// valida cualquier cosa
// copyright 2003 Mauricio Giraldo
// validacion de fecha tomada de www.smartwebby.com

function validar(forma,boton){
	var campos, nombres, tipos, arrCampos, arrNombres, arrTipos,i,j,valido=true,laForma;
	var re, arrMultiCheck, arrCamposMultiCheck, noMulti=0;
	laForma = document[forma];
	campos = laForma['__campos__'].value;
	nombres = laForma['__nombres__'].value;
	tipos = laForma['__tipos__'].value;
	arrCampos = campos.split(",");
	arrNombres = nombres.split(",");
	arrTipos = tipos.split(",");
	
	for (i=0;i<arrCampos.length;i++){
		if (arrTipos[i] == 'texto'){
			if (laForma[arrCampos[i]].value == '') {
				alert ('Debe ingresar un texto en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'textospaw'){
			if (laForma[arrCampos[i]].value == '') {
				alert ('Debe ingresar un texto en ' + arrNombres[i] + '.\nIntente de nuevo');
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'confirm'){
			if (!confirm ('Est\341 seguro que ' + arrNombres[i] + '?')) {
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'numero-op'){
			if (laForma[arrCampos[i]].value != '' && !hasValidChars(laForma[arrCampos[i]].value,"0123456789")) {
				alert ('Debe ingresar un n\372mero en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'unixname'){
			if (!hasValidChars(laForma[arrCampos[i]].value,"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_")) {
				alert ('Debe ingresar un texto v\341lido [a-z,A-Z,0-9,_,-] en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'alias'){
			re = /^[a-zA-Z0-9\.@_-]+$/;
			if (!re.test(laForma[arrCampos[i]].value)) {
				alert ('Debe ingresar un alias v\341lido en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'alias-op'){
			if (laForma[arrCampos[i]].value != '') {
				re = /^[a-zA-Z0-9\.@_-]+$/;
				if (!re.test(laForma[arrCampos[i]].value)) {
					alert ('Debe ingresar un alias v\341lido en ' + arrNombres[i] + '.\nIntente de nuevo');
					laForma[arrCampos[i]].focus();
					valido = false;
					return false;
					break;
				}
			}
		} else if (arrTipos[i] == 'clave'){
			if (laForma["clave"].value == "") {
				alert ('Debe ingresar una clave.\nIntente de nuevo');
				laForma["clave"].focus();
				valido = false;
				return false;
				break;
			}
			if (laForma["clave"].value != laForma["clave2"].value) {
				alert ('Las claves deben coincidir.\nIntente de nuevo');
				laForma["clave2"].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'emailrepite'){
			if (laForma["email"].value == "") {
				alert ('Debe ingresar una email.\nIntente de nuevo');
				laForma["email"].focus();
				valido = false;
				return false;
				break;
			}
			if (laForma["email"].value != laForma["email2"].value) {
				alert ('Los emails deben coincidir.\nIntente de nuevo');
				laForma["email2"].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'select'){
			if (laForma[arrCampos[i]].value=="") {
				alert ('Debe seleccionar ' + arrNombres[i] + '.\nIntente de nuevo.');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'multiselect'){
			if (laForma[arrCampos[i]].selectedIndex==-1) {
				alert ('Debe seleccionar ' + arrNombres[i] + '.\nIntente de nuevo.');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'multicheck'){
			arrMultiCheck = arrCampos[i].split("|");
			arrCamposMultiCheck = arrMultiCheck[2].split(".");
			for (j=0;j<arrCamposMultiCheck.length;j++) {
				if (laForma[arrMultiCheck[0] + "[" + arrCamposMultiCheck[j] + "]"].checked) noMulti++;
			}
			if (noMulti<arrMultiCheck[1]) {
				alert ('Debe seleccionar ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrMultiCheck[0] + "[" + arrCamposMultiCheck[0] + "]"].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'accept'){
			if (!laForma[arrCampos[i]].checked) {
				alert ('Debe aceptar ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			}
		} else if (arrTipos[i] == 'fecha'){
			if (laForma[arrCampos[i]].value == '') {
				alert ('Debe ingresar una fecha v\341lida en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			} else {
				if (!validarFecha(laForma[arrCampos[i]])) {
					laForma[arrCampos[i]].focus();
					valido = false;
					return false;
					break;
				}
			}		
		} else if (arrTipos[i] == 'fecha-tres'){
			if (laForma["dia"].value == '' || laForma["mes"].value == '' || laForma["ano"].value == '') {
				alert ('Debe ingresar una fecha en ' + arrNombres[i] + '.\nIntente de nuevo');
				laForma[arrCampos[i]].focus();
				valido = false;
				return false;
				break;
			} else {
				var validDate = dateCheckTres(laForma);
				if (!validDate) {
					alert ('Debe ingresar una fecha v\341lida (n\372meros) en ' + arrNombres[i] + '.\nIntente de nuevo');
					laForma[arrCampos[i]].focus();
					valido = false;
					return false;
					break;
				}
			}
		}
	}
	if (valido){
		//alert("LISTO PAPAAAaaa!!");
		if (laForma[boton]) laForma[boton].disabled = true;
		return true;
	} else {
		return false;
	}
}

function hasValidChars(strString,chars) {
	var strValidChars = chars;
	var strChar;
	var blnResult = true;
	
	if (strString.length == 0) return false;
	
	//  test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++) {
		strChar = strString.charAt(i);
		if (strValidChars.indexOf(strChar) == -1) {
			blnResult = false;
		}
	}
	return blnResult;
}

var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function validarFecha(campo){
	var dt=campo;
	if (isDate(dt.value)==false){
		return false
	}
    return true
}

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		alert("El formato de fecha debe ser : DD/MM/AAAA")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Por favor ingrese un mes v\341lido en la fecha.")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Por favor ingrese un dia v\341lido en la fecha.")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Por favor ingrese a\361o de 4 d&iacute;gitos v\341lido entre "+minYear+" y "+maxYear+" en la fecha.")
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Por favor ingrese una fecha v\341lida.")
		return false
	}
return true
}

function dateCheckTres(laForma){
	var chk    = 0;
	var maxDia = 0;
	var dd = laForma["dia"].value; // day
	var mm = laForma["mes"].value; // month
	var yyyy = laForma["ano"].value; // year
	
	// calling function to get maximum day for this month
	maxDia = maxDay(mm, yyyy);  

	if ((dd <= 0) || (dd > maxDia)){
		chk = 1;
	} else if ((mm <= 0) || (mm > 12)){
		chk = 1;
	} else if ((yyyy <= 0)){
		chk = 1;
	} 
	
	if (chk == 1){
		return false;
	} else {
		return true;
	}
}

// function for calculating maximum day 
function maxDay(mn, yr){
	var mDay;
	if ((mn == 4) || (mn == 6) || (mn == 9) || (mn == 11)){ 
		mDay = 30;
	} else if (mn == 2) {
		//calling leap year function 
		mDay = isLeapYear(yr) ? 29 : 28;    
	} else {
		mDay = 31;
	}
	return mDay; 
}

// function to check leap year
function isLeapYear(yr){
	if (yr % 2 == 0) {
		return true;
	} else {
		return false;
	}
}
