/***************************************************************************************************
*
* Class Name: FromValidator
*
* What does it do?:
*		This class was created to find all mandatory fields in an specific form, and show an alert when not filled in.
*		If all fields are correctly filled, then the class sends the form information to the spcified URL and shows an alert
*		with the result printed by that file.
*
* Parameters:
*		- mandatory_attr [OPTIONAL]: value defined in the 'class' attribute in order to find mandatory fields.
*		- alert_img [OPTIONAL]: image to display when a field is missing.
*		- abs_offset [OPTIONAL]: offset to apply to the image (distance to object)
*		- send_url (MANDATORY): URL to send the form and process it.
*
* Created by: Hermes <oxalus@gmail.com>
* Creation date: 06/10/2010
*
* TODO: For every field, it should be parametrized the data type that should contain and validate it
*	(integer, text, date, email, etc.)
*
***************************************************************************************************/
(function($)
{					
	$.fn.FormValidator = function(options)
	{
		$.fn.FormValidator.defaults = 
		{
			mandatory_attr: "mandatory", 					/* Clase que indica si un campo es obligatorio */
			alert_img: "_include/i/alert2.png",		/* Imagen a mostrar cuando hay un campo que falta */
			abs_offset: 5,												/* Distancia entre el campo y la alerta (puede ser negativo) */
			send_url: ""													/* URL donde se enviará la información del formulario para procesarla */
		};
				
		var opts = $.extend({}, $.fn.FormValidator.defaults, options); /* PONE LOS VALORES POR DEFECTO EN UNA VARIABLE */

		return this.each(function()
		{
			/* VARIABLES */
			var $this = $(this); 					/* VARIABLE GRLOBAL PARA EL OBJETO ACTUAL */
			var b_ErrorFound = false;			/* VARIABLE GLOBAL QUE INDICARÁ SI HA HABIDO UN ERROR AL ENVIAR EL FORMULARIO */
			
			$this.submit(function(){
				
				b_ErrorFound = false;
				
				//Buscar los campos obligatorios
				//Y comprobar que tengan alún valor.
				$(this).find("." + opts.mandatory_attr).each(function(){
					//Si no hay un valor entrado:
					if ($(this).val() == "")
					{
						
						//Si no se ha hecho foco antes, hacer foco sobre el objeto que ha fallado
						if (!b_ErrorFound)
						{
							$(this).focus();
						}
						
						//Mostrar error
						showError(this,$this);
												
						b_ErrorFound = true;	//ha habido un error.
					//Si el input tiene algun valor
					} else {
						//Controlar que los formatos de los inputs sean correctos.
						if ($(this).attr("format") != "")
						{
							switch ($(this).attr("format"))
							{
								case "email":
									if (!IsValidEmail($(this).val()))
									{
										//alert("You must enter a valid E-Mail format!");
										b_ErrorFound = true;	//ha habido un error.
										showError(this,$this);
									}
									break;
								case "number":
									if (isNaN($(this).val()))
									{
										//alert("You must enter a valid numeric format!");
										b_ErrorFound = true;	//ha habido un error.
										showError(this,$this);
									}
									break;									
							}
						}
					}
				});
				
				//Si no se han encontrado errores
				if (!b_ErrorFound)
				{
					//Enviar el formulario a la URL especificada
					//var params = escape($this.serialize());
					var objectArray =  $this.serializeArray();
					
					var queryString = "";
					for(var i = 0; i < objectArray.length; i++) {
							if (i > 0)
							{
								queryString += "&";
							}
								
					    queryString += objectArray[i]["name"] + "=" + escape(objectArray[i]["value"]);
					}		

					$.ajax({
						type		: "POST",
						cache	: false,
						url		: opts.send_url,
						data		: queryString,
						success: function(data) {
							alert(data);
							$this.find("." + opts.mandatory_attr).val('');
						}
					});
				}
				return false;
			});
			
			
			//Funcion que muestra el mensaje/imagen de error
			function showError(obj,frm)
			{
					//Generar el layer con la imagen de alerta
					var div = $("<div id=\"error_" + frm.attr("name") + "_" + $(obj).attr("name") + "\">").html("<img src=\"" + opts.alert_img + "\">");
					var lft, tp;
					
					//Buscar la posicion del input y posicionar el mensaje de alerta
					lft = $(obj).offset().left + $(obj).width() + 15;
					if (opts.abs_offset){
						lft = lft + opts.abs_offset;
					}
					tp = $(obj).offset().top + 0;
					
					$(div)
						.css("position","absolute")
				    .css("top",tp + "px")
				    .css("left",lft + "px")
				    .css("z-index","5000"); 	
					
					$(document.body).append(div);
					
					//Mostar el mensaje de alerta
					$(div).fadeIn("slow");
					
					
					/*$this.hide(function(){
						alert("cerrqado");	
					});*/
					
					//Al volver a hacer foco o cambiar el valor en el input que ha fallado, quitar el mensaje de alerta.
					$(obj).focus(function(){
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).fadeOut("slow");
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).remove();
					});						
					$(obj).keypress(function(){
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).fadeOut("slow");
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).remove();
					});
					$(obj).change(function(){
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).fadeOut("slow");
						$(document.body).find("#error_" +frm.attr("name") + "_" +$(obj).attr("name")).remove();
					});						
			}
			
			//Funcion que valida un formato de E-Mail
			function IsValidEmail(email)
			{
				var filter = /^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
				return filter.test(email);
			}
		});	
	};
})(jQuery);
