function urlencode (str) {
    // URL-encodes string  
    // 
    // version: 1101.3117
    // discuss at: http://phpjs.org/functions/urlencode    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer    // +      input by: Ratheous
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Joris
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // %          note 1: This reflects PHP 5.3/6.0+ behavior    // %        note 2: Please be aware that this function expects to encode into UTF-8 encoded strings, as found on
    // %        note 2: pages served as UTF-8
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
    str = (str+'').toString();
        // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
    // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
	replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}


function urlencode_(str) {

    // http://kevin.vanzonneveld.net

    // +   original by: Philip Peterson

    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    // +      input by: AJ

    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    // +   improved by: Brett Zamir (http://brett-zamir.me)

    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    // +      input by: travc

    // +      input by: Brett Zamir (http://brett-zamir.me)

    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)

    // +   improved by: Lars Fischer

    // +      input by: Ratheous

    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)

    // +   bugfixed by: Joris

    // %          note 1: This reflects PHP 5.3/6.0+ behavior

    // *     example 1: urlencode('Kevin van Zonneveld!');

    // *     returns 1: 'Kevin+van+Zonneveld%21'

    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');

    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'

    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');

    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'



    var hexStr = function (dec) {

        return '%' + (dec < 16 ? '0' : '') + dec.toString(16).toUpperCase();

    };



    var ret = '',

            unreserved = /[\w.-]/; // A-Za-z0-9_.- // Tilde is not here for historical reasons; to preserve it, use rawurlencode instead

    str = (str+'').toString();



    for (var i = 0, dl = str.length; i < dl; i++) {

        var ch = str.charAt(i);

        if (unreserved.test(ch)) {

            ret += ch;

        }

        else {

            var code = str.charCodeAt(i);

            if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters); https://developer.mozilla.org/index.php?title=en/Core_JavaScript_1.5_Reference/Global_Objects/String/charCodeAt

                ret += ((code - 0xD800) * 0x400) + (str.charCodeAt(i+1) - 0xDC00) + 0x10000;

                i++; // skip the next one as we just retrieved it as a low surrogate

            }

            // We never come across a low surrogate because we skip them, unless invalid

            // Reserved assumed to be in UTF-8, as in PHP

            else if (code === 32) {

                ret += '+'; // %20 in rawurlencode

            }

            else if (code < 128) { // 1 byte

                ret += hexStr(code);

            }

            else if (code >= 128 && code < 2048) { // 2 bytes

                ret += hexStr((code >> 6) | 0xC0);

                ret += hexStr((code & 0x3F) | 0x80);

            }

            else if (code >= 2048) { // 3 bytes (code < 65536)

                ret += hexStr((code >> 12) | 0xE0);

                ret += hexStr(((code >> 6) & 0x3F) | 0x80);

                ret += hexStr((code & 0x3F) | 0x80);

            }

        }

    }

    return ret;

}

function nuevoAjax(){
    var xmlhttp = false;
    try {
	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	try {
	    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	    xmlhttp = false;
	}
    }
    
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	xmlhttp = new XMLHttpRequest();
    }
    
    return xmlhttp;
}

// NO funciona con varias llamadas en la misma página
function getMyHTML(serverPage, objID) {
    //document.getElementById('capa_centrada').style.display='block';
    showUpdateProgress();
    var obj = document.getElementById(objID);
    
    ajax = nuevoAjax();
    
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, true);
    ajax.onreadystatechange = function() {
	//alert("readyState: "+ajax.readyState);
	if (ajax.readyState ==  4) {
	    if (ajax.status == 200) {
		//alert(ajax.responseText);	
		obj.innerHTML = ajax.responseText;		
		//document.getElementById('capa_centrada').style.display='none';    
		hideUpdateProgress();
	    } else {
		// quitado en produccion pq al ir a otra página sin haber ejecutado ajax salta alert status:0
		//alert("status: " + ajax.status);
	    }
	}
    }
    ajax.send(null); // IMPRESCINDIBLE
}

// funciona con varias llamadas en la misma página
function getMyHTML_multiple(serverPage, objID) {
    //document.getElementById('capa_centrada').style.display='block';		
    showUpdateProgress();
    
    //alert(objID);
    var obj = document.getElementById(objID);
    
    var ajax = false;
    try {
	ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	try {
	    ajax = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	    ajax = false;
	}
    }    
    if (!ajax && typeof XMLHttpRequest!='undefined') {
	ajax = new XMLHttpRequest();
    }
    
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, true);
    ajax.onreadystatechange = function() {
	//alert("readyState: "+ajax.readyState);
	if (ajax.readyState  ==  4) {
	    if (ajax.status==200) {
		//alert(ajax.responseText);	
		obj.innerHTML = ajax.responseText;
		//alert(obj.innerHTML);
		//eval("cambiaDimensionSplitter");
		//alert(obj.innerHTML);
		//document.getElementById('capa_centrada').style.display='none';    
		hideUpdateProgress();
	    } else {
		// quitado en produccion pq al ir a otra página sin haber ejecutado ajax salta alert status:0
		//alert("status: " + ajax.status);	 	
	    }
	}
    }
    ajax.send(null); // IMPRESCINDIBLE
}

// funciona con varias llamadas en la misma página
function getMyHTMLSincrono(serverPage) {
    showUpdateProgress();
    
    var ajax = false;
    try {
	ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	try {
	    ajax = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	    ajax = false;
	}
    }    
    if (!ajax && typeof XMLHttpRequest!='undefined') {
	ajax = new XMLHttpRequest();
    }
    
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, false);
    ajax.send(null); // IMPRESCINDIBLE
    
    hideUpdateProgress();
    return (ajax.responseText);
}

function getMyHTML_fckeditor(serverPage, objID) {
    showUpdateProgress();    
    //document.getElementById('capa_centrada').style.display='block';
    
    //var obj = document.getElementById(objID);
    var obj = FCKeditorAPI.GetInstance(objID);
    //alert(obj.GetHTML());
    var ajax = false;
    try {
	ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	try {
	    ajax = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	    ajax = false;
	}
    }
    
    if (!ajax && typeof XMLHttpRequest!='undefined') {
	ajax = new XMLHttpRequest();
    }
    
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, true);
    ajax.onreadystatechange = function() {
	//alert("readyState: "+ajax.readyState);
	if (ajax.readyState  ==  4) {
	    if (ajax.status==200) {
		//alert(ajax.responseText);	
		//obj.innerHTML = ajax.responseText;
		obj.SetHTML(ajax.responseText);
		//alert(obj.GetHTML());
		//document.getElementById('capa_centrada').style.display='none';
		hideUpdateProgress();
	    } else {
		alert("status: " + ajax.status);	 	
	    }
	}
    }
    ajax.send(null); // IMPRESCINDIBLE  
}

function getMyHTML2_fckeditor(serverPage, objID) {
    showUpdateProgress();    
    //document.getElementById('capa_centrada').style.display='block';
    
    //var obj = document.getElementById(objID);
    var obj = FCKeditorAPI.GetInstance(objID);
    
    var ajax = false;
    try {
	ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
	try {
	    ajax = new ActiveXObject("Microsoft.XMLHTTP");
	} catch (E) {
	    ajax = false;
	}
    }
    
    if (!ajax && typeof XMLHttpRequest!='undefined') {
	ajax = new XMLHttpRequest();
    }
    
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, true);
    ajax.onreadystatechange = function() {
	//alert("readyState: "+ajax.readyState);
	if (ajax.readyState  ==  4) {
	    if (ajax.status==200) {
		//alert(ajax.responseText);	
		//obj.innerHTML = ajax.responseText;
		obj.SetHTML(ajax.responseText);
		//document.getElementById('capa_centrada').style.display='none';
		hideUpdateProgress();
	    } else {
		alert("status: " + ajax.status);	 	
	    }
	}
    }
    ajax.send(null); // IMPRESCINDIBLE
}

function getMyHTML_Form(serverPage,formulario,campo) {
    showUpdateProgress();    
    //alert(document.forms[formulario][campo].value);
    //document.getElementById('capa_centrada').style.display='block';
    
    //var obj = document.getElementById(objID);
    ajax=nuevoAjax();
    if (serverPage.indexOf('?') > 0) serverPage = serverPage + "&hash=" + Math.random();
    else serverPage = serverPage + "?hash=" + Math.random();
    //alert(serverPage);
    ajax.open("GET", serverPage, true);
    ajax.onreadystatechange = function() {
	//alert("readyState: "+ajax.readyState);
	if (ajax.readyState  ==  4) {
	    if (ajax.status==200) {
		//alert(ajax.responseText);
		//document.forms[formulario].campo.value NO FUNCIONA!!
		document.forms[formulario][campo].value = ajax.responseText;
		//document.getElementById('capa_centrada').style.display='none';
		hideUpdateProgress();
	    } else {
		alert("status: " + ajax.status);	 	
	    }
	}
    }
    ajax.send(null); // IMPRESCINDIBLE
}

function enviarFormularioConAjax(url, formid) {
    var Formulario = document.getElementById(formid);
    var longitudFormulario = Formulario.elements.length;
    var cadenaFormulario = "";
    var sepCampos
    sepCampos = ""
    for (var i=0; i <= Formulario.elements.length-1;i++) {
	cadenaFormulario += sepCampos+Formulario.elements[i].name+'='+encodeURI(Formulario.elements[i].value);
	sepCampos="&";
    }
    peticion.open("POST", url, true);
    peticion.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
    peticion.onreadystatechange = function () {
	if (peticion.readyState == 4) {
	    document.getElementById('Ficha').innerHTML = "Los datos han sido enviados correctamente";
	}
    }
    peticion.send(cadenaFormulario);
}

function recargaTriggerTooltip() {
    //alert('Recargando Tooltip');
    $(".trigger_help img[title]").tooltip();
}

function getLetraNIF(objeto) {
    var elNif = obtenerValor(objeto).toUpperCase();
    //alert(elNif);
    if (elNif.length<9) {
        for (w = elNif.length; w<9; w++) {
            elNif += "0";
        }
    }

    var elNumero = elNif.substring(0,8);
    if (!esNumero(elNumero)){
        return false;
    }

    var posiblesLetras = "TRWAGMYFPDXBNJZSQVHLCKET";
    var pos = elNumero%23;
    return posiblesLetras.charAt(pos);
}

/*
function validaNIF(objeto) {
    // Valida el NIF que se le pasa. El formato puede ser 12345678A ó 12345678-A
    // si al NIF le faltan dígitos se completa con ceros. Se el puede pasar el
    // campo directamente o bien la cadena de texto a comprobar.

    var elNif = obtenerValor(objeto).toUpperCase();
    //alert(elNif);
    if (elNif.length<9) {
        for (w = elNif.length; w<9; w++) {
            elNif += "0";
        }
    }

    var elNumero = elNif.substring(0,8);
    if (!esNumero(elNumero)){
        return false;
    }

    var laLetra = elNif.charAt(8);
    if (elNif.length >= 10){
        laLetra = elNif.charAt(9);
    }

    var posiblesLetras = "TRWAGMYFPDXBNJZSQVHLCKET";
    if (posiblesLetras.indexOf(laLetra)<0){
        return false;
    }

    var pos = elNumero%23;
    if (posiblesLetras.charAt(pos)!=laLetra){
        return false;
    }

    if (typeof objeto == "object") {
        objeto.value = elNumero + laLetra;
    }
    
    return true;
}
*/

// verificar NIE: http://www.gabilos.com/textocalculadoranie.htm 
//Returns: 1 = NIF ok, 2 = CIF ok, 3 = NIE ok, -1 = NIF bad, -2 = CIF bad, -3 = NIE bad, 0 = ??? bad
function valida_nif_cif_nie(a) 
{
    // añadido por mi para que no falle NIE o CIF si se introduce en minusculas
    a=a.toUpperCase();
    
    // IE no reconoce a[8] si a es un String
    array_a = a.toArray();
    //alert(array_a);
    
    var temp=a.toUpperCase();
    var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";

    if (temp !== ''){
	    //si no tiene un formato valido devuelve error
	    if ((!/^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp) && !/^[T]{1}[A-Z0-9]{8}$/.test(temp)) && !/^[0-9]{8}[A-Z]{1}$/.test(temp))
	    {
		    return 0;
	    }

	    //comprobacion de NIFs estandar
	    if (/^[0-9]{8}[A-Z]{1}$/.test(temp))
	    {
		    posicion = a.substring(8,0) % 23;
		    letra = cadenadni.charAt(posicion);
		    var letradni=temp.charAt(8);
		    if (letra == letradni)
		    {
			    return 1;
		    }
		    else
		    {
			    return -1;
		    }
	    }

	    //algoritmo para comprobacion de codigos tipo CIF
	    suma = parseInt(array_a[2])+parseInt(array_a[4])+parseInt(array_a[6]);
	    for (i = 1; i < 8; i += 2)
	    {
		    temp1 = 2 * parseInt(array_a[i]);
		    temp1 += '';
		    temp1 = temp1.substring(0,1);
		    temp2 = 2 * parseInt(array_a[i]);
		    temp2 += '';
		    temp2 = temp2.substring(1,2);
		    if (temp2 == '')
		    {
			    temp2 = '0';
		    }

		    suma += (parseInt(temp1) + parseInt(temp2));
	    }
	    suma += '';
	    n = 10 - parseInt(suma.substring(suma.length-1, suma.length));

	    //comprobacion de NIFs especiales (se calculan como CIFs)
	    if (/^[KLM]{1}/.test(temp))
	    {
		    if (array_a[8] == String.fromCharCode(64 + n))
		    {
			    return 1;
		    }
		    else
		    {
			    return -1;
		    }
	    }

	    //comprobacion de CIFs
	    if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp))
	    {
		    temp = n + '';
		    if (array_a[8] == String.fromCharCode(64 + n) || array_a[8] == parseInt(temp.substring(temp.length-1, temp.length)))
		    {
			    return 2;
		    }
		    else
		    {
			    return -2;
		    }
	    }

	    //comprobacion de NIEs
	    //T
	    if (/^[T]{1}/.test(temp))
	    {
		    if (array_a[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp))
		    {
			    return 3;
		    }
		    else
		    {
			    return -3;
		    }
	    }

	    //XYZ
	    if (/^[XYZ]{1}/.test(temp))
	    {
		    pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
		    if (array_a[8] == cadenadni.substring(pos, pos + 1))
		    {
			    return 3;
		    }
		    else
		    {
			    return -3;
		    }
	    }
    }

    return 0;
}

function str_replace(search, replace, subject) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'
 
    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
 
    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };
 
    return sa ? s : s[0];
}

function calculaNAFCCC(codi){
    var un = (codi.length!=11)?1:0;
    var numero;
    if (codi.charAt(2)=="0"){
	numero = parseFloat(codi.substring(0,2) + codi.substring(3,(9+un)))*100;
    } else {
	numero = parseFloat(codi.substring(0,(9+un)))*100;
    }
    numero /= 97;
    numero = Math.floor(numero%100);
    if (numero>66){
	numero -= 2;
    } else if (numero>33){
	numero--;
    }
    
    return numero;
}

function comprobarNAFCCC(codi, tipo){
    if ( (tipo == "CCC" && codi.length != 11) || 
	 (tipo == "NAF" && codi.length != 12) ){
	return false;
    }
    digits = parseInt(codi.substring(codi.length-2,codi.length),10);
    if (calculaNAFCCC(codi)==digits){
	return true;
    }
    
    return false;
}

function obtenerValor(objeto) {
    // Si es un objeto devuelve su valor, si es una cadena la devuelve sin tocarla.

    if (typeof objeto == "object" && (objeto.type=="text" || objeto.type=="textarea" || objeto.type=="file" || objeto.type=="radio" || objeto.type=="checkbox") || objeto.type=="password" || objeto.type=="hidden"){
        return objeto.value;
    } else if (typeof objeto == "object" && (objeto.type=="select" || objeto.type=="select-one")){
        if (objeto.selectedIndex>=0){
            return objeto.options[objeto.selectedIndex].value;
        } else {
            return "";
        }
    } else if (typeof objeto == "string" || typeof objeto == "number"){
        return objeto;
    } else {
        alert ("Error en la función obtenerValor, no se puede obtener valor de '" + objeto.type + "'.\n" +
               "Sólo se puede obtener el valor de campos de texto y cadenas.");
    }
}

var numerosEnteros = "0123456789-";
function esNumero(cadena){
    laCadena = obtenerValor(cadena);
    if (contieneCaracteresValidos(laCadena, numerosEnteros) && countChars("-",laCadena)<=1 && laCadena.toString().lastIndexOf("-")<=0){
        return true;
    }
}

function contieneCaracteresValidos(cadena, caracteresValidos){
    // Devuelve 'true' si la 'cadena' esta compuesta integramente por 'caracteresValidos'.
    var laCadena = obtenerValor(cadena);
    for (var i=0; i<laCadena.length; i++){
        if (caracteresValidos.indexOf(laCadena.charAt(i))<0){
            return false;
        }
    }
    
    return true;
}

function countChars(chars, cadena){
    laCadena  = obtenerValor(cadena);
    sizeChars = chars.length;
    counter = 0;
    for (x=0; x<laCadena.length-sizeChars; x++){
        if (laCadena.substring(x,(x+sizeChars)) == chars){
            counter++;
        }
    }
    
    return counter;
}

function sumaDigitos(cadena){
    // Suma los digitos de una cadena entre sí, por ejemplo en la cadena '1024'
    // se realizará la siguiente operación: 1 + 0 + 2 + 4 = 7
    // Esta función es necesaria para calcular el CIF.

    var resultado = 0;
    laCadena = obtenerValor(cadena).toString();
    for (x=0; x<laCadena.length; x++){
        resultado += parseInt(cadena.charAt(x));
    }
    
    return resultado;
}

function addElementos(formulario,lista,vector) {
    //alert(vector.length);
    // con el for in me aparecen tres elementos de regalo en el vector (3 funciones !!!)
    //for (variable in vector) {
    for (j = 0; j < vector.length; j++) { 
	//alert(variable);
	addElemento(formulario,lista,vector[j],j);
    }
}

function addElemento(formulario,lista,texto,valor) {
    document.forms[formulario][lista].options[document.forms[formulario][lista].length] = new Option(texto,valor);
}

function removeElemento(formulario,lista,vector_indices)
{
    if (is_array(vector_indices)) {
	for (variable in vector_indices){
	    document.forms[formulario][lista].options[vector_indices[variable]] = null;   
	}
    } else {
	document.forms[formulario][lista].options[indice] = null;
    }
}

function vaciaLista(formulario,lista) {
    for (i = document.forms[formulario][lista].length-1; i >= 0; i--) {
	document.forms[formulario][lista].options[i] = null;
    }
}

function entradaDuplicada(formulario,valueListaOrigen,listaDestino)
{
    /* CUIDADO!! EL contador no puede ser i o bien debe ser declarada local!!*/
    //alert(valueListaOrigen);
    var j; 	
    for (j = 0; j < document.forms[formulario][listaDestino].length; j++)
    {		
	valueListaDestino = document.forms[formulario][listaDestino][j].value;
	//alert(j);				
	if (valueListaOrigen == valueListaDestino) return true;			
    }
    
    return false;
}

function traspasaElemento(formulario,listaOrigen,listaDestino,eliminaOrigen)
{
    //alert(document.forms[0][listaOrigen].selectedIndex);
    //alert(document.forms[0][listaOrigen][document.forms[0][listaOrigen].selectedIndex].value);
    //alert(document.forms[0][listaOrigen][document.forms[0][listaOrigen].selectedIndex].text);
    var i;	
    if (document.forms[formulario][listaOrigen].multiple)
    {
	for (i=0; i < document.forms[formulario][listaOrigen].length; i++)
	{
	    if (document.forms[formulario][listaOrigen][i].selected) 
	    {
		valueListaOrigen = document.forms[formulario][listaOrigen][i].value;
		textListaOrigen = document.forms[formulario][listaOrigen][i].text;	
		// afegir a listaDestino
		//alert(valueListaOrigen);
		if ( !entradaDuplicada(formulario,valueListaOrigen,listaDestino) )
			document.forms[formulario][listaDestino].options[document.forms[formulario][listaDestino].length] = new Option(textListaOrigen,valueListaOrigen);
		// eliminar de listaOrigen
		if(eliminaOrigen) document.forms[formulario][listaOrigen].options[i] = null;
	    }
	}	
    }
    else
    {
	if (document.forms[formulario][listaOrigen].selectedIndex >= 0) // -1 si no hay seleccionados	
	{			
	    valueListaOrigen = document.forms[formulario][listaOrigen][document.forms[formulario][listaOrigen].selectedIndex].value;
	    textListaOrigen = document.forms[formulario][listaOrigen][document.forms[formulario][listaOrigen].selectedIndex].text;	
	    // afegir a listaDestino
	    if (!entradaDuplicada(formulario,valueListaOrigen,listaDestino))			
		    document.forms[formulario][listaDestino].options[document.forms[formulario][listaDestino].length] = new Option(textListaOrigen,valueListaOrigen);
	    // eliminar de listaOrigen			
	    if(eliminaOrigen) document.forms[formulario][listaOrigen].options[document.forms[formulario][listaOrigen].selectedIndex] = null;		
	}
    }
}

function eliminaElementosSeleccionados(formulario,lista)
{
    //alert(document.forms[0][lista].selectedIndex);
    //alert(document.forms[0][lista][document.forms[0][lista].selectedIndex].value);
    //alert(document.forms[0][lista][document.forms[0][lista].selectedIndex].text);
    var i;
    if (document.forms[formulario][lista].multiple)
    {
	for (i = document.forms[formulario][lista].length-1; i >= 0; i--)
	{
	    if (document.forms[formulario][lista][i].selected) 
	    {
		document.forms[formulario][lista].options[i] = null;				
	    }
	}			
    }
    else
    {				
	if (document.forms[formulario][lista].selectedIndex >= 0) // -1 si no hay seleccionados
	{
	    document.forms[formulario][lista].options[document.forms[formulario][lista].selectedIndex] = null;
	}
    }	
}

function seleccionaElementos(formulario,lista)
{
    //alert(document.forms[0][lista].length);
    var i;
    if (document.forms[formulario][lista])
    {
	for (i = 0; i < document.forms[formulario][lista].length; i++)	
	{
	    document.forms[formulario][lista][i].selected = true;
	    //alert(document.forms[0][lista][i].selected);
	}
    }	
}

// no valida para varios checkbox con mismo nombre
function elementosSeleccionados(formulario,control)
{
    //alert(formulario);alert(control);
    //alert(document.forms[formulario][control].type)        
    var valorControl = new Array();
    var j;
    for (j = 0; j < document.forms[formulario][control].length; j++)
    {
	/*
	No funciona para el caso de que sea tenga un checkbox "multiple" (varios con el mismo nombre).
	document.forms[formulario][control].type devuelve undefined
	Quizás el type checkbox no admite names repetidos en el modelo de objetos.
	Solución: elementosCheckeados
	*/
	if (typeof document.forms[formulario][control] == "object" && document.forms[formulario][control].type == "select-multiple") propiedad = 'selected';
	else if (typeof document.forms[formulario][control] == "object" && document.forms[formulario][control].type == "checkbox") propiedad = 'checked';
	if (document.forms[formulario][control][j][propiedad])
	    valorControl.push(document.forms[formulario][control][j].value);
    }
    
    return valorControl.join(',');
}

// para varios checkbox con mismo nombre
function elementosCheckeados(formulario,control)
{
    //alert(formulario);alert(control);
    //alert(document.forms[formulario][control].type)        
    var valorControl = new Array();
    var j;
    for (j = 0; j < document.forms[formulario][control].length; j++)
    {
	if (document.forms[formulario][control][j].checked)
	    valorControl.push(document.forms[formulario][control][j].value);
    }
    
    return valorControl.join(',');
}

function getElementosSeleccionados(formulario,lista)
{
    //alert(document.forms[0][lista].length);
    var i;
    var seleccionados = 0;
    if (document.forms[formulario][lista])
    {
	for (i = 0; i < document.forms[formulario][lista].length; i++)	
	{
	    if (document.forms[formulario][lista][i].selected) seleccionados++;
	}
    }
    
    return seleccionados;
}

function getElementosCheckeados(formulario,grupo_checkboxes)
{
    //alert(document.forms[0][lista].length);
    var i;
    var seleccionados = 0;
    if (document.forms[formulario][grupo_checkboxes])
    {
	for (i = 0; i < document.forms[formulario][grupo_checkboxes].length; i++)	
	{
	    if (document.forms[formulario][grupo_checkboxes][i].checked) seleccionados++;
	}
    }
    
    return seleccionados;
}

function imgover(imgname){
    imgname.src = "../imagenes/arrow.gif";
}

function imgout(imgname){
    imgname.src = "../imagenes/blank.gif";
}

/* solo se usa en relizar_exam.js y realizar_ensayo.js para que no funcione la techa atrás (mozilla lo
respeta pero en IE NO PQ A BACKSPACE LE DA UN SIGNIFICADO ESPECIAL (atras) => HACER DE OTRO MODO

// Llamada desde onkeypress="return capturaTecla(event);" de BODY
function capturaTecla(e) {
      if(document.all)
      {
	  codigoTecla = event.keyCode //e.keycode també
      }
      else if(document.layers)
      {
	  codigoTecla = e.which
      }
      else if(document.getElementById)
      {
	  codigoTecla = (window.Event) ? e.which : e.keyCode;
      }
      //alert(codigoTecla);
      if (codigoTecla==8 || codigoTecla==0) return false;
}
*/

/*
   M‚todo que permite abrir una ventana centrada tanto de forma horizontal como verticalmente.
   Par metros:
     + ancho - define la anchura de la ventana.
     + alto  - define la altura  de la ventana.
       -  Si ancho/alto es mayor que 0 se entiende que se debe ser centrada.
       -  Si no debe ir centrada se envia 0 y se especifica el ancho como propiedad dentro de la cadena.
     + propiedades - cadena en la que se especifican todos los par metros que se desean ( menu, scrollbars, resizable, ...)
*/
function centrarVentana(url, titulo, ancho, alto, propiedades, cogeFoco){
    if ( alto > window.screen.height)
       alto = window.screen.height;
//         vertical = window.screen.height /2;

    var horizontal = ( window.screen.width  - parseInt(ancho) ) / 2 ;
    var vertical   = ( window.screen.height - parseInt(alto ) ) / 2 ;

    cadena = "window.open( \"" + url + "\", \"" + titulo + "\", \"";

    if ( parseInt( ancho ) > 0 )
       cadena += "width=" + ancho + ",screenX=" + horizontal + ",left=" + horizontal;

    if ( parseInt( alto  ) > 0 )
       cadena += ",height=" + alto + ",screenY=" + vertical + ",top=" + vertical;

    if ( propiedades != "" )
       cadena += "," + propiedades;

    cadena +=  "\" )";

    var nuevaVentana = eval ( cadena );
    if ( cogeFoco )
       nuevaVentana.focus();

    return nuevaVentana;
}

function abreVentanaGrande(fichero,nombre){
    if (nombre==null) nombre='ventana';
    var carac="left=0,top=0,width=" + (screen.availWidth-15) + ",height="+ (screen.availHeight-45) + ",resizable=yes,scrollbars=yes";
    //alert(carac)
    var ventana=window.open(fichero,nombre,carac);
    ventana.focus();
}

function abreCalen(campo){
    //var ven=centrarVentana('','calen',170,170,'scrollbars=no',1);
    // Con menos de 500 en remoto falla (en local funciona incluso con 100)!!!
    var ven=window.open('','calen','width=170,height=170,left=600,top=100,scrollbars=no',1);
    ven.document.write('<html><head><title>Calendario</title><link type=\"text/css\" href=\"themes/evaluaplus/css/estilos_evaluaplus.css\" rel=\"stylesheet\"><script type=\"text/javascript\" src=\"calendario.js\"><\/script></HEAD><BODY><br /><div id=\"cal\"></div><script>setTimeout(\"ponCal(\''+ campo +'\')\",500);</scr'+'ipt></body></html>');
    ven.focus();
}

function nombreValido(id){
    var nombre=document.forms[0][id].value;
    var pos=nombre.lastIndexOf("\\");
    //alert(pos);
    if (pos  ==  -1) pos=nombre.lastIndexOf("/");
    nombre=nombre.substring(pos+1);
    //alert(nombre);
    var codigoInicial = nombre.charCodeAt(0);
    //alert (codigoInicial);
    for (i=0; i<nombre.length; i++){
	var codigo = nombre.charCodeAt(i);
	if (!( (codigo>=48 && codigo<=57) || (codigo>=65 && codigo<=90)
	    || (codigo>=97 && codigo<=122) || codigo==45 || codigo==46 || codigo==95 || codigo==32)){  // - . _ espacio
	    alert("El caracter '"+ nombre.charAt(i) +"' no es un caracter válido.\n Los caracteres válidos son 0..9, a..z, A..Z y los caracteres - _ y espacio");
	    document.forms[0][id].focus();
	    return false;
	}
    }
    
    return true;
}

function loginValido(formulario,id){
    login = document.forms[formulario][id].value;
    
    /*
    var codigoInicial = login.charCodeAt(0);
    //alert (codigoInicial);
    if (!( (codigoInicial>=65 && codigoInicial<=90) || (codigoInicial>=97 && codigoInicial<=122) )){
	alert("El LOGIN debe empezar por un caracter comprendido entre a..z o A..Z y no puede contener espacios en blanco.");
	document.forms[formulario][id].focus();
	return false;
    }
    */
    
    for (i=0; i<login.length; i++){
	var codigo = login.charCodeAt(i);
	if (!( (codigo>=48 && codigo<=57) || (codigo>=65 && codigo<=90)
	  || (codigo>=97 && codigo<=122) || codigo==45 || codigo==46 || codigo==95)){  // - . Y _
	  alert("El caracter '"+ login.charAt(i) + "' no es un caracter válido.\n Los caracteres válidos son 0..9, a..z, A..Z y los caracteres . - y _");
	  document.forms[formulario][id].focus();
	  return false;
	}
    }
    
    return true;
}

function loginValido1(id){
    var checkOK = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÀÈÒ" + "abcdefghijklmnñopqrstuvwxyzáéíóúàèò";
    var checkFirst = document.forms[0][id].value.charAt(0);
    var valid=false;
    for (j = 0; j < checkOK.length; j++)
	if (checkFirst  ==  checkOK.charAt(j)){
	    valid=true;
	    break;
	}
    if (!valid) {
	alert("El LOGIN debe empezar por un caracter comprendido entre a..z o A..Z y no puede contener espacios en blanco.");
	document.forms[0][id].focus();
	return (false);
    }
  
    var checkOK = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÀÈÒ" + "abcdefghijklmnñopqrstuvwxyzáéíóúàèò"+
	  "0123456789"+"-"+"_";
    var allValid = true;
    var checkStr = document.forms[0][id].value;
  
    for (i = 0; i < checkStr.length; i++) {
	ch = checkStr.charAt(i);
	for (j = 0; j < checkOK.length; j++)
	    if (ch  ==  checkOK.charAt(j))
		break;
	if (j  ==  checkOK.length) {
	    alert('invalido');
	    allValid = false;
	    break;
	}
    }
  
    if (!(allValid)){
	alert("El caracter '"+ checkStr.charAt(i) +"' no es un caracter válido.\n Los caracteres válidos son 0..9, a..z, A..Z y los caracteres - y _");
	document.forms[0][id].focus();
	return (false);
    }
    
    return (true);
}

function cookies(){
    if (navigator.cookieEnabled) return true;
}

function openMenu(event, id) {
    var el, x, y;
  
    el = document.getElementById(id);
    if (window.event) {
      x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
      y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }else {
      x = event.clientX + window.scrollX;
      y = event.clientY + window.scrollY;
    }
    x -= 8; y -= 8;
    el.style.left = x + "px";
    el.style.top  = y + "px";
    el.style.visibility = "visible";
}


function closeMenu(event) {
    var current, related;
  
    if (window.event) {
	current = this;
	related = window.event.toElement;
    }else{
	current = event.currentTarget;
	related = event.relatedTarget;
    }
  
    //alert(current != related); siempre es cierto al cambiar de elemento de menu
    if (current != related && !contains(current, related)){
	current.style.visibility = "hidden";
    }
}


function contains(a, b) {
    // Return true if node a contains node b.
  
    if(b==null) return false;
    while (b.parentNode)
	if ((b = b.parentNode)  ==  a){
	    return true;
	}
	
    return false;
}


// CRONO: usada en onload de fra_sup
function actReloj()
{
    var hhmmss=new Date()
    var horas=hhmmss.getHours()
    var minutos=hhmmss.getMinutes()
    var segundos=hhmmss.getSeconds()
    
    //Convertimos los números a dos dígitos, o sea, 6 -> 06
    horas = (horas<=9)?("0"+horas):horas;
    minutos = (minutos<=9)?("0"+minutos):minutos;
    segundos=(segundos<=9)? ("0"+segundos):segundos;
    
    /* Aquí construimos la cadena de texto HTML con la hora, y el tipo de letra que se escribe
    en la capa del reloj. */
    
    var hora=horas+":"+minutos+":" +segundos;
    if ((document.all) || (document.getElementById))
    {
	document.getElementById('reloj').innerHTML=hora;
    }
    else if (document.layers)
    {
	document.layers.reloj.document.write(hora);
	document.layers.reloj.document.close();
    }
    //ejecuta la función cada segundo (1000 miliseg)
    setTimeout("actReloj()",1000);
}



/* ACTIVACION POR ALUMNO */
/*
function quitaAlumno(alum){
    var alumnos=document.form1["alumnos"].value;
    if (alumnos.substring(0,1)!=',') alumnos=','+alumnos;
    if (alumnos.substring(alumnos.length,alumnos.length+1)!=',') alumnos=alumnos+',';
    var pos=alumnos.indexOf(","+alum+",");
    if (pos!=-1){ // existe
	var alumnos1=document.form1["alumnos"].value;
	principio=alumnos1.substring(0,pos);
	fi=alum.length;
	fin=alumnos1.substring(pos+fi+1);
	alumnos1= principio + fin;
	//alert(alumnos);
	document.form1["alumnos"].value=alumnos1;
    }        
    //alert(document.form1["alumnos"].value);
}

function ponAlumno(alum){
    var alumnos=document.form1["alumnos"].value;
    if (alumnos.substring(0,1)!=',') alumnos=','+alumnos;
    if (alumnos.substring(alumnos.length,alumnos.length+1)!=',') alumnos=alumnos+',';
    var pos=alumnos.indexOf(","+alum+",");
    if (pos==-1){ // no existe
	    document.form1["alumnos"].value = document.form1["alumnos"].value + alum + ",";
    }        
    //alert(document.form1["alumnos"].value);
}

function ponAlumnos(obj){
  var alum="";
  var pos=0;
  var alumnos;
  
  if (obj.checked){
     // PONER
     for(i=0; i< document.form1.elements.length; i++){
	 if (document.form1.elements[i].name.substr(0,4) == "alum"){
		 // quitarla de contestadas para que no la envie
		 alum=document.form1.elements[i].value;
		 pos=document.form1["alumnos"].value.indexOf(alum);
		 if (pos==-1){ // no existe
			 document.form1["alumnos"].value = document.form1["alumnos"].value + alum + ", ";
		 }
		 //alert(document.form1["alumnos"].value);
	 }
     }
  }else{
     // QUITAR
     for(i=0; i<document.form1.elements.length; i++){
	 // quitarla de contestadas para que no la envie
	 alum=document.form1.elements[i].value;
	 //alert(alum);
	 pos=document.form1["alumnos"].value.indexOf(alum);
	 //alert(pos);
	 if (pos!=-1){ // existe
	     alumnos=document.form1["alumnos"].value;
	     principio=alumnos.substring(0,pos);
	     fi=alum.length;        
	     fin=alumnos.substring(pos+fi+1);
	     alumnos= principio + fin;
	     //alert(alumnos);
	     document.form1["alumnos"].value=alumnos;
		 //alert(document.form1["alumnos"].value);
	 } 
     }
  }
}
*/

// usada en mensajero, asistencia
function quitaMarca(campo,nombre){
    var pos=document.form1[campo].value.indexOf(nombre);
    if (pos!=-1){ // existe
	var alumnos=document.form1[campo].value;
	principio=alumnos.substring(0,pos);
	fi=nombre.length;
	fin=alumnos.substring(pos+fi+1);
	alumnos= principio + fin;
	//alert(alumnos);
	document.form1[campo].value=alumnos;
    }
    //alert(document.form1["alumnos"].value);
}


// usada en mensajero, asistencia
function ponMarca(campo,nombre){
    //alert(campo);
    //alert(nombre);
    var pos=document.form1[campo].value.indexOf(nombre);
    if (pos==-1){ // no existe
	    document.form1[campo].value = document.form1[campo].value + nombre + ",";
    }
    //alert(document.form1[campo].value);
}

/*
// PEQUEÑA CONTRADICCION:  ponMarca Y ponMarcas DEBERIAN USAR LAS DOS O NINGUNA EL CAMPO MARCAS
// usada en mensajero, asistencia
function ponMarcas(obj,id){
    var marca="";
    var pos=0;
    var marcas;
    
    if (id!=null) comienzo=id;
    else comienzo='';
    if (obj.checked){
      // PONER
      for(i=0; i< document.forms[0].elements.length; i++){
	   if (document.forms[0].elements[i].type=="checkbox" && document.forms[0].elements[i].name.substring(0,comienzo.length)==comienzo){
		   document.forms[0].elements[i].checked=true;
		   marca=document.forms[0].elements[i].value;
		   pos=document.forms[0]["marcas"].value.indexOf(marca);
		   if (pos==-1){ // no existe
			   document.forms[0]["marcas"].value = document.forms[0]["marcas"].value + marca + ",";
		   }
		   //alert(document.form1["alumnos"].value);
	   }
      }
    }else{
      // QUITAR
      for(i=0; i<document.forms[0].elements.length; i++){
	  if (document.forms[0].elements[i].type=="checkbox" && document.forms[0].elements[i].name.substring(0,comienzo.length)==comienzo){
	      document.forms[0].elements[i].checked=false;
	      marca=document.forms[0].elements[i].value;
	      //alert(alum);
	      pos=document.forms[0]["marcas"].value.indexOf(marca);
	      //alert(pos);
	      if (pos!=-1){ // existe
		  marcas=document.forms[0]["marcas"].value;
		  principio=marcas.substring(0,pos);
		  fi=marca.length;
		  fin=marcas.substring(pos+fi+1);
		  marcas= principio + fin;
		  //alert(alumnos);
		  document.forms[0]["marcas"].value=marcas;
		      //alert(document.form1["alumnos"].value);
	      }
	  }
	}
    }
    //alert(document.form1["alumnos"].value);
}
*/

/* ROLLOVER */
// usada en campus.php
function cambiaImagen(obj,imgOn,imgOff,sino){
    if (sino){
	obj.src=imgOn;
    }else{
	obj.src=imgOff;
    }
}


/* formULARIOS */

function cambiaBoton(obj,sino){
    if (sino){
	obj.style.borderColor= '#333333';
	obj.style.backgroundColor= '#666666';
	obj.style.color= 'white';
    }else{
	obj.style.borderColor= '#333333';
	obj.style.backgroundColor= '';
	obj.style.color= '';
    }
}

//PONE FOCO EN formULARIOS
function ponFoco(id){
    // si sólo pongo select el orden de tabulacion no funciona
    document.forms[0][id].focus();
    if (document.forms[0][id].type=="text") document.forms[0][id].select();
}


// CONFIRMA LA ELIMINACIÓN DE UN REGISTRO
function confirmar(id){
    var resp=confirm("¿Está seguro que desea eliminar el registro '" + id + "' ?");
    if (resp==false) return false;
    else return true;
}

/*
//MARCA TOTS LES PREGUNTES (CHECKBOX'S) DE LA PANTALLA IMPORTAR
function chkTotes(id){
    // por si se filtra y no hay ningún check, yq que vector_checks.length es curiosamente 1!!
    if (document.form1['checks'].value=='') return;
    vector_checks=document.form1['checks'].value.split(",");
    //alert(vector_checks.length);
    for(j=0; j< vector_checks.length; j++){
	if (document.form1['chkTot'].checked){
	    document.form1[id+vector_checks[j]].checked= true;
	}else{
	    document.form1[id+vector_checks[j]].checked= false;
	}
    }
}
*/

//MARCA TODOS LOS CHECKBOX'S DE UN LISTADO
function chkTots(formulario,obj,id){
    if (obj.checked == true)
	for(i=0; i< document.forms[formulario].elements.length; i++){
	    //alert(document.forms[formulario].elements[i].name);
	    //alert(document.forms[formulario].elements[i].name.substring(0,id.length));
	    if ( document.forms[formulario].elements[i].type=="checkbox" && document.forms[formulario].elements[i].name.substring(0,id.length)==id ){
	    //if ( document.forms[formulario].elements[i].type=="checkbox" && document.forms[formulario].elements[i].name == id ){
		    document.forms[formulario].elements[i].checked = true;
	    }
	}
    else
	for(i=0; i< document.forms[formulario].elements.length; i++){
	    //alert(document.forms[formulario].elements[i].name.substring(0,id.length));
	    if ( document.forms[formulario].elements[i].type=="checkbox" && document.forms[formulario].elements[i].name.substring(0,id.length)==id ){
	    //if ( document.forms[formulario].elements[i].type=="checkbox" && document.forms[formulario].elements[i].name == id ){
		    document.forms[formulario].elements[i].checked = false;
	    }
	}
}

// VERIFICA QUE HAYA DATOS
function verificaCampo(formulario){
    //alert(arguments.length);alert(arguments[0]);alert(arguments[1]);alert(arguments[2]);alert(arguments[3]);alert(arguments[4]);alert(arguments[5]);alert(arguments[6]);
    var hay_pass=false;
    for (i=1; i<arguments.length; i++){
	//alert(arguments[i]);
	if (document.forms[formulario][arguments[i]].value == ""){
	    alert("Este dato es obligatorio");
	    document.forms[formulario][arguments[i]].focus();
	    document.forms[formulario][arguments[i]].style.borderColor='#ff0000';
	    //document.forms[formulario][arguments[i]].style.borderWidth='2px';
	    
	    return false;
	}
	//if (arguments[i] == "password") hay_pass=true;
    }
    //if (hay_pass) return validaPassword(formulario);
    //else return (true);
    
    return (true);
}

// en formularios con COMBO O LISTA, comprueba que haya algun elemento elegido
function opcion_elegida(formulario){
    //alert(formulario);
    for (i=1; i<arguments.length; i++){
	//alert(arguments[i]);
        if (document.forms[formulario][arguments[i]].type=="select-one"){ //combo
	    if (document.forms[formulario][arguments[i]].selectedIndex == 0){
		if (document.forms[formulario][arguments[i]].length == 1) continue;
		document.forms[formulario][arguments[i]].style.borderColor='#ff0000';
		alert("Debe seleccionar una opción");
		document.forms[formulario][arguments[i]].focus();
		return false;
	    } else {
		document.forms[formulario][arguments[i]].style.borderColor='';
	    }
        }else if (document.forms[formulario][arguments[i]].type=="select-multiple"){ // lista
	    //alert(arguments[i]);
	    //alert(document.forms[formulario][arguments[i]].length);
	    for(j=0; j<document.forms[formulario][arguments[i]].length;j++){
		//alert(document.forms[formulario][arguments[i]][j].selected);
		document.forms[formulario][arguments[i]].style.borderColor='';
		if (document.forms[formulario][arguments[i]][j].selected==true) {		    
		    return true;
		}
	    }
	    alert("Debes elegir una opción");
	    document.forms[formulario][arguments[i]].style.borderColor='#ff0000';
	    document.forms[formulario][arguments[i]].focus();
            
	    return false;
        }
    }
    
    return (true);    
}

function verificaFichero(fich,login){
    fichero=document.forms[0][fich].value.toLowerCase();
    if (fichero=='') return true;

    //if (fichero.indexOf(login)!=-1) return true;
    pos_barra=fichero.lastIndexOf('\\');
    if (pos_barra==-1) pos_barra=fichero.lastIndexOf('/');
    pos_punto=fichero.lastIndexOf('.');
    nombre=fichero.substring(pos_barra+1,pos_punto);
    if (nombre==login) return true;
    else{
	alert("El nombre del fichero debe ser igual a " + login);
	document.form1[fich].focus();
	return false;
    }
}

//VERIFICA PASSWORDS
function validaPassword(formulario) {
    if (document.forms[formulario]['password'].value != document.forms[formulario]['password2'].value){
	alert("Los passwords no coinciden");
	document.forms[formulario]['password'].focus();
	return false;
    }
    
    return (true);
}

//VERIFICA CORREO
function verificaCorreo(formulario,mail){
    var correcto=false;
    var correo;
    if (mail==null)
	correo=document.forms[formulario]['correo'].value;
    else
	correo=document.forms[formulario][mail].value;
    if (correo=="") return (true);
    var arroba=correo.indexOf('@');
    if (arroba!=-1){
	var punto=correo.indexOf('.',arroba+1);
	if (punto!=-1){
	    correcto=true;
	}
    }
    if (!correcto){
	alert('Dirección de correo incorrecta');
	if (mail==null)
	    document.forms[formulario]['correo'].focus();
	else
	    document.forms[formulario][mail].focus();
	return false;
    }else{
	return true;
    }
}

// se usa en realizar_exam para no dejar que ponga más preguntas por pàgina que el total
function verificaLongitud(id,max){
    if (document.form1[id].value>max){
	alert('Máximo ' + max + ' preguntas');
	document.form1[id].focus();
	return false;
    }else if (document.form1[id].value<=0){
	alert('Número de preguntas incorrecto');
	document.form1[id].focus();
	return false;
    }
    
    return (true);
}

// le paso this, que el objeto fila que quiero iluminar
function ponColorFila(fila,onoff){
    // anteriores: rgb(132,158,181), rgb(204,153,153), #FF9900
    if (onoff=="on") 
	fila.style.backgroundColor="#F0FAFE";
    else
	fila.style.backgroundColor="";
}

// le paso this, que es el objeto que quiero iluminar
// SI SE PONE EN onclick solo funciona con botón izquierdo , en ONMOUSEDOWN funciona con los dos (GRAELLA)
// USADO EN textbox de formularios
function ponColorObjeto(obj,color){
    // rgb(132,158,181);
    //alert(obj.style.backgroundColor);
    if (obj.style.backgroundColor=="") {
	if (color==void 0)
	    obj.style.backgroundColor="#FFFF99";
	else
	    obj.style.backgroundColor=color;
    }else{
	obj.style.backgroundColor="";
    }
    if (obj.value != '') {
	obj.style.borderColor='';
    }
}


// le paso this, que el objeto párrafo que quiero iluminar
function ponColorPreg(preg,onoff,color){
    // rgb(189,203,222)
    if (onoff=="on")
	if (color) preg.style.backgroundColor=color;
	else preg.style.backgroundColor="#FFFF99";
    else
	//rgb(197,255,139)
	preg.style.backgroundColor="";
}

// controla que sólo entre numéricos positivos
// si uso final peta en Netscape pq es palabra reservada??
function pulsada(e,inicial,fin,validos) {
    if(document.all)
    {
	codigoTecla = event.keyCode //e.keycode també
    }
    else if(document.layers)
    {
	codigoTecla = e.which
    }
    else if(document.getElementById)
    {
	codigoTecla = (window.Event) ? e.which : e.keyCode;
    }

    //alert(codigoTecla);
    // 8 = backspace, 0 = cursores; esto es para Netscape sólo 
    if (codigoTecla==8 || codigoTecla==0) return;

    if (validos!=null){
	var v_validos = validos.split(' ');
	for(var j=0; j<v_validos.length; j++){
	    if (v_validos[j]==String.fromCharCode(codigoTecla)) {
	      if(document.all)
		  event.returnvalue = false;
	      else 
		  return false;
	    }
	}        
    }

    codigoInicial = inicial.charCodeAt(0);
    if (fin==null) // if (!fin) tambien vale
	  codigoFinal = 57;
    else                                          
	  codigoFinal = fin.charCodeAt(0);


    if (codigoTecla<codigoInicial || codigoTecla>codigoFinal) 
    {
	if(document.all)
	    event.returnvalue = false;
	else
	    return false;
    }
}

function soloNumeros(evt){
    // NOTE: Backspace = 8, Enter = 13, '0' = 48, '9' = 57
    var key = evt.keyCode ? evt.keyCode : evt.which ;
    return (key == 46 || key <= 40 || (key >= 48 && key <= 57));
} 

// se usa en mant_actividades.php 
function alClicarHabilitaText(obj){
    if (obj.value==1) {
	document.getElementById('peso').style.visibility='visible';
	document.forms[0]['peso'].disabled= false;
	document.forms[0]['peso'].focus();
	document.forms[0]['peso'].select();
    }else{
	document.forms[0]['peso'].disabled= true;                
	document.getElementById('peso').style.visibility='hidden';
    }
    /* cuando era un checkbox
    if (!obj.checked){
	    document.forms[0]['peso'].disabled= true;
    }else{
	document.forms[0]['peso'].disabled= false;
	document.forms[0]['peso'].focus();
	document.forms[0]['peso'].select();
    }
    */
}

// se usa en mant_actividades.php 
function alClicarHabilitaFila(obj){
    if (obj.value==0) {
	document.getElementById('manual').style.display='';
	document.getElementById('automatica').style.display='none';
    }else{
	document.getElementById('manual').style.display='none';
	document.getElementById('automatica').style.display='';
    }
}


// se usa en mant_actividades.php 
function alClicarHabilitaTipoAuto(obj){
    if (obj.value==0) {
	document.getElementById('inicio').style.display='inline';
	document.getElementById('periodo').style.display='none';
	document.getElementById('tituloauto').innerHTML='Inicio de activación:';
    }else if (obj.value==1) {
	document.getElementById('inicio').style.display='inline';
	document.getElementById('periodo').style.display='inline';
	document.getElementById('tituloauto').innerHTML='Periodo de activación:';
    }else if (obj.value==2 || obj.value=='null'){
	document.getElementById('inicio').style.display='none';
	document.getElementById('periodo').style.display='none';
	document.getElementById('tituloauto').innerHTML='';
    }
}

// se usa en resultados_in.php para FILTRAR aprobados y suspendidos
function escondeFilas(){
    var indice=document.forms[0]['esconde'].selectedIndex;
    /* al ser BARRA un TR no se puede hacer
    if (obj[i].className.indexOf('aprobado') == -1){
	obj[i].style.display="none";
    */

    obj=document.getElementsByTagName("tr");
    for (var i=0; i<obj.length; i++){
	// si pongo block, en Netscape NO funciona!! (pinta mal las filas)
	obj[i].style.display="";
    }

    if (indice==0){
	return;
    }else if (indice==1){ //aprobados
	obj=document.getElementsByTagName("tr");
	for (var i=0; i<obj.length; i++){
	    if (obj[i].className.indexOf('suspendido')!=-1){
		obj[i].style.display="none";
	    }
	}
    }else if (indice==2){ //susp
	obj=document.getElementsByTagName("tr");
	for (var i=0; i<obj.length; i++){
	    if (obj[i].className.indexOf('aprobado')!=-1){
		    obj[i].style.display="none";
	    }
	}
    }
}

function seleccionarFilaTabla(obj,valor) {  
    celda = obj.parentNode;
    //alert(celda);
    fila = celda.parentNode;
    //alert(fila.parentNode);
    tabla = fila.parentNode;
    filas=tabla.getElementsByTagName("tr");
    //alert(filas.length);
    for (var i=0; i<filas.length; i++) {
	//alert(filas);
	fila=tabla.getElementsByTagName("tr")[i];
	//alert(fila);
	for (j=0; elemento = fila.getElementsByTagName('td')[j]; j++) {
	    //alert(elemento);
	    // para IE:
	    if ((i % 2)==0) color_ie="#FFFFFF";
	    else color_ie="#EEEEEE";
	    elemento.style.background = color_ie;
	}
    }
    
    // no sirve pq al estar iluminadas y pasar el raton vuelve al color parimpar!!
    //alert(fila);
    //fila.style.backgroundColor='#4a8ce6';
    celda = obj.parentNode;
    //alert(celda);
    fila = celda.parentNode;
    for (i=0; elemento = fila.getElementsByTagName('td')[i]; i++) {
	//alert(elemento);
	// antiguo azul: #4a8ce6
	elemento.style.background = (valor) ? '#85bdc8' : '';
    }
}

// se usa en resultados.php para FILTRAR correctas e incorrectas
function filtra(){
    var obj;
    var contador=0;
    var indice=document.form1.combo.selectedIndex;

    // DEBERÉ CAMBIARLO POR DIV cuando haga salto de linea (DIV:after {content: "\A";})
    obj=document.getElementsByTagName("P");
    for (var i=0; i<obj.length;i++){
	obj[i].style.display="block";
    }
    if (indice==0){ //todas
	contador=obj.length;

    }else if (indice==1){ //correctas
	obj=document.getElementsByTagName("P");
	for (var i=0; i<obj.length; i++){
	    // es espacio es fundamental: ' correcta'
	    if ( obj[i].className.indexOf(' correcta')!=-1 )
		    contador++;                        
	    else
		    obj[i].style.display="none";
	}
    }else if (indice==2){  //incorrectas
	obj=document.getElementsByTagName("P");
	for (var i=0; i<obj.length; i++){
	    if ( obj[i].className.indexOf('incorrecta')!=-1 )
		    contador++;                        
	    else 
		    obj[i].style.display="none";
	}
    }else{ // no contestadas
	obj=document.getElementsByTagName("P");
	for (var i=0; i<obj.length; i++){
	    if ( obj[i].className.indexOf('nocontestada')!=-1 )
		    contador++;                        
	    else 
		    obj[i].style.display="none";
	}
    }
    document.getElementById('contador').innerHTML=contador;
}

// se usa en resultados.php para ORDENAR segun orden realización o según real
function ordena(criterio){
    var si_esta_alumno=false;
    for(i=0; i< document.form1.elements.length; i++)
	if (document.form1.elements[i].name=="alumno"){
	    si_esta_alumno=true;
	    break;
	}

    if (si_esta_alumno)
	document.form1.action="resultados.php?accion=1&examen=" + document.form1.examen.value
	+ "&curso="+document.form1.curso.value + "&clase="+document.form1.clase.value
	+ "&id_intento="+document.form1['id_intento'].value+"&alumno="+document.form1['alumno'].value;
    else
	document.form1.action="resultados.php?accion=1&examen="+document.form1.examen.value
	+ "&curso="+document.form1.curso.value + "&clase="+document.form1.clase.value
	+"&id_intento="+document.form1['id_intento'].value;

    var si_esta_exped=false;
    for(i=0; i< document.form1.elements.length; i++)
	if (document.form1.elements[i].name=="expediente"){
	    si_esta_exped=true;
	    break;
	}
    if (si_esta_exped) document.form1.action+="&expediente=1";

    var si_esta_estad=false;
    for(i=0; i< document.form1.elements.length; i++)
	if (document.form1.elements[i].name=="estadisticas"){
	    si_esta_estad=true;
	    break;
	}
    if (si_esta_estad) document.form1.action+="&estadisticas=1";

    if (criterio!=null) document.form1.action+=criterio;
    document.form1.submit();
}

/* GUARDA CORRECTA EN RESPUESTAS Y BANCO DE RESPUESTAS*/
function posaLinkGUARDAR(){
    document.getElementById('correcta').innerHTML='<a href="javascript:enviaform();void 0;"><span style="color: #bbbbbb">GUARDAR</span></a>';
}

function enviaform(){
    document.forms[0].submit();
}
/* FIN GUARDA CORRECTA EN RESPUESTAS */

// PONE LA FECHA ACTUAL A UN CAMPO A PARTIR DE SU name
function ponFecha(id){
    var fecha=new Date();
    //var f = fecha.getFullYear() +"-"+ fecha.getMonth() +"-" +fecha.getDate();
    var dia=String(fecha.getDate());
    var mes=String(fecha.getMonth()+1);
    if (dia.length==1) dia="0" + dia;
    if (mes.length==1) mes="0".concat(mes);
    var f=dia + "/" + mes + "/" + fecha.getFullYear();
    document.form1[id].value=f;
}

// PONE LA HORA ACTUAL A UN CAMPO A PARTIR DE SU name
function ponHora(id){
    var fecha=new Date();
    var hora=String(fecha.getHours());
    var min=String(fecha.getMinutes());
    var seg=String(fecha.getSeconds());
    if (hora.length==1) hora="0" + hora;
    if (min.length==1) min="0".concat(min);
    if (seg.length==1) seg="0".concat(seg);
    var h=hora + ":" + min + ":" + seg;
    document.form1[id].value=h;
}

function validaHora(obj){
    var hora=obj.value;
    var valida=true;

    if (hora=="" || hora=="00:00:00") return true;

    if (hora.length>5){ // sino es que es format hh:mm només
	fin=5;
	if (hora.substr(2,1) != ':' || hora.substr(5,1) != ':'){
	    valida=false;
	}
    }else{
	fin=3;
	if (hora.substr(2,1) != ':'){
	    valida=false;
	}
    }

    // per si es deixa entrar lletres,etc...
    // mira si hora es correcta
    horanum = hora.substr(0,2);
    horanum += hora.substr(3,2);
    horanum += hora.substr(6,2);

    var digit;
    for (i=0; i<=fin; i++)
    {
	digit = horanum.substr(i,1);
	if (digit < '0' || digit > '9')
	{
	    valida=false;
	}
    }

    // mira si hora es correcta
    hora_num = hora.substr(0,2);
    min_num  = hora.substr(3,2);
    if (fin==5) seg_num  = hora.substr(6,2);
    
    //alert(hora_num);
    if (hora_num > '24'){
	valida=false;
    }        
    if (min_num > '59'){
	valida=false;
    }
    if (fin==5) 
     if (seg_num > '59'){
	valida=false;
     }

    if (!valida) {
	alert("Hora incorrecta\nformato: hh:mm:ss");
	obj.focus();
	return false;
    }
    
    return true;
}

function compararHoras(sHora1, sHora2) {
    var arHora1 = sHora1.split(":");
    var arHora2 = sHora2.split(":");
    
    // Obtener horas y minutos (hora 1)
    var hh1 = parseInt(arHora1[0],10);
    var mm1 = parseInt(arHora1[1],10);

    // Obtener horas y minutos (hora 2)
    var hh2 = parseInt(arHora2[0],10);
    var mm2 = parseInt(arHora2[1],10);

    // Comparar
    if (hh1<hh2 || (hh1==hh2 && mm1<mm2))
	// sHora1 MENOR sHora2
        resultado = -1;
    else if (hh1>hh2 || (hh1==hh2 && mm1>mm2))
	// sHora1 MAYOR sHora2
        resultado = 1;
    else
	// sHora1 IGUAL sHora2
        resultado = 0;
    
    return resultado;
}

function validaFecha(obj)
{
    /* "00/00/0000" ya que si no se pusiera fecha, al modificar cursos (hay dos fechas seguidas) entraria en un bucle                 infinito */
    if (obj.value=="" || obj.value=="00/00/0000" || obj.value=="00/00/00") return;
    if (obj.value.substr(2,1) != '/'){
	if (obj.value.substr(1,1) == '/'){
	     obj.value="0"+obj.value;
	}
    }
    //alert(obj.value);
    if (obj.value.substr(5,1) != '/'){
	if (obj.value.substr(4,1) == '/'){
	     obj.value=obj.value.substr(0,3)+"0"+obj.value.substr(3);
	}
    }
    //alert(obj.value);

    if (!( (formatData(obj.value)) && (validaData(obj.value)) )) {
	alert("Fecha incorrecta\nformato: dd/mm/aaaa" );
	obj.focus();
	return false;
    }
    
    return true;
}

//El format de les dates ha da ser dd/mm/aaaa
function formatData(fData)
{
    if (fData.substr(2,1) != '/' || fData.substr(5,1) != '/'){
	return (false)
    }

    var data_num;
    //alert(fData.length);
    data_num = fData.substr(0,2);
    data_num += fData.substr(3,2);
    if (fData.length == 8) data_num += fData.substr(6,2);
    else if (fData.length == 10) data_num += fData.substr(6,4);
    // per si es deixa entrar lletres,etc...
    var digit;
    for (i=0; i<=data_num.length-1; i++)
    {
	digit = data_num.substr(i,1);
	if (digit < '0' || digit > '9')
	{
	    return(false);
	}
    }
    
    return(true);
}

//La data informada, ha de ser una data vàlida
function validaData(vData)
{
    var vDia = vData.substr(0,2);
    var vslash1 = vData.substr(2,1);
    var vMes = vData.substr(3,2);
    var vslash2 = vData.substr(5,1);
    var vAny = vData.substr(6,4);
    
    var DiaMes = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 

    //Actualitzem el mes de Febrer pels anys de traspàs ("bisiesto")
    if (((vAny % 4  ==  0) && (vAny % 100 != 0)) || (vAny % 400  ==  0))
	    DiaMes[1] = 29;
	    
    if (vMes < '01' || vMes > '12')
	    return (false);
	    
    if (vDia < '01' || vDia > DiaMes[vMes-1])
	    return (false);
	    
    return(true)
}

//Canvia el format de la data a aaaammdd per poder comparar (i enviar a PHP)
function canviformat(cData,separador)
{
    var sep='';
    if (separador==null) sep="-";
    else sep=separador;

    var cDia = cData.substr(0,2);
    var cMes = cData.substr(3,2);
    var cAny = cData.substr(6,4);
    var cDataNova = cAny + sep + cMes + sep + cDia;
    return (cDataNova)
}


//Canvia el format de la data desde aaaammdd a dd/mm/aaaa per presentacions
function canviformatAEspanyol(cData)
{
    var cAny = cData.substr(0,4);
    var cMes = cData.substr(5,2);
    var cDia = cData.substr(8,2);
    var cDataNova = cDia + "/" + cMes + "/" + cAny;
    return (cDataNova)
}


//NO SIRVE PQ EL NAVEGADOR ORDENA SEGÚN TIENE LOS ELEMENTOS EN LA PÁGINA Y NO 
// SEGÚN LOS VAYA PONIENDO VISIBLES (DESPUÉS DE OCULTARLOS) => PAGINA .PHP
/*
function ordena(){
    var obj;
    var vectorPreg=new Array();
    var indice=document.form1.combo2.selectedIndex;
    obj=document.getElementsByTagName("P");
    if (indice==0){
	for (var i=0; i<obj.length;i++){        
	    vectorPreg[vectorPreg.length]=obj[i].getAttribute('alum');
	}
    }else{
	for (var i=0; i<obj.length;i++){        
	    vectorPreg[vectorPreg.length]=obj[i].getAttribute('id');
	}
    }
    // oculta todas
    for (var i=0; i<obj.length;i++){
	obj[i].style.display="none";
    }
    //vectorPreg.sort(cmp);
    alert(vectorPreg);
    for (var i=0; i<vectorPreg.length;i++){
	obj[vectorPreg[i]-1].style.display="block";
	alert(vectorPreg[i]-1);
    }
}
*/

// NO LA USO: IDA DE OLLA
/*
function convertirAlinks(){
    var pregLinks="";
    var vector=document.getElementById('preguntas').innerHTML.split(" ");
    for(var i=0; i< vector.length; i++) {
	pregLinks=pregLinks+ "<a href=resultados.php?id=" + vector[i] +">" +vector[i]+"</a>" +" ";
    }
    document.getElementById('preguntas').innerHTML=pregLinks;
}
*/

function cmp(a,b) { 
    return (a-b);
}


/** 
* definimos las variables globales necesarias
* var n >> marcapasos del bucle
* var contenido >> string que va a almacenar en cada momento la variante del mensaje a pintar en la capa
* var mensaje >> mensaje a mostrar en la capa
*/
var n=-1;
var contenido="";
var mensaje="EXAMENES ONLINE";

/**
* funcion principal
*/
function escribe()
{
    /**
    * para Internet Explorer
    */
    if(document.all)
    {
	/**
	* si el marcapasos es menor que la longitud del mensaje >> continuamos el bucle, aumentando 1 unidad n
	* si el marcapasos iguala la longitud del mensaje >> lo inicializamos
	*/
	if(n<mensaje.length)
	    n+=1;
	else
	    n=-1;
	
	/**
	* iniciamos el bucle
	* asignamos a la letra de igual posicion que el marcapasos en la cadena del mensaje el color verde
	* y a las otras el color rojo, y almacenamos todo como un string en la variable contenido
	*/
	for(m=0;m<=mensaje.length;m++)
	{
	    if(m!=n)
	    {
		contenido+=('<span class="texto">'+mensaje.charAt(m)+'</span>');
	    }
	    else
	    {
		 contenido+=('<span class="letra">'+mensaje.charAt(n)+'</span>');
	    }
	}
	
	/**
	* una vez creada la cadena completa de este ciclo del bucle, la escribimos en la capa, usando la sintaxis 
	* propia de I. Explorer
	* luego inializamos de nuevo la variable contenido, para empezar desde cero el siguiente bucle
	*/
	document.all['contenedor'].innerHTML=contenido;
	contenido="";
    }
    
    
    /**
    * para Nestcape Navigator 6x
    * este si permite escribir directamente en la capa, al igual que I. Explorer.
    * para acceder a la capa usamos el objeto getElementById('nombre capa')
    */
    else if(document.getElementById)
    {
	 if(n<mensaje.length)
	     n+=1;
	 else
	    n=-1;
	for(m=0;m<=mensaje.length;m++)
	{
	    if(m!=n)
	    {
		contenido+=('<span class="texto">'+mensaje.charAt(m)+'</span>');        
	    }
	    else
	    {
		 contenido+=('<span class="letra">'+mensaje.charAt(n)+'</span>');
	    }
	}
	document.getElementById('contenedor').innerHTML=contenido;
	contenido="";                          
    }

    /**
    * para Nestcape Navigator 4x
    */
    else  if(document.layers)
    {
	if(n<=mensaje.length)
	    n+=1;
	else
	    n=-1;
	
	/**
	* este navegador no permite escribir directamente en una capa, pues considera cada capa como 
	* un documento propio. Hay que abrir el documento de la capa, escribir en el y cerralo luego
	*/
	document.layers['contenedor'].document.open();
	
	for (m=0;m<mensaje.length;m++)
	{
	    if(m!=n)
	    {
		document.layers['contenedor'].document.write('<span class="texto">'+mensaje.charAt(m)+'</span>');
	    }
	    else
	    {
		 document.layers['contenedor'].document.write('<span class="letra">'+mensaje.charAt(n)+'</span>');
	    }            
	}
	document.layers['contenedor'].document.close();
    }
    
    /**
    * llamamos de nuevo a la funcion cada 300 milisegundos
    */
    setTimeout("escribe()",600);
}

function creaCriterioAjax__(){
    var index;
    var criterio='';
    var criteriotexto='';

    // 1) nombre like '%l'abat%' => fallo SQL => no debo poner ' sino \'

    /* COMO SE ENVIA EL CRITERIO EN LA URL(construido por código) y no a través de campos de formulario (caso en
    el que el navegador hace codificaión URL) yo debo hacer la codificacion: LO IDEAL SERIA UNA FUNCION EN
    JAVASCRIPT QUE HAGA LA CODIFICACIÓN URL del criterio */
    // 2) % (del like) es un caracter reservado en una URL (como &) => código hexa => %25 ya que sino al
    // buscar dai p.e al PHP llega %dai% y piensa que ha estado codificado por el navegador =>
    // sustituye %da por Ú !!
    // 3) replace(/%/g,"\\%") hace que al buscar % se sutituya por \% que es lo que necesita MYSQL
    // en 2) peta si busco contiene %aa p.e (PHP lo decodifica como ª) => crit=crit.replace(/%/g,"%25"); previo
    // 4)debo sustituir & por %26 sino no llega el campo entero a PHP!!!
    // linea = linea.replace(/palabra/g, "frase");

    for (j = 1; j <= 5; j++){
	//alert(document.forms['frmFiltrado']['criterio'+j].disabled);
	if (document.forms['frmFiltrado']['criterio'+j].disabled==false){
	    crit=document.forms['frmFiltrado']['criterio'+j].value;

	    /*
	    crit = crit.replace(/'/g, "\\'");
	    crit = crit.replace(/%/g,"%25");
	    crit = crit.replace(/%/g,"\\%");
	    crit = crit.replace(/&/g, "%26");
	    crit = crit.replace(/\+/g, "%2B");
	    */
	    //crit=document.forms['frmFiltrado']['criterio'+j].value.replace(/\/g,"\\\");  peta

	    // CON NETSCAPE PETA EN JAVASCRIPT Y FINALIZA FUNCION!!
	    //if (document.getElementById('tipo'+j).value=='date') crit=canviformat(crit);
	    //else if(document.getElementById('tipo'+j).value=='timestamp') crit=canviformat(crit,'');

	    //alert(crit);
	    //alert(document.forms['frmFiltrado']['tipo'+j].value);
	    if (document.forms['frmFiltrado']['tipo'+j].value=='date'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}else{
		    crit=canviformat(crit);
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='timestamp' || document.forms['frmFiltrado']['tipo'+j].value=='datetime'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}else{
		    crit=canviformat(crit,'');
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='time'){
		if (validaHora(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}
	    }

	    if (document.forms['frmFiltrado']['operador'+j].value=="like")
		// %25 si se envia por url
		//criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%"+ crit + "%'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="not like")
		// %25 si se envia por url
		//criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%"+ crit + "%'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is null")
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is not null")
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '"+ crit + "'";
	    
	    index=document.forms['frmFiltrado']['operador'+j].selectedIndex;
	    criteriotexto+=" "+document.forms['frmFiltrado']['campo'+j].value+ " " 
	    + document.forms['frmFiltrado']['operador'+j][index].text+" '"+crit+"'";

	    if (document.forms['frmFiltrado']['andor'+(j)].value!=''){
		criterio+=document.forms['frmFiltrado']['andor'+(j)].value;
		index=document.forms['frmFiltrado']['andor'+(j)].selectedIndex;
		criteriotexto+=" "+document.forms['frmFiltrado']['andor'+(j)][index].text+" ";
	    }else{
		break;
	    }
	}
    }

    //criteriotexto = criteriotexto.replace(/%/g,"\\%");
    //alert(criterio);
    //alert(criteriotexto);
    document.forms['frmFiltrado'].criterio.value = "("+ criterio +")";
    document.forms['frmFiltrado'].criteriotexto.value = criteriotexto;
}

function creaCriterioAjax(){
    var index;
    var criterio='';
    var criteriotexto='';

    // 1) nombre like '%l'abat%' => fallo SQL => no debo poner ' sino \'

    /* COMO SE ENVIA EL CRITERIO EN LA URL(construido por código) y no a través de campos de formulario (caso en
    el que el navegador hace codificaión URL) yo debo hacer la codificacion: LO IDEAL SERIA UNA FUNCION EN
    JAVASCRIPT QUE HAGA LA CODIFICACIÓN URL del criterio */
    // 2) % (del like) es un caracter reservado en una URL (como &) => código hexa => %25 ya que sino al
    // buscar dai p.e al PHP llega %dai% y piensa que ha estado codificado por el navegador =>
    // sustituye %da por Ú !!
    // 3) replace(/%/g,"\\%") hace que al buscar % se sutituya por \% que es lo que necesita MYSQL
    // en 2) peta si busco contiene %aa p.e (PHP lo decodifica como ª) => crit=crit.replace(/%/g,"%25"); previo
    // 4)debo sustituir & por %26 sino no llega el campo entero a PHP!!!
    // linea = linea.replace(/palabra/g, "frase");

    for (j = 1; j <= 5; j++){
	//alert(document.forms['frmFiltrado']['criterio'+j].disabled);
	if (document.forms['frmFiltrado']['criterio'+j].disabled==false){
	    crit=document.forms['frmFiltrado']['criterio'+j].value;

	    crit = crit.replace(/'/g, "\\'");
	    crit = crit.replace(/%/g,"%25");
	    crit = crit.replace(/%/g,"\\%");
	    crit = crit.replace(/&/g, "%26");
	    crit = crit.replace(/\+/g, "%2B");
	    //crit=document.forms['frmFiltrado']['criterio'+j].value.replace(/\/g,"\\\");  peta

	    // CON NETSCAPE PETA EN JAVASCRIPT Y FINALIZA FUNCION!!
	    //if (document.getElementById('tipo'+j).value=='date') crit=canviformat(crit);
	    //else if(document.getElementById('tipo'+j).value=='timestamp') crit=canviformat(crit,'');

	    //alert(crit);
	    //alert(document.forms['frmFiltrado']['tipo'+j].value);
	    if (document.forms['frmFiltrado']['tipo'+j].value=='date'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}else{
		    crit=canviformat(crit);
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='timestamp' || document.forms['frmFiltrado']['tipo'+j].value=='datetime'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}else{
		    crit=canviformat(crit,'');
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='time'){
		if (validaHora(document.forms['frmFiltrado']['criterio'+j])==false){
		    return false;
		}
	    }

	    if (document.forms['frmFiltrado']['operador'+j].value=="like")
		// %25 si se envia por get
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="not like")
		// %25 si se envia por get
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is null")
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is not null")
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else
		criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '"+ crit + "'";
	    
	    index=document.forms['frmFiltrado']['operador'+j].selectedIndex;
	    criteriotexto+=" "+document.forms['frmFiltrado']['campo'+j].value+ " " 
	    + document.forms['frmFiltrado']['operador'+j][index].text+" '"+crit+"'";

	    if (document.forms['frmFiltrado']['andor'+(j)].value!=''){
		criterio+=document.forms['frmFiltrado']['andor'+(j)].value;
		index=document.forms['frmFiltrado']['andor'+(j)].selectedIndex;
		criteriotexto+=" "+document.forms['frmFiltrado']['andor'+(j)][index].text+" ";
	    }else{
		break;
	    }
	}
    }

    //criteriotexto = criteriotexto.replace(/%/g,"\\%");
    //alert(criterio);
    //alert(criteriotexto);
    document.forms['frmFiltrado'].criterio.value = "("+ criterio +")";
    document.forms['frmFiltrado'].criteriotexto.value = criteriotexto;
}

// para IE 5.0
function creaCriterio2(){
    var index;
    var criterio='';
    var criteriotexto='';

    // nombre like '%l'abat%' => fallo SQL => no debo poner ' sino \'
    for (j=1; j<6; j++){
	//alert(document.forms['frmFiltrado']['criterio'+j].disabled);
	if (document.forms['frmFiltrado']['criterio'+j].disabled==false){
	    document.forms['frmFiltrado']['criterio'+j].value = document.forms['frmFiltrado']['criterio'+j].value.replace(/'/g, "\\'");
  
	    if (document.getElementById('tipo'+j).value=='date') 
	    document.forms['frmFiltrado']['criterio'+j].value=canviformat(document.forms['frmFiltrado']['criterio'+j].value);
	    else if(document.getElementById('tipo'+j).value=='timestamp') 
	    document.forms['frmFiltrado']['criterio'+j].value=canviformat(document.forms['frmFiltrado']['criterio'+j].value,'');
  
	    if (document.forms['frmFiltrado']['operador'+j].value=="like")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%"+                                         document.forms['frmFiltrado']['criterio'+j].value + "%'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="not like")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is null")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is not null")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '"+                                         document.forms['frmFiltrado']['criterio'+j].value + "'";
	    
	    index=document.forms['frmFiltrado']['operador'+j].selectedIndex;
	    criteriotexto+=" "+document.forms['frmFiltrado']['campo'+j].value+ " " 
		    + document.forms['frmFiltrado']['operador'+j][index].text+" '"+document.forms['frmFiltrado']['criterio'+j].value+"'";
	    if (document.forms['frmFiltrado']['andor'+(j)].value!=''){
		    criterio+=document.forms['frmFiltrado']['andor'+(j)].value;
		    index=document.forms['frmFiltrado']['andor'+(j)].selectedIndex;
		    criteriotexto+=" "+document.forms['frmFiltrado']['andor'+(j)][index].text+" ";
	    }
	}
    }
    // debo sustituir & por %26 sino no llega el campo entero a PHP!!!
    // linea = linea.replace(/palabra/g, "frase");
    criterio = criterio.replace(/&/g, "%26");
    criteriotexto = criteriotexto.replace(/&/g, "%26");
    //alert(criterio);
    document.forms['frmFiltrado'].criterio.value="("+criterio+")";
    document.forms['frmFiltrado'].criteriotexto.value=criteriotexto;
    //alert(document.forms['frmFiltrado'].criterio.value);
    //alert(document.forms['frmFiltrado'].criteriotexto.value);
    setTimeout("delay()",100);
}

function ponClase(combo){
    j=combo.name.substr(5);
    var index=combo.selectedIndex;
    document.forms['frmFiltrado']['tipo'+j].value=combo.options[index].className;
}

function creaCriterio(){
    var index;
    var criterio='';
    var criteriotexto='';

    // 1) nombre like '%l'abat%' => fallo SQL => no debo poner ' sino \'

    /* COMO SE ENVIA EL CRITERIO EN LA URL(construido por código) y no a través de campos de formulario (caso en
    el que el navegador hace codificaión URL) yo debo hacer la codificacion: LO IDEAL SERIA UNA FUNCION EN
    JAVASCRIPT QUE HAGA LA CODIFICACIÓN URL del criterio */
    // 2) % (del like) es un caracter reservado en una URL (como &) => código hexa => %25 ya que sino al
    // buscar dai p.e al PHP llega %dai% y piensa que ha estado codificado por el navegador =>
    // sustituye %da por Ú !!
    // 3) replace(/%/g,"\\%") hace que al buscar % se sutituya por \% que es lo que necesita MYSQL
    // en 2) peta si busco contiene %aa p.e (PHP lo decodifica como ª) => crit=crit.replace(/%/g,"%25"); previo
    // 4)debo sustituir & por %26 sino no llega el campo entero a PHP!!!
    // linea = linea.replace(/palabra/g, "frase");

    for (j=1; j<6; j++){
	//alert(document.forms['frmFiltrado']['criterio'+j].disabled);
	if (document.forms['frmFiltrado']['criterio'+j].disabled==false){
	    crit=document.forms['frmFiltrado']['criterio'+j].value;

	    crit = crit.replace(/'/g, "\\'");
	    crit = crit.replace(/%/g,"%25");
	    crit = crit.replace(/%/g,"\\%");
	    crit = crit.replace(/&/g, "%26");
	    crit = crit.replace(/\+/g, "%2B");
	    //crit=document.forms['frmFiltrado']['criterio'+j].value.replace(/\/g,"\\\");  peta

	    // CON NETSCAPE PETA EN JAVASCRIPT Y FINALIZA FUNCION!!
	    //if (document.getElementById('tipo'+j).value=='date') crit=canviformat(crit);
	    //else if(document.getElementById('tipo'+j).value=='timestamp') crit=canviformat(crit,'');

	    //alert(crit);
	    if (document.forms['frmFiltrado']['tipo'+j].value=='date'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
			return false;
		}else{
			crit=canviformat(crit);
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='timestamp'){
		if (validaFecha(document.forms['frmFiltrado']['criterio'+j])==false){
			return false;
		}else{
			crit=canviformat(crit,'');
		}
	    }else if(document.forms['frmFiltrado']['tipo'+j].value=='time'){
		if (validaHora(document.forms['frmFiltrado']['criterio'+j])==false){
			return false;
		}
	    }

	    if (document.forms['frmFiltrado']['operador'+j].value=="like")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="not like")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '%25"+ crit + "%25'";
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is null")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else if(document.forms['frmFiltrado']['operador'+j].value=="is not null")
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value; 
	    else
	    criterio+=document.forms['frmFiltrado']['campo'+j].value+ " " + document.forms['frmFiltrado']['operador'+j].value+ " '"+ crit + "'";
	    
	    index=document.forms['frmFiltrado']['operador'+j].selectedIndex;
	    criteriotexto+=" "+document.forms['frmFiltrado']['campo'+j].value + " " 
	    + document.forms['frmFiltrado']['operador'+j][index].text+" '"+crit + "'";

	    if (document.forms['frmFiltrado']['andor'+(j)].value!=''){
		criterio+=document.forms['frmFiltrado']['andor'+(j)].value;
		index=document.forms['frmFiltrado']['andor'+(j)].selectedIndex;
		criteriotexto+=" "+document.forms['frmFiltrado']['andor'+(j)][index].text+" ";
	    }else{
		break;
	    }
	}
    }

    //criteriotexto = criteriotexto.replace(/%/g,"\\%");
    //alert(criterio);
    document.forms['frmFiltrado'].criterio.value="("+ criterio +")";
    document.forms['frmFiltrado'].criteriotexto.value=criteriotexto;
    //alert(document.forms['frmFiltrado'].criteriotexto.value);
    setTimeout("delay()",100);
}

// sin delay se cierra y no envia datos al servidor!!! (PROBLEMA DEL NAVEGADOR)
function delay(){
    window.close();
}

function ponEnabled(j){
    //( ) son obligados, sino hace andor2-1 !!
    if (document.forms['frmFiltrado']['andor'+(j-1)].selectedIndex>0)
	document.forms['frmFiltrado']['criterio'+j].disabled=false;
    else{
	document.forms['frmFiltrado']['criterio'+j].value='';
	document.forms['frmFiltrado']['criterio'+j].disabled=true;
    }
}


mesk=new Array();
mesk[10]="A";mesk[11]="B";mesk[12]="C";mesk[13]="D";mesk[14]="E";mesk[15]="F";
A=10;B=11;C=12;D=13;E=14;F=15;
let="ABCDEF";

function mes(num){
    if(let.indexOf(num) != -1){
	return eval(num)
    }else{
	if(num < 10) return eval(num)
	else return mesk[num]
    }
}

function color(begin,einde,stappen,stap){
    hh1=(mes(begin.charAt(0))*16)+mes(begin.charAt(1));
    hh2=(mes(begin.charAt(2))*16)+mes(begin.charAt(3));
    hh3=(mes(begin.charAt(4))*16)+mes(begin.charAt(5));
    pp1=(mes(einde.charAt(0))*16)+mes(einde.charAt(1));
    pp2=(mes(einde.charAt(2))*16)+mes(einde.charAt(3));
    pp3=(mes(einde.charAt(4))*16)+mes(einde.charAt(5));
    
    if(hh1 < pp1){
	ff1=hh1+Math.floor((pp1-hh1)/stappen*stap);
	ff1=eval("\'"+mes(Math.floor(ff1/16))+"\'")+eval("\'"+mes(ff1-(Math.floor(ff1/16)*16))+"\'");
    }else{
	ff1=hh1-Math.floor((hh1-pp1)/stappen*stap);
	ff1=eval("\'"+mes(Math.floor(ff1/16))+"\'")+eval("\'"+mes(ff1-(Math.floor(ff1/16)*16))+"\'");
    }
    
    if(hh2 < pp2){
	ff2=hh2+Math.floor((pp2-hh2)/stappen*stap);
	ff2=eval("\'"+mes(Math.floor(ff2/16))+"\'")+eval("\'"+mes(ff2-(Math.floor(ff2/16)*16))+"\'");
    }else{
	ff2=hh2-Math.floor((hh2-pp2)/stappen*stap);
	ff2=eval("\'"+mes(Math.floor(ff2/16))+"\'")+eval("\'"+mes(ff2-(Math.floor(ff2/16)*16))+"\'");
    }
    
    if(hh3 < pp3){
	ff3=hh3+Math.floor((pp3-hh3)/stappen*stap);
	ff3=eval("\'"+mes(Math.floor(ff3/16))+"\'")+eval("\'"+mes(ff3-(Math.floor(ff3/16)*16))+"\'");
    }else{
	ff3=hh3-Math.floor((hh3-pp3)/stappen*stap);
	ff3=eval("\'"+mes(Math.floor(ff3/16))+"\'")+eval("\'"+mes(ff3-(Math.floor(ff3/16)*16))+"\'");
    }
    
    return ff1+ff2+ff3
}

bum=0;bum2=0;
txt=new Array();
txt[0]="";

function lightf(){
    for(i=0;i != Math.floor(message.length/2);i++){txt[i]=color(lightcolor1,lightcolor2,Math.floor(message.length/2),i)};
	for(i=Math.floor(message.length/2);i != message.length;i++){txt[i]=color(lightcolor2,lightcolor1,Math.floor(message.length/2),(i-Math.floor(message.length/2)))};
	  lightf1();
}

// llamada por lightf
function lightf1(){
    txt[message.length+1]="";
    bum2=message.length-bum;
    for(i=0;i != message.length;i++){
	if(i+bum < message.length){
	    txt[message.length+1]=txt[message.length+1] + "<font color='#"+txt[(i+bum)]+"'>"+message.charAt(i)+"</font>"
	}else{
	    txt[message.length+1]=txt[message.length+1] + "<font color='#"+txt[i-bum2]+"'>"+message.charAt(i)+"</font>"
	}
    };
    
    if(bum != message.length){bum++;}
    else{bum=0}
    
    document.getElementById('light').innerHTML=txt[message.length+1];
    //document.getElementById('light2').innerHTML=txt[message.length+1];
    setTimeout("lightf1()",50)
}

function parpadea(id){
    if (document.getElementById(id).style.backgroundColor=='') document.getElementById(id).style.backgroundColor='#bbbbbb';
    else document.getElementById(id).style.backgroundColor='';
    funcion="parpadea('"+id +"')";
    //alert(funcion);
    setTimeout(funcion,1000);
}

var STR_PAD_LEFT = 1;
var STR_PAD_RIGHT = 2;
var STR_PAD_BOTH = 3;
 
function pad(str, len, pad, dir) {
    if (typeof(len) == "undefined") { var len = 0; }
    if (typeof(pad) == "undefined") { var pad = ' '; }
    if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }
  
    if (len + 1 >= str.length) {
	switch (dir){
	    case STR_PAD_LEFT:
		    str = Array(len + 1 - str.length).join(pad) + str;
	    break;

	    case STR_PAD_BOTH:
		    var RIGHT = Math.ceil((padlen = len - str.length) / 2);
		    var left = padlen - right;
		    str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
	    break;

	    default:
		    str = str + Array(len + 1 - str.length).join(pad);
	    break;
	} // switch
    }
  
    return str;
}

function is_array(input){
    return typeof(input)=='object'&&(input instanceof Array);
}

/*
function is_array (mixed_var) {
    // Returns true if variable is an array  
    // 
    // version: 1004.2314
    // discuss at: http://phpjs.org/functions/is_array    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Legaev Andrey
    // +   bugfixed by: Cord
    // +   bugfixed by: Manish
    // +   improved by: Onno Marsman    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // %        note 1: In php.js, javascript objects are like php associative arrays, thus JavaScript objects will also
    // %        note 1: return true  in this function (except for objects which inherit properties, being thus used as objects),
    // %        note 1: unless you do ini_set('phpjs.objectsAsArrays', true), in which case only genuine JavaScript arrays    // %        note 1: will return true
    // *     example 1: is_array(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
    // *     example 2: is_array('Kevin van Zonneveld');
    // *     returns 2: false    // *     example 3: is_array({0: 'Kevin', 1: 'van', 2: 'Zonneveld'});
    // *     returns 3: true
    // *     example 4: is_array(function tmp_a(){this.name = 'Kevin'});
    // *     returns 4: false
    
    var key = '';    var getFuncName = function (fn) {
        var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
        if (!name) {
            return '(Anonymous)';
        }        return name[1];
    };
 
    if (!mixed_var) {
        return false;
    }
 
    // BEGIN REDUNDANT
    this.php_js = this.php_js || {};
    this.php_js.ini = this.php_js.ini || {};    // END REDUNDANT
 
    if (typeof mixed_var === 'object') {
 
        if (this.php_js.ini['phpjs.objectsAsArrays'] &&  // Strict checking for being a JavaScript array (only check this way if call ini_set('phpjs.objectsAsArrays', 0) to disallow objects as arrays) (
            (this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase &&
                    this.php_js.ini['phpjs.objectsAsArrays'].local_value.toLowerCase() === 'off') ||
                parseInt(this.php_js.ini['phpjs.objectsAsArrays'].local_value, 10) === 0)
            
	    {            return mixed_var.hasOwnProperty('length') && // Not non-enumerable because of being on parent class
                            !mixed_var.propertyIsEnumerable('length') && // Since is own property, if not enumerable, it must be a built-in function
                                getFuncName(mixed_var.constructor) !== 'String'; // exclude String()
	    }
         if (mixed_var.hasOwnProperty) {
            for (key in mixed_var) {
                // Checks whether the object has the specified property
                // if not, we figure it's not an object in the sense of a php-associative-array.
                if (false === mixed_var.hasOwnProperty(key)) {
		    return false;
                }
            }
        }
         // Read discussion at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_is_array/
        return true;
    }
 
    return false;
}
*/

Array.prototype.in_array = function(){
    for(var j in this){
        if(this[j]==arguments[0]){
            return true;
        }
    }
    
    return false;    
}

// delete mi_array[posicion] lo hace pero no modifica la longitud!!!
// miArr.splice(x,1) borra el elemento x de un array 
/*
arrTest = new Array("red", "green", "blue", "yellow", "orange");
arrTest = arrTest.remove("yellow");
trace(arrTest);
*/
// se podria usar en lugar de splice
Array.prototype.remove = function(obj) {
  var a = [];
  for (var i=0; i<this.length; i++) {
    if (this[i] != obj) {
      a.push(this[i]);
    }
  }
  
  return a;
}

// Convert a string to an array (v1)
// Jesse Stratford, www.actionscripts.org
/*
// usage example
myString = "abcedfg";
myArray = myString.toArray();
*/
String.prototype.toArray = function ()
{
    var inArray = new Array()
    for (var c=0;c<this.length;c++)
    {
      inArray.push(this.substr( c, 1 ))
    }
    return inArray
}


/*
var arr = new Array(1,2,3,4,5,6,7,8,9);
trace(arr.randomize());
*/
Array.prototype.randomize = function() {
    var i = this.length;
    if (i == 0) return;
    while (--i) {
	var j = Math.floor(Math.random()*(i+1));
	var tmp1 = this[i];
	var tmp2 = this[j];
	this[i] = tmp2;
	this[j] = tmp1;
    }
    
    return this;
}

/*
 * STRTR as in php :  This function returns a copy of str, translating
 * all occurrences of each character in from to the corresponding
 * character in to
 */
String.prototype.strtr = function(from, to)
{
    var s, p, c1, c2, c3;
    if(! this.length || from.length != to.length) return;
    
    s = this;	
    for(var i=0; i<arguments[0].length; i++)
    {
	c1 = arguments[0].substr(i,1);
	for(var j=0; j<from.length; j++)
	{
	    c2 = from.substr(j,1);
	    c3 = to.substr(j,1);
	    if(c1 == c2)
	    {
		p = new RegExp(c2,'gi');
		s = s.replace(p,c3);
	    }
	}
    }

    return s;
}

String.prototype.removeAccents = function ()
{
	var __r = {
			'À':'A','??':'A','Â':'A','Ã':'A','Ä':'A','Å':'A','Æ':'E',
			'È':'E','É':'E','Ê':'E','Ë':'E',
			'Ì':'I','??':'I','Î':'I','??':'I',
			'Ò':'O','Ó':'O','Ô':'O','Ö':'O',
			'Ù':'U','Ú':'U','Û':'U','Ü':'U',
			'Ñ':'N'};
	
	return this.replace(/[À??ÂÃÄÅÆÈÉÊËÌ??Î??ÒÓÔÖÙÚÛÜÑ]/gi, function(m){
		var ret = __r[m.toUpperCase()];
					
		if (m === m.toLowerCase())
			ret = ret.toLowerCase();
			
		return ret;
	});
};

function replaceDiacritics(s)
{
    var diacritics =[
        /[\300-\306]/g, /[\340-\346]/g,  // A, a
        /[\310-\313]/g, /[\350-\353]/g,  // E, e
        /[\314-\317]/g, /[\354-\357]/g,  // I, i
        /[\322-\330]/g, /[\362-\370]/g,  // O, o
        /[\331-\334]/g, /[\371-\374]/g,  // U, u
        /[\321]/g, /[\361]/g, // N, n
        /[\307]/g, /[\347]/g, // C, c
    ];

    var chars = ['A','a','E','e','I','i','O','o','U','u','N','n','C','c'];

    for (var i = 0; i < diacritics.length; i++)
    {
        s = s.replace(diacritics[i],chars[i]);
    }

    return s;
}

function replaceAccents(s)
{
    var diacritics =[
        /[\300-\306]/g, /[\340-\346]/g,  // A, a
        /[\310-\313]/g, /[\350-\353]/g,  // E, e
        /[\314-\317]/g, /[\354-\357]/g,  // I, i
        /[\322-\330]/g, /[\362-\370]/g,  // O, o
        /[\331-\334]/g, /[\371-\374]/g,  // U, u
    ];

    var chars = ['A','a','E','e','I','i','O','o','U','u'];

    for (var i = 0; i < diacritics.length; i++)
    {
        s = s.replace(diacritics[i],chars[i]);
    }

    return s;
}










/*
// NIEVE //

var no = 4; // snow number
var speed = 10; // smaller number moves the snow faster
var snowflake = "../imagenes/snow.gif";

var ns4up = (document.layers) ? 1 : 0;  // browser sniffer
var ie4up = (document.all) ? 1 : 0;
var dx, xp, yp;    // coordinate and position variables
var am, stx, sty;  // amplitude and step variables
var i, doc_width = 400, doc_height = 500;

if (ns4up) {
    doc_width = self.innerWidth;
    doc_height = self.innerheight;
} else if (ie4up) {
    doc_width = 500;
    doc_height = 500;
}

dx = new Array();
xp = new Array();
yp = new Array();
am = new Array();
stx = new Array();
sty = new Array();

for (i = 0; i < no; ++ i) {
    dx[i] = 0;                        // set coordinate variables
    xp[i] = Math.random()*(doc_width-50);  // set position variables
    yp[i] = Math.random()*doc_height;
    am[i] = Math.random()*20;         // set amplitude variables
    stx[i] = 0.02 + Math.random()/10; // set step variables
    sty[i] = 0.7 + Math.random();     // set step variables
    if (ns4up) {                      // set layers
	if (i  ==  0) {
	    document.write("<layer name=\"dot"+ i +"\" left=\"15\" ");
	    document.write("top=\"15\" visibility=\"show\"><img src=\"");
	    document.write(snowflake + "\" border=\"0\"></layer>");
	} else {
	    document.write("<layer name=\"dot"+ i +"\" left=\"15\" ");
	    document.write("top=\"15\" visibility=\"show\"><img src=\"");
	    document.write(snowflake + "\" border=\"0\"></layer>");
	}
    } else if (ie4up) {
	if (i  ==  0) {
	    document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
	    document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
	    document.write("visible; TOP: 15px; LEFT: 15px;\"><img src=\"");
	    document.write(snowflake + "\" border=\"0\"></div>");
	} else {
	    document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
	    document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
	    document.write("visible; TOP: 15px; LEFT: 15px;\"><img src=\"");
	    document.write(snowflake + "\" border=\"0\"></div>");
	}
    }
}

function snowNS() {  // Netscape main animation function
    for (i = 0; i < no; ++ i) {  // iterate for every dot
	yp[i] += sty[i];
	if (yp[i] > doc_height-50) {
	    xp[i] = Math.random()*(doc_width-am[i]-30);
	    yp[i] = 0;
	    stx[i] = 0.02 + Math.random()/10;
	    sty[i] = 0.7 + Math.random();
	    doc_width = self.innerWidth;
	    doc_height = self.innerheight;
	}
	dx[i] += stx[i];
	document.layers["dot"+i].top = yp[i];
	document.layers["dot"+i].left = xp[i] + am[i]*Math.sin(dx[i]);
    }
    setTimeout("snowNS()", speed);
}

function snowIE() {  // IE main animation function
    for (i = 0; i < no; ++ i) {  // iterate for every dot
	yp[i] += sty[i];
	if (yp[i] > doc_height-50) {
	    xp[i] = Math.random()*(doc_width-am[i]-30);
	    yp[i] = 0;
	    stx[i] = 0.02 + Math.random()/10;
	    sty[i] = 0.7 + Math.random();
	    doc_width = document.body.clientWidth;
	    doc_height = document.body.clientheight;
	}
	dx[i] += stx[i];
	document.all["dot"+i].style.pixelTop = yp[i];
	document.all["dot"+i].style.pixelLeft = xp[i] + am[i]*Math.sin(dx[i]);
    }
    setTimeout("snowIE()", speed);
}

if (ns4up) {
    snowNS();
} else if (ie4up) {
    snowIE();
}

// FIN NIEVE //
*/

var palabrasNoEtiqueta = new Array();
var v_preposiciones = new Array("a","ante","bajo","cabe","con","contra","de","desde"," durante","en","entre","hacia","hasta","mediante","para","por","según"," sin","so","sobre","tras","vía");
var v_conjunciones = new Array("y","e","ni","mas","pero","sino","sino que","o","u","porque ","pues","puesto que","si","con tal que","siempre que","aunque","si bien","así","por lo tanto","como","tal como","tan","tanto que","así que","cuando","antes que","para que","a fin de que");
var v_adverbios = new Array("Aquí","Ahora","Bien","Más","Sí","No","Quizás","Ahí","Luego","Mal","Menos","También","Tampoco","Tal vez","Allí","Después","Así","Poco","Cierto","Nunca","Acaso","Cerca","Ayer","Aprisa","Mucho","Lejos","Hoy","Deprisa","Bastante","Arriba","Mañana","Despacio","Muy","Abajo","Entonces","Casi","Alrededor","Pronto","Dentro","Tarde","Fuera","Siempre");
var v_articulos = new Array("el","los","un","unos","la","las","una","unas","lo");
var v_simbolos = new Array(" ",",","-",";",":");
Array.prototype.push.apply(palabrasNoEtiqueta, v_preposiciones);
Array.prototype.push.apply(palabrasNoEtiqueta, v_conjunciones);
Array.prototype.push.apply(palabrasNoEtiqueta, v_adverbios);
Array.prototype.push.apply(palabrasNoEtiqueta, v_articulos);
Array.prototype.push.apply(palabrasNoEtiqueta, v_simbolos);
//alert(palabrasNoEtiqueta);


/* -------------------------------------------------------------------------------------
*   Visualización y ocultación del indicador de actualización.
* ------------------------------------------------------------------------------------- */

function showUpdateProgress() {
    setLoadingDisabled(true);
}

function hideUpdateProgress() {
    setLoadingDisabled(false);
}

/* -------------------------------------------------------------------------------------
*   Activación y desactivación de todos los elementos de una capa
* ------------------------------------------------------------------------------------- */

function setLoadingDisabled(disabled) {
    var dvLoadingLayer = document.getElementById("dvLoadingLayer");
    var dvLoadingIndicator = document.getElementById("dvLoadingIndicator");
    if (disabled) {
        dvLoadingLayer.style.position = "fixed";
        dvLoadingLayer.style.left = "0px";
        dvLoadingLayer.style.top = "0px";
        dvLoadingLayer.style.width = "100%";
        dvLoadingLayer.style.height = document.documentElement.clientHeight + "px";
        dvLoadingLayer.style.zIndex = 10000;
        dvLoadingLayer.style.display = "";

        dvLoadingIndicator.style.position = "fixed";
        dvLoadingIndicator.style.left = ((document.documentElement.clientWidth - 175) / 2) + "px";
        dvLoadingIndicator.style.top = ((document.documentElement.clientHeight - 100) / 2) + "px";
        dvLoadingIndicator.style.display = "";
        dvLoadingIndicator.style.zIndex = 10001;
    }
    else {
        dvLoadingLayer.style.display = "none";
        dvLoadingIndicator.style.display = "none";
    }
}

