//Developer : Salman Amjad
//Email : salmanamjad89@gmail.com
jQuery.fn.selectMenus = function(options){
	if ($(this).length > 0){
		var multi = options.multi;		
		var extraT = options.extraT == undefined ? 0 : options.extraT;
		var extraL = options.extraL == undefined ? 0 : options.extraL;
		var classOut = options.classOut == undefined ? 0 : options.classOut;
		var classInn = options.classInn == undefined ? 0 : options.classInn;
		var classUl = options.classUl == undefined ? 0 : options.classUl;
		var classLabel = options.classLabel == undefined ? 0 : options.classLabel;
		var classClear = options.classClear == undefined ? 0 : options.classClear;
		var Timer;
		var ChkC = '/images/menus/checkbox_checked.gif';
		var ChkE = '/images/menus/checkbox_empty.gif';
		var This = $(this);
		var TStyle = This.attr('style') != undefined ? 'style="'+This.attr('style')+'"' : '';
		var nName = This.attr('name');
		var nID = This.attr('id');
		var src = 	'<div class="'+classOut+'">'+
					'<div class="'+classInn+'">'+
					'<ul class="'+classUl+'" id="'+nName+'">';
		
		This.before('<div class="'+classLabel+'" '+TStyle+'></div>');
		This.after('<input type="hidden" name="'+nName+'" id="'+nID+'" />');
		var label = This.prev('div');
		var input = This.next('#'+nID);
		var iniVal = '';
		var iniTxt = '';
		var selCount = 0;
		This.find('option').each(function(){
			var chkD  = '';
			var thisVal = $(this).val();
			var thisTxt = $(this).text();
			var thisSel = $(this).attr('sel');
			if (thisSel == 'true'){
				selCount++;
				chkD = 'checked="checked"';
				iniVal += iniVal == '' ? thisVal : ';'+thisVal;
				iniTxt += iniTxt == '' ? thisTxt : ';'+thisTxt;
			}
			iniTxt = (selCount > 1) ? 'Multiple' : iniTxt;
			src += multi == true ? '<li rel="'+thisVal+'"><table border="0" cellspacing="0" cellpadding="0"><tr><td><img src="'+ChkE+'" border="0" width="16" /><input type="checkbox" style="display:none;" '+chkD+' /></td><td><span style="overflow:hidden;">'+thisTxt+'</span></td></tr></table></li>' : '<li rel="'+thisVal+'" '+chkD+'>'+thisTxt+'</li>';
		});
		This.remove();
		label.html(iniTxt);
		input.val(iniVal);
		src +=	'</ul>'+
				'</div>'+
				'</div>';
		$('body').append(src);
		var ThisUL = $('body').find('.'+classOut+':last');
		if (multi == true){
			ThisUL.prepend('<div class="'+classClear+'">Clear All</div>');
			var clearAll = ThisUL.find('div.'+classClear);
		}
		//Set Initial Value
		setTimeout(function(){
			if (selCount == 0){
				selIni();
			}else{
				setChkB();
			}
		}, 200);
		ThisUL.css({'position':'absolute', 'display':'none'});
		label.click(function(){
			var ThisOff = label.offset();
			var ThisL = ThisOff.left;
			var ThisT = ThisOff.top;
			var ThisWid = label.outerWidth();
			var ThisHei = label.outerHeight();
			var ThisB = ThisT + ThisHei;
			var ulHei = ThisUL.outerHeight();
			var ulWid = ThisUL.outerWidth();
			ThisUL.css({'top':ThisB+extraT+'px', 'left':ThisL+extraL+'px'});
			ThisUL.slideToggle("fast");
			$(document).click(function(event){
				var labelOff = ThisUL.offset();
				var labelL = ThisL;
				var labelR = labelL + ThisWid;
				var labelT = ThisT;
				var labelB = labelT + ThisHei + ulHei;
				var mX = event.pageX;
				var mY = event.pageY;
				if ((mX < labelL || mX > labelR)){
					ThisUL.slideUp();
				}else if ((mY < labelT || mY > labelB)){
					ThisUL.slideUp();
				}
			});
		});
		$(window).resize(function(){
			var ThisOff = label.offset();
			var ThisL = ThisOff.left;
			var ThisT = ThisOff.top;
			var ThisWid = label.outerWidth();
			var ThisHei = label.outerHeight();
			var ThisB = ThisT + ThisHei;
			var ulHei = ThisUL.outerHeight();
			var ulWid = ThisUL.outerWidth();
			ThisUL.css({'top':ThisB+extraT+'px', 'left':ThisL+extraL+'px'});
		});
		ThisUL.hover(function(){
			clearTimeout(Timer);
		},function(){
			Timer = setTimeout(function(){
				ThisUL.slideUp();
			}, 500);
		});		
		label.hover(function(){
			clearTimeout(Timer);
		},function(){
			Timer = setTimeout(function(){
				ThisUL.slideUp();
			}, 500);
		});
		if(multi == true){
			ThisUL.find('li:not(:first)').each(function(){
				$(this).css({'cursor':'pointer'}).click(function(){
					if (ThisUL.find('li').index($(this)) != 0){
						var ThisValA = '';
						var ThisTxtA = '';
						var ThisChkB = $(this).find("input[type=checkbox]");
						ThisChkB.attr('checked') ? ThisChkB.attr('checked', false) : ThisChkB.attr('checked', true);
						ThisUL.find('li:not(:first)').each(function(){
							label.html('');
							input.val('');
							if ($(this).find("input[type=checkbox]").attr('checked')){
								var currVal = $(this).attr('rel');
								var currTxt = $(this).find('span').text();
								ThisValA += ThisValA == '' ? currVal : ';'+currVal;
								ThisTxtA += ThisTxtA == '' ? currTxt : ', '+currTxt;
							}
						});
						input.val(ThisValA);
						if (ThisUL.find("input[type=checkbox]:checked").size() > 0){
							ThisUL.find('li:first input[type=checkbox]').attr('checked', false);
						}else{
							selIni();
						}
						(ThisUL.find("input[type=checkbox]:checked").size() > 1) ? label.html('Multiple') : label.html(ThisTxtA);
						setChkB();
					}
				});
			});
			//Clear All
			clearAll.css('cursor', 'pointer').click(function(){
				selIni();
			});
			ThisUL.find('li:first').css({'cursor':'pointer'}).click(function(){
				selIni();
			});
		}else{
			ThisUL.find('li').each(function(){
				$(this).css({'cursor':'pointer'}).click(function(){
					var currVal = $(this).attr('rel');
					var currTxt = $(this).text();
					label.html(currTxt);
					input.val(currVal);
					ThisUL.slideUp();
				});
			});
		}
				
		function selIni(){
			if(multi == true){
				ThisUL.find('li input[type=checkbox]').attr('checked', false);
				ThisUL.find('li:first input[type=checkbox]:first').attr('checked', true);
				var iniTxt = ThisUL.find('li:first span').text();
				var iniVal = ThisUL.find('li:first').attr('rel');
				label.html(iniTxt);
				input.val(iniVal);
				setChkB();
			}else{
				var iniTxt = ThisUL.find('li:first').text();
				var iniVal = ThisUL.find('li:first').attr('rel');
				label.html(iniTxt);
				input.val(iniVal);
			}
		}
		function setChkB(){
			ThisUL.find('li input[type=checkbox]').each(function(){
				$(this).attr('checked') ? $(this).prev('img').attr('src', ChkC) : $(this).prev('img').attr('src', ChkE);
			});
		}
	}
}
