//Filters used during the validation process

var FILTERS = new Object();

    FILTERS['alfanum'] = new RegExp(/^[^\[\]{}��#$%\*\+:;<=>�\?@~���خ���!�������ߵ��������]+$/);

    FILTERS['login'] = new RegExp(/^[\w]+$/);

    FILTERS['password'] = new RegExp(/^\w*(?=\w*\d)(?=\w*[a-zA-Z])\w*$/);

    FILTERS['alfa'] = new RegExp(/^[^\[\]{}��#$%\*\+:;<=>�\?@~���خ���!�������ߵ��������0-9]+$/);

    FILTERS['num'] = new RegExp(/^[0-9]+$/);

    FILTERS['cp'] = new RegExp(/[0-9]{5}/);

    FILTERS['phone'] = new RegExp(/[89]{1}[0-9]{8}/);

    FILTERS['mobilephone'] = new RegExp(/[6][0-9]{8}/);

    FILTERS['email'] = new RegExp(/^([\w\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/);

    FILTERS['nif'] = new RegExp(/[0-9]{8}[-]?[a-zA-Z]{1}/);

	FILTERS['cif'] = new RegExp(/[a-zA-Z]{1}[-][0-9]{8}/);

	FILTERS['void'] = null;

//	FILTERS['birthdate'] = FILTERS['alfanum'];

  FILTERS['birthdate'] = new RegExp('(0[1-9]|[12][0-9]|3[01])([/])(0[1-9]|1[012])\\2(19|20)\\d\\d');

var DUMMYERROR;
var FORMTAGS = ['input', 'select', 'textarea'];
var SUBMITTEDFORM;






































































































function checkForm(formData, jqForm, options){

	var pageForms;

	var formHolder = document.getElementById('logFormHolder');

	if(formHolder){
		pageForms = formHolder.getElementsByTagName('form');
	}
	else{
		pageForms = new Array();
	}

	var bgForms;

	formHolder = document.getElementById('articleBackground');
	if(formHolder){
		bgForms = formHolder.getElementsByTagName('form');
	}
	else{
		bgForms = new Array();
	}

	for(var i = 0; i < bgForms.length; i++){
		pageForms[pageForms.length] = bgForms[i];
	}

	hideError(pageForms);

	var form = jqForm[0];

	SUBMITTEDFORM = form;

	var formId = form.id;

	var formName = formId.substring(0, formId.indexOf('form'));
	formName = formName.substring(0, 1).toUpperCase() + formName.substring(1)+'Form';


	var checkFunction = 'check'+formName;

	while(!window[checkFunction]){

	}

	try{
		//Every form has a specific check function, its name constructed like that: 'check'+formNameCapitalized+'Form' (checkLoginForm, for instance).
		//This function will delegate the validation process in a generic 'checkFormElements' function (stored on pa.forms.js).
		//The return of the process is an array holding every element that failed the test, so the form is validated if the return length is 0.

		var errors = eval(checkFunction+'(form)');

		if(errors.length > 0){
			setError(form, errors);
			return false;
		}
		else {
			setLoading(form);
			return true;
		}
	}
	catch(e) {
		//TODO: This must fail silently
		var s = '';
		for (var i in e) s += i+' = '+e[i]+'\n'
		alert('Error: \n No se ha definido el m�todo '+checkFunction+'\n\n'+s);
		//return true;
		return false;
	}
	return false;
}

function catchFormResponse(xml){
	try {
		//Check if there is a redirect
		var redirect = checkRedirect(xml);

		/*if(redirect){
			LINK = redirect;
			_sendLink();
			return false;
		}*/

		var id = SUBMITTEDFORM.id;

		//See if we have any error
		var p = xml.getElementsByTagName('p');
		var error;

		for (var i = 0; i < p.length; i++) {
			if (p[i].getAttribute('class') == 'error') {
				error = p[i];
				break;
			}
		};

		if(error){
			if(!DUMMYERROR){
				DUMMYERROR = document.createElement('div');
				DUMMYERROR.style.display = 'none';
			}

			if(error.xml){
				DUMMYERROR.innerHTML = error.xml;
			}
			else{
				DUMMYERROR.appendChild(error);
			}

			p = DUMMYERROR.getElementsByTagName('p');

			//On Brochure request, disallow subsequent calls

			var disallowInput = false;

			if(id == 'requestBrochureform'){
				var pdflink = p[0].getElementsByTagName('a');
				if(pdflink.length > 0){
					disallowInput = true;
				}
			}

			var errorText = p[0].innerHTML;

			//var errorText = error.firstChild.xml || error.firstChild.nodeValue;

			var currentform = document.getElementById(id);
			hideFormLoading(currentform);

			setError(currentform, null, errorText);

			if(!disallowInput){
				enableInputs();
			}

			if(currentform){
				currentform.style.display = 'block';
			}
		}
		else{
			_writeContent(xml);
			//Run again the initialization of forms
			if(id == "registerform"){
				try {
					$('#registroComunidadOk').attr("src","/stats/registrook/comunidad.html");	
				}
				catch (e) { }
			}

			$('p.errorOK').show();
			initForms();

			//alert( $('span#msgOK').text() )
		}


	}
	catch(e){
		handleError(e)
	}
}



function checkEnviarAmigoForm(form){
	var elms = [
		{
			elm:	_getFormElementById(form, 'tunombre'),
			type:	'alfanum'
		},

		{
			elm:	_getFormElementById(form, 'tumail'),
			type:	'email'
		},
		{
			elm:	_getFormElementById(form, 'sunombre'),
			type:	'alfanum'
		},

		{
			elm:	_getFormElementById(form, 'sumail'),
			type:	'email'
		}
	];

	return checkFormElements(elms);
}







function checkLoginForm(form){
	var elms = [
		{
			elm:	_getFormElementById(form, 'username') || _getFormElementById(form, 'numero_socio'),
			type:	'alfanum'
		},

		{
			elm:	_getFormElementById(form, 'password'),
			type:	'alfanum'
		}
	];

	return checkFormElements(elms);
}

function checkRememberPasswordForm(form){

	var elms = [
		{
			elm:	_getFormElementById(form, 'email'),
			type:	'email'
		}
	];

	return checkFormElements(elms);
}

function checkRememberPasswordClubForm(form){

	var elms = [
		{
			elm:	_getFormElementById(form, 'numero_socio'),
			type:	'num'
		}
	];

	return checkFormElements(elms);
}


function checkChangePasswordForm(form){
	var elms = [
		{
			elm:	_getFormElementById(form, 'password'),
			type:	'alfanum'
		},
		{
			elm:	_getFormElementById(form, 'newpassword'),
			type:	'alfanum'
		},
		{
			elm:	_getFormElementById(form, 'repassword'),
			type:	'alfanum',
			matching:		_getFormElementById(form, 'newpassword'),
			postcondition:	'matchPasswords'
		}
	];

	return checkFormElements(elms);
}

function checkRegisterForm(form){
	var elms = getPersonalDataFormElements(form);

	//Add special cases

	elms[elms.length] = {
		elm:	_getFormElementById(form, 'username') || _getFormElementById(form, 'numero_socio'),
		type:	'login'
	};

	elms[elms.length] = {
		elm:	_getFormElementById(form, 'password'),
		type:	'alfanum'
	}

	elms[elms.length] = {
		elm:	_getFormElementById(form, 'repassword'),
		type:	'alfanum',
		matching:		_getFormElementById(form, 'password'),
		postcondition:	'matchPasswords'
	}
	if (form.numero_socio == null)
	{
		elms[elms.length] = {
			elm:	_getFormElementById(form, 'telefono'),
			type:	'num'
		}
	}
	


	return checkFormElements(elms);
}

function checkChangeInfoForm(form){
	var elms = getPersonalDataFormElements(form);

	return checkFormElements(elms);
}

function checkContactForm(form){
	var elms = getPersonalDataFormElements(form);

	//Add special cases



	return checkFormElements(elms);
}

function checkRequestBrochureForm(form){

	if ( _getFormElementById(form, 'pdf') )
	{
		var elms = [
			{
				elm:	_getFormElementById(form, 'tratamiento')

			},
			{
				elm:	_getFormElementById(form, 'pdf')

			},
			{
				elm:	_getFormElementById(form, 'nombre'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'apellido'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'email'),
				type:	'email'
			},
			{
				elm:	_getFormElementById(form, 'idPais'),
				type:	'alfa',
				other:	_getFormElementById(form, 'otro_pais'),
				postcondition:	'checkCountrySelected'
			},
			{
				elm:	_getFormElementById(form, 'idProvincia'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'cp'),
				type:	'num'
			},
			{
				elm:	_getFormElementById(form, 'conocido'),
				type:	'alfa'
			}
		];

	}
	else if ( _getFormElementById(form, 'post') )
	{
		var elms = [
			{
				elm:	_getFormElementById(form, 'tratamiento')

			},
			{
				elm:	_getFormElementById(form, 'post')

			},
			{
				elm:	_getFormElementById(form, 'nombre'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'apellido'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'email'),
				type:	'email'
			},
			{
				elm:	_getFormElementById(form, 'idPais'),
				type:	'alfa',
				other:	_getFormElementById(form, 'otro_pais'),
				postcondition:	'checkCountrySelected'
			},
			{
				elm:	_getFormElementById(form, 'idProvincia'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'cp'),
				type:	'num'
			},
			{
				elm:	_getFormElementById(form, 'conocido'),
				type:	'alfa'
			}
		];

	}
	else
	{
		var elms = [
			{
				elm:	_getFormElementById(form, 'tratamiento')

			},
			{
				elm:	_getFormElementById(form, 'nombre'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'apellido'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'email'),
				type:	'email'
			},
			{
				elm:	_getFormElementById(form, 'idPais'),
				type:	'alfa',
				other:	_getFormElementById(form, 'otro_pais'),
				postcondition:	'checkCountrySelected'
			},
			{
				elm:	_getFormElementById(form, 'idProvincia'),
				type:	'alfa'
			},
			{
				elm:	_getFormElementById(form, 'cp'),
				type:	'num'
			},
			{
				elm:	_getFormElementById(form, 'conocido'),
				type:	'alfa'
			}
		];

	}

	var post = document.getElementById('post');
	if(post){

		elms[elms.length] = {
			elm:		post
		}

		if(post.checked){
			elms[elms.length] = {
				elm:	_getFormElementById(form, 'direccion1'),
				type:	'alfanum'

			};

			elms[elms.length] = {
				elm:	_getFormElementById(form, 'poblacion'),
				type:	'alfa'

			};
		}
	}

	var pdf = document.getElementById('pdf');
	if(pdf){
		elms[elms.length] = {
			elm:		pdf
		}
	}

	return checkFormElements(elms);
}

function checkOpinaForm(form){
	var elms = [
		{
			elm:	_getFormElementById(form, 'comentario'),
			type:	'alfanum'
		}
	];

	return checkFormElements(elms);
}

function getPersonalDataFormElements(form){
//	var labels = $(form).children('fieldset').children('label');
	var labels = form.getElementsByTagName('label');

	var required = new Array();
	var requiredElements = new Array();
	var elms = new Array();
	var content, forElm;

	//Store all labels with an * inside them because * denotes a required field
	for (var i = 0; i < labels.length; i++){
		content = $(labels[i]).html();
		if(content.lastIndexOf('*') > -1){
			required[required.length] = labels[i];
		}
	}

	//Get the elements for every required label
	for (var i = 0; i < required.length; i++){
		forElm = $(required[i]).attr('for');
		requiredElements[requiredElements.length] = _getFormElementById(form, forElm);
	}

	//Finally store them
	var id;
	var o;
	for (var i = 0; i < requiredElements.length; i++){
		id = requiredElements[i].id;
		if(id != 'email' && id != 'username' && id != 'password' && id != 'idPais' && id != 'fecha_nacimiento'){
			o = new Object();
			o.elm = requiredElements[i];
			o.type = 'alfanum';
			elms[elms.length] = o;
		}
	}

	//Add special cases
	elms[elms.length] = {
		elm:	_getFormElementById(form, 'email'),
		type:	'email'
	};

	var fecha_nacimiento = _getFormElementById(form, 'fecha_nacimiento');

	if(fecha_nacimiento){
		elms[elms.length] = {
			elm:	fecha_nacimiento,
			type:	'birthdate',
			failMethod:	'resetBirthdate'
		};
	}

	var idPais = _getFormElementById(form, 'idPais');

	if(idPais){
		elms[elms.length] = {
			elm:	idPais,
			type:	'alfa',
			other:	_getFormElementById(form, 'otro_pais'),
			postcondition:	'checkCountrySelected'
		};
	}


	return elms;

}



/*
This function receives an array of objects.
Each of them holds the following info:
elm:	the form element to validate
type:	the type of information the element holds (mail, phone, ...)

It will return an an array holding every element that failed the test
*/
function checkFormElements(elms){
	var errorFields = new Array();
	for(var i = 0; i < elms.length; i++){

		if (i < elms.length)
		{
			if(!_checkFormElement(elms[i])){
				errorFields[errorFields.length] = elms[i].elm;
				//If it has an associated field, mark it too
				if(elms[i].other){
					errorFields[errorFields.length] = elms[i].other;
				}
				//If the element has a fail method, execute it
				if(elms[i].failMethod){
					eval(elms[i].failMethod+'(elms[i])');
				}
			}
		}
	};

	return errorFields;
}

function _checkFormElement(info, disallowTrim){
    var tag = info.elm.tagName.toLowerCase();
    if (info.precondition){

        var pre = eval(info.precondition+'(info)');

        if (pre) return true;
    };

	var valid;

    switch(tag){
        case 'input':
            valid = checkInputElement(info, disallowTrim);
            break;

        case 'select':
            valid = checkSelectElement(info);
            break;

        case 'textarea':
            valid = checkTextAreaElement(info);
            break;
    };

	if(!valid){
    	return false;
	}

    if (info.postcondition){

        var post = eval(info.postcondition+'(info)');

        return post;
    };

	return true;

}

function checkInputElement(info, disallowTrim){

	var type = info.elm.type;

    switch(type){
        case 'text':
        case 'password':
        case 'hidden':
            return checkInputTextElement(info, disallowTrim);
            break;

        case 'radio':
            return checkInputRadioElement(info);
            break;

        case 'checkbox':
            return checkInputCheckboxElement(info);
            break;
    };

    return false;
}

function checkInputTextElement(info, disallowTrim){
	if (!disallowTrim){
	    var value = trim(info.elm.value);
    	info.elm.value = value;
	}


    if (isEmpty(info)) return false;

	if(info.type == 'void'){
		return true;
	}

    var filter = FILTERS[info.type];

    if (!filter) filter = FILTERS['alfanum'];

    return filter.test(value);
}

function checkInputRadioElement(info){
    var collect = document.getElementsByName(info.elm.name);

    for (var i = 0; i < collect.length; i++){
        if (collect[i].checked) return true;
    };

    return false;
}

function checkInputCheckboxElement(info){
	var collect = document.getElementsByName(info.elm.name);

    for (var i = 0; i < collect.length; i++){
        if (collect[i].checked) return true;
    };

    return false;
}

function checkSelectElement(info){
    var value = info.elm.options[info.elm.selectedIndex].value;

    return (value != 'null' && value != '' && value != ' ');
}

function checkTextAreaElement(info){
	return info.elm.value.length > 0;
}

function isEmpty(info){
    var value = info.elm.value;
    return (value.length == 0);
}

function checkCountrySelected(info){

	//Create a dummy object without condition property (it will loop otherwise)
	var o = {
		elm:	info.elm
	}

	var valid = _checkFormElement(o);

	if(!valid){
		return false;
	}

	//Just check for last element if there are more than, say, 5 countries

	var total = info.elm.options.length;

	if(total < 5){
		return true;
	}

	//Check if the selected option is the last one
	var current = info.elm.selectedIndex;
	if(current < total - 1){
		return true;
	}

	//Create a dummy object with info about the backup input
	o = {
		elm:	info.other,
		type:	info.type
	}

	return _checkFormElement(o);
}

function resetBirthdate(info){
	info.elm.value = PA_DATE_FORMAT;
}

function matchPasswords(info){
	var value = trim(info.elm.value);
	var matchvalue = trim(info.matching.value);

	return (value == matchvalue);
}

function trim(str) {
   var temp = str;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;

   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }

   var obj = / +/g;
   temp = temp.replace(obj, " ");

   if (temp == " ") { temp = ""; }

   return temp;
}

function _getFormElementById(form, id){

	var elms;

	for (var i = 0; i < FORMTAGS.length; i++){
		elms = form.getElementsByTagName(FORMTAGS[i]);

		for (var j = 0; j < elms.length; j++){
			if(elms[j].id == id){
				return elms[j];
			}
		}
	};

	return null;
}

function _getFormElementByAttribute(form, tag, _attribute, value){
	var elms = form.getElementsByTagName(tag);
	var att;

	for (var i = 0; i < elms.length; i++){

	    if (elms[i].getAttributeNode) {
			att = elms[i].getAttributeNode(_attribute).value;
		}
	    else if(elms[i].getAttribute){
			att = elms[i].getAttribute(_attribute);
		}
		else{
			att = elms[i].attributes[_attribute];
		}

		if(att == value){
			return elms[i];
		}
	}

	return null;
}

function setError(form, elms, errorText){
	var label;
	if(elms){
		for(var i = 0; i < elms.length; i++){
			if(elms[i].type && elms[i].type == 'radio' || elms[i].type == 'checkbox'){
				label = _getFormElementByAttribute(form, 'label', 'for', elms[i].id);
				$(label).addClass('error');
			}
			else{
				$(elms[i]).addClass('error');
			}
		}
	}

	var error;
	var p = form.getElementsByTagName('p');

	for (var i = 0; i < p.length; i++){
		if(p[i].className.lastIndexOf('error') > -1){
			error = p[i];
			break;
		}
	}

	if (form.id=="registerform" && form.numero_socio == null)
	{
		if ($(form).find('input.error,select.error,textarea.error,label.error').length > 0)
		{
			var defaultError = _getFormElementById(form, 'defaulterrortextclient');
		}
		else {
			var defaultError = _getFormElementById(form, 'defaulterrortextserver');
		}
	}
	else {
		var defaultError = _getFormElementById(form, 'defaulterrortext');
	}




	if(!error){
		error = document.createElement('p');
		error.className = 'error';

		var node = defaultError.parentNode;
/*
		while(!node.tagName || node.tagName.toLowerCase() != 'fieldset'){
			node = node.parentNode;
		}
*/
//		insertAfter(node, error, defaultError);
		//form.insertBefore(error, defaultError.parentNode)
		$(form)
			.append('<br />')
			.append(error);

	}

	error.innerHTML = errorText || defaultError.value;
	error.style.display = 'block';
}

function hideError(forms){
	for(var i = 0; i < forms.length; i++){
		clearFormErrors(forms[i]);
	}
}

function setLoading(form){
	var loading;
	var p = form.getElementsByTagName('p');

	for (var i = 0; i < p.length; i++){
		if(p[i].className.lastIndexOf('loading') > -1){
			loading = p[i];
			break;
		}
	}

	var loadingtext = _getFormElementById(form, 'loadingtext');

	if(!loading){
		loading = document.createElement('p');
		loading.className = 'loading';

		var node = loadingtext.parentNode;
/*
		while(!node.tagName || node.tagName.toLowerCase() != 'fieldset'){
			node = node.parentNode;
		}
*/
//		insertAfter(node, loading, loadingtext);
		//form.insertBefore(loading, loadingtext.parentNode)
		$(form)
			.append('<br />')
			.append(loading);
	}

	loading.innerHTML = loadingtext.value;
	loading.style.display = 'block';

	//Disable all inputs
	disableInputs();

}

function hideFormLoading(form){
	var loading;
	var p = form.getElementsByTagName('p');

	for (var i = 0; i < p.length; i++){
		if(p[i].className.lastIndexOf('loading') > -1){
			loading = p[i];
			break;
		}
	}

	if(loading){
		loading.style.display = 'none';
	}
}

function disableInputs(){
	var elms = document.getElementsByTagName('input');
	var length = elms.length;
	for (var i = 0; i < length; i++){
		elms[i].disabled = true;
	}
}

function enableInputs(){
	var elms = document.getElementsByTagName('input');
	var length = elms.length;
	for (var i = 0; i < length; i++){
		elms[i].disabled = false;
	}
}

function clearFormErrors(form){
	var elms;
	var label;

	for (var i = 0; i < FORMTAGS.length; i++){
		elms = form.getElementsByTagName(FORMTAGS[i]);

		for (var j = 0; j < elms.length; j++){
			if(elms[j].type && elms[j].type == 'radio' || elms[j].type == 'checkbox'){
				label = _getFormElementByAttribute(form, 'label', 'for', elms[j].id);
				$(label).removeClass('error');
			}
			else{
				$(elms[j]).removeClass('error');
			}
		}
	};

	var p = form.getElementsByTagName('p');

	for (var i = 0; i < p.length; i++){
		if(p[i].className.lastIndexOf('error') > -1){
			p[i].style.display = 'none';
		}
	}

}