 function abrirVentana(nombre,archivo,ancho,alto) {
   window.open(archivo, nombre, "scrollbars=no,status=no,location=no,menubar=no,resizable=no,width="+ancho+",height="+alto+",top=100,left=100")
}
    var EMPTY_STRING = "";
    var ZERO_STRING = "0";
    var SPACE_STRING = " ";
    var SEPARATOR_DOT = ".";
    var SEPARATOR_COMMA = ",";
    var ERR_NOT_A_NUMBER = "El valor no es un número válido";
    
   function reverseString(str) {
	if (str == undefined) return "";
    var str2 = new String(EMPTY_STRING);
    var count = (str.length) - 1;
    for (var i = count ; i > -1; i--) {
        str2 = str2.concat(str.substring(i, i+1));
    }
    return str2;    
}

function replace(str, strReplace, strWith) {
    var i;
    var str2 = str;
    do {
        i = str2.indexOf(strReplace);
        if (i > 0) {
            str2 = str2.substring(0, i) + strWith + str2.substring(i + strReplace.length, str2.length);
        } else { 
            break;
        }
    } while(true);
    return str2;
} 
 
// funcion que comprueba que el campo ha sido rellenado
function esBlanco(campo) {
    if (Trim(campo).length == 0)
        return true;
    else
        return false;
}

/***************************************************************************************
 VALIDAR NUMERO DE TELEFONO (OMS)
 Segun los siguientes criterios:
	- con prefijo del país: un signo y 11 dígitos numéricos (+XXXXXXXXXXX).
	- sin prefijo del país: 9 dígitos numéricos (XXXXXXXXX).
***************************************************************************************/
function esTelefono(elemento) {

	var strAux = Trim(elemento.value);
	var tam = strAux.length;
	if ((tam != 9) && (tam != 12)) {
		return false;
	} 
	if ((tam == 9) && (!esNumeros(strAux))) {
		return false;
	}
	if (tam == 12) {
		var strAux2 = strAux.substring(1,tam);
		if ((strAux.substr(0,1) != "+") || (!esNumeros(strAux2))) {
			return false;
		}
	}
	return true;
}

/***************************************************************************************
 VALIDAR DIRECCION DE CORREO ELECTRONICO (OMS)
 Segun los siguientes criterios:
	- la cadena contiene una @.
	- la cadena contiene algo antes de la @.
	- la cadena contiene algo después de la @.
***************************************************************************************/
function esEmail(variable) {
	var strAux = Trim(variable);
	var posArr = strAux.indexOf("@");
	
	if ((posArr == -1) || (posArr == 0) || (posArr == (strAux.length-1))) {		
		return false;
	}
	else {
		return true;
	}
}

/***************************************************************************************
 VALIDA SI UNA CADENA DE CARACTERES ESTA FORMADA UNICAMENTE POR DIGITOS NUMERICOS
        - Entrada:  cadena de caracteres
	- Devuelve: true/false
***************************************************************************************/
function esNumeros(variable) {
	var patron = /^\d+$/;
	return patron.test(variable);
}

//******************************************************
//Función que devuelve una cadena 
//sin espacios por la derecha y la izquierda.
//Elemento:Es el objecto a validar(la caja de texto).
//******************************************************
function Trim(str) {
	var resultStr = '';
	resultStr = TrimLeft(str);
	resultStr = TrimRight(resultStr);	
	return resultStr;
}
//***************************************************************
//Función que quita los espacios por la izquierda.
//str:la cadena a limpiar.
//***************************************************************
function TrimLeft(str) {
	var resultStr = '';
	var i =  0;
	var len = 0 ;
	if (str+'' == 'undefined' || str == null){return null;}
	str += '';
	if (str.length == 0){
		resultStr = '';
	}else{	
		len = str.length;					
  		while ((i <= len) && (str.charAt(i) == " ")){i++;}
  		resultStr = str.substring(i, len);
  	}		
  	return resultStr;
}
//**********************************************************
//Función que quita los espacios por la derecha.
//str:la cadena a limpiar.
//**********************************************************
function TrimRight(str) {
	var resultStr='';
	var i=0;
	if (str+'' == 'undefined' || str == null){return null;}
	str += '';
	if (str.length == 0){
		resultStr = '';
	}else{
  		i = str.length - 1;
  		while ((i >= 0) && (str.charAt(i) == ' ')){i--;}
	  	resultStr = str.substring(0, i + 1);
	}
	return resultStr;
}

// funcion que comprueba si el campo es numerico decimal (positivo o negativo)
// El caracter del decimal es el punto o la coma.
function esDecimal(campo) {
    if (esEntero(campo) || esBlanco(campo))
        return true;
    
    var posPunto = campo.indexOf(".");
    if (posPunto < 0)
        posPunto = campo.indexOf(",");
    if (posPunto < 0)
        return false;
    
    if (!esEntero(campo.substring(0, posPunto)))
        return false;
    
    if (!esEntero(campo.substring(posPunto + 1)))
        return false;
        
    if (campo.charAt(posPunto + 1) == '-') 
        return false;
        
    return true;
    
}


// funcion que comprueba si el campo es numerico entero (positivo o negativo)
function esEntero(campo) {
    var inLen = campo.length;
        
    for (var i=0; i < inLen; i++) {
        var ch = campo.substring(i, i + 1);
        if ((ch < "0") || ("9" < ch)) {
            if (i != 0) return false;
    		else 
                if (ch != "-") return false;
        }
    }
    return true;
}

function compara_fechas(fechaDesde, fechaHasta){
    var fecha1, fecha2
    	
	fecha1 = parseInt(fechaDesde.slice(6,10) + fechaDesde.slice(3,5) + fechaDesde.slice(0,2), 10);
	fecha2 = parseInt(fechaHasta.slice(6,10) + fechaHasta.slice(3,5) + fechaHasta.slice(0,2), 10);
	
	
	 if (fecha1 > fecha2)
	   return true;
	 else  
	   return false;

}
// funcion que comprueba si el campo es numerico decimal (positivo o negativo)
// El caracter del decimal es la coma y los miles pueen ir separadoa por punto.
function esDecimalFormateado(campo) {
    if (esEntero(campo) || esBlanco(campo))
        return true;
        
    var posComa = campo.indexOf(",");    
    
    if (!esEnteroFormateado(campo.substring(0, posComa))) {
    	var posPunto = campo.indexOf(".");
    	
    	if (!esEnteroFormateado(campo.substring(0, posPunto)))
        	return false;   
    	if (!esEntero(campo.substring(posPunto + 1, posComa-1)))
        	return false;   
    }
        
    if (!esEntero(campo.substring(posComa + 1)))
        return false;        
        
    if (campo.charAt(0) == '-')
    	return false;    
                 
    return true;
    
}

function esEnteroFormateado(campo) {
	if (esEntero(campo) || esBlanco(campo)) return true;
	var posPunto = campo.lastIndexOf(".");
	

	if (!(posPunto+1 == campo.length -3 ) || !esEntero(campo.substring(posPunto + 1)) || !(esEnteroFormateado(campo.substring(0, posPunto)))){
		return false;	
	}
	else {
		return true;
	}	
}


function leftPad(str, chr, times) {
    var str2 = new String(EMPTY_STRING);
    if (str == null) str = EMPTY_STRING;
	var realTimes = times - str.length;
	for (var i = 0; i < realTimes; i++) str2 = str2.concat(chr);
	return (str2.concat(str));
}

function rightPad(str, chr, times) {
	var str2 = new String(EMPTY_STRING);
	if (str == null) str = EMPTY_STRING;
	str2 = str2.concat(str);
	var realTimes = times - str.length;
	for (var i = 0; i < realTimes; i++) str2 = str2.concat(chr);
	return str2; 
}

function number2Screen(varnumber, useThousands, decimalPositions) {
    var str = screen2Number(varnumber);    
    if (str == null) {
        return null;
    }
    var fNegative = false;

	if (str.substring(0,1) == "-") {
		 str = str.substring(1);
		 fNegative = true;
	}
    var i = str.indexOf(SEPARATOR_DOT);    
    var realPart = EMPTY_STRING;
    var decimalPart = EMPTY_STRING;
    if (i > 0) {    
        realPart = str.substring(0, i);  
        str = "" + str;
        decimalPart = str.substring(i + 1, str.length);           
    } else {
        realPart = str;
    }
    if (decimalPositions != undefined) {
        decimalPart = rightPad(decimalPart, ZERO_STRING, decimalPositions);   
    }
    if (useThousands) {
        realPart = reverseString(realPart);
        var formattedRealPart = EMPTY_STRING;
        var j = realPart.length;
        var k = 0;
        for (i = 0; i < j; i++) {
            formattedRealPart += realPart.substring(i, i+1);
            k++;
            if ( k == 3 && i < j - 1) {
                formattedRealPart += SEPARATOR_DOT;
                k = 0;
            }
        }
     
        realPart = reverseString(formattedRealPart);
    }
    if (decimalPart != EMPTY_STRING) {
        decimalPart = SEPARATOR_COMMA.concat(decimalPart);
    }
  
    if (!fNegative) {
        return realPart.concat(decimalPart);
    } else {
        return "-" + realPart.concat(decimalPart);
    }
}

// Elimina los blancos existentes al principio y al final de la cadena pasada por parámetro, devolviendo el resultado
function trim(cadena) {
    return ltrim(rtrim(cadena));
    
}
function ltrim(strvar) {
	if (strvar == undefined) return "";
	var str = strvar;
	if ( str == EMPTY_STRING ) return EMPTY_STRING;	 
	for (var i = 0; i < str.length; i++) {
		if ( str.substring(0, 1) == SPACE_STRING ) {
			if (str.length > 1) {
				str = str.substring(1);
			} else {
				str = EMPTY_STRING;
			}
		}
	}
	return str;
}
       
function rtrim(strvar) {
	if (strvar == undefined) return "";
	var str = reverseString(strvar);
	return reverseString(ltrim(str));
}


function screen2Number(varstrnumber) {

	var strNumber = trim(varstrnumber); 
 	var fNegative = false;

 	if (strNumber == EMPTY_STRING || strNumber == null || strNumber == undefined) return null;

	if (strNumber.substring(0,1) == "-") {
		 strNumber = strNumber.substring(1);
		 fNegative = true;
	}

    var str = reverseString(strNumber);
    var count = str.length;
    var chr = null;
    var decimalSeparator = null;
    var thousandsSeparator = null;
    for (var i = 0; i < count; i++) {
        chr = str.substr(i, 1);
        if (chr > '9' || chr < '0') {
           decimalSeparator = chr;
           break;
        }
    }   

    str = strNumber;
    if (decimalSeparator != null) {
        if ( decimalSeparator != SEPARATOR_DOT && decimalSeparator != SEPARATOR_COMMA ) {
            return null;
        }
        if (decimalSeparator == SEPARATOR_DOT) {
            thousandsSeparator = SEPARATOR_COMMA;
        } else {
            thousandsSeparator = SEPARATOR_DOT;
        }
    }

    str = replace(str, thousandsSeparator, EMPTY_STRING);
    if (decimalSeparator != SEPARATOR_DOT) {
        str = replace(str, decimalSeparator, SEPARATOR_DOT);
    }
    
    try {
        if ( isNaN(str) ) {
            return null;
        }
    } catch (e) {
        return null;
    }
    str = trimZeros(str);
    if (fNegative) {
       return "-" + str;
    } else { 
      return str;    
    }
}
function trimZeros(varnumber) { //PRIVATE (no invocar)
	var str = varnumber;
    while (str.substring(0, 1) == ZERO_STRING) 
		str = str.substring(1);
    while (str.substring(str.length - 1, str.length) == ZERO_STRING && str.indexOf(SEPARATOR_DOT) > 0 ) 
		str = str.substring(0, str.length - 1);
	if (str.substring(0, 1) == SEPARATOR_DOT) str = ZERO_STRING.concat(str);
	if (str.substring(str.length - 1) == SEPARATOR_DOT) 
		str = str.substring(0, str.length - 1);
	if (str == EMPTY_STRING) return ZERO_STRING;
	return str;
}

function httpStringInvoker(url, desc) {
	try {
		var xml = new ActiveXObject("Microsoft.XMLDOM");
		var request = new ActiveXObject("Microsoft.XMLHTTP");
		request.open("POST", url, false);
		request.send();
		var xmlObject = request.responseXML;
		var str = xmlObject.selectSingleNode("error").text;
		return str;
	} catch(e) {
		alert("Error de comunicaciones. Imposible conectar con el servidor.\n\nOperación:\t" + desc);
		return null;		
	}
}