/**
 functions to load a xml file, parse and put the content in a sparse matrix
*/

//load a xml to DOM, crossbrowser
function xmlLoader(url){
    if(window.XMLHttpRequest){
        var Loader = new XMLHttpRequest();
        Loader.open("GET", url + '?rand=' + Math.random(), false);
        Loader.send(null);
        return Loader.responseXML;
    }else if(window.ActiveXObject){
        var Loader = new ActiveXObject("Msxml2.DOMDocument.3.0");
        Loader.async = false;
        Loader.load(url);
        return Loader;
    }
}

//load a xml to a sparse matrix
function xmlArvore(xmlNode){
	var arvoreTxt = new Array(); //esta var armazenara o conteudo
	var tags = new Array(); //esta variavel cuidara de tags repetidas
	for(var i=0;i<xmlNode.childNodes.length;i++){//percorrendo os filhos do nó
		if(xmlNode.childNodes[i].nodeType == 1){//ignorar espaços em branco
			//se tiver filhos eu tenho que pegar o valor pegando o valor do primeiro filho
			if (tags[xmlNode.childNodes[i].nodeName] == null)
				tags[xmlNode.childNodes[i].nodeName] = 0;
			else
				tags[xmlNode.childNodes[i].nodeName] += 1;
			//reorganiza o vetor caso
			if (tags[xmlNode.childNodes[i].nodeName] == 1) {
				tmp = arvoreTxt[xmlNode.childNodes[i].nodeName];
				arvoreTxt[xmlNode.childNodes[i].nodeName] = new Array();
				arvoreTxt[xmlNode.childNodes[i].nodeName][0] = tmp;
			}
			if(xmlNode.childNodes[i].childNodes.length == 1) {
				if (tags[xmlNode.childNodes[i].nodeName] > 0)
					arvoreTxt[xmlNode.childNodes[i].nodeName][tags[xmlNode.childNodes[i].nodeName]] = xmlNode.childNodes[i].firstChild.nodeValue;
				else
					arvoreTxt[xmlNode.childNodes[i].nodeName] = xmlNode.childNodes[i].firstChild.nodeValue;
			}
			else {
				if (tags[xmlNode.childNodes[i].nodeName] > 0)
					arvoreTxt[xmlNode.childNodes[i].nodeName][tags[xmlNode.childNodes[i].nodeName]] = xmlArvore(xmlNode.childNodes[i]);
				else
					arvoreTxt[xmlNode.childNodes[i].nodeName] = xmlArvore(xmlNode.childNodes[i]);
			}
		}
	}
	return arvoreTxt;
}

//print the output of xml file idented
function xmlMicoxArvore(xmlNode,identacao){
    var arvoreTxt=""; //esta var armazenara o conteudo
    for(var i=0;i<xmlNode.childNodes.length;i++){//percorrendo os filhos do nó
  if(xmlNode.childNodes[i].nodeType == 1){//ignorar espaços em branco
   //pegando o nome do nó
   arvoreTxt = arvoreTxt + identacao + xmlNode.childNodes[i].nodeName + ": "
   if(xmlNode.childNodes[i].childNodes.length==0){
    //se não tiver filhos eu já pego o nodevalue
    arvoreTxt = arvoreTxt + xmlNode.childNodes[i].nodeValue
    for(var z=0;z<xmlNode.childNodes[i].attributes.length;z++){
     var atrib = xmlNode.childNodes[i].attributes[z];
     arvoreTxt = arvoreTxt + " (" + atrib.nodeName + " = " + atrib.nodeValue + ")";
    }
    arvoreTxt = arvoreTxt + "<br />\n";
   }else if(xmlNode.childNodes[i].childNodes.length>0){
    //se tiver filhos eu tenho que pegar o valor pegando o valor do primeiro filho
    arvoreTxt = arvoreTxt + xmlNode.childNodes[i].firstChild.nodeValue;
    for(var z=0;z<xmlNode.childNodes[i].attributes.length;z++){
     var atrib = xmlNode.childNodes[i].attributes[z];
     arvoreTxt = arvoreTxt + " (" + atrib.nodeName + " = " + atrib.nodeValue + ")";
    }
    //recursividade para carregas os filhos dos filhos
    arvoreTxt = arvoreTxt + "<br />\n" + xmlMicoxArvore(xmlNode.childNodes[i],identacao + "> > ");
   }
      }
    }
    return arvoreTxt;
}
