
//---------------------------
// Variables Globales
//---------------------------
//
//---------------------------
var datosXML;
var estiloTablaXSL;
var listacampos="";
var altopantalla;
var altobody;
var filas_seleccionadas=new Array();
var filas_eliminadas = new Array();

var filas=24;
var pagina=1;
var orden="inge";
var tipo="DESC";
var reiniciaFiltro=false;
var campos_visibles=new Array();
var filtros = {};

//--------------------------------------------------------------------
// Crea select Nodes y selectSingleNode en Mozilla
// mozXPath [http://km0ti0n.blunted.co.uk/mozxpath/] km0ti0n@gmail.com
//--------------------------------------------------------------------
function implementaMetodosXPath(){
	if( document.implementation.hasFeature("XPath", "3.0") ){
		if ( typeof XMLDocument == "undefined" ) { XMLDocument = Document; }
		
		XMLDocument.prototype.selectNodes = function(cXPathString, xNode){
			if( !xNode ) { xNode = this; } 
			var oNSResolver = this.createNSResolver(this.documentElement);
			var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			var aResult = [];
			for( var i = 0; i < aItems.snapshotLength; i++) { aResult[i] =  aItems.snapshotItem(i);	}
			return aResult;
		};
		
		XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode){
			if( !xNode ) { xNode = this; } 
			var xItems = this.selectNodes(cXPathString, xNode);
			if( xItems.length > 0 ){ return xItems[0];	}
			else {return null;	}
		};
		
		Element.prototype.selectNodes = function(cXPathString){
			if(this.ownerDocument.selectNodes){	return this.ownerDocument.selectNodes(cXPathString, this);}
			else{throw "For XML Elements Only";}
		};
		
		Element.prototype.selectSingleNode = function(cXPathString){	
			if(this.ownerDocument.selectSingleNode){return this.ownerDocument.selectSingleNode(cXPathString, this);	}
			else{throw "For XML Elements Only";}
		};
	}
}

implementaMetodosXPath();

//---------------------------------------------------------------
//---------------------------------------------------------------
//-------FUNCIONES PARA MANEJAR EL XSL EN MEMORIA DINAMICAMENTE
//---------------------------------------------------------------
//---------------------------------------------------------------
function getNodoValor(nodo)
{   
    var valor="";
    if( nodo.firstChild ) valor=nodo.firstChild.nodeValue;
    return valor;
}
function getVariable(variable){
    var busqueda='//xsl:variable[@name="'+variable+'"]';
    nodo=estiloTablaXSL.selectSingleNode(busqueda);
    return getNodoValor(nodo);
}
function setNodoValor(nodo,valor){
    var hijoviejo=nodo.firstChild;
    //creo un nodo nuevo para ello uso cualquier hoja xml, en este caso datosXML, debe existir si no falla
    nodonuevo=datosXML.createTextNode(valor);
    nodo.replaceChild(nodonuevo,hijoviejo);        	
}
function setVariable(variable,valor){
    var busqueda='//xsl:variable[@name="'+variable+'"]';
    nodo=estiloTablaXSL.selectSingleNode(busqueda);
    var hijoviejo=nodo.firstChild;
    nodonuevo=estiloTablaXSL.createTextNode(valor);
    nodo.replaceChild(nodonuevo,hijoviejo);        	
}




// --------------------------------------------------------------
// Cargamos xml SINCRONO puede parar el navegador
// El parametro indica la URL donde descargar el XML
// Utiliza un objeto XMLHTTPRequest
// --------------------------------------------------------------
function loadxml(url){
	var http = new Request({url: url, async: false, method: 'get', encoding: 'ISO-8859-1'});
	if(http){
		http.send();
		return http.response.xml;
	}
	else
		return false;	
}
// --------------------------------------------------------------
// Cargamos html SINCRONO puede parar el navegador
// El parametro indica la URL donde descargar el HTML
// Utiliza un objeto XMLHTTPRequest
// --------------------------------------------------------------
function loadhtml(url){
	var http = new Request({url: url, async: false, method: 'get', encoding: 'ISO-8859-1'});
	if(http){
		http.send();
		return http.response.text;
	}
	else
		return false;
}

// --------------------------------------------------------------
// Cargamos html ASINCRONO puede parar el navegador mediante POST
// El parametro indica la URL donde descargar el HTML
// Utiliza un objeto XMLHTTPRequest
// --------------------------------------------------------------
function loadhtmlpost(url,datos){
	var http = new Request({url: url, async: false, method: 'post', encoding: 'ISO-8859-1', urlEncoded: true});
	if(http){
		http.send(datos);
		return http.response.text;
	}
	else
		return false;
}


//--------------------------------------------------------------
//Cargamos xml SINCRONO puede parar el navegador mediante POST
//El parametro indica la URL donde descargar el XML
//Utiliza un objeto XMLHTTPRequest
//--------------------------------------------------------------
function loadxmlpost(url,datos){
	var resultado;
    var http =new Request({url: url, async: false, method: 'post', encoding: 'ISO-8859-1', urlEncoded: true});
    if(http) {
        http.send(datos);
        return http.response.xml;
    }
}



//--------------------------------------------------------------
//Cargamos xml ASINCRONO con datos POST
//El parametro indica la URL donde descargar el XML
//Utiliza un objeto XMLHTTPRequest
//--------------------------------------------------------------
function loadxmlpostasinc(url,datos){
    var http = new Request({url: url, async: true, method: 'post', encoding: 'ISO-8859-1', urlEncoded: true,
    				onSuccess : function(responseText, responseXML){						
	    					datosXML = responseXML;
                            filas_eliminadas = new Array();							
	    					if (estiloTablaXSL &&  parseInt(getVariable('visualizarLoading'))>0 ) $('actualizando_datos').setStyle('display','none');						
	    	                if(datosXML && estiloTablaXSL) transformaXml(datosXML,estiloTablaXSL,'tabla_listado');							
    					},
    				onFailure: function(xhr){
    						alert("Se ha producido un error al solicitar los datos al servidor: "+xhr.responseText);
    						if (estiloTablaXSL &&  parseInt(getVariable('visualizarLoading'))>0 ) $('actualizando_datos').setStyle('display','none');
    					}
    				});
    if(http) 
    {
        http.send(datos);
        if (estiloTablaXSL &&  parseInt(getVariable('visualizarLoading'))>0 ) $('actualizando_datos').setStyle('display','block');
    }
}


// --------------------------------------------------------------
// Realiza la transformación XSLT utilizando dos DOM XML, una de datos
// y otra de estilo conteniendo el XML y XSL respectivamente.
// El resultado de la transformación se vuelca en la la página XML
// como hijo del objeto destino
// --------------------------------------------------------------
function transformaXml(datos,estilo,destino){

	if(window.XSLTProcessor){
		var proc=new XSLTProcessor();
		proc.importStylesheet(estilo);
		var nuevoDocumento=proc.transformToFragment(datos,document);
		$(destino).innerHTML="";
		$(destino).appendChild(nuevoDocumento);
	} else {
        	var strxml=datos.transformNode(estilo);        
        	$(destino).innerHTML=strxml;
	}
}


// --------------------------------------------------------------
// 
// 
// 
// --------------------------------------------------------------
function marcaCamposVisibles(){
    //Primero marco todos con no visibles por defecto vienen como visibles
    var arrNodos=datosXML.selectNodes("//propiedades/columna/visible");
    for(i=0;i<arrNodos.length;i++)
        setNodoValor(arrNodos[i],"no");
    var listacampos=datosXML.selectSingleNode('//listacampos').firstChild.nodeValue;
    var arraycampos=listacampos.split(',');
    for(i=0;i<arraycampos.length;i++)
    {
        var indice=i+1;
        var busqueda="//propiedades/columna";
        var nodos=datosXML.selectNodes(busqueda);
        var nodo=nodos[indice -1];
        busqueda="visible";
        var nodo=nodo.selectSingleNode(busqueda);
        setNodoValor(nodo,"si");
    }
    
}
function cargaxml(){
	if (num_filas_automatica == true) recalculaFilas();
    datosXML = loadxmlpost(script_server,'&pag='+pagina+'&filas='+filas);
    calculaListaCampos();
    recalculaListaCamposVisibles();
    //marcaCamposVisibles();
    estiloTablaXSL=loadxml(xsl_server); 	 
    if(datosXML && estiloTablaXSL) transformaXml(datosXML,estiloTablaXSL,'tabla_listado');
}

//Recarga solo los datos, mantiene la hoja de estilo, la transformación la hace el loadxmlpostasinc
//Es asincrono y por compatibilidad se ha de definir la url completa
function carganewxml(){
	if (num_filas_automatica == true) recalculaFilas();
    loadxmlpostasinc(script_server,construyeParametros());
}


function construyeParametros(){
	var params = "";
	if (pagina) params += '&pag='+pagina;
	if (filas) params += '&filas='+filas;
	if (orden && tipo) params += '&orden='+orden+' '+tipo;
	if (campos_visibles.length > 0) params += '&campos-visibles='+campos_visibles;
	$each(filtros,function(el,i){
		if (el != null) params += "&filtros_campos["+i + "]="+el;
	});
	if (filas_seleccionadas.length > 0) params += "&filas_seleccionadas="+filas_seleccionadas;
	if (filas_eliminadas.length > 0) params += "&filas_eliminadas="+filas_eliminadas;
	if (reiniciaFiltro) params += '&reiniciaFiltro=1';
	return params;
}

//Hemos variado algun dato en memoria, solo hay que transformar
//Recarga solo los datos, mantiene la hoja de estilo
function cargasamexml(){
    if(datosXML && estiloTablaXSL) transformaXml(datosXML,estiloTablaXSL,'tabla_listado');
}

//Cargamos un codigo html directamente en un objeto 
// -------------------------------------------------------------------------------
// -------------------------------------------------------------------------------
function LoadHttp2Div(url,datos,div){
    var http = new Request.HTML({url: url, async: true, method: 'post', encoding: 'ISO-8859-1', urlEncoded: true, update: div});
    if(http) http.send(datos);

}

// -------------------------------------------------------------------------------
// -------------------------------------------------------------------------------
function cargahtml(url,datos,div){
    LoadHttp2Div(url,datos,div);
}

// -------------------------------------------------------------------------------
// -------------------------------------------------------------------------------
function cargahtmlcompleto(url,datos,div,pre,suf){
	var http = new Request.HTML({url: url, async: true, method: 'post', evalResponse:true, encoding: 'ISO-8859-1', urlEncoded: true, update: div, onComplete:function(){
		div.set('html',pre+div.get('html')+suf);
	}});
	if (http) http.send(datos);
}

// -------------------------------------------------------------------------------

// FUNCIONES ESPECIFICAS DE LA APLICACIÓN

//RECALCULO DE ALTO DE PANTALLA Y FILAS QUE ENTRAN EN LA MISMA
// --------------------------------------------------------------
// Recalculafilas verifica el alto del cliente de body
// --------------------------------------------------------------
function recalculaFilas(){
	/*
	var altopantalla_new = parseInt(document.getElementsByTagName('body')[0].clientHeight);
	var altobody_new = parseInt(document.getElementsByTagName('body')[0].getScrollHeight());
	var altofilas = (filas_obj.length > 0) ? filas_obj[0].getHeight() : 16;
	var filas_new;
	//alert('altopantalla='+altopantalla+' altopantalla_new='+altopantalla_new+' altobody='+altobody+' altobody_new='+altobody_new+' altofilas'+altofilas+' filas'+filas);

	if (!altopantalla || !altobody) {
		filas_new = 10;
	} else {
		//filas_new= parseInt( (altopantalla_new - (altobody - (altofilas * filas)))/altofilas ) ;
		filas_new = filas - parseInt( (altobody_new - altopantalla_new) / altofilas );
	}
	altopantalla = altopantalla_new;
	altobody= altobody_new;
	filas = Math.max(0,filas_new);
	*/
	var filas_obj = $$('#nombretabla > tbody > tr');
	var altofilas = (filas_obj.length > 0) ? filas_obj[0].getHeight() : 16;
	altopantalla=parseInt(document.getElementsByTagName('body')[0].clientHeight);
	var filasnew=parseInt((altopantalla- 500)/altofilas);
	if(Math.abs(filas-filasnew)>1) filas=filasnew;

	return;
}

// --------------------------------------------------------------
// En la función inicio cargamos la página 1 de la tabla
// --------------------------------------------------------------
function inicio(){
	script_server = script_server.replace( /&amp;/g, '&' );
	script_server_carrito = script_server_carrito.replace( /&amp;/g, '&' );
	xsl_server = xsl_server.replace( /&amp;/g, '&' );
	ficha_server = ficha_server.replace( /&amp;/g, '&' );
    url_filtro_avanzado = url_filtro_avanzado.replace( /&amp;/g, '&' );

   cargaxml();
   if (num_filas_automatica == true) window.addEvent('resize',carganewxml);
   

   return;
}

    
    
function obtieneCampo(id,campo){
    var xpath="//fila[@id = '"+id+"']/"+campo;
    var nodo=datosXML.selectSingleNode(xpath);
    return(getNodoValor(nodo));
}
    


//---------------------------------------------------------------
// EVENTOS sobre las filas
//---------------------------------------------------------------

function clickFila(objetofila){
    verFicha(objetofila);
}
function sobreFila(objetofila){
    if(objetofila.className!="filaSeleccionada")
        objetofila.className="filaActual";
    return;
}
function saleFila(objetofila){
    if(objetofila.className!="filaSeleccionada")
        objetofila.className=objetofila.getAttribute("claseoriginal");
    return;
}





// --------------------------------------------------------------
// Funciones de paginación
// --------------------------------------------------------------

// Ir a pagina, valores raros para salto 0=primera null=ultima
function iraPagina(objeto,salto){
	var ultima_pag = parseInt(objeto.getAttribute("ultima"));
	
    if (salto==null) pagina = ultima_pag;
    else if (salto==0) pagina = 1; 
    else pagina += salto;
    
    if (pagina<1) {pagina=1;}
    else if (pagina>ultima_pag) {pagina=ultima_pag;}
    carganewxml();
    return;
}

function irNumeroPagina(objeto)
{
	pagina_antigua = pagina;
    var pagina_nueva = objeto.value;
    try{
    	pagina_nueva = parseInt(pagina_nueva);
    	if (!isNaN(pagina_nueva)) iraPagina(objeto,pagina_nueva-pagina);
    	else objeto.value = pagina;
    } catch(error){objeto.value = pagina;}
    return;
}

function variaFilas(objeto,cantidad)
{
    filas=parseInt(objeto.getAttribute("filaspagina"))+cantidad;
    carganewxml();
}


//--------------------------------------------------------------
//Funciones de seleccion de campos
//--------------------------------------------------------------

function recalculaListaCamposVisibles(){
    var xpath="//propiedades/columna";
    var nodos=datosXML.selectNodes(xpath);
    campos_visibles.empty();
    for(i=0;i<nodos.length;i++)
    {
        var nodo=nodos[i];
        if(nodo.selectSingleNode('visible').firstChild.nodeValue=="si"){
            campos_visibles.include(nodo.selectSingleNode('campo').firstChild.nodeValue) ;
        }
    }
}

function calculaListaCampos(){
    var xpath="//propiedades/columna";
    var nodos=datosXML.selectNodes(xpath);
    listacampos="";
    for(i=0;i<nodos.length;i++)
    {
        var nodo=nodos[i];
        if(listacampos!="")  listacampos+=",";
        listacampos+=nodo.selectSingleNode('campo').firstChild.nodeValue;     
    }
}

function alternaVerTodos(){
    var opcionactual=parseInt(getVariable('opcionVerTodos'));
    opcionactual = (opcionactual==0) ? 1 : 0;
    setVariable('opcionVerTodos',opcionactual);
    cargasamexml();
}

function cambiaVisible(objeto)
{
    var campo=objeto.getAttribute("campo");
    var xpath="//propiedades/columna[campo='"+campo+"']/visible";
    var nodo=datosXML.selectSingleNode(xpath);
    if ( campos_visibles.contains(campo) ){
    	setNodoValor(nodo,'no');
    	campos_visibles.erase(campo);
    } else {
    	setNodoValor(nodo,'si');
    	campos_visibles.include(campo);
    }
    cargasamexml();

}


//--------------------------------------------------------------
//Funciones de ordenacion
//--------------------------------------------------------------

function alternaOrdenar(){
    var opcionactual=parseInt(getVariable('opcionOrdenar'));
    opcionactual = (opcionactual==0) ? 1 : 0;
    setVariable('opcionOrdenar',opcionactual);
    cargasamexml();
}

function ordena(campo,tipodatos){
    var ordenold=getVariable('campoOrden');
    var sentidoold=getVariable('sentidoOrden');
    var sentido="";
    if(campo==ordenold) 
    	sentido = (sentidoold=="ascendente") ? "descendente" : "ascendente";
    else  
    	sentido= (tipodatos=="decimal") ? "descendente" : "ascendente";
    orden=campo;
    tipo = (sentido=="ascendente") ? "ASC" : "DESC";
    setVariable('campoOrden',campo);
    setVariable('sentidoOrden',sentido);    
    carganewxml();
}

//--------------------------------------------------------------
//Funciones de ajuste de ancho de columnas
//--------------------------------------------------------------
function inicializaAncho(){
	
}

function compruebaAncho(){
	
}

function iniciaCambioAncho(campo){
	
}

//--------------------------------------------------------------
// Funciones de exportacion
//--------------------------------------------------------------
function exportarExcel(){
	if (filas_seleccionadas.length == 0) alert('Se exportarán todas las filas del listado.');
	window.open(script_server+'&tarea_listado=exporta_excel'+construyeParametros(),"_blank");
}

//--------------------------------------------------------------
//Funciones de filtrado
//--------------------------------------------------------------
function alternaFiltrar(){
    var opcionactual=parseInt(getVariable('opcionFiltrar'));
    opcionactual = (opcionactual==0) ? 1 : 0;
    setVariable('opcionFiltrar',opcionactual);
    if (opcionactual == 0){
    	$each(filtros,function(el,i){ filtros[i]=null;});
    	carganewxml();
    } else
    	cargasamexml();
}

function filtra(campo,valor){
	filtros[campo] = (valor == '') ? null : valor;
	pagina = 1;
	carganewxml();
}

function mostrarFiltroAvanzado(){
	var myURI = new URI(url_filtro_avanzado);
	myURI.go();
}

function reiniciarFiltro(){	
	reiniciaFiltro=true;
	carganewxml();
	reiniciaFiltro=false;
}

//--------------------------------------------------------------
//Funciones de carrito/cesta
//--------------------------------------------------------------
function actualizarCarrito(){
    var resp = loadhtmlpost(script_server_carrito,construyeParametros());
	if (resp) $('num_elem_carrito').innerHTML=resp;
	else alert('Error al obtener artículos al carrito');
}

function anadirCarrito(){
    var resp = loadhtmlpost(script_server_carrito,construyeParametros());
	if (resp) {
		$('num_elem_carrito').innerHTML=resp;
		//alert('Artículos añadidos correctamente');
	}
	else
		alert('Error al añadir artículos al carrito');
}

//--------------------------------------------------------------
//Funciones de las fichas
//--------------------------------------------------------------
function verFicha(fila){
	var destino = $('ficha_listado');
	destino.set('html','');
	var url = ficha_server + fila.getAttribute('idth');
	//var contenido = loadhtml(url);
	var pre = '<div class="bloqueImagenCerrarFicha" onclick="ocultarFicha()"></div>';
	cargahtmlcompleto(url,'',destino,pre,'');
	destino.style.display='block';    		
}

function ocultarFicha(){
	$('ficha_listado').style.display='none';
}

//--------------------------------------------------------------
//Funciones de seleccion de filas
//--------------------------------------------------------------

function cambiaSeleccionFilas(el_div) {
	var filas = $$('#nombretabla > tbody > tr');
	if (el_div.className.contains('bloqueImagenSeleccionFilaNo')) {
		el_div.className='bloqueImagenSeleccionFilaSi';
		filas.each(function(fila,i){
			seleccionaFila(fila);
		});
	} else {
		el_div.className='bloqueImagenSeleccionFilaNo';
		filas.each(function(fila,i){
			deSeleccionaFila(fila);
		});
	}
	
}

function cambiaSeleccionFila(fila) {
	if ( filas_seleccionadas.contains( fila.getAttribute('idth') ) ) deSeleccionaFila(fila);
	else seleccionaFila(fila);
}


function seleccionaFila(fila) {
	var id = fila.getAttribute('id');
	if (!id) return;
	var idth = fila.getAttribute('idth');
	if ( filas_seleccionadas.contains(idth) ) return;
	var div = $(id+'_seleccionFila');
    var xpath="//datos/fila[@idth='"+idth+"']";
    var nodo=datosXML.selectSingleNode(xpath);
    nodo.setAttribute('seleccionada', 'si' );
	filas_seleccionadas.include(idth);
	div.set('class','bloqueImagenSeleccionFilaSi');
}


function deSeleccionaFila(fila) {
	var id = fila.getAttribute('id');
	if (!id) return;
	var idth = fila.getAttribute('idth');
	if ( !filas_seleccionadas.contains( idth) ) return;
	var div = $(id+'_seleccionFila');
    var xpath="//datos/fila[@idth='"+idth+"']";
    var nodo=datosXML.selectSingleNode(xpath);
    nodo.setAttribute('seleccionada', 'no' );
	filas_seleccionadas.erase(idth);
	div.set('class','bloqueImagenSeleccionFilaNo');
}


// Funciones de eliminacion de filas

function eliminarFilasSeleccionadas() {
	if (filas_seleccionadas.length > 0 ){
		filas_seleccionadas.each(function(idth,i){
			filas_eliminadas.include(idth);
		});
		filas_seleccionadas.empty();
		carganewxml();
	}
}

function eliminarFila(fila) {
	var idth = fila.getAttribute('idth');
	if ( filas_eliminadas.contains(idth) ) return;
	filas_eliminadas.include(idth);
	if ( filas_seleccionadas.contains(idth) ) deSeleccionaFila(fila);
	carganewxml();
}



// funciones utiles

function comprobarFilasSelecionadas() {
	if (filas_seleccionadas.length > 0) return;
	if (confirm("No hay filas seleccionadas. Se seleccionarán las de la página actual.")) {
		$$('#nombretabla > tbody > tr').each(function(fila,i){
			seleccionaFila(fila);
		});
	}
}

