//Declaracion de variables
var RE_CADENA = /\w+/;
var RE_NUMERIC = /\d+/;
var RE_HORA = /^((0|1|2)\d:(0|1|2|3|4|5)\d)$/;
var RE_FECHA = /^(0|1|2|3)\d\/(0|1)\d\/\d{4}$/;
var RE_EMAIL = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
var RE_NIF = /^[0-9]{8}[a-zA-Z]{1}$/;
var RE_URL = /^((ftp|http|https):\/\/)(www)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;

//solo permite que se pulsen valores numericos en el campo
//ej: <input type="text" onkeypress="return onKeyPressNumbers(event);" />
function onKeyPressNumbers(e) {
	var key = window.event ? e.keyCode : e.which;
	var keychar = String.fromCharCode(key);
	return RE_NUMERIC.test(keychar);
}

//solo permite introducir valores validos para un campo hora
function onKeyPressHour(e) {
	var key = window.event ? e.keyCode : e.which;
	var keychar = String.fromCharCode(key);
	return /\d|:/.test(keychar);
}

//solo permite introducir valores validos para un campo hora
function onKeyPressDate(e) {
	var key = window.event ? e.keyCode : e.which;
	var keychar = String.fromCharCode(key);
	return /\d|\//.test(keychar);
}

//limita el numero de caracteres de un componente
//ej1: <textarea onkeyup="return limitLength(this, 20);"></textarea>
function limitLength(obj, maxlength) {
	if (obj.value.length > maxlength)
		obj.value = obj.value.substring(0, maxlength)
}

//valida el campo pasado como parametro segun la ER asociada
function validateCampo(campo, eReg) {
	var err = !eReg.test(campo.value);
	if (err) {
		var errDiv = document.getElementById("errFormulario");
		if (errDiv != null) errDiv.style.display = "block";
		campo.style.borderColor = "red";
		campo.focus();
	} else {
		if (campo.style.borderColor == "red")
			campo.style.borderColor = "gray";
	}
	return !err
}

//valida el campo pasado como parametro segun la ER asociada
/*function validateCampo(campo, eReg) {
	var msj_error='Error';
	var color_error='#ff6600';
	var color_ok='#ccc';
	var _id="#"+campo.id;
	var msj_ok="O.K";
	var err = !eReg.test($(_id).val());

	if (err) {		
			$(_id).css('border-color',color_error);
			$(_id).attr('title',msj_error);
			$(_id).Tooltip();
			$(_id).focus();
		
	} else {
		if ($(_id).css('border-color')==color_error);{
			$(_id).css('border-color',color_ok);
			$(_id).attr('title',msj_ok);
			$(_id).Tooltip();
		}
	}
	return !err
}*/

//valida los campos pasados como parametro segun sus expReg asociadas
//ej1: <form id="f" onSubmit="return validateCampos([f.num, f.hora, f.fecha], [/\d+/, /\d*/, /\d*/]);">
//ej2: <form id="f" onSubmit="return validateCampos([f.num, f.hora, f.fecha], [RE_NUMERIC, RE_HORA, RE_FECHA]);">
function validateCampos(aCampos, aRegExp) {
	var hayErrores = false;
	for (var i = 0; i < aCampos.length; i++) {
		hayErrores = !validateCampo(aCampos[i], aRegExp[i]) || hayErrores;
	}
	return !hayErrores;
}

//valida el formato de los campos opcionales
function validateFormatos(aCampos, aRegExp) {
	var hayErrores = false;
	for (var i = 0; i < aCampos.length; i++) {
		if (aCampos[i].value.length > 0)
			hayErrores = !validateCampo(aCampos[i], aRegExp[i]) || hayErrores;
	}
	return !hayErrores;
}

/**
  * Checks/unchecks all options of a <select> element
  *
  * @param   string   the form name
  * @param   string   the element name
  * @param   boolean  whether to check or to uncheck the element
  *
  * @return  boolean  always true
  */
function setSelectOptions(the_form, the_select, do_check) {
    var selectObject = document.forms[the_form].elements[the_select];
    var selectCount  = selectObject.length;
    for (var i = 0; i < selectCount; i++)
        selectObject.options[i].selected = do_check;
}

/**
  * Checks/unchecks all boxes on a form
  *
  * @param   string   Checkbox group name
  * @param   boolean  whether to check or to uncheck the element
  * @return  boolean  always true
  */
function checkAll(oform, check) {
    for (i = 0; i < oform.length; i++)
        oform[i].checked = check;
}

/**
  * Checks/unchecks all boxes on a form, which name match with param grupo
  *
  * @param   string   Checkbox group name
  * @param   string   String match
  * @param   boolean  whether to check or to uncheck the element
  * @return  boolean  always true
  */
function checkAllGroup(oform, grupo, check) {
    for (i = 0; i < oform.length; i++)
        if (oform[i].id.match(grupo)) oform[i].checked = check;
}

/**
  * Comprueba que el numero de dni introducido por el usuario se 
  * corresponde realmente con la letra indicada
  *
  * @param   string   cadena corresopondiente al dni
  * @param   string   letra para ese dni
  *
  * @return  char  letra correspondiente al dni
  */
function calcLetraDNI(din, letra) {
	var cadena = "TRWAGMYFPDXBNJZSQVHLCKET";
	return cadena.substr(dni % 23, 1) == letra;
}

/* Funciones para la validacion de un campo fecha */
function finMes(nMes) {
	switch (nMes) {
		case 1: return 31;
		case 2: return 29;
		case 3: return 31;
		case 4: return 30;
		case 5: return 31;
		case 6: return 30;
		case 7: return 31;
		case 8: return 31;
		case 9: return 30;
		case 10: return 31;
		case 11: return 30;
		case 12: return 31;
		default: return 31;
	}
}

/**
  * Valida el valor del campo fecha a su formato correcto
  *
  * @param   string   nombre del campo que contiene la fecha
  *
  * @return  string   descripcion de los errores detectados
  */
function validarFecha(oTxt) {
	var error = "";
	if (!RE_FECHA.test(oTxt.value))
		error = "Formato de fecha no valido";
	var nDia = parseInt(oTxt.value.substr(0, 2), 10);
	var nMes = parseInt(oTxt.value.substr(3, 2), 10);
	if ((nDia < 1) || (nDia > finMes(nMes)))
		error += "\n- El día indicado no es válido.";
	if ((nMes < 1) || (nMes > 12))
		error += "\n- El mes indicado no es correcto.";
	if (error != "") alert(error);
	return error == "";
}

/**
  * Cambia la visibilidad del elemento pasado como parametro.
  */
function cambiarVisibilidad(campo) {
    if (campo.style.display=='block')
        campo.style.display='none';
    else
        campo.style.display='block';
}

/**
  * Muestra en el documento HTML una cadena que indica la fecha y hora actuales
  */
function pintarFecha() {
    var fecha = new Date();
    var anyo = fecha.getYear();
    if (anyo < 1000) anyo += 1900;
    var dia = fecha.getDay();
    var mes = fecha.getMonth();
    var daym = fecha.getDate();
    if (daym < 10) daym = "0" + daym;

    document.write("<font color='#FFFFCC' size='-1'><b>" + Zapatec.Calendar._TT._DN[dia] + " " + daym + " de " + Zapatec.Calendar._TT._MN[mes] + " de " + anyo + "</b></font>");
}

