// @-----------------------------------------------------@
// |MGMD FORM VALIDATOR V 1.0					  _||_   |
// |MGMD LTDA 2008 TODOS LOS DERECHOS RESERVADOS |T\/T|  |
// |											 |I__I|  |
// |http://www.magdalenamedio.net				   ||    |
// @-----------------------------------------------------@

var validInst ; // VARIABLE DE INSTANCIACION DE LA CLASE


// CONSTRUCTOR
// RECEBE TIPOS DE ALERTA (INT, 1-2)
// RECIBE DIV (STRING, DIV ID)
function Validator(msgAlertType, div, extra)
{
	
	// INSTANCIACION DE VARIABLES GLOBALES
	this.msgAlertType  = msgAlertType ? msgAlertType : 1 ;
	this.div           = div ? div : '' ;
	this.validables    = new Array() ; // INSTANCIA DE ARREGLO DE CAMPOS VALIDABLES
	this.valid         = true ;
	this.validatorMsg  = '' ;
	this.extra         = extra ? extra : true ;
	this.form          = this.getForm() ; // INSTANCIAMIENTO DE LA VARIABLE GLOBAL DEL FORMULARIO CON LA FUNCION LO BUSCA
	// VERIFICA SI HAY O NO HAY FORMULARIO
	if ( (typeof this.form != "undefined") && (this.form != null) )
	{
		this.searchRequiredFields() ; // BUSCA CAMPOS REQUERIDOS
		
		this.addButtonEventHandler() ; // AGREGA EL HANDLER AL EVENTO CLICK DEL BOTON
	}
}

// BUSCA EL FORMULARIO QUE TENGA ID 'VALIDABLE' Y RETORNA EL FORMULARIO
Validator.prototype.getForm = function () {
									return document.getElementById('validable');
									
								 } ;
// BUSCA LOS CAMPOS REQUERIDOS
Validator.prototype.searchRequiredFields = function () {
											 var count = 0 ;
											 
											 for ( i = 0 ; i < this.form.elements.length ; i++ )
											 {
												 //	SI EL NOMBRE DE LA CLASE DEL CAMPO ES 'REQUIRED', EL CAMPO ES REQUERIDO																						
												 if  ( (typeof this.form.elements[i].className != "undefined") && (this.form.elements[i].className.search("notValidable") == -1) ) 
												 {
													// AGREGAMOS UN CAMPO VALIDABLE AL ARREGLO																							
													this.validables[count] = this.form.elements[i] ; 
													// ENVIAMOS EL CAMPO A LA FUNCION DE VERIFICACION DE HANDLERS REQUERIDOS	
													this.addNeededEventHandler(this.validables[count]) ;
													
													count++ ;
													
												 }
											 }												 
										   } ;
// AGREGA EL HANDLER AL BOTON PARA EL EVENTO 'CLICK'										   
Validator.prototype.addButtonEventHandler = function () {

												this.form.onsubmit = function (e) {
																				return validInst.checkRequiredFields(e) ;
																				 };
							
											} ;
// VERIFICA EL VALOR Y EL ESTADO DE LOS CAMPOS REQUERIDOS LUEGO DEL EVENTO 'CLICK' DEL BOTON
Validator.prototype.checkRequiredFields = function (e) {
												var actualElement = '' ;
												this.validatorMsg = '' ;
												this.valid        = true ; // FORMULARIO VALIDO POR DEFECTO
												
												// RECORRE EL ARREGLO DE CAMPOS REQUERIDOS 
												for(field in this.validables)
												{
													actualElement   = this.validables[field] ; // DEFINE EL ELEMENTO ACTUAL
													var actualValid = true ; // CAMPO ACTUAL POR DEFECTO VALIDO
													var extra       = '' ; // VARIABLE VACIA PARA DATO EXTRA DEL CAMPO NO VALIDO

													// SWITCH POR TIPO DE CAMPO
													switch (actualElement.type){
														case 'text':
															// VERIFICAR SI EL CAMPO ESTA VACIO
															if((actualElement.value == "") && (actualElement.className.search("optional") == -1))
															{
																this.valid = false ; // CAMBIA EL ESTADO DEL FORMULARIO 
																					 // A INVALIDO
																
																actualValid = false ; // CAMBIA EL ESTADO DEL CAMPO ACTUAL
																					  // A INVALIDO
																if(actualElement.className.search("retype") > -1)
																{
																	extra = 'No ' + actualElement.title ; // INFORMACION EXTRA DEL CAMPO INVALIDO
																}
																else
																{
																	extra = 'No escribiste ' + actualElement.title ; // INFORMACION EXTRA DEL CAMPO INVALIDO
																}
																var nameDiv = actualElement.name + 'Error';
																document.getElementById(nameDiv).className = 'form-div form-error';
															}
															// VERIFICAR SI EÑ CAMPO TIENE DATO EXTRA DE EMAIL
															else if(actualElement.className.search("emailValidable") > -1)
															{
																// VERIFICA SI LA FUNCION VERIFICADORA DE ESTRUCTURA DE MAIL
																// RETORNA VERDADERO O FALSO
																if(!this.checkEmail(actualElement.value))
																{
																	this.valid = false ; 
																						 
																	actualValid = false ; 
																						  
																	extra = actualElement.title + ' Direcc&oacute;n invalida' ;
																	var nameDiv = actualElement.name + 'Error';
																	document.getElementById(nameDiv).className = 'form-div form-error';
																}
															}
															else if(actualElement.className.search("retype") > -1)
															{
																// VERIFICA SI LA FUNCION VERIFICADORA DE ESTRUCTURA DE MAIL
																// RETORNA VERDADERO O FALSO
																if(actualElement.value != document.getElementById(actualElement.alt).value)
																{
																	this.valid = false ; 
																						 
																	actualValid = false ; 
																						  
																	extra = actualElement.title + ' No coincide con el campo anterior';
																	var nameDiv = document.getElementById(actualElement.alt).name + 'Error';
																	document.getElementById(nameDiv).className = 'form-div form-error';
																	var nameDiv = actualElement.name + 'Error';
																	document.getElementById(nameDiv).className = 'form-div form-error';
																}
															}	
														break;
														case 'select-one':
															// RECORRE CADA OPCION DEL CAMPO SELECT
															for(i=0;i<actualElement.options.length;i++)
															{	
																// ENTRA SI EL CAMPO ESTA SELECCIONADO
																if(actualElement.options[i].selected == true)
																{
																	// VERIFICA SI EL VALOR DEL CAMPO ACTUAL ES 'NULL'
																	if(actualElement.options[i].value == 'NULL')
																	{
																		this.valid = false ;
																		actualValid = false ;
																		extra = 'No seleccionaste ' + actualElement.title ;
																		var nameDiv = actualElement.name + 'Error';
																		document.getElementById(nameDiv).className = 'form-div form-error';
																	}
																	break;
																}
															}
														break;
														case 'textarea':
															// VERIFICAR SI EL CAMPO ESTA VACIO
															if(actualElement.value == "")
															{
																this.valid = false ;
																actualValid = false ;
																extra = actualElement.title + ' Campo Vacio' ;
																var nameDiv = actualElement.name + 'Error';
																document.getElementById(nameDiv).className = 'form-div form-error';
															}
														break;
														case 'password':
															if((actualElement.value == "") && (actualElement.className.search("optional") == -1))
															{
																this.valid = false ; // CAMBIA EL ESTADO DEL FORMULARIO 
																					 // A INVALIDO
																
																actualValid = false ; // CAMBIA EL ESTADO DEL CAMPO ACTUAL
																					  // A INVALIDO
																
																extra = 'Campo Vacio' ; // INFORMACION EXTRA DEL CAMPO INVALIDO
																
																var nameDiv = actualElement.name + 'Error';
																document.getElementById(nameDiv).className = 'form-div form-error';
															}														
															else if(actualElement.className.search("retype") > -1)
															{
																if((actualElement.value != ""))
																{	
																	
																	if(actualElement.value != document.getElementById(actualElement.alt).value)
																	{
																		//alert(actualElement.value + '>>VV>' + document.getElementById(actualElement.alt).value);
																		this.valid = false ; 
																							 
																		actualValid = false ; 
																		
																		
																							  
																		extra = 'No coincide con el valor de ' + document.getElementById(actualElement.alt).title;
																		var nameDiv = document.getElementById(actualElement.alt).name + 'Error';
																		document.getElementById(nameDiv).className = 'form-div form-error';
																		var nameDiv = actualElement.name + 'Error';
																		document.getElementById(nameDiv).className = 'form-div form-error';
																		
																		
																	}
																}
															}	
															else if((actualElement.className.search("minimum") > -1) && (actualElement.value != ""))
															{
																// VERIFICA SI LA FUNCION VERIFICADORA DE ESTRUCTURA DE MAIL
																// RETORNA VERDADERO O FALSO
																if(actualElement.value.length < actualElement.alt)
																{
																	this.valid = false ; 
																						 
																	actualValid = false ; 
																						  
																	extra = 'Numero de caracteres menor a ' + actualElement.alt;
																	var nameDiv = actualElement.name + 'Error';
																	document.getElementById(nameDiv).className = 'form-div form-error';
																}
															}
															
														break;
														case 'checkbox':
															if(actualElement.className.search("accept") > -1)
															{
																// VERIFICA SI LA FUNCION VERIFICADORA DE ESTRUCTURA DE MAIL
																// RETORNA VERDADERO O FALSO
																if(actualElement.checked == false)
																{
																	this.valid = false ; 
																						 
																	actualValid = false ; 
																						  
																	extra = 'No aceptaste términos y condiciones' ;
																	
																}
															}														
														break;
														case 'file':
															// VERIFICAR SI EL CAMPO ESTA VACIO
															if(actualElement.value == "")
															{
																this.valid = false ; // CAMBIA EL ESTADO DEL FORMULARIO 
																					 // A INVALIDO
																
																actualValid = false ; // CAMBIA EL ESTADO DEL CAMPO ACTUAL
																					  // A INVALIDO
																
																extra = 'Campo Vacio' ; // INFORMACION EXTRA DEL CAMPO INVALIDO
																
															}													
														break;														
													}
													// ENTRA SI EL CAMPO ACTUAL NO ES VALIDO
													/*if(!actualValid)
													{
														
														if(this.msgAlertType == 3)
														{
															this.validatorMsg += actualElement.name + '|' +  extra + ',';
														}
														else
														{
															// CONSTRUYE EL MENSAJE QUE SALE SI EL FORMULARIO NO ES VALIDO
															//this.validatorMsg += '- ' + actualElement.title ;
															
															// VERIFICA SI TIENE QUE SACAR LA INFORMACION EXTRA DEL CAMPO ACTUAL
															if(this.extra)
																this.validatorMsg += '. ' + extra + ' ' ;
															
															this.validatorMsg += '{linebreak}' ;
														}
													}*/
												}
												// ENTRA SI EL FORMULARIO NO ES VALIDO											
												//alert('--->'+this.valid);
												if(!this.valid) 
												{
													// TIRA LA ALERTA p
													this.throwAlert();
													return false;
												}
											} ;
 // FUNCION QUE VERIFICA LA ESTRUCTURA DEL MAIL	
 Validator.prototype.checkEmail = function(elementValue) {

									var at="@"
									var dot="."
									var lat=elementValue.indexOf(at)
									var lstr=elementValue.length
									var ldot=elementValue.indexOf(dot)
									if (elementValue.indexOf(at)==-1){
									   return false
									}
									if (elementValue.indexOf(at)==-1 || elementValue.indexOf(at)==0 || elementValue.indexOf(at)==lstr){
									   return false
									}
									if (elementValue.indexOf(dot)==-1 || elementValue.indexOf(dot)==0 || elementValue.indexOf(dot)==lstr){
									   return false
									}
                                    if (elementValue.indexOf(at,(lat+1))!=-1){
									   return false
									}
									if (elementValue.substring(lat-1,lat)==dot || elementValue.substring(lat+1,lat+2)==dot){
									   return false
									}
								    if (elementValue.indexOf(dot,(lat+2))==-1){
									   return false
									}
									
									if (elementValue.indexOf(" ")!=-1){
									   return false
									}
								
									return true					
								} ;
								
// AGREGA LOS HANDLERS NECESARIOS A CAMPOS DE VERIFICACION
Validator.prototype.addNeededEventHandler = function(element) {
												// SWITCH CON EL TAG 'ALT' DEL CAMPO
												if (element.className.search('text-only') > -1){
													// AGREGA LA FUNCION DE VERIFICACION DE SOLO TEXTO AL EVENTO 'KEYPRESS'
													element.onkeypress = function (e) {
																			return	validInst.validateText(e) ;
																};
	
												}
												else if (element.className.search('numeric') > -1) {
													// AGREGA LA FUNCION DE VERIFICACION DE SOLO NUMEROS AL EVENTO 'KEYPRESS'
													element.onkeypress =	function (e) {
																			 return	validInst.validateNumber(e) ;
																			};
												}
											} ;
											
// VALIDA QUE EL CAMPO TENGA SOLO TEXTO
Validator.prototype.validateText = function (e) {
		
									// REVISA QUE TECLA SE PRESIONO UTILIZANDO EL EVENTO LANZADO
									var key = (e) ? e.which : window.event.keyCode;
									
									// ENTRA SI LA TECLA NO ES SOLO TEXTO
									if ((key < 65 && key != 32 && key != 46 & key != 8 & key != 0) || key > 122 || (key > 90 && key < 97)) 
											return false;

									return true;  
									} ;

// VALIDA QUE EL CAMPO TENGA SOLO NUMEROS
Validator.prototype.validateNumber = function (e) {
									
									// REVISA QUE TECLA SE PRESIONO UTILIZANDO EL EVENTO LANZADO
									var key = (e) ? e.which : window.event.keyCode;

									// ENTRA SI LA TECLA NO ES SOLO NUMEROS
									if (key > 31 && (key < 48 || key > 57))	
											return false;
	
									return true;  
									} ;

// FUNCION QUE TIRA LA ALERTA
Validator.prototype.throwAlert = function()
								{
									// INSTANCIA LA VARIABLE MENSAJE CON UN TEXTO
									var msg = ''
									// HACE UN SWITCH CON EL TIPO DE ALERTA QUE SE HAYA ESTABLECIDO (1 - HTML, 2 - ALERTA)
									switch(this.msgAlertType) 
									{
										case 1:
												// CONSTRUYE EL MENSAJE CON LOS CAMPOS INVALIDOS 
												// Y REMPLZA EL {LINEBREAK} POR \R\N
												msg += '\r\n' + this.validatorMsg.replace(/{linebreak}/g, "<br />");					
												//alert(msg) ;
												//document.getElementById('msgBox').innerHTML = '<strong>Han habido problemas con tu registro</strong><br />' + msg;
												document.getElementById('msgBox').style.display = '';
												document.body.scrollTo(0,0);
												//return false;
										break;
										case 2:
											var target = document.getElementById(this.div);
											
											// MUESTRA EL DIV SI ESTA ESCONDIDO
											if(target.style.display == 'none')
											{
												target.style.display = '';
											}

											// CONSTRUYE EL MENSAJE CON LOS CAMPOS INVALIDOS 
											// Y REMPLZA EL {LINEBREAK} POR <BR/>	
											target.innerHTML = msg + '<br>' + this.validatorMsg.replace(/{linebreak}/g, "<br/>");	
											
										break;
										case 3:
											var elementIds = this.validatorMsg.split(',');
											for(i = 0; i < elementIds.length; i++)
											{
												elementInfo = elementIds[i].split('|');
												document.getElementById(elementInfo[0]).style.display = '';
												document.getElementById(elementInfo[0]).innerHTML = '<img src="' + ApplicationUrl + 'img/content/alert-small-icon.gif" alt="' + elementInfo[1] + '" />' + elementInfo[1];												
											}
										break;										
									}
								} ;
$(document).observe('dom:loaded', function () { validInst = new Validator(1, '', true); });
