//Thomas - Burke
//Funciones necesarias para la validación de forms

/************************************************************************************************************/
//Expresiones regulares
/************************************************************************************************************/
//para validar dirección mail
var RE_MAIL = /^[0-9a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[A-Za-z]{2,4}$/;

//para validar dirección web
var RE_URL = /^(www\.)?([-a-zA-Z0-9_]+)((\.[a-zA-Z0-9]{2,4})+)((\/[-a-zA-Z0-9_]+)*)((\.[a-zA-Z0-9]{2,4})?)\/?$/;
var RE_URL_VAR = /^(&?[\w-]+=\w*)+$/;

//para validar un número entero
var RE_INT = /^\-?[0-9]+$/;

//para validar un número decimal
var RE_DECIM = /^\d+(\.\d{1,2})?$/;

//errores surgidos en la comprobación (String)
var errorStr;
//variable en la que se guardan los labels del form para poder mostrar los nombre de los campos
//por pantalla en caso de error.
var labels;

var blockedList = new Array();

/************************************************************************************************************/
//Funciones encargada de comprobar un form
/************************************************************************************************************/
//scroll: true/false si hay un mensaje de fallo vuelve al principio de la página o no
//myForm: el formulario que llama a checkForm (this)
function checkForm(myForm, scroll){
	labels = myForm.getElementsByTagName('label');
	errorStr = _checkTags(myForm);
	if (errorStr.length != 0){ //Si ha habido algún fallo
		printErrors(myForm, errorStr);
		if (scroll == null || scroll == true) ScrollToElement(myForm); //vuelve al principio de la página
		return false;
	}
	return true;
}

function checkDatesAndForm(datesArray, myForm){
	//datesArray es un array de arrays donde la primera fecha ha de ser posterior a la segunda - se pasa el id de los campos
	if (checkForm(myForm)){
		var errorStr = '';
		var noError = true;
		for (i=0; i < datesArray.length; i++){
			date1 = document.getElementById(datesArray[i][0]);
			date2 = document.getElementById(datesArray[i][1]);
			if (date1 != null && date2 != null && date1.value != "" && date2.value != ""){
				if (!checkStartEndDate(date1.value, date2.value)){
					inputError(date1, true);
					inputError(date2, true);
					errorStr += errorConstructer(23, new Array(getElemName(date1), getElemName(date2)));
					noError= false;
				}else{
					inputError(date1, false);
					inputError(date2, false);
				}
			}	
		}
	}else{
		return false;
	}
	if (!noError){
		ScrollToElement(myForm);
		printErrors(myForm, errorStr);
	}
	return noError;
}

//Comprueba los elementos del form - función local
function _checkTags(myForm){
	var _errors = "";
	for (var j=0;j<myForm.elements.length;j++) {
		var _auxError = "";
		switch(myForm.elements[j].type){
		/******************************************************/
		//text
		/******************************************************/
			case 'text':
				if (myForm.elements[j].value != null && deleteSpace(myForm.elements[j]) != ''){
					switch(myForm.elements[j].getAttribute("tipo")){
						case 'date':
							checkDate(myForm.elements[j], false);
							_auxError += dateErrors;
						break;
						case 'url':
							if (!checkUrl(myForm.elements[j].value))
								_auxError += errorConstructer(25, new Array(getElemName(myForm.elements[j])));		
						break;
						case 'mail':
							if (!checkMail(myForm.elements[j].value))
								_auxError += errorConstructer(24,new Array(getElemName(myForm.elements[j])));	
						break;
						case 'int':	
						 	if (!checkInt(myForm.elements[j].value))
						 		_auxError += errorConstructer(26,new Array(getElemName(myForm.elements[j])));
						break;
						case 'dec':
						 	if (!checkDecimal(myForm.elements[j].value))
						 		_auxError += errorConstructer(26,new Array(getElemName(myForm.elements[j])));
						break;		 	
						case 'mark':
						 		if (!(checkDecimal(myForm.elements[j].value) && (myForm.elements[j].value <= 10)))
						 			_auxError += errorConstructer(28,new Array(getElemName(myForm.elements[j])));	
						break;
					}
				}else if (checkObligatory(myForm.elements[j]))
						_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));
			break;
			/******************************************************/
			//select-one
			/******************************************************/
			case 'select-one':
				if (checkObligatory(myForm.elements[j]) && myForm.elements[j].selectedIndex == 0)
					_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));
			break;
			/******************************************************/
			//select-multiple
			/******************************************************/
			case 'select-multiple':
				if (checkObligatory(myForm.elements[j]) && myForm.elements[j].selectedIndex == -1)
					_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));
			break;
			/******************************************************/
			//textarea
			/******************************************************/			
			case 'textarea':
				if (myForm.elements[j].value == null || deleteSpace(myForm.elements[j]) == ''){
					if (checkObligatory(myForm.elements[j]))
						_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));	
				}
			break;
			/******************************************************/
			//password
			/******************************************************/			
			case 'password':
				if (myForm.elements[j].value == null || myForm.elements[j].value == ''){
					if (checkObligatory(myForm.elements[j]))
						_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));
				}else{
					if (myForm.elements[j].value.length < 8)
						_auxError += errorConstructer(22, new Array(getElemName(myForm.elements[j])));
				}
			break;
			/******************************************************/
			//file
			/******************************************************/	
			case 'file':			
			//|| deleteSpace(myForm.elements[j]) == ''
				if (myForm.elements[j].value == null){
					if (checkObligatory(myForm.elements[j]))
						_auxError += errorConstructer(0, new Array(getElemName(myForm.elements[j])));
				}
			break;
		}
		if (_auxError.length > 0){ 
			inputError(myForm.elements[j], true);
			_errors += _auxError;	
		}else{
			inputError(myForm.elements[j], false);
		} 
	}					
	return _errors;
}
/************************************************************************************************************/
//Funciones auxiliares
/************************************************************************************************************/

//elimina los espacios del principio y del final de un String
function deleteSpace(anElement){
	if (anElement.value.length > 0){	
		string = anElement.value.replace(/^\s+/, '');
		for (var i = string.length; i > 0; i--) {
			if (/\S/.test(string.charAt(i-1))) {
				string = string.substring(0, i);
				break;
			}
		}
		anElement.value = string;
		return anElement.value;
	}
	return anElement.value;
}

//Comprueba la correcta sintaxis de una dirección de e-mail
function checkMail (myMail){
	if (myMail.match(RE_MAIL)) return true;
	return false;
}

//comprueba la correcta sintaxis de una dirección web
function checkUrl (myUrl){
	if (myUrl != ''){
		var url_parts;
		if (myUrl.indexOf("?") != -1){
			url_parts = myUrl.split('?');
			if (!url_parts[0].match(RE_URL)){
				return false;
			}
			if (!url_parts[1].match(RE_URL_VAR)){
				return false;
			}
		}else{
			if (!myUrl.match(RE_URL)){
				return false;
			}
		}
		return true;
	}
	return true;
}

//comprueba numeros enteros
function checkInt (myInt){
	if (myInt == "") return true;
	if (myInt.match(RE_INT)) return true;
	return false;	
}

//comprueba numeros de punto flotante
function checkDecimal (myDec){
	if (myDec == "") return true;
	if (myDec.match(RE_DECIM)) return true;
	return false;	
}

//compara dos String para ver si son idénticos
function compareStrings (firstpass, secondpass){
	if (firstpass == secondpass){
		return true;
	}
	return false;
}

//Obtiene el nombre del Label o, en su ausencia Name de un elemento para los mensajes de error 
function getElemName(currentTag){
	for (var k=0;k<labels.length;k++){
		if (labels[k].htmlFor == currentTag.id)
			return labels[k].innerHTML;	 
	} 
	var aux = new String();
	aux = currentTag.name;
	aux = aux.replace(/\_/g," ");
	aux = aux.replace(/\[/g," ");
	aux = aux.replace(/\]/g,"");
	return aux;
}

//Compara dos fechas entre si
function checkStartEndDate(startDate, endDate){
		
	var _date1 = startDate.split('/');
	var _date2 = endDate.split('/');
	var date1 = new Date(_date1[2],_date1[1]-1,_date1[0]);
	var date2 = new Date(_date2[2],_date2[1]-1,_date2[0]);
	
	if (date1 > date2)
		return false;
	else
		return true;
}

function checkStartEndDate2(startDate, endDate){
	var _date1 = startDate.split('/');
	var _date2 = endDate.split('/');
	var date1 = new Date(_date1[2],_date1[1]-1,_date1[0]);
	var date2 = new Date(_date2[2],_date2[1]-1,_date2[0]);
	
	if (date1 > date2)
		return false;
	else
		return true;
}

//Comprueba si un input es obligatorio (obligatory = 'true') o no
function checkObligatory(anObj){
	if ((anObj.getAttribute('obligatory') == true) || (anObj.getAttribute('obligatory') == 'true')){
		return true;
	}
	return false;
}

//Hace un scroll al elemento pasado 
function ScrollToElement(theElement){
  //var selectedPosX = 0;
  var selectedPosY = 0;
              
  while(theElement != null){
    //selectedPosX += theElement.offsetLeft;
    selectedPosY += theElement.offsetTop;
    theElement = theElement.offsetParent;
  }
                        		      
 window.scrollTo(0,selectedPosY);

}

/************************************************************************************************************/
//Funciones para manejar grupos
/************************************************************************************************************/

//cambia todo los campos cuyo atributo grupo tenga el mismo valor
function changeObligState(myForm, grupo, state){
//	alert("changeObligState("+myForm+", "+grupo+", "+state+")");
	var _notOblig = false;
	
	if(typeof state == 'function') state = state();
	for (var j=0;j<myForm.elements.length;j++) {
		if ((myForm.elements[j].getAttribute("grupo") == grupo)){
			if (!isBlocked(grupo)){
				switch (state){
					case true:
						if (myForm.elements[j].getAttribute("obligatory") != null)
							changeObligStateElem(myForm.elements[j], true)
					break;
					case false:
						if (myForm.elements[j].getAttribute("obligatory") != null)
							changeObligStateElem(myForm.elements[j], false)
					break;
					case undefined:
					case null:
						_notOblig = true;
						switch(myForm.elements[j].type){
							case "select-one":
								if (myForm.elements[j].selectedIndex != 0) return;
							break;
							case "select-multiple":
								if (myForm.elements[j].selectedIndex != -1) return;
							break;
							default:
							 	if (myForm.elements[j].value != null && myForm.elements[j].value != "") return;
							break;
						}
					break;
				}
			}else return;
		}
	}
	if (_notOblig){ 
		changeObligState(myForm, grupo, false);
	} 
}

//Pone el atributo 'obligatory' de un elemento a true/false 
function changeObligStateElem(elem, state){
	if(typeof state == 'function') state = state();	
	if(state){
		if (elem.getAttribute('obligatory') != null) elem.setAttribute('obligatory',true);
		if (document.getElementById("ast_" + elem.id) != null) (document.getElementById("ast_" + elem.id)).style.visibility = "visible";
	}else{
		if (elem.getAttribute('obligatory') != null) elem.setAttribute('obligatory',false);
		if (document.getElementById("ast_" + elem.id) != null) (document.getElementById("ast_" + elem.id)).style.visibility = "hidden";
		inputError(elem, false);
	}
}

//Si todos los campos están vacíos se cambian a no obligatorios sino seguirán siendo obligatorios
function loadGrupoStates(myForm){
	for (var j=0;j<myForm.elements.length;j++) {
		var _group = myForm.elements[j].getAttribute("grupo");
		if ((_group != null) && (_group != "")){
			addEvent(myForm.elements[j], "focus", function() {changeObligState(this.form, this.getAttribute("grupo"), true)});
			addEvent(myForm.elements[j], "blur", function() {changeObligState(this.form, this.getAttribute("grupo"))});
			if (isBlocked(_group)) changeObligStateElem(myForm.elements[j], true);
			else changeObligStateElem(myForm.elements[j], false);	
		}
	}
	return true;
}

//Añade una funcion (funct) a un evento específico (evType) de un elemento (elem)
function addEvent(elem, evType, func, pos){ 
	var event = "on" + evType;
	var OldEvent = elem[event]; 
	if( (typeof elem[event]) != 'function' ){ 
		elem[event] = func;
	}else{ 
		if (pos){//nueva funcion se ejecuta antes que las antiguas
			elem[event] = 
			function(){ 
				func(); 
				OldEvent(); 
			}
		}else{//al reves
			elem[event] = 
			function(){ 
				OldEvent();
				func();  
			}
		} 
	}
} 

//bloquea/desbloquea a un grupo
function blockGroup(group, value){
	alert("blockGroup("+group+", "+value+")");
	if (value){
		if (!isBlocked(group)) blockedList.push(group);
	}else{
		for (var j=0;j<blockedList.length;j++) {
			if (blockedList[j] == group){
				blockedList.splice(j, 1);
				return;
			}
		}
	}
		
}

//evalua si un grupo esta bloqueado o no
function isBlocked(group){
	for (var j=0;j<blockedList.length;j++) {
		if (blockedList[j] == group){
			return true;
		}
	}
	return false;
}

//Si el elemento seleccionado del select es el último se pone 'targetElem' a obligatory=true
function condSelect(mySelect, targetElem){
	changeObligStateElem(targetElem, (mySelect.selectedIndex == mySelect.length -1)?true:false);
}
function condSelectGroup(mySelect,myForm, grupo){
	blockGroup(grupo, false);
	var blocked = (mySelect.selectedIndex == mySelect.length -1)?true:false;
	changeObligState(myForm, grupo, blocked);
	blockGroup(grupo, blocked);
}

/************************************************************************************************************/
//Funciones para mostrar un Error
/************************************************************************************************************/

//Escribe el mensaje de error al principio del form
function printErrors(myForm, errorStr){
	if (document.getElementById("errorDiv" + myForm.id) != null){
			document.getElementById("errorDiv" + myForm.id).innerHTML = errorStr;
	}else{
		var errorText = document.createElement("div");
		errorText.id = "errorDiv" + myForm.id;
		errorText.name = "errorDiv" + myForm.id;
		errorText.setAttribute("class", "error");
		errorText.setAttribute("className", "error");
		errorText.innerHTML = errorStr;
		with (myForm) insertBefore(errorText, firstChild);
	}
}

//funcion encargada de construir los mensajes de error. 
//failnum = posición del mensaje de error en el vector errorVector
//valuesVec = vector de variables que sustituyen a $ por orden
function errorConstructer(failNum, valuesVec){
	if (failNum < errorVector.length){
		var _auxErrorStr = errorVector[failNum];
		if (valuesVec != null && valuesVec.length != 0){
			var _errorStr = "";   
			var _pos = 0;
			var _auxPos;
			for(i=0; i < valuesVec.length; i++){
				_auxPos = _auxErrorStr.indexOf('$', _pos);
				_errorStr += _auxErrorStr.substr(_pos, _auxPos - _pos) + valuesVec[i]; 
				_pos = _auxPos +1; 
			}
			return (_errorStr + _auxErrorStr.substr(_auxPos+1));
		}
		else{ 
			return _auxErrorStr;
		}
	}
	return "ERROR: no se encontró la descripción del error, ésto se debe a un fallo interno grave.";
}

//Función que cambia el fondo de color de un input si error = true, si error = false quita el fondo del input
function inputError(elem, error){
	if (error){
		elem.setAttribute('class', 'errorBorder');
		elem.setAttribute('className', 'errorBorder');
		return;
	}
	elem.setAttribute('class', '');
	elem.setAttribute('className', '');
}

function changeClass (elem, myClass){
	elem.setAttribute('class', myClass);
	elem.setAttribute('className', myClass);
}

function resetErrors(myForm){
	if (document.getElementById("errorDiv" + myForm.id) != null){
		elem = document.getElementById("errorDiv" + myForm.id);
		elem.parentNode.removeChild(elem);
		for (var j=0;j<myForm.elements.length;j++){
			inputError(myForm.elements[j], false);
		}
	}
}

function selectSelectedElem(mySelect, elem){
	for (i=0; i < mySelect.options.length; i++){
		if (mySelect.options[i].innerHTML == elem)
			mySelect.options[i].selected = 'selected';
	}
}

/************************************************************************************************************/
//Mensajes de error
/************************************************************************************************************/

errorVector= new Array();

errorVector[0] = "<b>ERROR:</b> El campo <b> $ </b> está vacío.<BR>";
errorVector[1] = "<b>ERROR:</b> Los campos de <b>'Añadir una experiencia laboral anterior'</b> han de estar todos o llenos o vacíos.<BR>";

//Strings para los errores de fecha/calendario
errorVector[2] = "Calendario no encontrado.";
errorVector[3] = "Calendario: el parámetro especificado no es un control válido.";

//mensajes para errores de fecha/calendario para ser lanzados con 'alert'
errorVector[4] = " Formato de fecha no válido: '$'.\nNo se pudo encontrar el día del mes.";
errorVector[5] = "Valor 'día' del mes no válido: '$'.\nLos valores permitidos son números enteros.";
errorVector[6] = "Formato de fecha no válido: '$'.\nNo se pudo encontrar el 'Mes'.";
errorVector[7] = "Formato de fecha no válido: '$'.\nLos valores permitidos son números enteros.";
errorVector[8] = "Formato de fecha no válido: '$'.\nNo se pudo encontrar el 'Año'.";
errorVector[9] = "Valor de año no válido: '$'.\nLos valores permitidos son números enteros.";
errorVector[10] = "Formato de fecha no válido: '$'.\nEl formato aceptado es dd/mm/yyyy.";
errorVector[11] = "Valor del mes no válido: '$'.\nEl rango permitido es de 01 a 12.";
errorVector[12] = "Valor 'Día' del mes no válido: '$'.\nEl rango permitido es de 01 a $.";

//mensajes para errores de fecha/calendario para ser impresos en la página web (errorDiv)
errorVector[13] = "<b>ERROR:</b> En el campo <b>$</b>. Formato de fecha no válido: '$'. No se pudo encontrar el día del mes.";
errorVector[14] = "<b>ERROR:</b> En el campo <b>$</b>. Valor 'día' del mes no válido: '$'. Los valores permitidos son números enteros.";
errorVector[15] = "<b>ERROR:</b> En el campo <b>$</b>. Formato de fecha no válido: '$'. No se pudo encontrar el 'Mes'.";
errorVector[16] = "<b>ERROR:</b> En el campo <b>$</b>. Formato de fecha no válido: '$'. Los valores permitidos son números enteros.";
errorVector[17] = "<b>ERROR:</b> En el campo <b>$</b>. Formato de fecha no válido: '$'. No se pudo encontrar el 'Año'.";
errorVector[18] = "<b>ERROR:</b> En el campo <b>$</b>. Valor de año no válido: '$'. Los valores permitidos son números enteros.";
errorVector[19] = "<b>ERROR:</b> En el campo <b>$</b>. Formato de fecha no válido: '$'. El formato aceptado es dd/mm/yyyy.";
errorVector[20] = "<b>ERROR:</b> En el campo <b>$</b>. Valor del mes no válido: '$'. El rango permitido es de 01 a 12.";
errorVector[21] = "<b>ERROR:</b> En el campo <b>$</b>. Valor 'Día' del mes no válido: '$'. El rango permitido es de 01 a $.";

//Otros errores
errorVector[22] = "<b>ERROR:</b> La contraseña en el campo <b>$</b> debe tener un mínimo de 8 caracteres.<br>"
errorVector[23] = "<b>ERROR:</b> La fecha en <b>$</b> ha de ser anterior a la fecha <b>$</b>.<br>";
errorVector[24] = "<b>ERROR:</b> En el campo <b>$</b>, el e-mail es erróneo.<br>";
errorVector[25] = "<b>ERROR:</b> En el campo <b>$</b>, Url no válida.<br>";
errorVector[26] = "<b>ERROR:</b> En el campo <b>$</b>, número no válido.<br>";
errorVector[27] = "<b>ERROR:</b> La nueva contraseña no coincide con la de verificación.<br>";
errorVector[28] = "<b>ERROR:</b> En el campo <b>$</b>, Calificacón no válida. El rango permitido es de 0.00 a 10.00<br>";




