function muestraMetadatos(m) {
	var largo = m.length;
	var j = 0;
	for (var i in m.items) {
		if (j >= largo) {
			break;
		}
		alert('key is: ' + i + ', value is: ' + m.items[i]);
		j++;
	}
};

function muestra(nodo, id, padre) {
	var msg = "";
	msg = "Nombre= " + nodo.nodeName+"\n";
	msg += "ID= "+id+"\n";
	msg += "Padre= "+padre+"\n";
	alert(msg);
};

function se_incluye_en_arbol(nodo) {
	// Retorna True si el elemento se muestra en el arbol o TOC
	var nom = nodo.nodeName;
	var se_incluye = false;
	
	switch(nom)
	{
		case "NORMA":
			se_incluye = true;
			break;
		case "ENCABEZADO":
			se_incluye = true;
			break;
		case "ESTRUCTURA_FUNCIONAL":
			se_incluye = true;
			break;
		case "PROMULGACION":
			se_incluye = true;
			break;
		case "ANEXO":
			se_incluye = true;
			break;
	}
	return se_incluye;
};

function getMetadatos(nodo) {
    var nom = nodo.nodeName;
	var metadatos = null;
	
	switch(nom)
	{
		case "NORMA":
			metadatos = new Norma(nodo);
			break;
			
		case "ENCABEZADO":
			metadatos = new Encabezado(nodo);
			break;
		case "ESTRUCTURA_FUNCIONAL":
			metadatos = new EstructuraFuncional(nodo);
			break;
		case "PROMULGACION":
			metadatos = new Promulgacion(nodo);
			break;
		case "ANEXO":
			metadatos = new Anexo(nodo);
			break;
	}
	return metadatos;
};

function get_firstChild(n){
  if(!n) {
  	return null;
  }
  
  var xpathExpr='./ESTRUCTURAS_FUNCIONALES/ESTRUCTURA_FUNCIONAL';
  var x=n.selectSingleNode(xpathExpr);
  return x;
}

function get_nextSibling(n){
  if(!n) {
  	return null;
  }
  var x=n.nextSibling;
  while(x) {
  	if (x.nodeType == 1 && x.nodeName == 'ESTRUCTURA_FUNCIONAL') {
		return x
	}
  	x = x.nextSibling;
  }
  return null;
}

ParseaNorma = function(stringXML) {
		
    this.stringXML = stringXML;
    this.arrayNodos = new Array();
    this.id=0;
    
   // Parsear el String
    var oDomDoc = Sarissa.getDomDocument();
    oDomDoc = (new DOMParser()).parseFromString(this.stringXML, "text/xml");
    this.doc = oDomDoc;
    //var rootNode = this.doc.documentElement;
};

ParseaNorma.prototype.parsea = function() {
   	var rootNode = this.doc.documentElement;
	this.recorreArbol2(rootNode);
};


ParseaNorma.prototype.getArregloPartes = function() {
    return this.arrayNodos;
};


ParseaNorma.prototype.recorreArbol2 = function(nodo) {
	var indice = 0;
  
  	// Se agrega la Norma
  	this.creaArregloMetadatos(nodo, indice, -1, true, true);
	indice++;  
	
  	// Se agrega el Encabezado
  	var enc = nodo.selectSingleNode('./ENCABEZADO');
	if (enc) 
	{	this.creaArregloMetadatos(enc, indice, 0, false, false);
		indice++;
	}
	var pilaNodos = new Array(); 
 	var pilaIndices = new Array();
	pilaIndices.push(-1);
  
  	var nodoNorma = nodo;
	do{
		if(nodo)
		{
      		var padre = pilaIndices[pilaIndices.length-1];
      		if (padre == -1) {
      			pilaIndices.push(0);
      		}
      		else
      		{	
      			// Si tiene hijos
      			var tiene_hijos = get_firstChild(nodo);
      			tiene_hijos = tiene_hijos?true:false;
      			
      			// Si es el ultimo Sibling
      			var es_ultimo = get_nextSibling(nodo);
      			es_ultimo = es_ultimo?false:true;
      			this.creaArregloMetadatos(nodo, indice, padre, tiene_hijos, es_ultimo);
      			pilaIndices.push(indice);
      			indice++;
      		}
      		pilaNodos.push(nodo);
      		nodo=get_firstChild(nodo);
    	}
    	else if(pilaNodos.length > 0)
    	{
      		nodo=get_nextSibling(pilaNodos[pilaNodos.length-1]);
      		pilaNodos.pop();
      		pilaIndices.pop();
    	}
  	}while(pilaNodos.length > 0);
  	
  	
  	var promul = nodoNorma.selectSingleNode('./PROMULGACION');
  	var lstAnexos = nodoNorma.selectNodes('./ANEXOS/ANEXO');
	
  	// Si tiene promulgacion o al menos un anexo, hay que indicar
  	// que la ultima EF no es ultimo nodo
  	if (promul || lstAnexos.lenght>0) {
  		// Se busca el ultimo nodo ingresado que este al nivel de la Promulgacion
  		nodo = this.arrayNodos[this.arrayNodos.length-1];
  		var nodo_encontrado = false;
  		while(nodo_encontrado==false) {
  			if (nodo[1] == 0) {
  				// Se encontro el ultimo nodo al Nivel de la Promulgacion.
  				// entonce se le indica al nodo que no es el ultimo
  				nodo[5] = false;
  				nodo_encontrado = true;
  			}
  			else {
  				nodo = this.arrayNodos[nodo[1]];
  			}
  		}
  	}
  	
  	// Se agrega la Promulgacion
  	if (promul) 
	{	this.creaArregloMetadatos(promul, indice, 0, false, false);
		indice++;
	}
	
	// Se agregan los Anexos
	for(var i=0; i<lstAnexos.length; i++)
	{
		if (i == lstAnexos.length-1) // Es el ultimo anexo
			this.creaArregloMetadatos(lstAnexos[i], indice, 0, false, true);
		else
			this.creaArregloMetadatos(lstAnexos[i], indice, 0, false, false);
		indice++;
	}

};

ParseaNorma.prototype.getIdParaObjetoTexto= function (metadatosNodo){
	if(metadatosNodo.getNombre() == "NORMA"){
		var idParte = 0;
	}else{
		var idParte = metadatosNodo.getID();
	}
	var id = metadatosNodo.getID_Norma()+"_"+idParte+"_"+metadatosNodo.getInicioVigencia();
	return id;
}

ParseaNorma.prototype.creaArregloMetadatos = function(nodo, indice, padre, tiene_hijos, es_ultimo) {
	
	var metadatosNodo = getMetadatos(nodo);
   	if (metadatosNodo != null) 
   	{	
   		var nodoArray = new Array();
    	
    	// Agregar el ID del nodo
    	// [0]
    	nodoArray.push(indice);
    	
    	// Se agrega el id del padre
    	// [1]
    	nodoArray.push(padre);
    	
  		// Se agregan los metadatos al nodo
    	// [2]
    	nodoArray.push(metadatosNodo);
			    	
    	// id de la Parte o Norma
    	// [3]
    	if(metadatosNodo.nodo.tagName == "NORMA") 
    		nodoArray.push('');
    	else
	    	nodoArray.push(metadatosNodo.getID());

		// Booleano que indica si el nodo tiene hijos
    	// [4]
		nodoArray.push(tiene_hijos);
		
		// Booleano que indica si es el ultimo hermano (Sibling)
    	// [5]
		nodoArray.push(es_ultimo);
		
		// Se crea nodo Texto
    	// [6]
		var t = new Texto(nodo);
		var idObjTexto = this.getIdParaObjetoTexto(metadatosNodo)
		t.setIdObjeto(idObjTexto);
		nodoArray.push(t);
		
        // Verficar si la parte esta eliminada
        var eliminada = false;
        var visible = true;
        if (metadatosNodo.estaEliminada()) {
            eliminada = true;
            visible = false;
            //alert(metadatosNodo.getTituloArbol());
            //alert(metadatosNodo.getID());
        }
		if(metadatosNodo.estaMovida()){
			visible = false;
		}
    	// [7]
        nodoArray.push(eliminada);
    	// [8]
        nodoArray.push(visible);
        
        //Agregado por David (2007-01-16)
		//Se necesita: idNorma,idVersion,idpartenorma,idversionparte
		nodoArray.push(metadatosNodo.getID_Norma()); //[9]
        nodoArray.push(metadatosNodo.getInicioVigencia()); //[10]
        nodoArray.push(metadatosNodo.getID()); //[11] => ID PARTE
        nodoArray.push(metadatosNodo.getNombre()); //[12] nombre del tag 
        nodoArray.push(metadatosNodo.getID_Version()); //[13] ID DE LA VERSION       
		
		// El nodo se agrega a la lista final
    	this.arrayNodos.push(nodoArray);

    }
};
ParseaNorma.prototype.show = function() {
	for(var i=0; i<this.arrayNodos.length; i++) {
		//document.write(this.arrayNodos[i] + "<br/>");
		/*
		if (i == 1000) { break; }
		var arrayNodo = this.arrayNodos[i]
    	document.write(arrayNodo[0] + " --- " + arrayNodo[1] + "</br>")
    	*/
    }
    
};
//EOF