/**
 * Arquivo contendo funções que manipulam XML.
 *
 *
 */


/**
 * Esta função retorna uma string concatenando a expressao processada
 * para cada nó.
 *
 * @version			1.0
 * @author			Humberto Sales da Silva
 *
 * @param nodelist	Objeto NodeList, de nós que irão ser processados.
 * @param expressao	String da expressao que irá ser processada.
 *					Ex: "<tr><td>[ID]</td><td>[Nome]</td></tr>"
 *
 * @return			String com a concatenacao dos nós.
 *					Ex: var nodelist = MinhaIlhaXML.selectNodes("//Pessoa")
 *					    strRows = processarExpressaoNodelist(nodelist, "<tr><td>[ID]</td><td>[Nome]</td></tr>")
 */

function processarExpressaoNodelist(nodelist, expressao) {
    var no;
    var resultado;
    var valorAtual;
    var arrayExpressao;
    
    
    resultado = "";
    
	for (var i = 0; i < nodelist.length; i++){
		resultado = resultado + processarExpressaoNode(nodelist[i],expressao)
	}
    
    return resultado;
    
}





/**
 * Esta função apaga os itens de um objeto Select (Combo ou List)
 * e adiciona os itens que estao na lista de nós XML (nodelist)
 * de acordo com as expressões enviadas nos parametros.
 *
 * @version			1.0
 * @author			Humberto Sales da Silva
 *
 * @param objSelectForm		Objeto Select que irá ser carregado com os itens.
 * @param nodelist			Objeto NodeList, de nós que irão preencher o Select.
 * @param expressaoValor	String de expressao que irá ficar no valeu de cada item.
 * @param expressaoTexto	String de expressao que irá ficar no texto de cada item.
 * @param valorSelecionado	String de valor(es) que identifica(m) os itens que deve(m)
 *							ser selecionado(s). Se for mais de um valor,
 *							deve-se separar por virgula os valores.
 * @param temItemEmBranco	Bolleano q diz se vai ter um item em branco no select.
 *
 * @return			Não tem retorno.
 *					Ex: var nodelist = IlhaGrupo.documentElement.selectNodes("//Pessoa");		
 *						gerarOptionsSelect(document.FormularioConsultar.MeuCombo,nodelist,"[IDPessoa]","[NomePessoa]","93,95",false);
 */
function gerarOptionsSelect(objSelectForm, nodelist, expressaoValor, expressaoTexto, valorSelecionado, temItemEmBranco){
	var valorAtual;
		
	//Limpando os dados do select
	objSelectForm.innerHTML = '';
	
	if (valorSelecionado != ''){
		valorSelecionado = ',' + valorSelecionado + ','
	}	
		
	if (temItemEmBranco){
		//Adiciona um item em branco
		objSelectForm.add(new Option('',''));		
	}
		
	//Adicionando os itens ao select
	for (var i = 0; i < nodelist.length; i++){
		valorAtual = processarExpressaoNode(nodelist[i],expressaoValor);
		var option = 
			new Option(processarExpressaoNode(nodelist[i],expressaoTexto), valorAtual);
		if (valorSelecionado.indexOf(valorAtual) >= 0){
			option.selected = true;
		}
			
		objSelectForm.add(option);
	}
}
	

/**
 * Esta função processa uma expressão baseando-se nos atributos
 * contidas no nó XML enviado por parametro.
 *
 * @version			1.0
 * @author			Humberto Sales da Silva
 *
 * @param no		Objeto Node é um nó do XML.
 * @param expressao	String da expressao que irá ser processada.
 *					Ex: "Meu ID é [ID], e meu nome é [Nome]!"
 *
 * @return			String representando o valor processado da expressão.
 *					Ex: var node = MinhaIlhaXML.selectNodes("//Pessoa")[0]
 *						//node= XML("<no ID='1' Nome='Humberto'/>")
 *						MeuValor = processarExpressaoNode(node, "[ID] - [Nome]")
 *						//return "Meu ID é 1, e meu nome é Humberto"
 */
function processarExpressaoNode(no,expressao){
    var resultado = "";
    var vetor = expressaoToArray(expressao);
    var chaves = "";
    var atributo = "";

    for(var i=0; i<vetor.length; i++){
            chaves = "" + vetor[i].charAt(0);                
            chaves = chaves + ("" + vetor[i].charAt(vetor[i].length-1));
				
            if(chaves == "[]"){                
                atributo = vetor[i].substring(1,vetor[i].length-1);
                //retorno += no.getAttributes().getNamedItem(atributo).getNodeValue().toString();
                resultado += no.getAttribute(atributo);
                    
             }else{
                 resultado += vetor[i];
             }
    }
    return resultado;
}
    
/**
 * Transforma a string que contem expressão em um array, 
 * separando expressao e texto.
 *
 * @version		1.0
 * @author		Humberto Sales da Silva
 *
 * @param a		String com a expressao.
 *				Ex: "Meu ID é [ID], e meu nome é [Nome]!"
 *
 * @return		Retorna um array. 
 *				Ex: ("Meu ID é ";"[ID]";", e meu nome é ";"[Nome]";"!")
 */
function expressaoToArray(a){
    a = replaceAll(a,"[","ß[");
    a = replaceAll(a,"]","]ß");
    return a.split("ß");
}
	
/**
 * Faz a mesma operção da função 'replace', nativa do Javascript, mas faz 
 * as substiuições para todas as ocorrência na String.
 *
 * @version		1.0
 * @author		Humberto Sales da Silva
 *
 * @param varb			String original.
 * @param replaceThis	String que irá ser substituída.
 * @param replaceBy		String que irá substituir.
 *
 * @return				Retorna a string original, com as substituições. 
 */
function replaceAll(varb, replaceThis, replaceBy)
{	
    	newvarbarray=varb.split(replaceThis);
    	newvarb=newvarbarray.join(replaceBy);	
    	return newvarb;
}
	
/**
 * Retorna o maior valor encontrado na do atributo na consulta especificada.
 *
 * @version		1.0
 * @author		Daniel C. Rodrigues
 *
 * @param objXML		Objeto XML
 * @param strAtributo	Nome do atributo em que o maior valor sera pesquisado.
 * @param strXpath		Consulta que determinará a lista de nós que serão pesquisados.
 *
 * @return				Retorna o maior valor encontrado.
 */	
function getMax(objXML, strAtributo, strXpath)
{
	try
	{
		var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
			
		var strXSL = "<?xml version='1.0'?>"
		strXSL += "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"
		strXSL += "<xsl:output method='text'/>"
		strXSL += "<xsl:template match='/'>"
		strXSL += "<xsl:for-each select='" + strXpath + "'>"
		strXSL += "<xsl:sort select='@" + strAtributo + "' order='descending'/>"
		strXSL += "<xsl:if test='position() = 1'>"
		strXSL += "<xsl:value-of select='@" + strAtributo + "'/>"
		strXSL += "</xsl:if>"
		strXSL += "</xsl:for-each>"
		strXSL += "</xsl:template>"
		strXSL += "</xsl:stylesheet>"
    
		xslDoc.loadXML(strXSL)
			
		return objXML.transformNode(xslDoc.documentElement);	
			
	}
	catch(e)
	{
		alert(e.message);
	}
}
  
/**
 * Retorna o próprio xml de entrada ordenado, de acordo com os parametros.
 *
 * @version		1.0
 * @author		Humberto Sales da Silva
 *
 * @param objXML		Objeto XML (DOM)
 * @param select		String, Expressão que a função irá 
 *						se basear para ordenar, podendo ser nome de atributo, nó,
 *						concatenacao de atributos, utilizando funções do XSL.
 *						Se for atributo, o parametro deve iniciar
 *						com '@'. ex: @NomeEntidade
 * @param isDescending	Boleano, se false, os dados seráo ordenados ascendentemente,
 *						se verdadeiro, serão em ordem inversa. Opcional. Default false.
 * @param strType		Tipo de dado do parametro Select. 
 *						Pode ser "date", "numeric" ou "text" Opcional. Default é "text".
 *						Se for date, o valor o qual o XSL vai ser basear (parametro select),
 *						deve ser uma data no formato DD/MM/YYYY.
 * @param isLowerFirst	Boleano, se verdadeiro irá ordenar primeiro os valores 
 *						que iniciam minusculo e depois os maiusculos, caso falso, 
 *						faz o inverso. Opcional. Default false.
 *
 * @return				Retorna a string XML ordenada.
 *
 *						Ex: MinhaIlhaXML.loadXML(sortXML(MinhaIlhaXML,"@NomeOrgao",true));
 */	

function sortXML(objXML, select, isDescending, strType, isLowerFirst)
{
	try
	{
		
		var ordem = (isDescending || false) ? "descending" : "ascending";
		var tipo = "text" || strType;
		var caseOrder = (isLowerFirst || false) ? "lower-first" : "upper-first";
		
		if (tipo == "date"){
			tipo = "text";
			select = "concat(substring("+select+", 7,4),substring("+select+", 4,2),substring("+select+", 1,2))";
		}
		
		var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
			
		var strXSL = "<?xml version='1.0'?>"
		strXSL += "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"
		strXSL += "<xsl:template match='*|text()|@*'>"
		strXSL += "<xsl:copy>"
		strXSL += "<xsl:apply-templates select='*|text()|@*'>"
		strXSL += "<xsl:sort select='" + select + "' order='" + ordem + "' data-type='" + tipo + "' case-order='" + caseOrder + "'/>"
		strXSL += "</xsl:apply-templates>"
		strXSL += "</xsl:copy>"
		strXSL += "</xsl:template>"
		strXSL += "</xsl:stylesheet>"
    
		xslDoc.loadXML(strXSL)
			
		return objXML.transformNode(xslDoc.documentElement);	
			
	}
	catch(e)
	{
		alert(e.message);
	}
}

/**
 * Retorna o próprio xml de entrada filtrado, de acordo com os parametros.
 *
 * @version		0.1
 * @author		Cleofas 
 *
 * @param objXML		Objeto XML (DOM)
 * @param select		nome do campo que vai determinar o filtro. . ex: @NomeEntidade
 * @param texto			valor texto que vai ser ultilizado no filtro. 
 *						O filtro é feito ignorando maiusculas e minusculas e 
						o conteúdo e pesquisado como like '%texto%'.
 * @return				Retorna a string XML filtrada.
 *
 *						Ex: MinhaIlhaXML.loadXML(filtrar(MinhaIlhaXML,"@NomeOrgao","XX"));
 * OBS. Estou tentando ainda...
 */	

function filtrar(objXML, select, texto)
{
	try
	{
		var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
		
		var strXSL = "<?xml version='1.0'?>"
		strXSL += "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"
		strXSL += "<xsl:variable name='lcletters'>abcdefghijklmnopqrstuvwxyz</xsl:variable>"   
		strXSL += "<xsl:variable name='ucletters'>ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>" 
		strXSL += "<xsl:template match='*|text()|@*'>"
		strXSL += "<xsl:copy>"
		strXSL += "<xsl:copy-of select=\"" +((texto)?'node()[contains(translate('+ select +',$lcletters,$ucletters) , \'' + texto.toUpperCase() + '\')] ':'node()')+ "\"/>"
		strXSL += "</xsl:copy>"
		strXSL += "</xsl:template>"
		strXSL += "</xsl:stylesheet>"   
    
   
		xslDoc.loadXML(strXSL)			  
		return objXML.transformNode(xslDoc.documentElement);	
			
	}
	catch(e)
	{
		alert(e.message);
	}
}

function deletar(objXML, select, texto)
{
	try
	{
		var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
		
		var strXSL = "<?xml version='1.0'?>"
		strXSL += "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>"
		strXSL += "<xsl:variable name='lcletters'>abcdefghijklmnopqrstuvwxyz</xsl:variable>"   
		strXSL += "<xsl:variable name='ucletters'>ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>" 
		strXSL += "<xsl:template match='*|text()|@*'>"
		strXSL += "<xsl:call-template name='filtra'/>  "	
		strXSL += "</xsl:template>"
		strXSL += "<xsl:template name = 'filtra'>"
		strXSL += "<xsl:copy>"
		strXSL += "<xsl:copy-of select=\"" +((texto)?'node()[not( contains(translate('+ select +',$lcletters,$ucletters) , \'' + texto.toUpperCase() + '\' ) )]':'node()')+ "\"/>"
		strXSL += "</xsl:copy>"
		strXSL += "</xsl:template>"
		strXSL += "</xsl:stylesheet>"   
		//"@*[not(.='')]|node()"
		//alert(strXSL)
		xslDoc.loadXML(strXSL)			
		//alert(xslDoc.xml)  
		return objXML.transformNode(xslDoc.documentElement);	
			
	}
	catch(e)
	{
		alert(e.message);
	}
}

