/*
Librería de Funciones AJAX y DOM
=================================
Desarrollada por TODAS AQUELLAS PERSONAS Q TENGAN EL CONOCIMIENTO.
Fecha de última modificacion: 27/04/2007
*/
var http_request = false;
var DATA = '';
function makeRequest(url,nom,capa,tipofunc,ancho,largo,opcional1,opcional2,opcional3,opcional4,sMethod,sVars) {
	//alert(sVars);
	// descomentar en caso de error
	//alert(url+" | "+nom+" | "+capa+" | "+tipofunc+" | "+sVars);return false;
/*

	nota: todavia falta BASTANTE por hacer con AJAX
	Funcion makeRequest:
	=====================================================================================================================
	Uso: es el padre del ajax, sin esta no hay nada. hace todo lo q tiene q ver con recuperar y enviar los objetos
	=====================================================================================================================
	url: es la url de la hoja xml con el reporte, puede ser tambien la url de un script que genere el xml de una consulta
	capa: Se refiere al ID del DIV que se va a manipular
	tipofunc: Se refiere al numero de funcion que se le pasara a la funcion defineAccion
	ancho: Define el ancho del elemento (usado para la funcion creaTabla)
	largo: Define el alto del elemento (usado en la funcion creaTabla? npi)
	opcional1: Variable opcional, como por ejemplo los titulos
	opcional2: Variable opcional, como por ejemplo los anchos de las celdas
	opcional3: Variable opcional agregada para el boton de imprimir en la funcion creaTabla (03/11/2006)
	opcional4: Variable opcional agregada para el boton de imprimir en la funcion creaTabla (url a llamar) (03/11/2006)
	sMethod: Define el metodo en q va a ser envido el formulario GET ò POST
	sVars: Arreglo q contiene todas las varibles utilizadas en el formulario.
	========================================================================================================================
	
*/
	var bFinal = false;
	var nurl = url;
	var http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
        	http_request.overrideMimeType('text/xml');
		}
	} 
	else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (e) {
			}
		}
	}
/*	
	METODOS DE ENVIO DEL LAS VARIABLES AJAX
	=======================================
	
*/	
	if (!http_request) {
		alert('Falla :( No es posible crear una instancia XMLHTTP');
		return false;
	}
	if (sMethod == "GET")
      {
       http_request.open(sMethod, url+'?'+sVars, true);
       var sVars = "";
	   http_request.send(null);
      }
      else
      {
        http_request.open(sMethod, url, true);
        http_request.setRequestHeader("Method", "POST "+url+" HTTP/1.1");
        http_request.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded"); //OJO
		//var valore="algo=hola"
		 http_request.send(sVars);
      }
	
	
	
	http_request.onreadystatechange = 
		function(){
			
			if (http_request.readyState < 1 && (tipofunc == 2 || tipofunc == 4 || tipofunc == 5 )) {
				//muestraCargando(capa);
				borraElementos(capa);
				//actdes();
                
			}
			
			if (http_request.readyState == 4 && !bFinal && http_request.status == 200) {
				bFinal = true;
				if (tipofunc == 8 || tipofunc == 9){
					type(http_request.responseText,capa,tipofunc,opcional1);
				} else {
					defineAccion(http_request,nom,capa,tipofunc,ancho,largo,opcional1,opcional2,opcional3,opcional4);
				}
				
        	}
		};
		
	 //http_request.send(null);
	//http_request.open('GET', url, true);
    
}
function type(data,objForm,tipofunc,url){
	
	destino = objForm;
	
	while (destino.hasChildNodes()) {
		rem = destino.firstChild;
		destino.removeChild(rem);
	}
	destino.innerHTML = data;
	// OJO REDIRECCION	
	if (tipofunc == 9){
		ir(url);	
	}
	return;
}
function ir(url){
	// OJO '../imprimirMer.php'
	location= url;
}
function actdes() {
/*
		Uso: activa y desactiva los elementos de un formulario
		======================================================

*/
var iNroForms = document.forms.length;
	for (x = 0; x < iNroForms; x++) {
		var iElementos = document.forms[x].elements.length;
		for (y = 0; y < iElementos; y++) {
			var sStatus = null;
			if (document.forms[x].elements[y].type == 'select-one') {
				if (document.forms[x].elements[y].disabled) {
					document.forms[x].elements[y].disabled = false;
				}
				else {
					document.forms[x].elements[y].disabled = true;
				}
			}
		}
	}
}

function creaCadena(formu) {
/*
	Uso: crear tanto las cadenas de variables del metodo POST como GET.
	====================================================================
	Parametros: [formu]->fromulario donde se van a recoger las variables
	====================================================================
	Devuelve: campo1=valorcampo1&campo2=valorcampo2
	====================================================================
    no->creaCadena(document.forms[0]);
   
*/
	//alert(formu);
    var cadena = '';
    var elementos = formu.elements.length;
    for (i = 0; i < elementos; i++) {
        id = formu.elements[i].id;
        if (id == '') { id = formu.elements[i].name }
        tipo = formu.elements[i].type;
        valor = formu.elements [i].value;
       
        if (tipo == "radio") {
            id = formu.elements[i].name; //me da el nombre del objeto
            if (formu.elements[i].checked == true) {
                valor = formu.elements[i].value;
            }
            else {
                valor = 0;
            }
        }
        if (valor != null && valor != 'undefined' && valor != '' && valor != 0) {
            if (cadena == '') {
                cadena = cadena+id+'='+valor;
            }// FIN IF
            else {
                cadena = cadena+'&'+id+'='+valor;
            }// FIN ELSE
        }// FIN IF
    }// FIN FOR
	//alert(cadena);
   return cadena;
   
}// FIN FUNCION


function muestraCargando(capa) {
/*
	Preloader HTML
	Uso: crear la imagen de cargando mientras se realizan los procesos de cargar la data
	=====================================================================================
	Parametros:
		-capa: es la capa de destino donde va a aparecer la imagen
	=====================================================================================
*/  
	
	//document.getElementById(capa).innerHTML ='<img scr="http://operaciones.corporacioncasa.com.ve/imagenes/mercado_virtual/iconos/loader.gif" alt="cargando"/><span class="negritas">Cargando...</span>';
	
	
	dest = document.getElementById(capa);
	var msj = "Cargando...Espere";
	img = document.createElement("IMG");
	img.setAttribute("src","http://operaciones.corporacioncasa.com.ve/imagenes/mercado_virtual/iconos/ajax-loader3.gif");
	//img.setAttribute("width",80);
	//img.setAttribute("heigth",80);
	ele = document.createElement("P");
	ele.setAttribute("class","negritas");
	ele.setAttribute("className","negritas");
	texto = document.createTextNode(msj);
	ele.appendChild(img);
	ele.appendChild(texto);
	dest.appendChild(ele);
	/*
//	muestraCargando viejo...
	
	//flashLightbox('test.jpg');
	*/
}

function defineAccion(objXML,nom,capa,var1,ancho,largo,opcional1,opcional2,opcional3,opcional4) {
/*
		Funcion defineAccion:
		=====================
		Uso: defineAccion(objXML,capa,var1)
		objXML: Se Refiere a el objeto xml referido (es decir, la respuesta XML) desde XHttpRequest
		capa: Se refiere al ID del DIV que se va a manipular
		var1: Se refiere al numero de accion a tomar es decir, si deseamos crear un SELECT con la respuesta XML pasamos como parámetro 1
		ver referencia de la leyenda...
		
		Casos posibles:
		===============
			caso 1: Crea un select
			caso 2: Crea una tabla
			caso 3: Crea un select o un input hidden
			caso 5: devuelve el valor en una capa despues de una insercion
			caso 6: funcion para retornar el valor de una consulta xml
*/ 
		switch (var1) {
	    	case 1:creaSelect(objXML.responseXML,capa,opcional1);break;
			case 2:creaTabla(objXML.responseXML,nom,capa,ancho,largo,opcional1,opcional2,opcional3,opcional4);break;
			case 3:creaSelectH(objXML.responseXML,capa,opcional1);break;
			case 4:InsertaHTML(objXML.responseText,capa);break;
			case 5:devuelveValor(objXML.responseXML,capa);break;
			case 6:retornaValor(objXML.responseText,capa);break;
			case 7:completaText(objXML.responseXML,capa);break;
		}
}
	
function creaSelect(objXML,capadest,opcional1) {
	//alert("Objeto XML->"+objXML+"  Capa destino->"+capadest+"  opcion->"+opcional1);return false;
	/*
	NOTA: Esta funcion esta hecha pensando que capadest es el ID del SELECT; es decir, ya tiene que estar creado! OJO!
	Funcion creaSelect:
	===================
	Uso: creaSelect(objXML,capadest)
	objXML: Se Refiere a el objeto xml referido (es decir, la respuesta XML) desde XHttpRequest
	capa: Se refiere al ID del DIV que se va a manipular
	opcional1: Es una variable de tipo booleana si esta en 1 se eliminan las opciones del select, sino, se crean las nuevas opciones
	*/
	
	borraElementos(capadest);
	var ie = (document.all) ? true:false;
	xml = objXML.getElementsByTagName('reporte');
	nombres = objXML.getElementsByTagName('id');
	cantidad = nombres.length;
	//alert(cantidad);
	if (opcional1 == 1) {
		borraElementos(capadest);
	}
	destino = document.getElementById(capadest);
	for (j = 0; j<cantidad;j++) {			
		
		opcion = document.createElement("option");
		if (ie) {
			texto = nombres.item(j).childNodes.item(1).childNodes.item(0).nodeValue;
			opcion.setAttribute("value",nombres.item(j).childNodes.item(0).childNodes.item(0).nodeValue);
		}
		else {
			// Esto es para el valor del option, Gecko (Firefox)
			texto = nombres[j].childNodes[3].childNodes[0].nodeValue;
			opcion.setAttribute("value",nombres[j].childNodes[1].childNodes[0].nodeValue);
		}
		nt = document.createTextNode(texto);
		
		opcion.appendChild(nt);
		destino.appendChild(opcion);
		/*if (texto=='- Todos -'){
			option.setAttribute("selected","selected");
			//alert(texto);
		}*/
		
	}
		var http_request = false;
		var bFinal = false;
		
}

function creaSelectH(objXML,capadest,opcional1) {
	/*
	NOTA: Esta funcion crea un select o un input hidden + p si la cantidad de registros son menores a 2
	Funcion creaSelectH:
	===================
	Uso: creaSelect(objXML,capadest)
	objXML: Se Refiere a el objeto xml referido (es decir, la respuesta XML) desde XHttpRequest
	capa: Se refiere al ID del DIV que se va a manipular
	*/
	var ie = (document.all) ? true:false;
	xml = objXML.getElementsByTagName('reporte');
	nombres = objXML.getElementsByTagName('id');
	cantidad = nombres.length;
	//alert(cantidad);
	if (cantidad > 1) {
		borraElementos(capadest);
		destinof = document.getElementById(capadest);
		destino = document.createElement("select");
		for (j = -1; j<cantidad;j++) {			
			opcion = document.createElement("option");
			if (j < 0) {
				texto = "Seleccione";
				opcion.setAttribute("value","");
			}
			else {
				if (ie) {
					texto = nombres.item(j).childNodes.item(1).childNodes.item(0).nodeValue;
					opcion.setAttribute("value",nombres.item(j).childNodes.item(0).childNodes.item(0).nodeValue);
				}
				else {
					// Esto es para el valor del option, DAMN FF!!!
					texto = nombres[j].childNodes[3].childNodes[0].nodeValue;
					opcion.setAttribute("value",nombres[j].childNodes[1].childNodes[0].nodeValue);
				}
			}
			nt = document.createTextNode(texto);
			opcion.appendChild(nt);
			destino.name = opcional1;
			destino.id = opcional1;
			destino.appendChild(opcion);
			destinof.appendChild(destino);
		}
		
	}
	else {
		borraElementos(capadest);
		destinof = document.getElementById(capadest);
		destino = document.createElement("input");
		//destino.setAttribute("name",opcional1);
		//destino.setAttribute("id",opcional1);
		destino.setAttribute("type","hidden");
		for (j = 0; j<cantidad;j++) {			
			txt = document.createElement("P");
			if (ie) {
				texto = nombres.item(j).childNodes.item(1).childNodes.item(0).nodeValue;
				destino.setAttribute("value",nombres.item(j).childNodes.item(0).childNodes.item(0).nodeValue);
			}
			else {
				// Esto es para el valor del option, DAMN FF!!!
				texto = nombres[j].childNodes[3].childNodes[0].nodeValue;
				destino.setAttribute("value",nombres[j].childNodes[1].childNodes[0].nodeValue);
			}
			nt = document.createTextNode(texto);
			txt.appendChild(nt);
			destino.name = opcional1;
			destino.id = opcional1;
			destinof.appendChild(txt);
			destinof.appendChild(destino);
		}
	}
	var http_request = false;
	var bFinal = false;
}

function borraElementos(capa) {
	/*
	Funcion borraElementos:
	=======================
	Uso: borraElementos(capa)
	<Explicacion de variables>
	capa: Se refiere al ID del DIV que se va a manipular
	*/
	destino = document.getElementById(capa);
	while (destino.hasChildNodes()) {
		rem = destino.firstChild;
		destino.removeChild(rem);
	}

}

function creaTabla(objXML,tablaid,capa,tamanoX,tamanoY,titulos,anchos,botonprint,url) {
	var ie = (document.all) ? true:false;
	/*
	Funcion "creaTabla"
	====================
	Uso: crea_tabla(objXML,tablaid,capa)
	objXML: Se Refiere a el objeto xml referido (es decir, la respuesta XML) desde XHttpRequest
	tablaid: Es el id con el cual queremos llamar la tabla a crear
	capa: Se refiere al ID del DIV que se va a manipular
	tamanoX: Ancho de la tabla
	tamanoY: Alto de la tabla
	titulos: nombres de los titulos (en un string que luego es desarmado)
	anchos: Anchos de las columnas
	botonprint: Caption del boton para Imprimir
	Url: Dirección web a la que va a enviar el reporte
	*/
	aTitulos = titulos.split('|');//hacemos un array de los titulos
	aAnchos = anchos.split('|');//hacemos un array de los anchos
	borraElementos(capa); // Borramos los elementos existentes en la capa
	bImprimir = (botonprint == '' || url == '') ? 0:1;
	//
	xml = objXML.getElementsByTagName('id'); // Obtenemos el hijo de registro, que son los id's donde contenemos los datos
	filas = xml.length; // Contamos el numero de registros
	docbody=document.getElementById(capa); // Definimos la capa a trabajar
	tabla= document.createElement("TABLE"); // Creamos la tabla
	// Propiedades Grafica de la tabla
	tabla.setAttribute("cellSpacing","0px");
	tabla.setAttribute("cellPadding","0px");
	tabla.setAttribute("className","borde_tabla");
	tabla.setAttribute("class","borde_tabla");
	// Fin de las propiedades graficas de la tabla
	tabla.id=tablaid; //Asignamos el id que pasamos por referencia
	cuerpotabla=document.createElement("TBODY"); //Creamos el cuerpo de la tabla donde vamos a empezar a crear las filas y celdas dinamicamente
	n = 2; //inicializamos a N en 2 para que la primera fila nos salga en color azul :o
	cols = xml.item(0).childNodes.length; // contamos el numero de columnas por fila
	cols = (!ie) ? (cols/2)-1 : cols; // si es FF aplicamos una relacion numerica de (( numerodecolumnas / 2 ) -1)
	for (i=-1; i<filas; i++){
	  	row=document.createElement("TR");
		if (i >= 0) {
			clase = (n % 2 == 0) ? "bg_celda_b"  : "bg_celda_a";
			row.setAttribute("class",clase);
			row.setAttribute("className",clase);
		}
		n++;
		for (j=0; j<cols; j++){
			if (cols > 1) {
				if (i < 0) {
			  		cell=document.createElement("TH");
					cell.setAttribute("className","titulo_tabla");//Asignamos la clase de la celda (className para IE)
					cell.setAttribute("class","titulo_tabla");//Asignamos la clase de la celda (class para FF)
					txt = aTitulos[j];
					texto = document.createTextNode(txt);
				}
				else {
					cell=document.createElement("TD");
					cell.setAttribute("className","texto");//Asignamos la clase de la celda (className para IE)
					cell.setAttribute("class","texto");//Asignamos la clase de la celda (class para FF)
					cell.setAttribute("align","center");// Centramos el contenido de la data
					if (ie) {
						txt = xml.item(i).childNodes.item(j).childNodes.item(0).nodeValue;		
					}
					else {
						txt = xml[i].childNodes[((2*j)+1)].firstChild.nodeValue;
					}
					texto = document.createTextNode(txt);
				}
				cell.setAttribute("width",aAnchos[j]);
				
			}
			else {
				//aqui sabemos que tiene error 
				i = 0;
				var bImprimir = 0;
				if (ie) {
					cell=document.createElement("TH");
					cell.setAttribute("className","error");
					cell.setAttribute("class","error");
					txt = xml.item(i).childNodes.item(j).childNodes.item(0).nodeValue; 
					texto = document.createTextNode(txt);
				}
				else {
					cell=document.createElement("TH");
					cell.setAttribute("className","error");
					cell.setAttribute("class","error");
					txt = xml[i].childNodes[((2*j)+1)].firstChild.nodeValue;
					texto = document.createTextNode(txt);
				}	
			}
			cell.appendChild(texto);
			row.appendChild(cell);
		}
		cuerpotabla.appendChild(row);
	}
    if (bImprimir != 0) {
		cuerpotabla.appendChild(crea_imprimir(botonprint,url)); // esto luego puede ser optimizado
	}
	tabla.appendChild(cuerpotabla);
	docbody.appendChild(tabla);
}

function crea_imprimir(boton,url) {
	var ie = (document.all) ? true:false;
	fila = document.createElement("tr");
	col = document.createElement("td");
	col.setAttribute("align","center");
	col.colSpan = 7;
	destino = document.createElement("input");
	destino.setAttribute("type","button");
	destino.setAttribute("name",boton);
	destino.setAttribute("value",boton);
	destino.setAttribute("class","boton");
	destino.setAttribute("className","boton");
	addEvent(destino,"click",redirige,true);
	col.appendChild(destino);
	fila.appendChild(col);
	return fila;
}
 //para todos los tipos de exploradores el adicionar y quitar eventos
function addEvent(obj, evType, fn, useCapture){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} 
	else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} 
	else {
		alert("Handler could not be attached");
	}
}
function removeEvent(obj, evType, fn, useCapture){
	if (obj.removeEventListener){
    	obj.removeEventListener(evType, fn, useCapture);
    	return true;
    } 
	else if (obj.detachEvent) {
    	var r = obj.detachEvent("on"+evType, fn);
	    return r;
    } 
	else {
    	alert("Handler could not be removed");
    }
} 
function InsertaHTML(data,capa) {
/*
		Uso: Insertar HTML en una capa determinada
		===========================================
		Parametros
			-data: hoja HTML
			-capa: capa de destino del contenido
		===========================================
*/   //alert(data);
//return;
	document.getElementById(capa).innerHTML = data;
	
}
function devuelveValor(objXML,capa) {
/*	
	Uso: se creo para una prueba. en periodos de desarrollo
	========================================================
	Parametro
		-objXML: hoja xml creada
		-capa: capa de destino
	========================================================
	
*/
	borraElementos('load');
	var ie = (document.all) ? true:false;
	xml = objXML.getElementsByTagName('reporte');
	nombres = objXML.getElementsByTagName('id');
	cantidad = nombres.length;
	//alert(cantidad);
	if (ie) {
        var resp=nombres.item(0).childNodes.item(0).childNodes.item(0).nodeValue;
	} else {
	    resp=nombres.item[1].childNodes.item[1].childNodes.item[0].nodeValue;
	}
	var obj2=document.createTextNode(resp);
	capa.appendChild(obj2);
	
	var http_request = false;
    var bFinal = false;
	//alert(.id);
}
function retornaValor(data,obj){
	//alert(data);
	msg(data);
	
}
function completaText(objXML,capa){
/*
		Uso: solo para text// en prueba
		=====================
*/
    borraElementos(capa);
	var ie = (document.all) ? true:false;
	/*var xml = objXML.getElementsByTagName('reporte');
	var nombres = objXML.getElementsByTagName('id');*/
	var nodo = objXML.getElementsByTagName('nro');
	var cantidad = nodo.length;
	alert(cantidad);
	
	if (ie) {
        var resp=nombres.item(0).childNodes.item(0).childNodes.item(0).nodeValue;
	} else {
	    var resp=nodo[0].childNodes[0].nodeValue; //.childNodes.item[0].nodeValue;
	}
	alert(resp);
	return false;
	//document.getElementById(obj).value = data;
}
function retornaResponce(objText){
	DATA = objText;
}
