/**
 * Pacote NET.
 * 
 * @author Artur Alves
 */
var NET = {};

NET.temp = {};

NET.acoes = {};

NET.efeitosHabilitados = (function(){
	return true;
})();

/**
 * @author Artur Alves 
 */
NET.ajax = {
	
	_showAguardeMsg: function(){
		var msgScroll = (function() {
				var xScroll, yScroll;
				if (self.pageYOffset) {
					yScroll = self.pageYOffset;
					xScroll = self.pageXOffset;
				} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
					yScroll = document.documentElement.scrollTop;
					xScroll = document.documentElement.scrollLeft;
				} else if (document.body) {// all other Explorers
					yScroll = document.body.scrollTop;
					xScroll = document.body.scrollLeft;	
				}
				return {left: xScroll, top: yScroll};
		})();
		
		$("#wrapper").append('' +
			'<div id="_Alerta_Aguarde" style="position:absolute;z-index:9999;color:#fff;background:#ff5e3c;left:'+msgScroll.left+'px;top:'+msgScroll.top+'px;padding:3px;font-size:1.2em;">' +
			'<img src="/netretrev/common/imgs/carregando-ajax.gif" />' +
			'aguarde...' +
			'</div>' +
		'');
	},
	
	_hideAguardeMsg: function(){
		$("#_Alerta_Aguarde").remove();
	},
	
	/**
	 * 
	 * 
	 * @param url
	 * @param params
	 * @param response
	 * @param responseError
	 */
	requisicao: function(url, params, callback, responseError) {
		responseError = $.isFunction(responseError) ? responseError : function(e){
			NET.ajax._hideAguardeMsg();
			
			var err = [];
			
			err["0"] = "Não foi possível estabelecer conexão com o servidor"; 		// para ff
			err["12029"] = err["0"]; 												// para ie
			
			err["404"] = "Página não encontrada";
			err["500"] = "Erro interno no servidor";
			err["503"] = "Serviço não disponível";
			
			var descErro = err[e.status.toString()] ? err[e.status.toString()] : "Erro desconhecido";
			
			alert("Erro " + e.status + ": " +  descErro  + ".\n\nChamada: " + url);
		};
		
		$.ajax({
			type: 		"GET",
			url: 		url,
			data: 		params,
			beforeSend: NET.ajax._showAguardeMsg,
			complete: 	NET.ajax._hideAguardeMsg,
			success: 	callback,
			error: 		responseError 
		});
	},

	/**
	 * 
	 * 
	 * @param objURLs
	 * @param callback
	 */
	carregar: function(objURLs, callback){
		var count = 1;
		var buff = {};
		
		var objQnt = function(obj){
			var c = 0;
			for(var k in obj){
				if(k.indexOf('_params')==-1)
					c++;
			}
		
			return c;
		
		}(objURLs);
		
		var strURL;
		var mantemVar = function(pKey) {
			var ajaxParams = {};
			
			if(typeof(objURLs[pKey+"_params"]) == 'object') {
				ajaxParams = objURLs[pKey+"_params"];
			}
			
			NET.ajax.requisicao(objURLs[pKey], ajaxParams, function(data){
				buff[pKey] = data;
				if(count == objQnt){
					if($.isFunction(callback)) callback(buff);
				} else {count++;}
			});
		};
		
		for(var key in objURLs){
			strURL = objURLs[key];

			if(key.indexOf('_params') == -1) {
				mantemVar(key);
			}
		}
	},
	
	/**
	 * 
	 */
	executarSequencia_proximaJanelaParams: function(){
		return;
	},

	/**
	 * 
	 * @param pId
	 * @param pWidth
	 * @param seq
	 */
	executarSequencia: function(pId, pWidth, seq) {
		var geralWidth = pWidth;
		var ajaxParams = {};

		if(('width' in seq[0])) {
			pWidth = seq[0].width;
		}
		
		if(('params' in seq[0])) {
			if((typeof(seq[0].params) == 'object') && (seq[0].params != null)) {
				ajaxParams = seq[0].params;
			}
		}
		
		if(('preScript' in seq[0])) {
			if($.isFunction(seq[0].preScript)) {
				seq[0].preScript();
			}
		}

		var mantemVar = function(seq, geralWidth, pWidth, ajaxParams) {
			NET.ajax.requisicao(seq[0].pagina, ajaxParams, function(data){
				NET.popup.exibir(pId, data, pWidth, function(){
					if(seq.length > 1) {
						$(".etapa_seguinte").click(function(){
								if ($.isFunction(NET.ajax.executarSequencia_proximaJanelaParams)) {
									$.extend(seq[1].params, NET.ajax.executarSequencia_proximaJanelaParams());
								}
								NET.ajax.executarSequencia(pId, geralWidth, seq.slice(1));
						});
					}
					
					if(('script' in seq[0])) {
						if($.isFunction(seq[0].script)) seq[0].script();
					}
					
				});
			});
		}(seq, geralWidth, pWidth, ajaxParams);
	}
	
};

/**
 * 
 */
NET.janela = {
	

	
};

/**
 * 
 */
NET.abas = {
	
	/**
	 * 
	 */
	carregarAbas_script_buffer: {},
	
	carregarAbas_memoria:{},
		
	/**
	 * 
	 * @param pId
	 * @param objURLs
	 * @param callback
	 */
	carregarAbas: function(pId, objURLs, callback) {
		var abaInicial = ""; 
		var abaScript = {};

		if("ABA_INICIAL" in objURLs) {
			abaInicial = objURLs.ABA_INICIAL;
			delete objURLs.ABA_INICIAL;
		}
			
		for(var abaScr in objURLs) {
			if(abaScr.indexOf("_script") != -1) {
				if($.isFunction(objURLs[abaScr])) {
					abaScript[abaScr.substr(0, abaScr.length - "_script".length)] = objURLs[abaScr];
				}
				
				delete objURLs[abaScr]; 
			}
		}
		
		NET.ajax.carregar(objURLs, function(data){
			// Itera sobre as abas e atribui ação para o
			// onclick de cada uma
			for(var aba in data) {
				var mantemVar = function(pId, pAba, scr) {
					$("#"+aba).click(function(){
						if(!$(this).hasClass("aba_ativa")) {
							data[$(".popup_ .aba_ativa a").attr("id")] = $("#"+pId).clone(/*true*/);

							$(".popup_ .aba_ativa").removeClass("aba_ativa");
							$(this).parent().addClass("aba_ativa");

							if(typeof(data[pAba]) == 'object') {
								$("#"+pId).replaceWith(data[pAba]);
							} else {
								$("#"+pId).empty().append(data[pAba]);
							}
					
							if(pAba in scr) {
								scr[pAba]();
								/*delete scr[pAba];*/
							}
					
							if($.isFunction(NET.abas.carregarAbas_script_buffer)) {
								NET.abas.carregarAbas_script_buffer();
								NET.abas.carregarAbas_script_buffer = {};
							} else {
								NET.popup.centralizar();
							}
						}
						
						return false;
					});
					
				}(pId, aba, abaScript);
			}
			
			// Trata a aba inicial, para que apareça ao abrir a janela
			var initAba = $(".popup_ .aba_ativa a").attr("id");
			if(abaInicial != "") {
				$("#"+pId).empty().append(data[initAba]);
		
				if(initAba in abaScript) {
					abaScript[initAba]();
				}
		
				NET.popup.centralizar();

				if($.isFunction(callback)) callback();

			 } else {
				if($.isFunction(callback)) callback();
			 }
		});
	}
	
};

/**
 * 
 */
NET.ui = {
	
	_metodosEfeitos: {
	
		slideDown: function(jqObj, v, callback) {
			jqObj.slideDown((v ? v : "fast"), callback);
		},
		
		slideUp: function(jqObj, v, callback) {
			jqObj.slideUp((v ? v : "fast"), callback);
		},
		
		slideToggle: function(jqObj, v, callback) {
			jqObj.slideToggle((v ? v : "fast"), callback);
		},
		
		show: function(jqObj, v, callback){
			if(!v){
				jqObj.show();
				$.isFunction(callback) ? callback() : "";
			} else {
				jqObj.show(v, callback);
			}
		},
		
		hide: function(jqObj, v, callback){
			if(!v){
				jqObj.hide();
				$.isFunction(callback) ? callback() : "";
			} else {
				jqObj.hide(v, callback);
			}
		},
		
		fadeIn: function(jqObj, v, callback){
			jqObj.fadeIn((v ? v : "fast"), callback);
		},
		
		fadeOut: function(jqObj, v, callback){
			jqObj.fadeOut((v ? v : "fast"), callback);
		},
		
		_show: function(jqObj){
			jqObj.show();
		},
		
		_hide: function(jqObj){
			jqObj.hide();
		},
		
		_toggle: function(jqObj){
			jqObj.toggle();
		},
		
		_relacaoDesabilitado: {
			show: "_show",
			hide: "_hide",
			toggle: "_toggle",
			slideDown: "_show",
			slideUp: "_hide",
			slideToggle: "_toggle",
			fadeIn: "_show",
			fadeOut: "_hide"
		},

		_verificaCallback: function(el){
			return $.isFunction(el) ? undefined : el;
		},
		
		_debug: function(a, b){
			alert("Parametros enviados: \n\n - "+a+"\n - "+b);
		}
	},
	
	efeito: function(pEfeito){
		var params = "";

		for(var i = 1; i < arguments.length; i++){
			params += "arguments["+i+"]"+(i < (arguments.length - 1) ? "," : "");
		}
		
		if(NET.ui._metodosEfeitos[pEfeito]){
			if(NET.efeitosHabilitados){
				eval("NET.ui._metodosEfeitos[pEfeito]("+params+")");
			} else {
				eval("NET.ui._metodosEfeitos[NET.ui._metodosEfeitos._relacaoDesabilitado[pEfeito]]("+params+")");
				if($.isFunction(arguments[arguments.length - 1])) 
					arguments[arguments.length - 1]();
			}
		} else {
			alert('Erro: Método "'+pEfeito+'" não encontrado');
		}
	},
	
	carregarComboBox : function(seletorForm, seletorComboBox, parametros, valor, rotulo, seletorDiv) {
	 	var actionRequest = $(seletorForm).attr("action");
		NET.ajax.requisicao(actionRequest, parametros,
			function(jsonString) {
				var lista = eval("(" + jsonString + ")");
				
				$(seletorComboBox + " option").remove();
				
				var comboBox = $(seletorComboBox);
				comboBox.append('<option value=""> - SELECIONE - </option>');
				
				if (seletorDiv != null) {
					if (lista.length > 0) {
						NET.ui.efeito("show", $(seletorDiv));
					} else {
						NET.ui.efeito("hide", $(seletorDiv));
					}
				}
				
				for (var i = 0; i < lista.length; i++) {
		 			var option = "<option value=\"";
		 			for (var y = 0; y < valor.length; y++) {
		 				if (y > 0) {
		 					option += "_";
		 				}
		 				option += lista[i][valor[y]];
		 			}
		 			option += "\">";
		 			for (var y = 0; y < rotulo.length; y++) {
		 				if (y > 0) {
		 					option += " - ";
		 				}
		 				option += lista[i][rotulo[y]];
		 			}
		 			option += "</option>";
		 			
		 			comboBox.append(option);
		 		}
			}
		);
	},
	
	regraExibicaoComboBox : function(regras) {
		$(".regra").change(function(){
			for (var i = 0; i < regras.length; i++) {
				var regra = regras[i];
				var dependencias = regra.dependencia;
				var exibir = false;
		
				for (var y = 0; y < dependencias.length; y++) {
					var dependencia = dependencias[y];
					var valorEsperado = dependencia.valor;
					var valorComboBox = $("#" + dependencia.id + " option:selected").attr("value");
					
					if (dependencia.expressao == null) {
						dependencia.expressao = "==";
					}
					
					var expr = eval("valorComboBox " + dependencia.expressao + " valorEsperado");
					if (valorComboBox != "" && (expr || valorEsperado == null)) {
						exibir = true;
					} else {
						exibir = false;
						break;
					}
				}
				
				if (exibir) {
					NET.ui.efeito("show", $("#div_" + regra.id));
				} else {
					$("#div_" + regra.id + " option[value=]").attr("selected", "selected");
					NET.ui.efeito("hide", $("#div_" + regra.id));
				}
			}
		});
	}
	
};

/**
 * Responsável pela correção de problemas nos browsers.
 * 
 */
NET.correcaobrowser = {
	
	/**
	 * Corrige o bug do IE 6 no seletor hover para linhas de uma tabela.
	 * 
	 */
	trHover : function () {
		if(jQuery.browser.msie && eval(jQuery.browser.version.substr(0,1)) <= 6){
			$('table tbody tr').bind("mouseenter", function() {
					$(this).addClass('hovered');
			});
			
			$('table tbody tr').bind("mouseleave", function() {
					$(this).removeClass('hovered');
			});
			
			$('.jCalendar tr').unbind("mouseenter mouseleave");
		}
	}
	
};

$(function() {

	$.ajaxSetup({
		cache: false,
		beforeSend: function(xhr) {
		    xhr.setRequestHeader("Content-type", "text/html; charset=UTF-8");
		}
	});
	
	NET.correcaobrowser.trHover();
	
});