/*
	EXEMPLO DE USO
	
	<?
		$name = "teste";
	?>
	<ul class="selectMultiple" id="<?=$name?>"></ul>
	<a id="<?=$name?>mark">Marcar Todos</a> | <a id="<?=$name?>unmark">Desmarcar Todos</a> 
	<script type="text/javascript" src="/js/selectMultiple.js"></script>
	<script type="text/javascript">
		$(document).ready(function() {	
			var smobj = new selectMultiple();	
			smobj.load('ARQUIVO_CONFIG.php?param=1', '<?=$name?>', function(){alert("callback"}); 	
			||
			smobj.noAjaxLoad(ELEMENTOS, '<?=$name?>');				
		});
	</script>
*/

function selectMultiple()
{
	this.register = register;
	this.reload = reload;
	this.load = load;
	this.getSelecteds = getSelecteds;
	this.getQtdSelecteds = getQtdSelecteds;
	this.setSelected = setSelected;
	this.setOneSelected = setOneSelected;
	this.noAjaxLoad = noAjaxLoad;
	this.appendItem = appendItem;
	this.disable = disable;
	this.enable = enable;
	this.nomeLista = nomeLista;
	this.clear = clear;
	this.appendText = appendText;
	this.setScroll2Item = setScroll2Item;
	this.registerNew = registerNew;
	
	var controle = 0;
	var useDefaultCss = true;
	
	function register(lista)
	{			
		lista = nomeLista(lista);
		
		$("#"+lista+" > li").unbind("click");
		$("#"+lista+" > li").click(function() {
		
			$("#"+nomeLista(this.id)+" > input[type='checkbox']").each(function() {
				if(this.checked)
				{
					this.checked = false;
					$(this).parents("li").removeClass("selected");
				}
				else if($("#"+lista+" > li > input[type='checkbox']").filter(":checked").length < $("#"+lista+"").attr("maxlength") || !$("#"+lista+"").attr("maxlength"))							
				{
					this.checked = true;
					$(this).parents("li").addClass("selected");
				}
				else if($("#"+lista+"").attr("unique") == 'true')
				{
					$("#"+lista+" > li > input[type='checkbox']").filter(":checked").parents("li").click();
					this.checked = true;
					$(this).parents("li").addClass("selected");
				}

				if($('#'+nomeLista(lista)+'_btnRefinar').length > 0 && $('#'+nomeLista(lista)+'_btnRefinarAct').length > 0) {
					if(getQtdSelecteds(lista)>0) {
						$('#'+nomeLista(lista)+'_btnRefinar').hide();
						$('#'+nomeLista(lista)+'_btnRefinarAct').show();
					} else {
						$('#'+nomeLista(lista)+'_btnRefinarAct').hide();
						$('#'+nomeLista(lista)+'_btnRefinar').show();
					}
				}

			});	
		});
		
		$("#"+lista+" > li").unbind("keypress");
		$("#"+lista+" > li").keypress(function(e){
			if(e.keyCode == 13) $(this).click();
		}); 
		
		$("#"+lista+" > li").unbind("mouseover");	
		$("#"+lista+" > li").mouseover(
			function() {
				if($(this).hasClass("selected"))
					$(this).addClass("zhover");
				else	 
					$(this).addClass("hover");
			}
		); 	
		$("#"+lista+" > li").unbind("mouseout");	
		$("#"+lista+" > li").mouseout( 
			function(){
				$(this).removeClass("zhover"); 
				$(this).removeClass("hover"); 
			}
		); 	
		
		$("#"+lista+" > li > input[type='checkbox']").unbind("click");	
		$("#"+lista+" > li > input[type='checkbox']").click(function(){
			this.checked = !this.checked;
		});				
		
		
		$("#"+lista+"mark").unbind("click");
     	$("#"+lista+"mark").click(function(){			    
			$("#"+lista+ "  > li:visible > input[type='checkbox']").each(function() { 		     		
				this.checked = true;
				$(this).parents("li").addClass("selected");
     		});
     	});
		$("#"+lista+"unmark").unbind("click");
     	$("#"+lista+"unmark").click(function(){			    
			$("#"+lista+ "  > li:visible > input[type='checkbox']").each(function() { 		     		
				this.checked = false;
				$(this).parents("li").removeClass("selected");
     		});
     	});
     	
		$("input[type='checkbox']#"+lista+"Toggle").unbind("click");
     	$("input[type='checkbox']#"+lista+"Toggle").click(function(){
     		if($(this).attr("checked") == false)
     		{		    
				$("#"+lista+ "  > li:visible > input[type='checkbox']").each(function() { 		     		
					this.checked = false;
					$(this).parents("li").removeClass("selected");
	     		});
     		}
     		else
     		{
				$("#"+lista+ "  > li:visible > input[type='checkbox']").each(function() { 		     		
					this.checked = true;
					$(this).parents("li").addClass("selected");
	     		});
	     	}
     	});
	}
	
	var controlList = new Array();
	
	
	function click(list,e){
	
		e = window.event||e;
		var tgt = e.srcElement||e.target;
		var check = false;
		var tagname = tgt.tagName.toLowerCase();
		
		if(tagname == 'li'){
			check = tgt.getElementsByTagName('input');
			li = tgt;
			check = check[0];
			var fli = true;
		}else if(tagname == 'input'){
			check = tgt;	
			li = tgt.parentNode;
			var fli = false;				
		}

		if(check){
			
			if(controlList[list][unique] && (controlList[list][selectCount] == 0 || check.checked)){
			
				if(controlList[list][selectCount] > 0){
					$('#'+list+' input[type=checkbox]:checked').attr('checked',false).removeClass('selected');
					controlList[list][selectCount]=0;
				}

				if(fli)
					check.checked = !check.checked;

			}else if(controlList[list]['selectCount'] < controlList[list]['maxlength'] ||  check.checked){
			
				if(fli)
					check.checked = !check.checked;
			}else{
				check.checked = false;
			}
			
			
			if(	check.checked ){
				$(li).addClass('selected');
				controlList[list]['selectCount']++;
			}else{
				$(li).removeClass('selected');
				controlList[list]['selectCount']--;
			}
		}
	}
	
	function registerNew(lista)
	{	
		lista = nomeLista(lista);
		
		var nSel = $("#"+lista+' input[type=checkbox]:checked').length;
		var maxlength = $("#"+lista).attr('maxlength');
		var unique = $("#"+lista).attr('unique');
		
		controlList[lista] = {'selectCount':nSel,'maxlength':maxlength,'unique':unique};
		
		$("#"+lista).unbind("click");
		$("#"+lista).click(function(e) { click(lista,e)});

		/*});
		
		$("#"+lista+" > li").unbind("keypress");
		$("#"+lista+" > li").keypress(function(e){
			if(e.keyCode == 13) $(this).click();
		}); 
		
		$("#"+lista+" > li").unbind("mouseover");	
		$("#"+lista+" > li").mouseover(
			function() {
				if($(this).hasClass("selected"))
					$(this).addClass("zhover");
				else	 
					$(this).addClass("hover");
			}
		); 	
		$("#"+lista+" > li").unbind("mouseout");	
		$("#"+lista+" > li").mouseout( 
			function(){
				$(this).removeClass("zhover"); 
				$(this).removeClass("hover"); 
			}
		); 	
		
		$("#"+lista+" > li > input[@type='checkbox']").unbind("click");	
		$("#"+lista+" > li > input[@type='checkbox']").click(function(){
			this.checked = !this.checked;
		});				
		
		
		
     	$("#"+lista+"mark").click(function(){			    
			$("#"+lista+ "  > li > input[@type='checkbox']").each(function() { 		     		
				this.checked = true;
				$(this).parents("li").addClass("selected");
     		});
     	});
     	$("#"+lista+"unmark").click(function(){			    
			$("#"+lista+ "  > li > input[@type='checkbox']").each(function() { 		     		
				this.checked = false;
				$(this).parents("li").removeClass("selected");
     		});
     	});*/
	}
	
	
	function reload(file, lista, callback)
	{
		jsonLoad(file, lista, callback);
		/*lista = nomeLista(lista);
		
		$.ajax({
			url: file,
			cache: true,
			dataType: "html",
			success: function(html){
				$("#"+lista).html(html);
				register(lista);
				if(callback) callback.call();
			}
		});*/
	}
	
	function load(file, lista, callback)
	{
		//reload(file, lista, callback);
		jsonLoad(file, lista, callback);
	}
	
	function jsonLoad(file, lista, callback)
	{		
		var listaOriginal = lista;
		lista = nomeLista(lista);
		
		$.ajax({
			url: file,
			cache: true,
			dataType: "json",
			success: function(json){
				$("#"+lista).html("");
				for (x in json) 
				{
					//alert(json[x]);
					if($("#"+lista).attr("showcheckbox") == "true")
						$("#"+lista).append("<li id=\""+lista+"_"+x+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+x+"\" realvalue=\""+json[x]+"\"> "+json[x]+"</li>");
					else
						$("#"+lista).append("<li id=\""+lista+"_"+x+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+x+"\" realvalue=\""+json[x]+"\" style=\"display:none\"> "+json[x]+"</li>");
				}

				register(lista);
				if(callback) callback.call();
				
			}
		});
	}
	
	function noAjaxLoad(values, lista, append)
	{
		var listaOriginal = lista;
		lista = nomeLista(lista);
		// limpa
		if(!append)
		{
			$("#"+lista).html("");
		}
		var toCheck = new Array();
		var x = 0;
		for(var i = 0; i < values.length; i++)
		{
			if($("#"+lista).attr("showcheckbox") == "true")
				$("#"+lista).append("<li id=\""+listaOriginal+"_"+values[i][0]+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+values[i][0]+"\"> "+values[i][1]+"</li>");
			else
				$("#"+lista).append("<li id=\""+listaOriginal+"_"+values[i][0]+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+values[i][0]+"\" style=\"display:none\"> "+values[i][1]+"</li>");
			if(values[i][2] == true)
			{
				toCheck[x++] = values[i][0];
			}
		}	
		$("#"+lista).ready(function(){
			register(lista);
			setOneSelected(lista, toCheck);
		}); 		
	}
	
	function appendItem(key, value, checked, lista , noRegister)
	{
		var listaOriginal = lista;
		lista = nomeLista(lista);
		
		if($("#"+lista).attr("showcheckbox") == "true")
			$("#"+lista).append("<li id=\""+listaOriginal+"_"+key+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+key+"\"> "+value+"</li>");
		else
			$("#"+lista).append("<li id=\""+listaOriginal+"_"+key+"\"><input type=\"checkbox\" name=\""+listaOriginal+"[]\" value=\""+key+"\" style=\"display:none\"> "+value+"</li>");		
		
		if(typeof noRegister == 'undefined' || noRegister == false){
			$("#"+lista).ready(function(){
				register(lista);
				if(checked) setOneSelected(lista, key);
			}); 
		}
	}
	
	function appendText(lista,text){
		$("#"+lista).html("<li> "+text+" </li>");
	}
	
	
	function clear(lista){
		//$("#"+lista).html('');
		
		$('#'+lista).each(function (){this.innerHTML =''})
		
	}
	
	function getSelecteds(lista)
	{
		lista = nomeLista(lista);
		return $("#"+lista+" > li > input[type='checkbox']").filter(":checked");
	}
	
	function getQtdSelecteds(lista)
	{
		lista = nomeLista(lista);
		return $("#"+lista+" > li > input[type='checkbox']").filter(":checked").length;
	}
	
	function setSelected(lista, values)
	{
		lista = nomeLista(lista);
		if (!(values instanceof Array))
 		{
 			values = values.split(",");
 		}
		
		for(var i = 0; i < values.length; i++)
		{
			$("#"+lista+" > li > input[type='checkbox'][@value='"+values[i]+"']").filter(":not(:checked)").parents("li").click();
		}
	}
	
	function setOneSelected(lista, value)
	{
		lista = nomeLista(lista);
		$("#"+lista+" > li > input[type='checkbox'][@value='"+value+"']").filter(":not(:checked)").parents("li").click();
	}
	
	function nomeLista(str) {
			
		strDecode = str.replace(/\+/g,'\\+').replace(/\[/g,'\\[').replace(/\-/g,'\\-').replace(/\]/g,'\\]').replace(/\*/,'\\*').replace(/\//g,'\\/').replace(/ /g,'\\ ');
		
		return strDecode;
	}
	
	function disable(lista)
	{
		lista = nomeLista(lista);
		$("#"+lista+" > li > input[type='checkbox']").filter(":checked").parents("li").click();
		$("#"+lista+" > li > input[type='checkbox']").attr("disabled", true);
		$("#"+lista+" > li").unbind("click");
		$("#"+lista+" > li").unbind("mouseover");
		$("#"+lista+" > li").unbind("mouseout");
		$("#"+lista).css("background-color", "#EEEEEE");
		$("#"+lista+"mark").unbind("click");
		$("#"+lista+"unmark").unbind("click");
	}
	
	function enable(lista)
	{
		lista = nomeLista(lista);
		$("#"+lista+" > li > input[type='checkbox']").attr("disabled", false);
		$("#"+lista).css("background-color", "");
		register(lista);
	}
	 
	function setScroll2Item(lista, id)
	{
		if(id.indexOf(",") != -1)
		{
			id = id.split(",")[0];
		}
 		
		var itemPos = getPosition(lista+"_"+id);
		var listaPos = getPosition(lista);
		if(itemPos.top != 0) {
			$('#'+nomeLista(lista)).scrollTop((itemPos.top-listaPos.top));
		}
	}
	
	
	function getPosition(elemID){
	    var offsetTrail = document.getElementById(elemID);
	    var offsetLeft = 0;
	    var offsetTop = 0;
	    while (offsetTrail) {
	        offsetLeft += offsetTrail.offsetLeft;
	        offsetTop += offsetTrail.offsetTop;
	        offsetTrail = offsetTrail.offsetParent;
	    }
	    if (navigator.userAgent.indexOf("Mac") != -1 && 
	        typeof document.body.leftMargin != "undefined") {
	        offsetLeft += document.body.leftMargin;
	        offsetTop += document.body.topMargin;
	    }
	    return {left:offsetLeft, top:offsetTop};
	}
}
