/**
 * @author charles
 */

//Browser do usuário
var browser = navigator.appName;
//complemento de folhas de estilos
var css_end;
if(browser.search(/Microsoft Internet Explorer/i) == 0){
	css_end = "ie.";
} else if(browser.search(/opera/i) == 0){
	css_end = "opera.";
}else{
	css_end = "";
}
//pasta onde estão os estilos
var cssDir = "../Estilos";
//pasta onde estão os scripts
var scriptDir = "../includes";



/***********************************************
 * Algumas funções que horas são atalhos, horas uma tremenda mão na roda
 * Principalmente quando se fala de geração dinâmica de conteúdo 
 ***********************************************/


/** função que cria um novo elemento. atalho para document.createElement
 * @param {String} tag
 * @param {Object} att -> Array no formato att[atributo] = valor
 */
function mkElement(tag){
	var att = arguments[1];
	try{
		var nElement = document.createElement(tag);
		if(typeof(att) == "object"){
			try{
				for(var key in att){
					if(typeof(att[key]) != "function" && typeof(key) == "string"){
						/class/i.test(key) ? nElement.className = att[ key ] : nElement.setAttribute( key, att[ key ] );
					}
				}
			}catch(e){
				throw new Error("Algo acontece que nos impede de inserir os atributos no elemento");
				return false;
			}
		}
		return nElement;
	}catch(e){
		throw new Error("Nao foi possível criar o elemento: " + e.message);
		return false;
	}
}

//função que carrega e disponibliza um dado script
function loadScript(end){
	if(typeof(arguments[1]) == "boolean" && arguments[1]){
		var sc = document.getElementsByTagName("script");
		for(var e = 0; e < sc.length; e++){
			if(sc[e].src == end){ return false; }
		}
	}
	var head = document.getElementsByTagName("head")[0];
	var script = mkElement("script",{"type":"text/javascript","language":"javascript","src":end});
	head.appendChild(script);
	return false;
} 


//Objeto xmlhttprequest
xmlHttpRequest = function (){
	var obj;
	try{
		obj = new XMLHttpRequest();
	}catch(e){
		try{
			obj = new ActiveXObject("MXML2.XMLHTTP");
		} catch(o){
			try{
				obj = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e){
				try{
					obj = new ActiveXObject("Msxml2.XMLHTTP");
				}catch(u){
					alert("Desculpe, mas seu browser não oferece suporte aos recursos do Compara Tudo!");
					return false;
				}
			}
		}
	}
	return obj;
}

function loadStyleSheet(url,styleSheetId,checkDuplicates){
	var xml = new xmlHttpRequest();
	var debug = arguments[3];
	xml.onreadystatechange = function(){
		if(xml.readyState == 4){
			if(xml.status == 200 || xml.status == 0){//OK
				var cssTxt = xml.responseText;
				var newCSS = insertStyleSheet(cssTxt,styleSheetId,url);
				if(newCSS && typeof(debug) == "boolean"){
					if(debug == true){
						newCSS.setAttribute("schref",url);
					}
				}
			}else if(xml.status == 404){
				//alert("404");
				throw new Error("Erro em loadStyleSheet: Url fornecida não pôde ser encontrada.");
			}else{
				throw new Error("Erro em loadStyleSheet: problemas com a url fornecida. Código retornado pelo servidor: "+xml.status);
			}
		}
	}
	
	//verifica se já existe
	if(checkDuplicates){
		var styles = document.getElementsByTagName("style");
		for(var i = 0; i < styles.length; i++){
			if(styles[i].id == styleSheetId){
				return;
			}
		}
	} 
	xml.open("GET",url,true);
	xml.send(null);
}

//função que insere a folha carregada
function insertStyleSheet(cssTXT,styleSheetId){
	var newCss = mkElement("style",{"id":styleSheetId,"type":"text/css"});
	if(newCss.styleSheet){//para o IE
		newCss.styleSheet.cssText = cssTXT;
	} else{//para browsers de verdade
		var newCssTXT = document.createTextNode(cssTXT);
		newCss.appendChild(newCssTXT);
	}
	
	var head = document.getElementsByTagName("head")[0];
	if(!head){
		throw new Error("Erro em insertStyleSheet: seu documento não tem uma tag head onde possa ser inserida a folha de estilos.");
	} else{
		head.appendChild(newCss);
	}
	return newCss;
}

//check mail
function checkMail(mail){
	var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
	if(typeof(mail) == "string"){
		if(er.test(mail)){ return true; }
	}else if(typeof(mail) == "object"){
		if(er.test(mail.value)){ return true; }
	}else{
		throw new Error("mail não é uma string ou um objeto.");
	}
	return false;
}

//procura needle no objeto
Object.prototype.haveIndex = function(needle){
	for(var i in this){
		if(typeof(i) != "function"){
			if(needle == this[ i ]){ return true;}
		}
	}
	return false;
}

//Une a propriedade property do objeto separando com glue
Object.prototype.propertyJoin = function(glue,property){
	var imploded;
	imploded = this[0][property];
	for(var i = 1; i < this.length; i++){
		imploded += glue + this[i][property];
	}
	
	return imploded;
}



//extraído da classe de formulários do site http://www.wait-till-i.com
//
function cancelClick(e){
	if (window.event){
		try{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}catch(a){
			return false;
		}
	}

	if (e){
		try{
			e.stopPropagation();
			e.preventDefault();
		}catch(a){
			return false;
		}
	}
}

//mostra uma espécie de popup para o usuário.
function showPopUp(msg,withTags){
	var nDiv = mkElement("div",{"id":"popup"});
	var bDiv = mkElement("div");
	var layerDiv = mkElement("div",{"id":"layer"});
	var txt;
	var nspn = mkElement("span",{"id":"popup_span"});
	
	if(withTags){
		txt = msg;
		nspn.innerHTML = txt;
	}else{
		txt = document.createTextNode(msg);
		nspn.appendChild(txt);
	}
	
	
	var fechar = mkElement("a",{"title":"fechar","href":"javascript: ;"});
	txt = document.createTextNode("Fechar");
	fechar.appendChild(txt);
	var args = arguments;
	fechar.onclick = function(){ 
		if (args[2] && typeof(args[2]) == 'function') {
			args[2]();
		}
		hidePopUp(); 
	}
	
	loadStyleSheet(cssDir+"/popup."+css_end+"css","popup_sheet",true);
	
	bDiv.appendChild(fechar);
	bDiv.appendChild(nspn);
	
	nDiv.appendChild(bDiv);
	
	document.body.appendChild(nDiv);
	document.body.appendChild(layerDiv);
	
	//dimensões
	layerDiv.style.width = document.body.offsetWidth+"px";
	layerDiv.style.height = document.body.offsetHeight+"px";
	
	nDiv.style.height = fechar.offsetHeight + calcAlt(nspn.innerHTML,nspn.offsetWidth,16) + 90 + "px";
	bDiv.style.height = fechar.offsetHeight + calcAlt(nspn.innerHTML,nspn.offsetWidth,16) + 80 + "px";return false;
}

//calcula a altura de alguns elementos baseado na sua largura
function calcAlt(txt,width,fS){
	var total = txt.length;
	total = total * (fS / 2);
	var height = total / width;
	return height;
}

//fecha o popup
function hidePopUp(){
	var popup = $("popup");
	popup.innerHTML = "";
	document.body.removeChild(popup);
	
	var layer = $("layer");
	document.body.removeChild(layer);
}

function jsArrayToPHPSerialized(a){
	var tipos = {"string":"s","number":"i","object":"a"};
	
	
	if(typeof(a) == "object"){
		var serialized = "a:###:{";
	}else{
		throw new Error("O argumento da função precisa ser do tipo objeto array");
		return false;
	}
	var i = 0;
	for(var key in a){
		if(typeof(a[key]) != "function"){
			var valor = a[key];

			serialized += tipos[typeof(key)]+":";
			serialized += typeof(key) == "string" ? key.length+":\""+key+"\";" : key+";";
			serialized += tipos[typeof(valor)]+":"+(typeof(valor) == "string" ? valor.length+":" : "");
			serialized += typeof(valor) == "string" ? "\""+valor+"\";" : valor+";";
			i++;
		}
	}
	serialized = serialized.replace(/\#\#\#/,i);
	serialized += "}";
	//document.write(serialized);
	return serialized;
}

/********************************************************************
 * Aqui já começa as funções/classes comuns ao site propriamente dito
 *********************************************************************/

//classe de eventos do site.
var startEvents = function (){
	this.events = new Array(5);
	this.events[0] = function(obj) {obj.startEventBusca();}
	this.events[1] = function(obj) {obj.startEventResizeWindow();}
}

startEvents.prototype.setEvent = function (evento){
	this.events[ this.events.length ] = evento;
}

//inicia todos os eventos
startEvents.prototype.startAllEvents = function (obj) {
	for (var i = 0; i < this.events.length; i++){
		try{ obj.events[ i ]( obj );}catch(e){ obj.events[ i ];}
	}
}

//evento do campo de busca
startEvents.prototype.startEventBusca = function (){
	var busca = $( "busca" );

	busca.onfocus = function (){ this.value = "";}; 
	busca.onblur = function (){this.value == "" ? this.value = "Buscar Comparação" : "";}
}

//evento que faz a página ter um tamanho legal qndo não tiver conteúdo suficiente
startEvents.prototype.startEventResizeWindow = function (){

}

//todo script que quiser colocar um evento para ser inicializado, deverá fazê-lo por _SE.setEvent();
var _SE = new startEvents();
window.onload = function() {  _SE.startAllEvents(_SE);}

function showLoadLabel(){
	var divContainer, divLabel,span;
	divContainer = mkElement("div",{"id":"load_layer"});
    
    divLabel = document.createElement("div");
    divLabel.setAttribute("id","loading");
	
	span = document.createElement("span");
		
	if( arguments[0] == undefined ){
		span.innerHTML = "Carregando...";
		span.innerHTML += "<a href=\""+ window.location + "\" id=\"load_fix\">Abortar!</a>";
	} else {
		span.innerHTML = arguments[0];
	}
	
	document.body.appendChild(divContainer);
	document.body.appendChild(divLabel)
	
	divContainer.style.height = (document.body.offsetHeight < 768 ? 768 : document.body.offsetHeight ) + "px";
	divContainer.style.width = document.body.offsetWidth + "px";
	
	$( "loading" ).appendChild(span);

	var ll = $( "load_fix" );
	
	try{ 
		ll.focus(); 
		ll.onclick = function(){ this.innerHTML = "cancelando...";} 
	}catch(e) {}
}

function hideLoadLabel() {
    var divContainer,divLabel;
    divContainer = $( "load_layer" );
    divLabel = $( "loading" );
    
    divContainer.innerHTML = "";
    divLabel.innerHTML = "";
    
    document.body.removeChild(divContainer);
    document.body.removeChild(divLabel);
}

//mensagem de erro
function showError(where){

	where.innerHTML = "";
	var n = "<span id=\"erro\">";
	typeof( arguments[1] ) == "string" ? n += arguments[1] : n += "Ocorreu um erro na página. Esse problema pode ser resolvido atualizando a página (F5 ou <a href=\"" + document.location + "\">Atualizar</a>).";
	n += "</span>";
	if(arguments[2] == true){
		where.innerHTML += n;
	}else{
		where.innerHTML = n;
	}
	
	try{
		hideLoadLabel();
	}catch(e){} 
	
	return false;
}

//função que mostra erros nos formulários dinâmicos
function showFormError(form,msg){
	try{
		var fe = $("form_error");
		if(fe.innerHTML == msg){
			return true;
		}else{
			fe.innerHTML == "";
			form.getElementsByTagName("fieldset")[0].removeChild(fe);
		}
	}catch(e){}
		
	var err = mkElement("span",{"id":"form_error"});
	err.innerHTML = msg;
	
	form.getElementsByTagName("fieldset")[0].appendChild(err);
}


/*************************************
 * Área do login e cadastro
 *************************************/


_SE.setEvent( function(obj) {obj.startEventMenuTopRight();} );

startEvents.prototype.startEventMenuTopRight = function () {
	var login = $("logInOut").getElementsByTagName("a")[0];
	var cadastro = $("logInOut").getElementsByTagName("a")[1];
	login.onclick = function () { showLogin();}
	cadastro.onclick = function () { showCadastro()}
}

function showLogin() {
	var layer, logDiv,logForm;
	
	layer = document.createElement("div");
	layer.setAttribute("id","cadastro_layer");
	layer.style.height = document.body.offsetHeight + "px";
	document.body.appendChild(layer);
	
	xmlRequest = new xmlHttpRequest();
	xmlRequest.onreadystatechange = function() {
		if(xmlRequest.readyState == 4){
			var xml = xmlRequest.responseText;
			var url_css = ""
			//carregando a folha de estilos
			loadStyleSheet(cssDir + "/login." + css_end + "css","login_css",true);
			//alert($("login_css").innerHTML);
			
			logDiv = mkElement("div",{"id":"login"});
			logDiv.innerHTML = xml;//"<br />"+cssDir+"/login."+css_end+"css";
			document.body.appendChild(logDiv);	
			
			if(typeof(valida_form_js) != "function"){
				valida_form_js = function (){ manipuladorLogin();}
			}else{
				manipuladorLogin();
			}
			
			loadScript(scriptDir + "/valida_form.js",true);
		}
	}
	xmlRequest.open("GET","../templates/login.xhtml",true);
	xmlRequest.send(null);
} 

function hideLogin(){
	var layer = $("cadastro_layer");
	var logDiv = $("login");
	var logCSS = $("login_css");
	
	logDiv.innerHTML = "";
		
	document.body.removeChild(logDiv);
	document.body.removeChild(layer);
	//só remove o css se for IE
	if(css_end != "ie."){
		try{
			logCSS.innerHTML = "";
		}catch(e){
			logCSS.styleSheet.cssText = "";
		}
		document.getElementsByTagName("head")[0].removeChild(logCSS);
	}
}

function showCadastro(iframe) {
	var layer, cadDiv,cadForm;
	
	layer = mkElement("div",{"id":"cadastro_layer"})

	document.body.appendChild(layer);
	
	layer.style.height = (document.body.offsetHeight < 768 ? 768 : document.body.offsetHeight) +"px";
	layer.style.width = document.body.offsetWidth;	
	
	xmlRequest = new xmlHttpRequest();
	xmlRequest.onreadystatechange = function() {
		if(xmlRequest.readyState == 4){
			var xml = xmlRequest.responseText;
			cadDiv = mkElement("div",{"id":"cadastro"});
			cadDiv.innerHTML = xml;
			document.body.appendChild(cadDiv);	
		
			//carregando a folha de estilos
			loadStyleSheet(cssDir + "/cadastro." + css_end + "css","cadastro_css",true);
		
			if(typeof(valida_form_js) != "function"){
				valida_form_js = function (){ manipuladorCadastro(iframe?iframe:false);}
			}else{
				manipuladorCadastro(iframe?iframe:false);
			}
		
			loadScript(scriptDir + "/valida_form.js",true);
		}
	}
	xmlRequest.open("GET","../templates/cadastro.xhtml",true);
	xmlRequest.send(null);

}

function hideCadastro(){
	var layer = $("cadastro_layer");
	var cadDiv = $("cadastro");
	var cadCSS = $("cadastro_css");
	
	cadDiv.innerHTML = "";
	
	document.body.removeChild(cadDiv);
	document.body.removeChild(layer);
	//só remove o css se for IE
	if(css_end != "ie."){
		try{
			cadCSS.innerHTML = "";
		}catch(e){
			cadCSS.styleSheet.cssText = "";
		}
		document.getElementsByTagName("head")[0].removeChild(cadCSS);
	}
}

//
function manipuladorLogin(){
	$("fecha_login").onclick = function (){ hideLogin();}
	
	$("btn_send_login").onclick = function(){
		var forM = document.login_form;//$("login_form");
		var fld = fieldCheck(forM);
		
		if( fld != false){
			var errMsg = "<br />Você não preencheu o campo "+fld.name;
			showFormError(forM,errMsg);
			
			fld.style.border = "2px solid red";
			fld.onkeydown = function() { this.style.borderColor = "#dedede";this.onkeydown = "";}
			
		}else{
			cancelClick(this);
			var ss = mkElement("input",{"name":this.id,"value":this.innerHTML,"type":"button"});
			ss.style.display = "none";
			forM.appendChild(ss);
	
			forM.submit();
								
		}
	}
	document.getElementsByName("senha")[0].onkeyup = function (e) {
		var keyNum;
		if(window.event){//IE fix
	    		keyNum = window.event.keyCode;
		} else if(e.keyCode){//gecko_based e opera
	   		keyNum = e.keyCode;
       		}
		if(keyNum == 13){//13 = enter
	    		$('btn_send_login').onclick();
        	}
	}
}


//
function manipuladorCadastro(iframe){
	//se for em um iframe, fecha o iframe  <<<======================>>>
	$("fecha_cadastro").onclick = function (){ hideCadastro();}
	var senha,confirM;
	var ff = $("cadastro_form");
	senha = $("cadastro_senha");
	confirM = document.getElementsByName("senha_confirm")[0];
	
	confirM.onblur = function (){ passwordCheck(senha,this,"cadastro_form"); }
	
	$("btn_send_cadastro").onclick = function(){
		var forM = $("cadastro_form");
		var fld = fieldCheck(forM);
		
		if( fld != false){
			var errMsg = "<br />Você não preencheu o campo "+fld.name;
			showFormError(forM,errMsg);
			
			fld.style.border = "2px solid red";
			fld.onkeydown = function() { this.style.borderColor = "#dedede";this.onkeydown = "";}
			
		}else if(passwordCheck(senha,confirM)){			
			try{
				cancelClick(this);
			}catch(e){}
			
			var ss = mkElement("input",{"name":this.id,"value":this.innerHTML,"type":"button"});
			ss.style.display = "none";
			forM.appendChild(ss);
			
			//=>>> Se for em um iframe, deve fazer via ajax 
			if(!iframe){

				forM.submit();
			}else{
				var url = "../modules/cadastro_on_the_fly.php";
				var opts = "nome="+$("cadastro_nome").value;
				opts += "&email="+$("cadastro_email").value;
				opts += "&senha="+$("cadastro_senha").value;
				opts += "&senha_confirm="+$("cadastro_senha_confirm").value;
				var xml = new xmlHttpRequest();
				
				xml.onreadystatechange = function(){
					if(xml.readyState == 4 && xml.status == 200){
						var response = xml.responseText;
						try{
							var rsObj = eval("(" + response + ")");
						}catch(e){
							showPopUp("Ocorreu um problema ao tentar enviar seu cadastro! Tente novamente mais tarde",false);
						}
						if(rsObj.Cadastrado){
							showPopUp(rsObj.Cadastrado.msg,false);
							hideCadastro();
						}else if(rsObj.Error){
							showPopUp("Erro "+rsObj.Error.errorNo+": "+rsObj.Error.errorMsg,false);
						}else{
							showPopUp("Ocorreu um problema ao tentar enviar seu cadastro! Tente novamente mais tarde",false);
						}
					}
				}
				
				xml.open("POST",url,true);
				xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    			xml.setRequestHeader('Content-length', opts.length );
				xml.send(opts);
			}
		}
	}

	$("cadastro_senha_confirm").onkeyup = function (e) {
		var keyNum;
		if(window.event){//IE fix
			keyNum = window.event.keyCode;
		} else if(e.keyCode){//gecko_based e opera
			keyNum = e.keyCode;
		}
		if(keyNum == 13){//13 = enter
			$('btn_send_cadastro').onclick();
	       	}
	}
}


/** Função para dar alert onde quiser e só aparecer se uma variável debug global estiver setada
 */
function debug(argumento) {
	if (document.DEBUG == true) {
		alert(argumento);
	} 
}
