/* nteste.js */
/*try{
	InitFlash("flashLoaded");
}catch(e){}

function flashLoaded(){
    //var results = dojo.flash.comm.sayHello("Did I leave the iron on?");
    //dojo.debug(results);
	return true;
}*/

//classe comparacao
var comparacao = function (){
    this.url = '../includes/mkComp.php?output=js';//"http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=charlesschaefer&results=1&output=json";
    this.itensContainer = $( "itens_comparacao" );
    this.itensToComp = new Array;//itens para comparar
    this.itensResult = new Array;//resultado de cada item
    this.titulo = "";//
    this.assunto = "";//
    this.comp_obs = "";//
    this.sinonimos = "";//
    this.tipo_item = "";//
    this.type = 1;//tipo de comparação: {1} = fama; {2} = fama relativa/CC
}

//função que insere os itens entre aspas se a string contiver espaços no meio
comparacao.prototype.formatStrictSearch = function(word){
	var re = new RegExp(/[a-zA-Z0-9]+\s[a-zA-Z0-9]+/);
	if(re.test(word)){//encontrou espaços
		var nWord = '"' + word + '"';
		return nWord;
	}
	return word;
}
//montar a url para a comparacao no servidor
comparacao.prototype.mountQuery = function (e){
    var nUrl = this.url;
    for ( key in e )
    {
		if( typeof( e[ key ] ) != "function" ){
			try{
				val = encodeURIComponent(e[key]);
			}catch(e){
				val = encodeURI(e[key]);
			}
			nUrl += "&" + key + "=" + val;
		}
    }
    return nUrl;
}


/**
 * pegar da página os itens para a comparação
 * @param {boolean} nComp
 */
comparacao.prototype.setItensToComp = function (nComp){
    if(!nComp){
		var itens = this.itensContainer.getElementsByTagName("li");
    	var nItens = new Array;
    	for ( var i = 0; i < itens.length; i++ )
    	{
	        if( itens[ i ].childNodes[0].nodeType == 3)//texto
    	    {
        	    nItens[ i ] = itens[ i ].childNodes[0].nodeValue;
        	}
    	}
    
    	this.itensToComp = nItens;
	} else {
		var nItem = new Array();
		//arguments[1] é um array
		nItem[ nItem.length ] = arguments[1];
		this.itensToComp = nItem;
	}
}

//seta os atributos da comparacao, como titulo, assunto, etc. so funciona com objetos cujos values estao disponiveis
//trabalha com argumentos na forma arg[0] = "titulo", etc;
comparacao.prototype.setCompAttribute = function (e){
    for ( key in e )
    {
        try{ //alert(this[ e[ key ] ]+ e[ key ]);
        	//busca na página o valor requerido
            this[ e[ key ] ] = $( e[ key ] ).value;
        }catch(e){
            return false;
        }
    }
    return true;
}

//executa a comparacao
/**
 * 
 * @param {integer} type: {1} = fama; {2} = fama relativa/CC
 */
comparacao.prototype.doComp = function (type,callBack){
    var urlArgs = new Array(1);
    var url;
	var cb = callBack;
	
	//query = último registro do itensToComp
    urlArgs[ 'query' ] = this.formatStrictSearch( this.itensToComp[ (this.itensToComp.length - 1) ]);
	urlArgs[ 'query' ] += " AND " + this.formatStrictSearch(this.assunto);
	
	//seta o tipo de comparação
	this.type = type;
	
	//objeto flashxmlhttprequest
    var fxhr;
// TODO: Modificar aqui para podermos ter os valores necessários

	if ( typeof (fxhr) != 'object')
	{
		fxhr = new xmlHttpRequest();
	} 
	//alert(type);
	//alert(typeof( this.itensResult[ this.itensToComp[ (this.itensToComp.length -1) ] + "_cc" ]));
	//se a comparação for do tipo Fama Relativa/CC
	if( type == 2 && typeof( this.itensResult[ this.itensToComp[ (this.itensToComp.length -1) ] + "_cc" ]) == "undefined"){
		this.comp_obs != this.assunto ? urlArgs[ 'query' ] += " AND " + this.formatStrictSearch(this.comp_obs) : "";
		try{
			var sinonimos = this.sinonimos.split(",");
			
			//coloca os sinonimos na query.
			for( var i = 0; i < sinonimos.length; i++){
				typeof(sinonimos[i]) != "function" ? urlArgs[ 'query' ] += " OR " + this.formatStrictSearch(sinonimos[i]) : "";
			}
		}catch(e){
			var sinonimos = this.sinonimos;
			urlArgs[ 'query' ] += " OR " + this.formatStrictSearch(sinonimos);
		}
	}
	
	debug(urlArgs['query']);
	url = this.mountQuery( urlArgs );
	
	//cp é o objeto global da comparacao
    fxhr.onreadystatechange = function (){ //alert(fxhr.responseText);
		if (fxhr.readyState != 4){
			return;
		} 
		
		debug('onreadystatechange and readyState == 4');
		// só passa se readyState == 4
		try{
			var itenResultOb = eval( "(" + fxhr.responseText + ")");
		}catch(e){
			/*showPopUp("Parece que você não possui o Plugin Adobe Flash&copy; instalado.<br />"
			+ "Faça o <a href='http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash'>download do Plugin flashPlayer</a> para realizar uma comparação!",true);*/
			debug(e+'\n'+fxhr.responseText);
			showPopUp("Ocorreu um erro na hora de fazer a requisição ao servidor. <br/>"+
			"Se o problema persistir entre em contato com a equipe ComparaTudo!", true);
			return false;
		}
		
		var itenResult;
		// Mensagem de erro de excesso de comparações p/ dia
		try {
			itenResult = itenResultOb.ResultSet.totalResultsAvailable;
		} catch (e) {
			try {
				showPopUp(itenResultOb.Error.Message, true, function () {window.location = window.location;});
				return false;
			} catch (e) {
				showPopUp("Ocorreu um erro na hora de fazer a requisição ao servidor. <br/>"+
			"Se o problema persistir entre em contato com a equipe ComparaTudo!", true);
				return false;
			}
		}
		
		
		debug(itenResult);
		//alert(cp.titulo);
		
		//se comparação Fama, pode retirar o item a comparar
		if( cp.type == 1 ){
			
			//itensResult[ultimo de itensToComp] e tira o ultimo de itensToComp
			cp.itensResult[ cp.itensToComp.pop() ] = itenResult; 
			if( cp.itensToComp.length > 0 ){
				 cp.doComp(cp.type,cb);
			} else{
				eval(cb[0]+"(\""+cb[1]+"\")");
			}
		}else{

			if( cp.itensResult[ cp.itensToComp[ (cp.itensToComp.length -1) ] + "_cc" ] != undefined){
				//já fez a comparação cc e podemos retirar o item a ser comparado
				cp.itensResult[ cp.itensToComp.pop() ] = itenResult;
				if( cp.itensToComp.length > 0 ){
					cp.doComp(cp.type,cb);
				} else{
					eval(cb[0]+"(\""+cb[1]+"\")");
				}
				
			} else {//ainda temos que fazer uma comparação CC
				cp.itensResult[ cp.itensToComp[ (cp.itensToComp.length -1) ] + "_cc" ] = itenResult;
				cp.doComp(cp.type,cb);
			}
		}
    }
	debug('vai entrar agora');
	fxhr.open("GET",url, true);
	fxhr.send(null);        
}


//mostra a comparacao
comparacao.prototype.showComp = function (){
	try{
		hideLoadLabel();
	}catch(e){}
	
	showLoadLabel("aguarde... montando o resultado");
	var xmlRequest = new xmlHttpRequest();
	var args = arguments;
	//baixando o modelo da terceira parte
	xmlRequest.onreadystatechange = function () {
		if( xmlRequest.readyState == 4){
			var result = xmlRequest.responseText;
			var toInsert = $( "etapa_um" );
			toInsert.innerHTML = "";
			toInsert.innerHTML = result;
			
			var itens = cp.itensResult;
			var itensTotal = 0;	
			var itensNormal = [];
			
			var table = toInsert.getElementsByTagName("table")[0].tBodies[0];
			//alert(cp.type);
			var teste = new RegExp(".*\_cc$");
			if( cp.type == 2 ){
				
				for ( var indice in itens ){
	
					if ( itens[ indice ] != "" && typeof( itens[ indice ]) != "function" && !teste.test(indice)){
						//propriedade = propriedade_cc / propriedade
						itensNormal[ indice ] = itens[ indice ];
						itens[ indice ] = ( itens[ indice + "_cc"] / itens[ indice ] ) * 100;//alert(itens[indice]);
						itens[ indice ] = new Number(itens[ indice ].toFixed(4));
						//limpa propriedade_cc
						
						var compTipo = 2;
					}
				}
			}else{
				var compTipo = 1;
			}
				
			//contando o total pra mostrar a porcentagem
			for ( e in itens ){
				if( typeof(itens[ e ]) != "function"){
					if(cp.type == 1 || cp.type == 2 && !teste.test( e )){
						itensTotal += itens[ e ];
					}
				}
			}
	
			//montando o corpo da tabela
			for ( key in itens){
				if( typeof(itens[ key ]) != "function"){
					if(cp.type == 1 || cp.type == 2 && !teste.test( key )){
						var pct = itens[ key ] * 100;
						pct = (pct / itensTotal).toFixed(2);
			/* vamos inserir alguns pseudo-atributos no tr, para depois pegar seus valores
			 e montar a comparação com os novos itens */
						var tr;
						cp.type == 1 ? tr = mkElement("tr",{"class":"comp_cc_ref_val"}) : tr = mkElement("tr",{"val":itens[ key ],
						"val_cc":itens[ (key + "_cc")],
						"val_normal":itensNormal[ key ],
						"class":"comp_cc_ref_val"});

						var td1 = mkElement("td",{"class":"item_comparado"});
						td1.innerHTML = key;
					
						var td2 = mkElement("td",{"class":"valor_encontrado"});
						td2.innerHTML = itens[ key ];
					
						var td3 = mkElement("td",{"class":"porcentagem"});
						td3.innerHTML = pct + "%";
					
						var delItem = mkElement("a",{"href":"javascript: ;"});
						delItem.innerHTML = "Excluir Item?";
					
						var td4 = mkElement("td",{"class":"excluir_item"});
						td4.appendChild(delItem);
					
						tr.appendChild(td1);
						tr.appendChild(td2);
						tr.appendChild(td3);
						tr.appendChild(td4);

						table.appendChild(tr);		
						
						delItem.onclick = function(){ cp.removeItemFromTable(this,table);}			
					}
				}
				delete(itens[ key + "_cc" ]);
			}
			
			
			$( "comp_title" ).innerHTML = cp.titulo;
			
			var barraUrl = "../graphs/barras.php?val=";
			var pUrl = "../graphs/pizza.php?val=";
			var val = "";
			var lbl = "";			
			for(var a in itens){				
				if( typeof(itens[ a ]) != "function"){					
					val += val == "" ? itens[ a ] : "," + itens[ a ];					
					lbl += lbl == ""  ? a : "," + a;					
				}
			}
			barraUrl += val + "&lbl=" + lbl + "&dec=2";			
			pUrl += val + "&lbl=" + lbl + "&dec=2";			
			
			var gpizza = $( "gpizza" );
			var gbarra = $( "gbarra" );
			
			gpizza.getElementsByTagName("img")[0].setAttribute("src",pUrl);
			gbarra.getElementsByTagName("img")[0].setAttribute("src",barraUrl);

			
			try{
				var addItem = $("add_new_item");
				var ht = "<input type='hidden' value='";
				addItem.innerHTML += ht + compTipo + "' id='tipo_comp' />";
				addItem.innerHTML += ht + cp.titulo + "' id='titulo' />";
				addItem.innerHTML += ht + cp.assunto + "' id='assunto' />";
				addItem.innerHTML += ht + cp.tipo_item + "' id='tipo_item' />";
				if( cp. type == 2){ //comparacao CC
					addItem.innerHTML += ht + cp.comp_obs + "' id='comp_obs' />";
					addItem.innerHTML += ht + cp.sinonimos + "' id='sinonimos' />";
				}
				mudarEtapas($("link_etapa_dois"),$("link_etapa_tres"));
				$("link_etapa_dois").setAttribute("class","etapas_blur etapa_dois_blur_no_acces");
				
			}catch (e){
				showError($("comparacao"));
				hideLoadLabel();
			}
			
			hideLoadLabel();//esconde o que abrimos
			_SE.graphLink();
			
			
			try{
				eval(args[0]);
			}catch(e){}
			
		}//close xml.readyState == 4

	}//close xmlRequest.onreadystatechange()
	
	xmlRequest.open("GET","iniciar_comparacao3.html",true)
	xmlRequest.send(null);
	
	var link = loadStyleSheet(cssDir+"/iniciar_comparacao3."+css_end+"css","redefinicao_estilos_ff",false);	
}

comparacao.prototype.showNewComp = function () {
	var itens = cp.itensResult;
	var itensTotal = new Number();	
	var toInsert = $( "etapa_um" );
	var table = toInsert.getElementsByTagName("table")[0].tBodies[0];
	var results = document.getElementsByClassName("valor_encontrado");
	var itensComparados = document.getElementsByClassName("item_comparado");
	var porcentagens = document.getElementsByClassName("porcentagem");
	var nItens = new Array();
	var itensNormal = [];
	
	//alert(cp.type);	
	
	var teste = new RegExp(".*\_cc$");

	//colocando os antigos resultados no array
	for ( var indice in results ){
		if ( results[ indice ].innerHTML != "" && typeof( results[indice] ) != "function"){
			//propriedade = propriedade_cc / propriedade
			nItens[ itensComparados[ indice ].innerHTML ] =  results[ indice ].innerHTML;
			nItens[ itensComparados[ indice ].innerHTML ] = new Number(new Number( nItens[ itensComparados[ indice ].innerHTML ] ).toFixed(4));
		}
	}	

	if( cp.type == 2 ){	
		//montando o resultado para o resultado atual
		for ( var indice in itens){
			if ( itens[ indice ] != "" && typeof( itens[indice] ) != "function" && !teste.test(indice)){
				itensNormal[ indice ] = itens[ indice ];
				//propriedade = propriedade_cc / propriedade
				itens[ indice ] = ( itens[ indice + "_cc"] / itens[ indice ] ) * 100;
				itens[ indice ] = new Number(itens[ indice ].toFixed(4));
			}
		}
	}
	
	//colocando os resultados atuais no array tbm
	for( var e in itens){
		if(typeof(e) != "function" && !teste.test(e)){
			nItens[ e ] = itens[ e ];
		}
	}
	
	//contando o total pra mostrar a porcentagem
	for (var e in nItens ){
		if( typeof(nItens[e]) != "function"){
			var n = new Number(nItens[e]);
			itensTotal = itensTotal + n;
		}
	}
	//alert(itensTotal);
	//montando as linhas da tabela para esse novo item
	for ( var key in itens ){
		if( typeof(itens[ key ]) == "number" || typeof(itens[key]) == "string" || typeof(itens[key]) == "object"){
			if(cp.type == 1 || cp.type == 2 && !teste.test( key )){
				var pct = itens[ key ] * 100;
				pct = (pct / itensTotal).toFixed(2);
			
				var tr;
				cp.type == 1 ? tr = mkElement("tr",{"class":"comp_cc_ref_val"}) : tr = mkElement("tr",{"val":itens[ key ],
				"val_cc":itens[ (key + "_cc")],
				"val_normal":itensNormal[key],
				"class":"comp_cc_ref_val"});

				var td1 = mkElement("td",{"class":"item_comparado"});
				td1.innerHTML = key;
			
				var td2 = mkElement("td",{"class":"valor_encontrado"});
				td2.innerHTML = itens[ key ];
					
				var td3 = mkElement("td",{"class":"porcentagem"});
				td3.innerHTML = pct + "%";
					
				var delItem = mkElement("a",{"href":"javascript: ;"});
				
				delItem.innerHTML = "Excluir Item?";
					
				var td4 = mkElement("td",{"class":"excluir_item"});
				td4.appendChild(delItem);
				
				tr.appendChild(td1);
				tr.appendChild(td2);
				tr.appendChild(td3);
				tr.appendChild(td4);

				table.appendChild(tr);
				
				delItem.onclick = $("id_comparacao") ? function(){ voteToExclude($("id_comparacao").value)} : function(){ cp.removeItemFromTable(this,table);}
				
				//variáveis para mandar o novo item para o servidor
				try{
					var coisas = key;
					var vals = cp.type == 2 ? itensNormal[key] : itens[key];
					var val2 = cp.type == 2 ? itens[ (key + "_cc") ] : "";
					var idComp = $("id_comparacao").value;
					var tpComp = cp.type == 2 ? "CC" : "FAMA";
				}catch(E){}
			}
		}
	}
	
	document.getElementById( "new_item" ).value = "";
	
	//atualizando as linhas dos itens antigos
	for (var i in porcentagens){
		if(typeof(porcentagens[i]) != "function"){
			var pct = new Number(results[i].innerHTML) * 100;
			porcentagens[i].innerHTML = (pct / itensTotal).toFixed(2) + "%";
		}
	}
	
	var barraUrl = "../graphs/barras.php?val=";
	var pUrl = "../graphs/pizza.php?val=";
	var val = "";
	var lbl = "";
	
	for(var i = 0; i < (table.getElementsByTagName("tr").length - 1); i++){
		var tr = table.getElementsByTagName("tr")[i];
		if( typeof( document.getElementsByClassName("valor_encontrado")[i].innerHTML) == "string"){
			val += val == "" ? document.getElementsByClassName("valor_encontrado")[i].innerHTML : "," + document.getElementsByClassName("valor_encontrado")[i].innerHTML;
			lbl += lbl == "" ? document.getElementsByClassName("item_comparado")[i].innerHTML : "," + document.getElementsByClassName("item_comparado")[i].innerHTML;
		}
	}
	
	barraUrl += val + "&lbl=" + lbl + "&dec=2";
	pUrl += val + "&lbl=" + lbl + "&dec=2";
	
	var gpizza = $( "gpizza" );
	var gbarra = $( "gbarra" );
	
	gpizza.getElementsByTagName("img")[0].setAttribute("src",pUrl);
	gbarra.getElementsByTagName("img")[0].setAttribute("src",barraUrl);
	
	hideLoadLabel();//esconde o que abrimos
	_SE.graphLink();
	
	if(arguments[0]){
		cp[arguments[0]]({"coisas":coisas,"results":vals,"result2":val2,"id":idComp,"tpComp":tpComp});
	}	
	
}

comparacao.prototype.sendNewItem = function(q){
	var xml = new xmlHttpRequest();
	
	var url_to_send = "../modules/update.php";
	var strData = "results="+q.results+"&result2="+q.result2+"&id="+q.id+"&coisas="+q.coisas+"&tpComp="+q.tpComp;
	
	xml.onreadystatechange = function(){
		if(xml.readyState == 4 && xml.status == 200){
			var resp = xml.responseText;
			if(resp == "ok"){
				alert("Novo item inserido com sucesso!");
				var table = document.getElementsByTagName("table")[0].tBodies[0];
				table.getElementsByTagName("a")[ table.getElementsByTagName("a").length ].onclick = function(){
					voteToExclude("n",id,idc,idu);
				}
			}else if(resp == "você não está logado"){
				var remember = $("remember");
				if(!remember){
					remember = mkElement("input",{"type":"hidden","id":"remember"});
					document.forms[0].appendChild(remember);
					alert("Para armazenar este novo item no nosso banco de dados você precisa estar logado!");
				}
			}
		}
	}
	
	xml.open("POST",url_to_send,true);
	xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xml.setRequestHeader('Content-length', strData.length );
	xml.send(strData);	
}

//reorganiza os itens após exclusões
comparacao.prototype.reorganizeItens = function(){
	var trs = document.getElementsByClassName("comp_cc_ref_val");
	var total = new Number();
	for(var i in trs){
		if(typeof(trs[i]) != "function"){			
			var ref = trs[i].getElementsByTagName("td")[1].innerHTML;
			total += ref;
		}
	}
	for(var e in trs){
		if(typeof(trs[e]) != "function"){
			var ref = trs[e].getElementsByTagName("td")[1].innerHTML;
			trs[e].getElementsByTagName("td")[2].innerHTML = (ref * 100 / total) + "%";
		}
	}
}

comparacao.prototype.removeItemFromTable = function(itemId,parentN){
	var item = itemId.parentNode.parentNode;
	item.innerHTML = "";
	parentN.removeChild(item);
	this.reorganizeItens();
}

//votar no item
var voteToExclude = function(optV,id,idc,idu){
	var xml = new xmlHttpRequest();
	!idu ? idu = "" : "";
	xml.onreadystatechange = function(){
		if(xml.readyState == 4 && xml.status == 200){
			//enviar um voto para o servidor.
			if(xml.responseText == "ok"){
				showPopUp("Seu voto foi computado com sucesso! Obrigado!");
			}else if(xml.responseText == "1"){
				showPopUp("Você já votou neste item e não pode votar novamente!");
			}
		}
	}
	xml.open("GET","../modules/votar.php?optV=" + optV + "&id=" + id + "&idc=" + idc + "&idu=" + idu,true);
	xml.send(null);
}
