    // Quita los espacios blancos de cada lado del cadena.
    function trim(cadena) {
        return cadena.replace( /^\s*/, "" ).replace( /\s*$/, "" );
    }
    
    // Devuelve el valor del campo. Si puede tener más de un valor, devuelve un
    // array con todos los valores. Si no tiene un valor, o el campo no está 
    // habilitado, devuelve una cadena vacía o un array vacío.
    function getValue(campo)
    {
       	var value = '';
        if ((campo.type == 'hidden' || campo.type == 'text' ||
        	campo.type == 'textarea' || campo.type == 'file' ||
        	campo.type == "select-one" || campo.type == 'password') 
        	&& campo.disabled == false) 
        {
            value = trim(campo.value);
        } else if (campo.type == "select-multiple") {  
            var numOptions = campo.options.length;
            lastSelected=-1;
            value = new Array();
            for(loop=numOptions-1;loop>=0;loop--) {
                if(campo.options[loop].selected) {
                    lastSelected = loop;
                    value.push(trim(campo.options[loop].value));
                }
            }
        } else if ((campo.length > 0) && campo[0].type == 'checkbox') {
            value = new Array();
            for (loop=0;loop < campo.length;loop++) {
                if (campo[loop].checked) {
                	value.push(trim(campo[loop].value));
                }
            }
        } else if ((campo.length > 0) && campo[0].type == 'radio') {
            for (loop=0;loop < campo.length;loop++) {
                if (campo[loop].checked) {
                	value = trim(campo[loop].value);
                	break;
                }
            }
        }

        return value;
    }
    
    // True si los valores de los campos son iguales.
    function valoresIguales(campo1, campo2)
    {
    	var val1 = getValue(campo1);
    	var val2 = getValue(campo2);
    	if (val1 instanceof Array)
    		val1 = val1.toString();
    	if (val2 instanceof Array)
    		val2 = val2.toString();
    	return val1 == val2;
    }
    
    
	// True si el campo tiene uno o más valores, false si no.
	// Si el campo tiene sólo espacios, es false.
	// Funciona para todos tipos de input.
    function tieneValue(campo) 
    {
        var isValid = true;

        if ((campo.type == 'hidden' || campo.type == 'text' ||
        	campo.type == 'textarea' || campo.type == 'file' ||
            campo.type == 'checkbox' || campo.type == 'select-one' ||
            campo.type == 'password') && campo.disabled == false) 
        {

        	var value = '';
            // get campo's value
            if (campo.type == "select-one") {
            	var si = campo.selectedIndex;
                if (si >= 0) {
                	value = campo.options[si].value;
                }
            } else if (campo.type == 'checkbox') {
                if (campo.checked) {
                    value = campo.value;
                }
            } else {
                value = campo.value;
            }

            if (trim(value).length == 0) {
                isValid = false;
            }
        } else if (campo.type == "select-multiple") { 
            var numOptions = campo.options.length;
            lastSelected=-1;
            for(loop=numOptions-1;loop>=0;loop--) {
                if(campo.options[loop].selected) {
                    lastSelected = loop;
                    value = campo.options[loop].value;
                    break;
                }
            }
            if(lastSelected < 0 || trim(value).length == 0) {
                isValid=false;
            }
        } else if ((campo.length > 0) && (campo[0].type == 'radio' || campo[0].type == 'checkbox')) {
            isChecked=-1;
            for (loop=0;loop < campo.length;loop++) {
                if (campo[loop].checked) {
                    isChecked=loop;
                    break; 
                }
            }
            if (isChecked < 0) {
                isValid=false;
            }
        }

        return isValid;
    }
    
    // True si el valor del campo es vacío o se compone de [a-zA-Z_0-9].
    // Sólo funciona si el valor del campo es una cadena.
    function esId(campo)
    {
    	var valor = getValue(campo);
    	return (valor.search(/^\w*$/) == 0);
    }
    
     // True si el valor del campo es vacío o se compone de [a-zA-Z_0-9/].
    // Sólo funciona si el valor del campo es una cadena.
    function esIdRuta(campo)
    {
    	var valor = getValue(campo);
    	return (valor.search(/^(\w|\/)*$/) == 0);
    }
    
    // True si el valor del campo es vacío o se compone de un integer.
    // Sólo funciona si el valor del campo es una cadena.
    function esInt(campo)
    {
    	var valor = getValue(campo);
    	return (valor.search(/^\d*$/) == 0);
    }
    
     /**
     * True si el valor del campo es vacío, o una dirección de correo valida.
     * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
     * http://javascript.internet.com
     */
    function esEmail(campo, extraido)
    {
    	var email;
    	if (extraido)
    	{
    		email = campo;
    	}
    	else
    	{
    		email = getValue(campo);
    	}
    	
    	if (email.length == 0) {
           return true;
       }
       var emailPat=/^(.+)@(.+)$/;
       var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
       var validChars="\[^\\s" + specialChars + "\]";
       var quotedUser="(\"[^\"]*\")";
       var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
       var atom=validChars + '+';
       var word="(" + atom + "|" + quotedUser + ")";
       var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
       var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
       var matchArray=email.match(emailPat);
       if (matchArray == null) {
           return false;
       }
       var user=matchArray[1];
       var domain=matchArray[2];
       if (user.match(userPat) == null) {
           return false;
       }
       var IPArray = domain.match(ipDomainPat);
       if (IPArray != null) {
           for (var i = 1; i <= 4; i++) {
              if (IPArray[i] > 255) {
                 return false;
              }
           }
           return true;
       }
       var domainArray=domain.match(domainPat);
       if (domainArray == null) {
           return false;
       }
       var atomPat=new RegExp(atom,"g");
       var domArr=domain.match(atomPat);
       var len=domArr.length;
       if ((domArr[domArr.length-1].length < 2) ||
           (domArr[domArr.length-1].length > 3)) {
           return false;
       }
       if (len < 2) {
           return false;
       }
       return true;
    }
    
    /**
     * True si el valor del campo es vacío, o tiene por lo menos 'min' carácteres.
     */
    function minTamano(campo, min)
    {
    	var value = getValue(campo);
    	return value.length < 1 || value.length >= min;
    }
    
    /**
     * True si el valor del campo tiene 'max' carácteres o menos.
     */
    function maxTamano(campo, max)
    {
    	var value = getValue(campo);
    	return value.length <= max;
    }

	function esNombreObjeto(campo)
	{
		if (!tieneValue(campo))
		{
			return false;
		}
		var valor = getValue(campo);
    	return (valor.search(/^([a-z]|[A-Z]|[0-9]|á|é|í|ó|ú|ý|Á|É|Í|Ó|Ú|Ý|à|è|ì|ò|ù|À|È|Ì|Ò|Ù|ä|ë|ï|ö|ü|ÿ|Ä|Ë|Ï|Ö|Ü|Ÿ|â|ê|î|ô|û|Â|Ê|Î|Ô|Û|ã|Ã|õ|Õ|ñ|Ñ|å|Å|ç|Ç|æ|Æ|ð|Ð|ø|Ø|þ|Þ|ß|œ|Œ|š|Š|\$|-|_|\+|,|\(|\)|\x20)+$/) == 0);
	}
	
	function esNIFValido(nif)
	{
		if (nif.length < 1)
			return true;
		var nifNumero = nif.substring(0,nif.length-1);
		var nifLetra = nif.substring(nif.length-1).toUpperCase();
	
		var letras = 'TRWAGMYFPDXBNJZSQVHLCKE';
		var numero = nifNumero % 23;
		var letraCorrecta = letras.substring(numero,numero+1);
		
		if(letraCorrecta!=nifLetra){
			return false;
		}
	
		return true;
	}
	
	function esCuentaBancariaValida(numeroCuenta)
	{
		if (numeroCuenta.length < 1)
			return true;
		var valores = new Array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
		var controlCS = 0;
		var controlCC = 0;
	
		for (i=0; i<=7; i++)
			controlCS += parseInt(numeroCuenta.charAt(i)) * valores[i+2];
	
		controlCS = 11 - (controlCS % 11);
		if (controlCS == 11)
			controlCS = 0;
		else if (controlCS == 10)
			controlCS = 1;
	
		for (i=10; i<=19; i++)
			controlCC += parseInt(numeroCuenta.charAt(i)) * valores[i-10];
	
		controlCC = 11 - (controlCC % 11);
		if (controlCC == 11)
			controlCC = 0;
		else if (controlCC == 10)
			controlCC = 1;
	
		if (numeroCuenta.charAt(8)==controlCS && numeroCuenta.charAt(9)==controlCC ) {
			return true;
		}else{
			return false;
		}
	}
	
	function esFechaValida(dia, mes, ano)
	{ 
		var fecha = new Date();
		fecha.setTime(0);
		fecha.setFullYear(ano);
		fecha.setMonth(mes);
		fecha.setDate(dia);

		return dia == fecha.getDate() && mes == fecha.getMonth() && ano == fecha.getFullYear();
	}
  
	function ismaxlength(obj, tamano)
	{
		if (obj.value.length > tamano)
		{
			obj.value = obj.value.substring(0, tamano)
		}
	}
	
	/* Devuelve las etiquetas prohibidas para secciones. Son las que pueden resultar en
	 * conflictos de URLs.
	 */
	function getEtiquetasProhibidas()
	{
		return new Array('gestor', 'docs', 'proyecto', 'config');
	}
	
	function esEtiquetaProhibida(etiqueta)
	{
		var prohibidas = getEtiquetasProhibidas();
		for (var i = 0; i < prohibidas.length; i++)
		{
			if (etiqueta == prohibidas[i])
			{
				return true;
			}
		}
		return false;
	} 
	
