/*
	Author: Jesse Thompson
	Date: February 23rd 2010
	Version: .1
	
	Supported list item attributes
	------------------------------
	data-value="0"					- fills INPUT field value, used to determine default value
	data-disabled="true"			- changes hover state (disables by default), removes click functionality
	data-href="/special-offers/"	- adds a linkout
	data-linktarget="_blank"		- sets a target for the linkout
*/

(function($){
		$.fn.iwsDropdown = function(list,options) {   
		var defaults = {
		  type: "link",
		  defaultLinkTarget: "_self",
		  classExt: "",
		  wrapperClass: null,
		  prependLabel: "",
		  overrideDefault: "",
		  fillLabel: null,
		  skipSetupCallback:false,
		  maxHeight: null,
		  slideUp: false,
		  slide: true,
		  input: null,
		  onSelect: null,
		  onHover: null,
		  onOut: null,
		  onOpen:null,
		  onClose:null,
		  initialValue:null
		};
		
		var isOn = false;
		var obj;
		var options = $.extend(defaults, options);
		
		return this.each(function() {
			//options.input = null;
			if(options.input) {
				registerInput(options.input); 
			}
			
			obj = $(this);
			var body = obj.html();
			
			if(options.wrapperClass)
				body += '<div class="'+options.wrapperClass+'">';
				
			body += '<div class="iwsDropdown_wrapper">';
			body += '<div class="iwsDropdown_btn"><div class="iwsDropdown_decor"></div>';
			body += '<div class="iwsDropdown_label"></div></div>';
			
			if(options.maxHeight)
				body += '<div class="iwsDropdown_container"><div class="iwsDropdown_slide" style="height:100px"><div class="ScrollPane" style="height:100px">';
			else body += '<div class="iwsDropdown_container"><div class="iwsDropdown_slide">';
			
			$("li",list).each(function() {
				var add_classes = "";
				if($(this).attr("data-disabled"))
					add_classes += "iwsDropdown_item_disabled " + options.classExt;
					
				var ni = "<div class='iwsDropdown_item " + add_classes + "' data-value='"+$(this).attr("data-value")+"'";
				if($(this).attr("data-href"))
					ni += " data-href='"+$(this).attr("data-href")+"'";
				if($(this).attr("data-linktarget"))
					ni += " data-linktarget='"+$(this).attr("data-linktarget")+"'";	
				if($(this).attr("data-default"))
					ni += " data-default='"+$(this).attr("data-default")+"'";	
				
				ni += ">" + $(this).html() + "</div>";
				body += ni;
			});
			
			body += "</div>";
			body += "</div>";
			if(options.maxHeight)
				body += "</div>";
			if(options.wrapperClass)
				body += "</div>";

			obj.html(body);
			initHandlers();

			if($("li",list).length > 1)
				createHover();
			
			if(options.maxHeight)
				$('.ScrollPane',obj).jScrollPane({showArrows:true,dragMinHeight:15,dragMaxHeight:15});
				
			$(".iwsDropdown_slide",obj).css("top","-"+$(".iwsDropdown_slide",obj).outerHeight()+"px");
			$(".iwsDropdown_container",obj).hide();
			
			
			if(options.initialValue)
				$(".iwsDropdown_label",obj).html(options.initialValue);
		});
		
	  
		function registerInput(i) {
			type = "input";
			options.input.css("display","none");
		}
	  
		function createHover() {
			$(".iwsDropdown_btn",obj).mouseenter(function() {
				if(!isOn)
				{
					handleOpen();
				} 
			});
			
			$(".iwsDropdown_wrapper",obj).mouseleave(function() {
				if(isOn) {
					if(options.slideUp) {
						$(".iwsDropdown_slide",obj).stop().animate({top:"0px"},handleClose);
					} else {
						$(".iwsDropdown_slide",obj).stop().animate({top:"-"+$(".iwsDropdown_slide",obj).outerHeight()+"px"},handleClose);
					}
					isOn = false;
				//	handleClose();
				}
			});
		}
	  
	  	function initHandlers() {
			$(".iwsDropdown_btn",obj).click(function() {
				if(!this.isOn)
				{
					handleOpen();
				} else {
					handleClose();
				}
			});
			
			$(".iwsDropdown_item",obj).each(function () {
				if(!$(this).hasClass("iwsDropdown_item_disabled")) {
					$(this).click(function() {
						handleClick($(this));
					});
					if(options.input) {
						if(options.input.val() == $(this).attr("data-value")) 
						{
							//alert("match " + $(this).html());
						//	handleClick($(this));
						}
					} else if(options.overrideDefault.length > 0) {
						if($(this).html().toLowerCase() == options.overrideDefault.toLowerCase()) {
							handleClick($(this));
						}
					} else if($(this).attr("data-default")) {
						handleClick($(this),options.skipSetupCallback);	
					}
				}
			});  
	  	}
		
		function handleClick(targ,skipCallback) {
			if(targ.attr("data-href"))
			{
				var lt = options.defaultLinkTarget;
				if(targ.attr("data-linktarget"))
					lt = targ.attr("data-linktarget")
				window.open(targ.attr("data-href"),lt);
				handleClose();
			}
			
			if(options.fillLabel)
				$(".iwsDropdown_label",obj).html(options.prependLabel + targ.html());
				
			handleClose();
			
			$(".iwsDropdown_item_selected",obj).removeClass("iwsDropdown_item_selected",obj);
			targ.addClass("iwsDropdown_item_selected");
			
			if(!skipCallback)
				if(options.onSelect)
					options.onSelect(targ.html());
				
			//executeCallback(options.onSelect);
			
			if(options.input && targ.attr("data-value") != "undefined")
			{
				$(".iwsDropdown_label",obj).html(targ.html());
				options.input.val(targ.attr("data-value"));
			}
		}
		
		function executeCallback(func) {
			if(func)
				func();	
		}
		
		function handleOpen() {			
			$(".iwsDropdown_container",obj).show();
			if(options.slideUp) {
				$(".iwsDropdown_slide",obj).css('display','block');
				$(".iwsDropdown_slide",obj).css("top","200px");
//				$(".iwsDropdown_slide",obj).stop().animate({top: "-"+$(".iwsDropdown_slide",obj).outerHeight()+"px"});
					$(".iwsDropdown_slide",obj).stop().animate({top:"0px"});
			} else {
				$(".iwsDropdown_slide",obj).css("top","-"+$(".iwsDropdown_slide",obj).outerHeight()+"px");
				$(".iwsDropdown_slide",obj).stop().animate({top: '0px'});
			}
			$(".iwsDropdown_btn",obj).addClass("iwsDropdown_btn_on");
			$(".iwsDropdown_decor",obj).addClass("iwsDropdown_decor_on");
			isOn = true;
			executeCallback(options.onOpen);
		}
		
		function handleClose() {
			//alert("CLOSE");
			$(".iwsDropdown_container",obj).hide();
		//	$(".iwsDropdown_slide",obj).css('display','none');
//			$(".iwsDropdown_slide",obj).stop().css("top","300px");
		//	$(".iwsDropdown_slide").css("top","-"+$(".iwsDropdown_slide").outerHeight()+"px",200);
			
			$(".iwsDropdown_btn",obj).removeClass("iwsDropdown_btn_on");
			$(".iwsDropdown_decor",obj).removeClass("iwsDropdown_decor_on");
			isOn = false;
			executeCallback(options.onClose);
		}	
		
		function onComplete() {
			$(".iwsDropdown_container",obj).hide();	
		}
};
})(jQuery);

