/*
****************************************************************
* Validación de formularios con JavaScript
* AUTHOR: Darmin Cid Agurto. 
* CREATION DATE: 13/09/2000
* SOURCE CODE OPTIMIZED BY DARMIN CID dcid@tutopia.com NOV 2000
****************************************************************
*/

var gbCurrentElemIndex;
var sError;
	
function Verifica(numeroForm)
{
	var nTot=0;
	var nPas=0;
	var objHtml;
   	var sElemName;
	var sElemValue;
	var sOne;
	var sTwo;
	var strRequerido;
// por cambios en gráfica de infomax
   var nForm;
   if (numeroForm==null) {
      nForm = 0;
   } else {
      nForm = numeroForm;
   }
//---
   
	sError="Errores encontrados:\n";

	var RE_A=/^[a-z0-9áéíóúÑñ\s]*[a-z0-9áéíóúÑñ]+[a-z0-9áéíóúÑñ\s]*$/i;
	var RE_a=/^[A-ZÑ\s]*[A-ZÑ]+[A-ZÑ\s]*$/;
	var RE_B=/^[\!-\]\sa-záéíóúÑñ_]*[\!-\]a-záéíóúÑñ_]+[\!-\]\sa-záéíóúÑñ_]*$/;
	var RE_b=/^[\!-\]\sÑ_]*[\!-\]Ñ_]+[\!-\]\sÑ_]*$/;
	var RE_C=/^[\!-\]\sa-zÑñ]*[\!-\]a-zÑñ]+[\!-\]\sa-zÑñ]*$/;
	var RE_c=/^[\!-\]\sÑ]*[\!-\]Ñ]+[\!-\]\sÑ]*$/;
	//add 21-feb-2001
	var RE_P=/^[\sX]$/


	var RE_D=/^\s*(\+|\-)?\d+,?\d*\s*$/;
	var RE_d=/^\s*(\+|\-)?\d+,\d{1}\s*$/;
	var RE_F=/^\s*(\+|\-)?\d+,\d{2}\s*$/;
	var RE_g=/^\s*(\+|\-)?\d+,\d{5}\s*$/;
	var RE_J=/^\s*(\+|\-)?\d+,\d{10}\s*$/;
    
	var RE_N=/^\s*(\+|\-)?\d+\s*$/;
	var RE_n=/^\s*\d+\s*$/;

	var RE_NoNumbers=/\D+/;
	var RE_Spaces=/\s+/;
	var RE_AnyChar=/\S/;
    var RE_Zeros=/0+/;

	var RE_e=/^\s*[a-z0-9_]+@[a-z0-9_]+\.[a-z0-9_]+\.*[a-z0-9_]*\s*$/i;
	
	// FOR RUT DETECTION
	var RE_SeekerPoints = /\./g;
	var RE_SeekerMinus =/\-/;
	// now this is dinamic, var RE_MaxRut= /^\s*(\d{1,3}\.?\d{3}\.?\d{3}\-[0-9Kk])\s*$/;
	var RE_MaxRut;
	var RE_SplitRut= /^\s*(\d+)([0-9Kk])\s*$/;
	var sRe_MaxRut="";
	var iLoopCount=0;

	
	var	Mantiza;
	var DigV;
	
	// FO ChBx AND RdBt
	var objHtmlAux;
	// FOR CHECKBOX
	var sCurrentCkBxNameArray="";
	var sFirstCkBxNameArray="";
	var iFirstCkBxElemIndex=0;
	var bCkBxChecked=false;
	
	//FOR RADIOBUTTON
	var sCurrentRdBtName="";
	var sFirstRdBtName="";
	var iFirstRdBtElemIndex=0;
	var bRdBtChecked=false;
		
		
	for (gbCurrentElemIndex = 0; gbCurrentElemIndex<document.forms[nForm].length; gbCurrentElemIndex++)
    {
		objHtml=document.forms[nForm].elements[gbCurrentElemIndex];
		
    	sElemName=objHtml.name;
		sElemType=objHtml.type;
		// for netscape comprention (Puaaajj!!!)
		if (sElemType=="select-one"){
			var auxSelItem=objHtml.selectedIndex;
			if ( auxSelItem!=null)
				sElemValue=objHtml.options[objHtml.options.selectedIndex].value
			 }
		else
			sElemValue=objHtml.value;

		if ( sElemType=="submit" || sElemType=="reset" || sElemType=="image" || sElemType=="button" || sElemType=="FileUpload"){
			sOne='x';
			sTwo='x';
		}
		else
		{
		    sOne=sElemName.charAt(0);
		    sTwo=sElemName.charAt(1);
		}
		
		sElemName=limpiaNombre(sElemName);
		
		if (sTwo=='o'){
		  if (RE_AnyChar.test(sElemValue))
		  {
		      sTwo='r';
			  strRequerido="No ";
		  }
		}else
		  strRequerido="";
					
		if (sTwo=='r') {
				switch (sOne) {
					case 'A':
						if (!RE_A.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'a':
						if (!RE_a.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'B':
						if (!RE_B.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;	
					case 'b':
						if (!RE_b.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;	
					case 'C':
						if (!RE_C.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'c':
						if (!RE_c.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'D':
						if (!RE_D.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe ser número entero o decimal y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'd':
						if (!RE_d.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe ser numero con un decimal y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'F':
						if (!RE_F.exec(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe ser número con dos decimales y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'g':
						if (!RE_g.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe ser número con cinco decimales y " + strRequerido + "es obligatorio\r"
						}					
						break;
					case 'J':
						if (!RE_J.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe ser número con diez decimales y " + strRequerido + "es obligatorio\r"
						}					
						break;

					case 'e':
						if (!RE_e.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe tener formato de e-mail y " + strRequerido + "es obligatorio\r"
						}
						break;
					case 'N':
						if (!RE_N.test(sElemValue)) //RE_N.exec(sElemValue)!=sElemValue)
						{
						   	nTot++;
							sError+=sElemName +", debe ser numérico entero y " + strRequerido + "es obligatorio\r";
						}
						break;						
					case 'n':
						if (!RE_n.test(sElemValue))
						{
						   	nTot++;
							sError+=sElemName +", debe ser numérico y " + strRequerido + "es obligatorio\r";
						}
						break;
					case 's':
						if (!RE_AnyChar.test(sElemValue))
						{
						   	nTot++;
							sError+=sElemName +", debe ser texto y " + strRequerido + "es obligatorio\r";
						}
						break;
					case 'K':
                    case 'k':
                    case 'L':
                    case 'l':
                    case 'M':                                                            
						if (!valida_Fecha(sElemValue,sOne))
						{
						   	nTot++;
							sError += sElemName +", debe ser Fecha de acuerdo al formato especifico y " + strRequerido + "es obligatorio\r";
						}
						break;
					case 'P':
						if (!RE_P.test(sElemValue))
						{
						   	nTot++;
							sError+=sElemName +", debe ser ' ' o 'X' y " + strRequerido + "es obligatorio\r";
						}
						break;					
					case 'r':
						// si existen puntos o menos 
						if (RE_SeekerPoints.test(sElemValue)||RE_SeekerMinus.test(sElemValue)){
							// busca rut
							// genero la Max RegExp apropiada segun el largo del rut
							sRe_MaxRut="^\\s*(\\d{1,3}";
							iLoopCount=parseInt((sElemValue.length-2)/4);

							for (iCount=0;iCount<iLoopCount;iCount++)
								sRe_MaxRut+="\\.?\\d{3}";							

							sRe_MaxRut+="\\-[0-9Kk])\\s*$";
							RE_MaxRut = new RegExp(sRe_MaxRut) ;

							if (RE_MaxRut.test(sElemValue)){
								// limpiamos string
								sElemValue=sElemValue.replace(RE_SeekerPoints,"");
								sElemValue=sElemValue.replace(RE_SeekerMinus,"");
							}
							else { 
								sError += sElemName +", no es formato válido de rut y " + strRequerido + "es obligatorio\r";
								nTot++;
								break;
							}							
						}

						if (sElemValue.length>11){
							sError += sElemName +", es un rut inválido (demasiado largo) y " + strRequerido + "es obligatorio\r";
							nTot++;
							break;
						}else if (RE_SplitRut.test(sElemValue)){
							// buscamos rut en su forma minima
							RE_SplitRut.exec(sElemValue);
							Mantiza=RegExp.$1;
							DigV=RegExp.$2;
							// revisamos 0-0
							if (parseInt(Mantiza)==0){
								sError += sElemName +", no es formato válido de rut y " + strRequerido + "es obligatorio\r";
								nTot++;
							}else{
								DigV = DigV.toUpperCase();
								if ( !ValidaRut(Mantiza,DigV)) {
									sError += sElemName +", debe ser un rut válido y " + strRequerido + "es obligatorio\r";
								   	nTot++;
								}							
							}    
						}else{
							// el string NO ES RUT
							sError += sElemName +", no es formato válido de rut y " + strRequerido + "es obligatorio\r";
							nTot++;
						}
						break;
					case 'R':
						//nTot=nTot+RevisaCheck_y_RadioButtons(sOne);
						/*
						var sCurrentRdBtName="";
						var sFirstRdBtName="";
						var iFirstRdBtElemIndex=0;
						var bRdBtChecked=false;
						*/
						if (sElemType!="radio"){
							nTot++;
							sError+=sElemName +", sólo un objeto 'RadioButton' puede usar esta validación (V)\r"
							break;
						}
						// de aqui pa'bajo pasan solo objetos radiobutton
						if (sFirstRdBtName==""){
							// se compara el nombre completo
							sFirstRdBtName=document.forms[nForm].elements[gbCurrentElemIndex].name;
							bRdBtChecked=false;
							iFirstRdBtElemIndex=gbCurrentElemIndex;
						}

						// de aqui al final
						for (;gbCurrentElemIndex<window.document.forms[nForm].elements.length; gbCurrentElemIndex++)
                        {
                        	// Notese que no necesariamente el elemnto siguiente es un RdBt
							objHtmlAux=document.forms[nForm].elements[gbCurrentElemIndex];

							if (objHtmlAux.type!="radio"){
								// retrocedo para validarlo (no es RdBt)
                         		gbCurrentElemIndex--;
								break;
							}
							else {
	                        	sCurrentRdBtName=objHtmlAux.name;
	                        	if (sFirstRdBtName==sCurrentRdBtName)
    	                    	{
									if (objHtmlAux.checked == true)
            	             			bRdBtChecked=true;
                	         	}
                    	     	else
                        	 	{
									// termina ese checkbox group y sigo con otro
									if (bRdBtChecked==false){
										if (nPas==0)
											document.forms[nForm].elements[iFirstRdBtElemIndex].focus();
										nTot++;
										sError+="debe seleccionar una opción (" +  limpiaNombre(sFirstRdBtName) + ")\r";
									}
									// retrocedo para comenzar a validar este nuevo grupo
									sFirstRdBtName="";
    	                     		gbCurrentElemIndex--;
        	                 		break;
            	             	}
							} // fin if
                	    } // fin for
						break;							
					case 'T':
					case 't':
					case 'U':					
						if (!RE_c.test(sElemValue))
						{
							nTot++;
							sError+=sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r"
						}
						else{
							switch (sOne) {
								case 'T':
									nTot=nTot+CheckTxAr(objHtml,10,71,420);
									break;
								case 't':
									nTot=nTot+CheckTxAr(objHtml,40,71,1470);
									break;
								case 'U':
									nTot=nTot+CheckTxAr(objHtml,25,78,1950);
									break;
							}
						}
						break;
					case 'V':
						//nTot=nTot+RevisaCheck_y_RadioButtons(sOne);
						/*
						fuera del FOR
        				var objHtmlAux;
        				var sCurrentCkBxNameArray="";
        				var sFirstCkBxNameArray="";
        				var bCkBxChecked=false;
						var iFirstCkBxElemIndex=0;
						*/
						if (sElemType!="checkbox"){
							nTot++;
							sError+=sElemName +", sólo un objeto 'CheckBox' puede usar esta validación (V)\r"
							break;
						}
						// de aqui pa'bajo pasan solo objetos checkbox
						if (sFirstCkBxNameArray==""){
							// se compara el nombre completo
							sFirstCkBxNameArray=document.forms[nForm].elements[gbCurrentElemIndex].name.split("#");
							bCkBxChecked=false;
							iFirstCkBxElemIndex=gbCurrentElemIndex;
						}

						// de aqui al final
						for (;gbCurrentElemIndex<window.document.forms[nForm].elements.length; gbCurrentElemIndex++)
                        {
                        	// Notese que no necesariamente el elemnto siguiente es un CkBx
							objHtmlAux=document.forms[nForm].elements[gbCurrentElemIndex];

							if (objHtmlAux.type!="checkbox"){
								// retrocedo para validarlo (no es CkBx)
                         		gbCurrentElemIndex--;
								break;
							}
							else {
	                        	sCurrentCkBxNameArray=objHtmlAux.name.split("#");
	                        	if (sFirstCkBxNameArray[0]==sCurrentCkBxNameArray[0])
    	                    	{
									if (objHtmlAux.checked == true)
            	             			bCkBxChecked=true;
                	         	}
                    	     	else
                        	 	{
									// termina ese checkbox group y sigo con otro
									if (bCkBxChecked==false){
										if (nPas==0)
											document.forms[nForm].elements[iFirstCkBxElemIndex].focus();
										nTot++;
										sError+="debe seleccionar al menos una opción (" +  limpiaNombre(sFirstCkBxNameArray[0]) + ")\r";
									}
									// retrocedo para comenzar a validar este nuevo grupo
									sFirstCkBxNameArray="";
    	                     		gbCurrentElemIndex--;
        	                 		break;
            	             	}
							} // fin if
                	    } // fin for
						
						break; // fin case V						
				} // fin switch
		} // fin if 'r'
		
	    // LISTA DE ERRORES
	    if (nPas==0 && nTot>0)
		{
			if (objHtml.type!="checkbox" && objHtml.type!="radio")
			objHtml.focus();
			if (objHtml.type=="text")
				objHtml.select();
	        nPas=1;
		}
	} // fin for general
	
	//cierre del ultimo grupo de CkBx
	if (bCkBxChecked==false && sFirstCkBxNameArray!=""){
		if (nPas==0)
			document.forms[nForm].elements[iFirstCkBxElemIndex].focus();
		nTot++;
		sError+="debe seleccionar al menos una opción (" + limpiaNombre(sFirstCkBxNameArray[0])  + ")\r";
	}
	//cierre del ultimo grupo de RdBt
	if (bRdBtChecked==false && sFirstRdBtName!=""){
		if (nPas==0)
			document.forms[nForm].elements[iFirstRdBtElemIndex].focus();
		nTot++;
		sError+="debe seleccionar una opción (" + limpiaNombre(sFirstRdBtName)  + ")\r";
	}
						
	if (nTot>0) 
	{	
		alert(sError);
		return false;
	}
	else
	{
	    return true;
	}
}

// MISC

function limpiaNombre(strNombre)
{
	var iLenName=strNombre.length;

	if (iLenName>6)
	{
		strNombre=strNombre.substring(6,iLenName);

		// Quitamos underLine
		// iLenName=strNombre.length;
		var strNombreAux="";
		for (var i=0;i<iLenName;i++)
		{
			var sByte=strNombre.substring(i,i+1);
			if (sByte=="_")
				sByte=" ";
			strNombreAux=strNombreAux+sByte;
		}

		// nombre esta de acuerdo a standard TID
		var RE_Seeker=/(.\w{2})L(\d\d)C(\d\d)/;
		if(RE_Seeker.exec(strNombreAux)!=null){
			// strNombre= "En el subcampo "+ RegExp.$3 +" del campo "+ RegExp.$1 + " de linea " + RegExp.$2;
			strNombreAux= "En línea " + RegExp.$2 + ", el campo "+ RegExp.$1 + ", subcampo "+ RegExp.$3  
		}
		//Corregimos ortografia
		//FROM DCID
		var re = new RegExp("cion","g");
		strNombreAux = strNombreAux.replace(re, "ción");
		re = RegExp("inea","g");				
		strNombreAux = strNombreAux.replace(re, "ínea");
		re = RegExp("umero","g");
		strNombreAux = strNombreAux.replace(re, "úmero");
		re = RegExp("odigo","g");
		strNombreAux = strNombreAux.replace(re, "ódigo");							
		re = RegExp("aximo","g");
		strNombreAux = strNombreAux.replace(re, "áximo");
		// FROM ROLA
		re = RegExp("area","g");
		strNombreAux = strNombreAux.replace(re, "área");
		re = RegExp("aratulas","g");
		strNombreAux = strNombreAux.replace(re, "arátulas");
		re = RegExp("dia","g");
		strNombreAux = strNombreAux.replace(re, "día");
		re = RegExp("nvio","g");
		strNombreAux = strNombreAux.replace(re, "nvío");
		re = RegExp("ublico","g");
		strNombreAux = strNombreAux.replace(re, "úblico");
		strNombre=strNombreAux;

 	}
	return strNombre;
}

function CaptureCheckedValues(intoObject,indxForm)
{
	if (indxForm==null)
		indxForm=0;
	var valuesConcat = "";
	var elem;
	for (var j = 0; j < document.forms[indxForm].length; j++)
	{
		elem  = document.forms[indxForm].elements[j];
		if (elem.type == "checkbox")
			if (elem.checked==true)
				valuesConcat = valuesConcat + elem.value + ",";
	}
	document.forms[indxForm].elements[intoObject].value=valuesConcat;
}

function ConfirmarFormAction(msg,flagConfirm,refLink,metodo,numeroForm)
{	
//por cambio en gráfica infomax
   var nForm;
   if (numeroForm==null) {
      nForm = 0;
   } else {
      nForm = numeroForm;
   }

	var flagSubmit=true;
	if (msg!="¿volver?" )
		if (!Verifica(nForm))
			return false;
	if (flagConfirm==true)
		flagSubmit=confirm(msg);		
	if (flagSubmit==true)
	{
		document.forms[nForm].action=refLink;
		document.forms[nForm].method=metodo;
	}
	return flagSubmit;
}
			

function ValidaRut(rut, dv){

	if(rut.length==0){
		return false;
	}
	else{
		var factor = 2;
		var suma = 0;
		var i;
		var dig;

		for(i=rut.length-1; i>=0; i--){
			suma = suma + factor*rut.charAt(i);
			if (factor==7)
        		factor=2;
			else    
        		factor++;
		}
		resto = suma % 11;
		if (resto == 1) {
			dig = 'K';
		}
		else if (resto == 0){
			dig = '0';
		}
		else {
			resto = 11 - resto;
			dig = "" + resto;
		}
	}

	if (dv==null)
		return dig;
	if (dig==dv)
		return true;
	return false;
}

function desformat( strCadena ) {
	var resultado = "";
	for(var i=0;i<strCadena.length;i++) {
		var sByte=strCadena.substring(i,i+1)
		if ( (sByte>="0" && sByte<="9") )   {
			resultado = resultado+sByte;
		}
	}
	return(resultado);
}

//public trim sLorR is optional 
// in js 5.5 use RE_Trim=/((?:\w+\s*)+)/; for best performance
function trim(strCadena, sLorR) {
	var sResult = "";
	var RE_Trim;
	switch (sLorR) {
		case "L" :
			RE_Trim=/((\S+[\x20\t]*)+)/;
			if (RE_Trim.exec(strCadena)!=null)
				sResult =RegExp.$1 ;
			break;
		case "R" :
			RE_Trim=/(([\x20\t]*\S+)+)/;
			if (RE_Trim.exec(strCadena)!=null)
				sResult =RegExp.$1 ;
			break;
		default :
			RE_Trim=/((\S+[\x20\t]*)+)/;
			if (RE_Trim.exec(strCadena)!=null)
				sResult =RegExp.$1 ;
			RE_Trim=/(([\x20\t]*\S+)+)/;
			if (RE_Trim.exec(sResult)!=null)
				sResult =RegExp.$1 ;
	}
	return(sResult);
}


function VerificaCeros(forma) {
	var h;
	for (h=0; h < forma.length; h++) {
		if (forma.charAt(h)!= "0")
			return false;
	}
	return true;
}

function esnumero(num) {
	if (num.length == 0)  {
		return false;
	}

	for (i = num.length; i > 0; i--) {
		c = parseInt(num.charAt(i-1))
		if (isNaN(c)) {
			return false
		}
	}
	return true
}


function valida_Fecha(sFecha,formato){

	var iYear=0;
	var iMonth=0;
	var iDay=0;

	if (formato=='K'){
		if (sFecha.length!=10)
			return false;
		iDay = parseInt(sFecha.substring(0, 2),10);
		iMonth = parseInt(sFecha.substring(3, 5),10);
		iYear = parseInt(sFecha.substring(6,10),10);
	}

	else if (formato=='k'){
		if (sFecha.length!=8)
			return false;
		iDay = parseInt(sFecha.substring(0, 2),10);
		iMonth = parseInt(sFecha.substring(2, 4),10);
		iYear = parseInt(sFecha.substring(4,8),10);
	}		

	else if (formato=='L'){
		if (sFecha.length!=6)
			return false;
		iDay = parseInt(sFecha.substring(0, 2),10);
		iMonth = parseInt(sFecha.substring(2, 4),10);
		iYear = parseInt(sFecha.substring(4,6),10);
	}

	else if (formato=='l'){
		if (sFecha.length!=8)
			return false;
		iDay = parseInt(sFecha.substring(6, 8),10);
		iMonth = parseInt(sFecha.substring(4, 6),10);
		iYear = parseInt(sFecha.substring(0,4),10);
	}		
	else if (formato=='M'){
		if (sFecha.length!=6)
			return false;
		iDay = parseInt(sFecha.substring(4, 6),10);
		iMonth = parseInt(sFecha.substring(2, 4),10);
		iYear = parseInt(sFecha.substring(0,2),10);
	
	}

	if ( isNaN(iMonth) ) return false;
	if ( isNaN(iDay) ) return false;
	if ( isNaN(iYear) ) return false;

	// ESTE CODIGO CONTROLA AÑOS CON DOS DIGITOS
	if (sFecha.length==6){
		if (iYear>=0 && iYear<=50)
			iYear=2000+iYear;
		else if (iYear>=51 && iYear<=99)
			iYear=1900+iYear;
	}
		
	// TID USA ESTO
	if (iYear<1951 || iYear>2050) return false;
	// RUBEN USA ESTO OTRO
	// if (iYear<1900) return false;

	if (iMonth<1 || iMonth>12) return false;
	if (iDay<1 || iDay>31) return false;
		
	if (iMonth==2){
		if (iDay>29) {
			return false;
		}
		else {
			if (iDay==29) {
				if (    ( (iYear%4==0) && (iYear%100==0) && (iYear%400==0) ) ||
		           		 ( (iYear%4==0) && (iYear%100!=0)               )  ) {
					return true;
				}
				else {		
					return false;
				}
			}
		}
	}

	if (iMonth==4 || iMonth==6 || iMonth==9 || iMonth==11){
		if (iDay>30)
			return false;
		else
			return true;	
	}
	else {
		if (iDay>31)
			return false;
		else
			return true;
	}

}
// **** public check the correct hour format

function checkHourFormat (sHour){
	var RE_Hour =/^([0-2]\d)\:([0-5]\d)$/;
	var sHH,sMM;

	if (RE_Hour.exec(sHour)!=null)
	{
		sHH =RegExp.$1;
		sMM =RegExp.$2;
		if (sHH<25 && sMM<60)
			return true;
		else
			return false;
	}
	return false;
}

// ****

var uni = new Array();
var dece = new Array();
var cente = new Array();

function toArrayLeters(strNumber,strSufijo)
{
	var EnArray = new Array();

	var iLenIntPart=0;
	var iLenDecPart=0;
	var outEnLetras="";
	// coma y no punto!
	RE_DEC = /^(\d+),?(\d*)$/;
	RE_EOL = /(\w+\s)+/; 

	RE_DEC.exec(strNumber);
	
	var strIntPart=RegExp.$1;	
	var strDecPart=RegExp.$2;
	var iDecPart=parseInt(strDecPart,10);
		
	//iLenIntPart=strIntPart.length();
	iLenDecPart=strDecPart.length;
	if (iLenDecPart!= 0){
		var strCeros="";
		var i=0;
		for (i=0;i<iLenDecPart;i++)
		{
			strCeros+="0";
		}
		//if (iLenDecPart==1)
		//	strSufijo=strSufijo+" CON "+iDecPart+"0/10 ";
		//else
			strSufijo=strSufijo+" CON "+iDecPart+"/1"+strCeros+" ";
	}
	outEnLetras= toLeters(strIntPart) + " "+strSufijo;

	var iLenEnLetras=outEnLetras.length;
	var iTurno=0;
	// var NumeroValue=0;
	// var NumeroIndex=0;
	// NumeroValue = ObjNumero.value;
	
	for (iTurno=0;iTurno<4;iTurno++){
		EnArray[iTurno]="";
	}
	
	iTurno=0;
	var sAuxValue;
	var iMaxLenForLine=48;
	var iAuxCursor=0;
	// boolean bMatched=false;
	
	while (iTurno<4 && iLenEnLetras>0){
		if ((iLenEnLetras-iMaxLenForLine)>0){
			sAuxValue=outEnLetras.substring(iAuxCursor,iAuxCursor+iMaxLenForLine);
			var sre;
			//RE_EOL.exec(sAuxValue);
			aMatchedArray=sAuxValue.match(RE_EOL);
			EnArray[iTurno]=aMatchedArray[0]; // no se puede ocupar RegExp.$1 pues es recursivo (puede superar 9 memorias)
			iAuxCursor=iAuxCursor+RegExp.lastIndex;
			iLenEnLetras=iLenEnLetras-RegExp.lastIndex;
		}
		else{
			sAuxValue=outEnLetras.substring(iAuxCursor,iAuxCursor+iLenEnLetras);
			EnArray[iTurno]=sAuxValue;
			iAuxCursor=0;
			iLenEnLetras=0;
		}
		iTurno++;
	}
	return EnArray;
}

function toLeters(numero)
{ 
	var r1=0;
	var r2=0;
	var r3=0;
	var r4=0;
		
	var resp="";

	uni[0] = "";
	uni[1] = "UN";
	uni[2] = "DOS";
	uni[3] = "TRES";
	uni[4] = "CUATRO";
	uni[5] = "CINCO";
	uni[6] = "SEIS";
	uni[7] = "SIETE";
	uni[8] = "OCHO";
	uni[9] = "NUEVE";
	uni[10] = "DIEZ";
	uni[11] = "ONCE";
	uni[12] = "DOCE";
	uni[13] = "TRECE";
	uni[14] = "CATORCE";
	uni[15] = "QUINCE";

	dece[0] = "DIECI";
	dece[1] = "VEINT";
	dece[2] = "TREI";
	dece[3] = "CUARE";
	dece[4] = "CINCUE";
	dece[5] = "SESE";
	dece[6] = "SETE";
	dece[7] = "OCHE";
	dece[8] = "NOVE";

	cente[0] = "CIEN";
	cente[1] = "DOSCI";
	cente[2] = "TRESCI";
	cente[3] = "CUATROCI";
	cente[4] = "QUINI";
	cente[5] = "SEISCI";
	cente[6] = "SETECI";
	cente[7] = "OCHOCI";
	cente[8] = "NOVECI";
	
	resp = "";
	if (numero==0){
		resp="CERO";
		return resp;
	}

	if (numero < 0){ 
		numero = numero * -1; 
		resp = "MENOS ";
	}

	// Parto el número en tres bloques de tres digitos
	numero= trim(numero);
	LenNumero=numero.length;
	var turno=1;
	while (LenNumero>0){
		switch (turno) {
			case 1 :
		    	r1 =parseInt (numero.substring(LenNumero-3, LenNumero),10);
				LenNumero=LenNumero-3;
				turno=2;
				break;				
			case 2 :
		    	r2 =parseInt (numero.substring(LenNumero-3, LenNumero),10);
				LenNumero=LenNumero-3;
				turno=3;
				break;								
			case 3 :
		    	r3 =parseInt (numero.substring(LenNumero-3, LenNumero),10);
				LenNumero=LenNumero-3;
				turno=4;
				break;
			case 4 :
		    	r4 =parseInt (numero.substring(LenNumero-3, LenNumero),10);
				LenNumero=LenNumero-3;
		}	
	}
	
//	r4 =parseInt ((numero / 1000000000));
//	r3 =parseInt ((numero / 1000000) - (r4* 1000));
//	r2 =parseInt ((numero / 1000) - ((r4* 1000000) + (r3 * 1000)));
//	r1 =parseInt (numero - ( (r4*1000000000) + (r3 * 1000000) + (r2 * 1000)));
	var cota= 1000000000000;

	if (numero < cota){
		// Proceso los millares de millones
		if (r4 != 0){
			if (r4 != 1){
				resp = resp + cifra(r4, 2);
				resp = trim(resp) + " ";					
			}
			if (r3==0)
				resp = resp + "MIL MILLONES ";
			else
				resp = resp + "MIL ";
		}
			
		// Proceso los millones
		if (r3 != 0){
			if (r3 != 1) {
				resp = resp + cifra(r3, 3);
				resp = trim(resp) + " MILLONES ";
			}
			else
				if (r4==0)
					resp = resp + "UN MILLON ";
				else
					resp = resp + "UN MILLONES ";
		}
		// Proceso los millares
		if (r2 != 0){
			if (r2 != 1){
				resp = resp + cifra(r2, 2);
				resp = trim(resp) + " ";
			}
			resp = resp + "MIL ";
		}
		resp = resp + cifra(r1, 1); // Proceso las centenas
	}
	else
		resp = "Wow más de 999.999.999.999 ";
	return resp;

}

function  cifra( m,  nivel){
		
	var n3;
	var n2;
	var n1;
	var n;
	var resp="";

	n3 = parseInt (m / 100);
	n2 = parseInt ((m / 10) % 10);
	n1 = parseInt (m % 10);
	//Comprobamos la centena
	if (n3 != 0){
		resp = resp + cente[n3 - 1];
		
		if (n3 < 2){
			if (m != 100)
				resp = resp + "TO ";
			//ElseIf nivel = 3 Then ' el nivel nos indica el sexo de las pesetas
			//resp = resp + "ENTOS "
		}
		else
			resp = resp + "ENTOS ";
	}
		
	n = (n2 * 10) + n1;
		
	if (n != 0){
		// para los inferiores a 16
		if (n < 16)
			resp = resp + uni[n];
		else {
			resp = resp + dece[n2 - 1];
			//decenas de menos de 30
			if (n2 < 3) {
				if (n2 > 1) {
					if (n1 != 0)
						resp = resp + "I";
					else
						resp = resp + "E";
				}
			}
			else {
				// las demás decenas acaban en NTA
				resp = resp + "NTA ";
				if (n1 != 0)
					resp = resp + "Y ";
			}
				// le pongo las unidades
			resp = resp + uni[n1];
		}
	}
	return resp;
}

function putMontLetterToCamps(sMountValue,sSufijo,sPutInElemName,iMaxFillLines) {
		var LocalArray = new Array();
		if (isNaN(sMountValue)){
			alert("Ingrese un valor numerico");
			return;
		}
		var iCurrentElemIndex=0;
		var iArrayCount=0;
		var nElemenNum=0;
		var sElemenNom="";
		
		with(document.forms[0]){
			for (iCurrentElemIndex = 0; iCurrentElemIndex<document.forms[0].length; iCurrentElemIndex++)
		    {
		    	nElemenNum=gbCurrentElemIndex;
		   		sElemenNom=document.forms[0].elements[iCurrentElemIndex].name;
				
				if (sElemenNom==sPutInElemName){
					LocalArray=toArrayLeters(sMountValue,sSufijo);
					for (;iMaxFillLines>0;iMaxFillLines--,iArrayCount++){
						document.forms[0].elements[iCurrentElemIndex].value=LocalArray[iArrayCount];
						iCurrentElemIndex++;
					}
					iCurrentElemIndex=document.forms[0].length;
				}					
			}
		}
}

// Private of CheckForm
function CheckTxAr(oTxAr,MaxRows, MaxCols, MaxChrs)
{
	/* 
		PREREQUISITO:
			PASAR POR EL FILTRO X DE STRING'S ACEPTADOS
	*/
	var sTxArValue=oTxAr.value;
	var sElemName=oTxAr.name;
	var sRequerido;

	var iRowCount = 1;
	var iColCount = 0;
	var iCharCount = 0;
	var iCount=0;

	var bUseRTrim=true;
	var sOneLine="";
	var sResult="";

	for(; iCount < sTxArValue.length; iCount++){
		// si detecto un enter	
		if ((sTxArValue.charCodeAt(iCount) == 13) && (sTxArValue.charCodeAt(iCount + 1) == 10)){
			iRowCount++;
			iColCount = 0;
			iCount++;

			if (bUseRTrim)
				sOneLine=trim(sOneLine,'R');

			sResult+= sOneLine;
			iCharCount+=sOneLine.length;
			sResult+= "\r\n";				
			sOneLine="";
		}
		else {
			iColCount++;
			sOneLine+=sTxArValue.charAt(iCount);
			// si llego al EOL y no estoy al final del TxAr...
			if ((iColCount == MaxCols) && ((iCount + 1) < sTxArValue.length))
				// si no hay un enter ...Ponerlo!
				if (sTxArValue.charCodeAt(iCount + 1) != 13)
					sTxArValue = sTxArValue.substring(0, (iCount + 1)) + "\r\n" + sTxArValue.substring((iCount + 1), sTxArValue.length);
		}
	}// fin for

	// SIEMPRE cuando no hay enter o es la ultima linea 
	if (bUseRTrim)
		sOneLine=trim(sOneLine,'R');
	sResult+= sOneLine;
	iCharCount+=sOneLine.length;

//************ algoritmo similar al de verifica
	if (sElemName.charAt(1)=='o'){
		strRequerido="No ";
	}else
		strRequerido="";

	sElemName=limpiaNombre(sElemName);
//************* control de errores

/* esto no ocurre nunca
	if (iCharCount == 0){
		if (sTwo=='r') {
			sError += sElemName +", debe contener caracteres válidos y " + strRequerido + "es obligatorio\r";
			return 1;
		}
	}
	else{
*/
	oTxAr.value=sResult
	if (iRowCount > MaxRows){
		sError += sElemName +", contiene demasiadas lineas y " + strRequerido + "es obligatorio\r";
		return 1;		
	}
	else{
		if (iCharCount > MaxChrs){
			sError += sElemName +", contiene demasiados caracteres y " + strRequerido + "es obligatorio\r";
			return 1;
		}
	}
	return 0;
}

/*
 PUBLIC FUNCTION FOR AUTOFILL OR DEFAULT VALUE
 TIPICAL INVOCATION fillCell(document.forms[0].nrTxBxNúmero_conexión,'0',4,'L',false)
 
 REMARKS: If bAllowTargetBlank=true then 'fillCell' not fill nothing
 */
function fillCell(oTarget,sCharToFill,iTargetOutLen,sFillSide,bAllowTargetBlank) {
	if ((oTarget.value.length>0 && oTarget.value.length<iTargetOutLen) || (oTarget.value.length=0 && bAllowTargetBlank==true) ){
    	var sToContat="";
    	var iAux=0;
     
    	for (;iAux<iTargetOutLen;iAux++){
    		sToContat+=sCharToFill;
    	}
    	// LEFT ES POR DEFECTO
    	if (sFillSide=='R'){
    		sToContat=oTarget.value+sToContat;
    		oTarget.value=sToContat.substring(0, iTargetOutLen);
    	}
    	else{
    		sToContat=sToContat+oTarget.value;
    		iAux=sToContat.length;
    		oTarget.value=sToContat.substring(iAux-iTargetOutLen, iAux);
    	}
	}
 }

