/*
 * simple dropdown 
 * uses .drop_down_element inside of trigger element e.g. a div inside a <div class="button"/>
 * element will toggle dropdown on click
 */

( function ( $ ) {
	
	// name for the data when saved
	var dropdownNS = 'theDropdownNamespace';
	var defaults = 
					{
						'positionLeft': 'right',
						'positionTop': 'bottom'
					};
	
	var methods = {
	
		'init' : function(options) {
			var settings = $.extend(true, {}, defaults, options);
			
			return $(this).each( function() {
			
			// elements to work with
			var parts = {
				'$this' : $(this),
				'$button': $(this).children('.button, .button_red'),
				'$dropElement' : $('.drop_down_element', this)
			}
	
			//save parts and settings
			var data = {
				'parts' : parts,
				'settings' : settings,
				'dropElement_x1' : 0,
				'dropElement_y1' : 0,
				'dropElement_x2' : 0,
				'dropElement_y2' : 0,
				'button_x1' : 0,
				'button_y1' : 0,
				'button_x2' : 0,
				'button_y2' : 0
			};
			parts.$this.data( dropdownNS, data );
			
			parts.$this.dropdown('calculatePosition');			
			
			// add click event
			parts.$button.click(function() { $(this).dropdown('toggle'); });
				
			// add resize event		
			var resizeTimer = null;
			$(window).bind('resize', function() {
			    if (resizeTimer) clearTimeout(resizeTimer);
			    resizeTimer = setTimeout(function(){
					parts.$this.dropdown('calculatePosition')
				}, 50);
			});
			
			});
		},
		
		
		'toggle' : function() 
		{
			var $this = $( this ).parent();
			var parent = $( this ).parent();
			var data = parent.data(dropdownNS);
						
			$('body').unbind('mouseup.dd_jq');
 
			data.parts.$button.toggleClass('button_open');
			
			if(data.parts.$button.hasClass('button_open'))
			{	
			
				var dd_mouseDownEvent = function(e)
										{ 	
											if(
												(
													(
														e.clientX >= data.dropElement_x1
														&&
														e.clientX <= data.dropElement_x2
													)
													&&
													(	
														e.clientY >= data.dropElement_y1
														&&
														e.clientY <= data.dropElement_y2
													)
												)
												||
												(
													(
														e.clientX >= data.button_x1
														&&
														e.clientX <= data.button_x2
													)
													&&
													(	
														e.clientY >= data.button_y1
														&&
														e.clientY <= data.button_y2
													)
												)
												
											)
											{
	
											}
											else
											{
												var dataButton = data.parts.$button;
												$('body').unbind('mouseup.dd_jq');
												
												$('.drop_down_element').hide();
												$('.button_open').removeClass('button_open');
											}
											
										};

				$('.drop_down_element').hide();
				$('.button_open').removeClass('button_open');
				
				data.parts.$button.toggleClass('button_open');
				data.parts.$dropElement.css('visibility', 'visible');
				data.parts.$dropElement.show();				
				fixBoxBorders();

				data.dropElement_x1 = data.parts.$dropElement.offset().left;
				data.dropElement_y1 = data.parts.$dropElement.offset().top;
				
				data.dropElement_x2 = data.parts.$dropElement.offset().left	+ data.parts.$dropElement.outerWidth();
				data.dropElement_y2 = data.parts.$dropElement.offset().top	+ data.parts.$dropElement.outerHeight();
		 				

				data.button_x1 = data.parts.$button.offset().left;
				data.button_y1 = data.parts.$button.offset().top;
				
				data.button_x2 = data.parts.$button.offset().left	+ data.parts.$button.outerWidth();
				data.button_y2 = data.parts.$button.offset().top	+ data.parts.$button.outerHeight();
				
				if( data.parts.$dropElement.hasClass('dropdownscrollbar') ) {
					data.parts.$dropElement.tinyscrollbar({});
				}
				
				
				$('body').bind('mouseup.dd_jq',dd_mouseDownEvent);
			}
			else 
			{ 
				data.parts.$dropElement.hide();
			}
			
			return true;
		}, 
		
		
		'calculatePosition' : function () {
			//load settings
			var data = $( this ).data(dropdownNS);
			
			
			if ('top' == data.settings.positionTop) {
				var top = data.parts.$this.position().top 
						- data.parts.$dropElement.height();
						- data.parts.$this.css('margin-bottom').replace('px', '');
						top += 27;
			} else {
			// top position dropdown element
				var top = data.parts.$this.position().top 
						+ data.parts.$this.outerHeight(true) 
						- data.parts.$this.css('margin-bottom').replace('px', '');
			}
				
			// left position dropdown element
				var left = 0;
			if (data.settings.positionLeft == 'right') {
				var left = data.parts.$this.position().left;
			} else if (data.settings.positionLeft == 'center') {
				left = data.parts.$this.position().left 
				left += Math.round(data.parts.$this.innerWidth()  / 2)
				left -= Math.round(data.parts.$dropElement.innerWidth() /2);
			}
			
			// set calculated values to drop element
				data.parts.$dropElement.css({'top' : top});
				data.parts.$dropElement.css({'left' : left});
		}
	};
	
	
	/*
	 *  execute function from param
	 */
		$.fn.dropdown = function ( method ) {
		
		if ( methods[ method ] ) {
			return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ) );
		} else if ( typeof method === 'object' || !method ) {
			return methods.init.apply( this, arguments );
		}
		return null;
	};
	
} )( jQuery );
