/*
 * 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 ) );
}
