/* * jQuery Dropdown: A simple dropdown plugin * * Contribute: https://github.com/claviska/jquery-dropdown * * @license: MIT license: http://opensource.org/licenses/MIT * * Customized by Yudhistira Mauris (http://www.yudhistiramauris.com/) * */ if ( jQuery ) { ( function( $ ) { $.extend( $.fn, { jqDropdown: function( method, data ) { switch ( method ) { case 'show': show( null, $( this ) ); return $( this ); case 'hide': hide(); return $( this ); case 'attach': return $( this ).attr( 'data-jq-dropdown', data ); case 'detach': hide(); return $( this ).removeAttr( 'data-jq-dropdown' ); case 'disable': return $( this ).addClass( 'jq-dropdown-disabled' ); case 'enable': hide(); return $( this ).removeClass( 'jq-dropdown-disabled' ); } }, } ); function show( event, object ) { var trigger = event ? $( this ) : object, jqDropdown = $( trigger.attr( 'data-jq-dropdown' ) ), isOpen = trigger.hasClass( 'jq-dropdown-open' ); // In some cases we don't want to show it if ( event ) { if ( $( event.target ).hasClass( 'jq-dropdown-ignore' ) ) { return; } event.preventDefault(); event.stopPropagation(); } else if ( trigger !== object.target && $( object.target ).hasClass( 'jq-dropdown-ignore' ) ) { return; } hide(); if ( isOpen || trigger.hasClass( 'jq-dropdown-disabled' ) ) { return; } // Show it trigger.addClass( 'jq-dropdown-open' ); jqDropdown .data( 'jq-dropdown-trigger', trigger ) .show(); // Position it position(); // Trigger the show callback jqDropdown .trigger( 'show', { jqDropdown: jqDropdown, trigger: trigger, } ); } function hide( event ) { // In some cases we don't hide them var targetGroup = event ? $( event.target ).parents().addBack() : null; // Are we clicking anywhere in a jq-dropdown? if ( targetGroup && targetGroup.is( '.jq-dropdown' ) ) { // Is it a jq-dropdown menu? if ( targetGroup.is( '.jq-dropdown-menu' ) ) { // Did we click on an option? If so close it. if ( ! targetGroup.is( 'A' ) ) { return; } } else { // Nope, it's a panel. Leave it open. return; } } // Hide any jq-dropdown that may be showing $( document ).find( '.jq-dropdown:visible' ).each( function() { var jqDropdown = $( this ); jqDropdown .hide() .removeData( 'jq-dropdown-trigger' ) .trigger( 'hide', { jqDropdown: jqDropdown } ); } ); // Remove all jq-dropdown-open classes $( document ).find( '.jq-dropdown-open' ).removeClass( 'jq-dropdown-open' ); } function position() { var jqDropdown = $( '.jq-dropdown:visible' ).eq( 0 ), trigger = jqDropdown.data( 'jq-dropdown-trigger' ), hOffset = trigger ? parseInt( trigger.attr( 'data-horizontal-offset' ) || 0, 10 ) : null, vOffset = trigger ? parseInt( trigger.attr( 'data-vertical-offset' ) || 0, 10 ) : null; if ( jqDropdown.length === 0 || ! trigger ) { return; } if ( $( '#wpadminbar' ).length === 0 ) { // Position the jq-dropdown relative-to-parent... if ( jqDropdown.hasClass( 'jq-dropdown-relative' ) ) { jqDropdown.css( { left: jqDropdown.hasClass( 'jq-dropdown-anchor-right' ) ? trigger.position().left - ( jqDropdown.outerWidth( true ) - trigger.outerWidth( true ) ) - parseInt( trigger.css( 'margin-right' ), 10 ) + hOffset : trigger.position().left + parseInt( trigger.css( 'margin-left' ), 10 ) + hOffset, top: trigger.position().top + trigger.outerHeight( true ) - parseInt( trigger.css( 'margin-top' ), 10 ) + vOffset, } ); } else { // ...or relative to document jqDropdown.css( { left: jqDropdown.hasClass( 'jq-dropdown-anchor-right' ) ? trigger.offset().left - ( jqDropdown.outerWidth() - trigger.outerWidth() ) + hOffset : trigger.offset().left + hOffset, top: trigger.offset().top + trigger.outerHeight() + vOffset, } ); } } else { var bar_height = $( '#wpadminbar' ).css( 'height' ); bar_height = parseInt( bar_height.replace( 'px', '' ) ); // Position the jq-dropdown relative-to-parent... if ( jqDropdown.hasClass( 'jq-dropdown-relative' ) ) { jqDropdown.css( { left: jqDropdown.hasClass( 'jq-dropdown-anchor-right' ) ? trigger.position().left - ( jqDropdown.outerWidth( true ) - trigger.outerWidth( true ) ) - parseInt( trigger.css( 'margin-right' ), 10 ) + hOffset : trigger.position().left + parseInt( trigger.css( 'margin-left' ), 10 ) + hOffset, top: trigger.position().top + trigger.outerHeight( true ) - parseInt( trigger.css( 'margin-top' ), 10 ) + vOffset, } ); } else { // ...or relative to document jqDropdown.css( { left: jqDropdown.hasClass( 'jq-dropdown-anchor-right' ) ? trigger.offset().left - ( jqDropdown.outerWidth() - trigger.outerWidth() ) + hOffset : trigger.offset().left + hOffset, top: trigger.offset().top + trigger.outerHeight() + vOffset - bar_height, } ); } } } $( document ).on( 'click.jq-dropdown', '[data-jq-dropdown]', show ); $( document ).on( 'click.jq-dropdown', hide ); $( window ).on( 'resize', position ); }( jQuery ) ); }