/*
 *
 *
 * EJEMPLO:
 *
	<script src = "http://toolbox.copywrite.net/js/forms/formvalidator.js" ></script>
	<script type="text/javascript">

	var form = new FormValidator ('fmContact');
	// Campos a verificar
	form.validatingFields = new Array (
		{ field: 'name', type: 'noempty'},
		{ field: 'email', type: 'noempty,email'},
		{ field: 'comments', type: 'noempty'}
	);


	// Establecer parámetros de servidor para el formulario
	form.serverParams = new Array (
		{ param: 'mail_subject', value: 'Gibraltar Chamber of Commerce - Contact Us Form'},
		{ param: 'mail_to', value:  'info@gibraltarchamberofcommerce.com'},
		{ param: 'mail_from', value: 'form:email'} // form:nombrecampo es un alias al campo nombrecampo del formulario (notacion inventada por nosotros)
	);
 *
 *
 *
 * DEBEMOS DEFINIR EN EL CSS:
 
.formErrorDiv {
	background-color:#c00;
	padding: 5px;
}

.formErrorDiv span {
	color: #fff;
	font-weight:bold;
}

 * 
 */
var error_strings = new Array ();
error_strings["ENOEMPTY"]	= "Please, fill up this mandatory field";
error_strings["EEMAIL"]		= "it seems that the email address introduced it is not a valid one";
error_strings["ENOCHECKED"]		= "You must check in this field";


// Funcion tomada de prototype.js
Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}



/* 
 *		CLASE FormValidator
 * 
 *
 */

var FormValidator = function () {
	this.initialize.apply(this, arguments);
}
	
FormValidator.prototype = {

	// // //
	// CONSTRUCTOR
	// 
	// // //
   initialize: function(formName) {
		this.formName = formName;
		this.errorClass = "formErrorDiv";
		this.focusField = ''; // campo en el que se pone el foco (si no es vacio)

		if (window.addEventListener){
			window.addEventListener ("load", this.onLoadHandler.bindAsEventListener(this), false);
		}
		else if (window.attachEvent){
			window.attachEvent("onload", this.onLoadHandler.bindAsEventListener(this));
		}
		
		this.validatingFields = new Array ();
		this.serverParams = new Array ();
   },
   

   onLoadHandler: function(evt){
		// capturo el evento onsubmit del formulario para hacer las comprobaciones
		this.formObj = document.getElementById( this.formName );
		this.formObj.onsubmit = this.onSubmitHandler.bindAsEventListener(this);
		if (this.focusField != '')
			this.formObj[this.focusField].focus();
   },
   
   
   // // //
   // SUBMIT del formulario
   // 
   // // //
   onSubmitHandler: function(evt) {
	  if (this.validateFields()) {
		this.setServerParams();
	  	return true;
	  }
   	  else
	  	return false;
   },
   
   
   // // //
   // Realizar la validación de los campos del formulario
   //
   // // //
   validateFields: function() 
   {
		var wrongFields = new Array();
		var message = '';
		
		// Compruebo los campos 
		for (var i = 0, j = 0; i < this.validatingFields.length; i++) {
			var f = this.validatingFields[i];
			f.obj = document.getElementById(f.field);
		
			if (f.type.indexOf ('noempty') != -1 && f.obj.value == ''){
				wrongFields[j++] = { message: error_strings["ENOEMPTY"], field: f.field };
			}
			else if (f.type.indexOf ('checked') != -1 && !f.obj.checked){
				wrongFields[j++] = { message: error_strings["ENOCHECKED"], field: f.field };
			}
			else if (f.type.indexOf ('email') != -1 && !checkEmail(f.obj.value) ){
				wrongFields[j++] = { message: error_strings["EEMAIL"], field: f.field };
			}			
			
			//Ocultar los mensajes que pudieran existir ya
			var divAnt = document.getElementById('div_' + f.field); 
			if (divAnt) {
				//alert ('antes de cloneNode: ' + f.obj.value + ' ' + f.obj.tagName + ', buscado: div_' + f.field ); 
				var copiaf = f.obj.cloneNode (true);
				try {
					divAnt.parentNode.insertBefore (copiaf, divAnt);
					divAnt.parentNode.removeChild(divAnt);
					//this.formObj.insertBefore (copiaf, divAnt);
					//this.formObj.removeChild (divAnt);	
				} catch (e) {
					if (console)
						console (e.name + " - " + e.message + ' (' + divAnt.nodeName + ')');
					//alert(e.name + " - " + e.message + ' (' + divAnt.nodeName + ')');
				}
				
				
				if (f.obj.value && (f.obj.tagName == 'TEXTAREA' || f.obj.tagName == 'textarea')) // por si es un textarea, copio el contenido
					copiaf.innerHTML = f.obj.value;
			}
		}
		
		this.highLightFields (wrongFields);
	
		if (wrongFields.length > 0) {
			//alert (message);
			return false;
		}
		else
			return true;

	},
	
	
	// // //
	// PARAMETROS PARA EL SERVIDOR
	//
	// // //
	setServerParams: function () {
		// Creo los input hidden que contienen los parámetros a pasar al servidor
		for (var i = 0; i < this.serverParams.length; i++) {
			ih = document.createElement("input");
			ih.setAttribute ('type', 'hidden');
			ih.setAttribute ('name', 'cfg[' + this.serverParams[i].param + ']');
			ih.setAttribute ('value', this.serverParams[i].value);
			//ih.setAttribute ('id', this.serverParams[i].param);
			this.formObj.appendChild(ih);
		}
	},
	
	
	// // //
	// Se encarga de DESTACAR los campos que han fallado
	//
	// // //
	highLightFields: function (wf)
	{
		// Aviso al usuario de errores
		for (var i = 0; i < wf.length; i++) 
		{
			var f = document.getElementById(wf[i].field);
			var divAnt = document.getElementById('div_' + wf[i].field); // compruebo si ya existe la notificación
			if (!divAnt) {
				var div = document.createElement ("div");
				var copiaf = f.cloneNode (true);
				var span = document.createElement ("span");
				span.innerHTML = "<br />" + wf[i].message;
				// span.style["background"] = "#ffc";
				
				div.setAttribute ('id', 'div_' + wf[i].field);
				if (f.currentStyle){
					var ancho = f.currentStyle['width'];
				}
				else if (document.defaultView){
					var ancho = parseInt(document.defaultView.getComputedStyle(f, '').getPropertyValue("width"));
					// En el Mozilla se come la linea, debemos darle un poco más de ancho
					ancho = (ancho +10);
					ancho = ancho + 'px';
				}
				else {
					var ancho = f.style["width"];
				}
				
				div.style["width"] = ancho;
				// div.style['padding'] = "5px";
				// div.style["background"] = "#f00";
				div.className = this.errorClass;
				
				div.appendChild (copiaf);
				div.appendChild (span);
				f.parentNode.insertBefore (div, f);
				f.parentNode.removeChild (f);
				f = copiaf;
			}
			
			if (i == 0)
				f.focus();
		}// fin for
	}
	
	
};






/*
 *
 * Valida el formato de una cadena que representa una dirección de email
 *
 */
function checkEmail (emailStr) 
{
		/* Verificar si el email tiene el formato usuario@dominio. */
		var emailPat=/^(.+)@(.+)$/ 

		/* Verificar la existencia de caracteres. ( ) < > @ , ; : \ " . [ ] */
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]" 
		
		/* Verifica los caracteres que son válidos en una dirección de email */
		var validChars="\[^\\s" + specialChars + "\]" 

		var quotedUser="(\"[^\"]*\")" 

		/* Verifica si la dirección de email está representada con una dirección IP Válida */ 
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/

		/* Verificar caracteres inválidos */ 
		var atom=validChars + '+'
		var word="(" + atom + "|" + quotedUser + ")"
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
		/* domain, as opposed to ipDomainPat, shown above. */
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
	
		var matchArray=emailStr.match(emailPat)
		if (matchArray==null) 
		{
			// alert("La dirección de correo electrónico introducida parece ser incorrecta")
			return false
		}
		var user=matchArray[1]
		var domain=matchArray[2]

		// Si el usuario "uuarior" es valido 
		if (user.match(userPat)==null) 
		{
			// Si no
			// alert("El nombre de usuario de la dirección de correo electrónico no es válido.")
			return false
		}

		/* Si la dirección IP es válida */
		var IPArray=domain.match(ipDomainPat)
		if (IPArray!=null) 
		{
			for (var i=1;i<=4;i++) {
				if (IPArray[i]>255) 
				{
					// alert("IP de destino del email inválida")
					return false
				}
			}
			return true
		}

		var domainArray=domain.match(domainPat)
		if (domainArray==null) 
		{
			// alert("El dominio parece no ser válido.")
			return false
		}

		var atomPat=new RegExp(atom,"g")
		var domArr=domain.match(atomPat)
		var len=domArr.length
		if (domArr[domArr.length-1].length<2 || 
			domArr[domArr.length-1].length>3) 
		{ 
			// alert("La dirección de email debe tener 3 letras si es .com o 2 si es de algún pais.")
			return false
		}

		if (len<2) 
		{
			// var errStr="La dirección de correo electrónico es errónea"
			// alert(errStr)
			return false
		}

		// La dirección de email ingresada es Válida
		return true;
}
