/*!
 * Mega Droplist Plugin
 * Version 1.0.0
 *
 * Copyright © 2011 David Young & Cape Fear Webmasters, Inc.
 * http://www.cfwebmasters.com/
 * http://dcyoung.com/
 * Released under the GNU GPL Version 2 license.
 * 
 *
 *
 */
if(typeof(jQuery)!=='undefined'&&window.jQuery){
	(function($){
		jQuery.fn.cfwiMegaDropList=function(args){
			/* 	Default parameters.  These can be overwridden by supplying
			 *	the new values via the "args" variable
			*/
			var m_params={
				Container:{
					CssClass:'cfwiMegaDropList'
				},
				ListHead:{
					CssClass:'cfwiListHead',
					Selector:'div > h4'
				},
				List:{
					CssClass:'cfwiList',
					Selector:'ul'
				},
				GroupWrapper:{
					CssClass:'cfwiDropListWrapper'
				},
				Group:{
					CssClass:'cfwiGroup'
				},
				DropDown:{
					CssClass:'cfwiDropList',
					DefaultText:{
						CssClass:'',
						Selector:'> span',
						Text:'Please Choose...'
					},
					Button:{
						CssClass:'cfwiLinkButton',
						Text:'Go',
						ShowText:true
					}
				},
				ColumnCount:3
			};
			var m_width=0;
			//Override default paramters with supplied args variable
			if(typeof(args)==='object'&&args!==null){$.extend(true,m_params,args);}
			
			//Create DropList Control Elements
			var $droplistctrl=$('<div class="'+ m_params.DropDown.CssClass +'" />')
				.append('<a href="#" class="'+ m_params.DropDown.Button.CssClass +'" />')
				.prepend('<span>'+ m_params.DropDown.DefaultText.Text +'</span>');
			
			//Create ListGroup Wrapper Element
			var $wrapperctrl=$('<div class="' + m_params.GroupWrapper.CssClass + '" />');
			
			//Create Generic Click() function to handle Show/Hide functionality
			var $click=function(){
				if(this){
					this.is(':hidden')?
						this.show().animate({'opacity':1},300,function(){})
						:
						this.animate({'opacity':0},300,function(){ $(this).hide(); });
				}	
			}
			
			//Event Handlers for auto-hide of DropList
			var Timer=null;
			var $mouseenter=function(){
				if(Timer!==null){clearTimeout(Timer);}
			};
			var $mouseleave=function(){
				var $this=$(this);
				Timer=setTimeout(function(){
					$this.animate({'opacity':0},300,function(){ $(this).hide(); });
				},750);
			};
			//Get DropDown LinkButton & Handle the ButtonText Properties
			var $a = (m_params.DropDown.Button.ShowText)?
				$droplistctrl
					.find('a.' + m_params.DropDown.Button.CssClass)
					.text(m_params.DropDown.Button.Text)
				:
				$droplistctrl
					.find('a.' + m_params.DropDown.Button.CssClass);
			
			//Iterate through each element to be converted to a MegaDropList and construct control.
			return this.each(function(){
				var $list=null,$dropdown=null,$groups=null;
				var $element=$(this);
				
				$element
					.addClass(function(){
						return (m_params.Container.CssClass.length > 0)? m_params.Container.CssClass : ''; 				   
					})
					.find(m_params.ListHead.Selector)
					.filter(function(){
						var $this=$(this);
						return ($this.next(m_params.List.Selector).length > 0);
					})
					.each(function(){
						var $this=$(this);
						var $g = $this
							.add(
								$this.next(m_params.List.Selector)
								 	.addClass(function(){ 
										return (m_params.List.CssClass.length > 0)? m_params.List.CssClass : ''; 
									}
								)
							);
						$g.wrapAll('<div class="'+ m_params.Group.CssClass+'" />');
					});
					
				$groups=$element.find('div.'+ m_params.Group.CssClass).wrapAll($wrapperctrl).filter(':nth-child('+m_params.ColumnCount+'n+1)').css({'clear':'left'}).addClass('cfwiNewLine').end();
				$list=$element.find('div.' + m_params.GroupWrapper.CssClass);
				$droplistctrl.insertBefore($list);
				$dropdown=$element.find('div.' + m_params.DropDown.CssClass);
				
				$groups
					.find('li > a')
					.click(function(){
						var $this=$(this);
						$dropdown.find(m_params.DropDown.DefaultText.Selector).text($this.text());
						$list.animate({'opacity':0},300,function(){ $list.hide(); })
					});
				
				$droplistctrl.click(function(){
					$click.call($list);
					return false;
				});
				
				$list
					.width(function(){ 
						$groups.cfwiEqualize({set:'width',margins:false}).cfwiEqualize({set:'height',margins:false}).each(function(){ 
							var $this=$(this); 
							m_width = Math.max($this.outerWidth(true),m_width);
						});
						return m_width * m_params.ColumnCount;
					})
					.css({'position':'absolute','opacity':0,'overflow':'hidden','display':'none'})
					.css('marginLeft',function(){ return -(($list.width() + 20) - $droplistctrl.width()); })
					.mouseenter($mouseenter)
					.mouseleave($mouseleave);
				
				//$element.mouseout(function(){
					//$list.animate({'opacity':0},300,function(){ $list.hide(); });			   
				//});
				
			});
		}
	})(jQuery);	
};
