﻿// JavaScript Document

//definimos nuestro namespace dentro del objeto global
var Global = {};

Global.isIE = (document.all) ? true:false;
Global.lang = document.getElementById('lang').value;

//nueva ventana (entradas corte ingles)
var openWindow = function (url) {
	//window.open(URL,name,specs,replace)
	var specs = 'width=900,height=700,left=20,top=20,location=0,menubar=1,toolbar=0,titlebar=1,status=1,resizable=1,scrollbars=1';
	window.open(url,'',specs,false);
};

//DESPLIEGUE DE OVERLAY CON ALPHA Y FORMULARIOS DE MAIL FEED O CONTACTO RAPIDO
//control del overlay
var display_overlay = function (form_id) {
	
	var overlay = document.getElementById('overlay');
	
	//hacemos visible el overlay
	overlay.style.display = 'block';
	
	//cambiamos su opacidad
	if (!Global.isIE) {
		
		overlay.style.opacity = 0.8;
	} else {

		overlay.style.filter ="progid:DXImageTransform.Microsoft.Alpha(opacity=80)";
	}
	
	//hacemos visible el formulario correspondiente
	document.getElementById(form_id).style.display = 'block';
	
};

var close_overlay = function (form_id) {
	
	var overlay = document.getElementById('overlay');
	
	//antes de cerrar reseteamos los forms 
	reset_overlay_forms(form_id);
	
	//cerramos el formulario
	document.getElementById(form_id).style.display = 'none';
	
	//cerramos el overlay
	overlay.style.display = 'none';
};

var reset_overlay_forms = function (form_id) {
	
	switch (form_id) {
	case 'rapid_contact_form':
		
		document.getElementById('retmessage').innerHTML        = '';
		document.getElementById('retmessage').style.display    = 'none'
		document.getElementById('form_contacto').style.display = 'block';
	break;
	case 'mail_feed_form':
		
		document.getElementById('email_feed').value      = '';
		document.getElementById('email_mssgs').innerHTML = '';
	break;
	}
	
};


//FORMULARIO DE CONTACTO RAPIDO
var rapidContact = function () {
	
	var retval,
		retmssg   = '',
		params,
		errores   = [], 
		error;
	
	switch (Global.lang) {
	case 'cat':
	params    = {'nombre'    : ['string', 1, 'Nom'],
				 'email'     : ['email',  1, 'E-mail'],
		         'comment'   : ['string', 1, 'Comentari / Suggeriment']
				 };
	break;
	case 'es':
	params    = {'nombre'    : ['string', 1, 'Nombre'],
				 'email'     : ['email',  1, 'E-mail'],
		         'comment'   : ['string', 1, 'Comentario / Sugerencia']
				 };

	break;
	}
	
	Global.validator = new Validator(document.getElementById('formcontacto'),params);
	
	if (Global.validator.validate(false)) {
	    
		//return true;
		//vamos a enviar mediante xmlhttprequest los datos del formulario al script php
		//que los guardara en db y los enviara por correo
		var key,
			sep  = '',
			data = '',
			xmlhttp = Ajax.GetXmlHttpObject();
		
		if (xmlhttp === null) {
			
			//return true;
			alert("xmlHttp error");
		}
		
		//creamos el post que enviaremos a utils.php
		for (key in Global.validator.params) {
			
			if (Global.validator.params.hasOwnProperty(key)) {
				
				data+= sep + key + '=' + Global.validator.formObject.elements[key].value;
				sep = '&';
			}
		}
		
		//alert(data);
		
		//aqui va todo el coplero de los settings de ajax y bla bla bla...
		xmlhttp.open("POST","script/php/sendComment.php",true);
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
		xmlhttp.onreadystatechange = function () {
			
			if (xmlhttp.readyState === 4) {
				
				if (xmlhttp.status === 200) {
					
					
					retval = xmlhttp.responseText;
					
					switch (retval) {
					case '1':
					retmssg = (Global.lang === 'cat') ? "El seu missatge s'ha enviat correctament.<br />Gràcies per usar aquest servei!":"Su mensaje se envió correctamente.<br />Gracias por usar este servicio!";
					break;
					case '0':
					retmssg = (Global.lang === 'cat') ? "Ho sentim! Es va produir un error en intentar enviar el seu missatge.<br />Per favor torni a intentar-ho en uns minuts. Gràcies!":"Lo sentimos, se produjo un error al intentar enviar su mensaje<br />Por favor inténtelo en unos minutos. Gracias!";
					break;
					default:
					retmssg = (Global.lang === 'cat') ? "Ho sentim! Es va produir un error en intentar enviar el seu missatge.<br />Per favor torni a intentar-ho en uns minuts. Gràcies!":"Lo sentimos, se produjo un error al intentar enviar su mensaje<br />Por favor inténtelo en unos minutos. Gracias!";
					}
					
					document.getElementById('rapid_nombre').value  = '';
					document.getElementById('rapid_email').value   = '';
					document.getElementById('rapid_comment').value = '';
					
					document.getElementById('form_contacto').style.display = 'none';
					document.getElementById('retmessage').style.display = 'block';
					document.getElementById('retmessage').innerHTML = retmssg;
					
				} else {
					
					alert(xmlhttp.statusText);
				}
			}
		};
		
		xmlhttp.send(data);
		return false;
	
	} else {
	
		errores = Global.validator.getErrors();
		
		for (error in errores) {
			
			retmssg += errores[error] + "\n";
		}
		
		alert(retmssg);
		return false;
	}
};


//validator
var Validator = function (formObject,params) {
	 
	//variables privadas//
	
	var that   = this, 
		error  = false, 
		errors = [], 
		key, 
		value, 
		isEmptyValue,
		isEmptyMssg,
		isRequired,
		libErrors,
		types;
		
	//libreria de mensajes de error estandar segun el tipo de campo
	switch (Global.lang) {
	case 'cat':
	libErrors = {'email': ['l\'EMAIL no és correcte']};
	break;
	case 'es':
	libErrors = {'email': ['el email no es correcto']};
	break;
	}
	
	types = new Types();
	
	
	/*if (typesToLoad !== null) {
		types.loadTypes(typesToLoad);
	}*/
	
	//variables y metodos publicas/os //
	
	this.formObject = formObject;
	this.params = params;
	//metodos privilegiados: validate, getErrors//
	
	//llamada publica a la funcion de validacion (validateFields), accedemos a ella a traves
	//de este metodo privilegiado
	this.validate = function (strictMode) {
		
		if (!validateFields(this.formObject, this.params, strictMode)) {
			error = false;
			return false;
		} else {
			return true;
		}
		
	};
	
	//recuperamos los errores de validacion
	this.getErrors = function () {
		return errors;
	};
	
	
	
	
	//metodos privados: validateFields, logErrors//
	
	//core de la validacion
	function validateFields(formObject, params, strictMode) {
		
				
		for (key in params) {
			
			if (params.hasOwnProperty(key)) {
				
				
				value        = formObject.elements[key].value;
				isEmptyValue = value.empty();
				isRequired   = params[key][1];
				
				if (isRequired || (!isRequired && strictMode && !isEmptyValue)) {
					
					try{
						
						if (isEmptyValue) {
					
							isEmptyMssg = (Global.lang === 'cat') ? "El camp " + params[key][2] + " es obligatori":"El campo " + params[key][2] + " es obligatorio";
							throw  isEmptyMssg;
						} else {
							
							retval = (types[params[key][0]]).call(params[key], value);
							if (!retval) {
								throw params[key][2] + ": " + libErrors[params[key][0]][retval];
							}
						}
					} catch(e) {
						
						if (!error) {
							
							error = true;
						}
						
						logError(e, key);
					}
				}
			}
		}
			
		if (!error) {
			
			return true;
		} else {
			
			return false;
		}
	}
	
	//registro de errores
	function logError(e, key) {
		errors[key] = e;
		return;
	}
	
};



// libreria de tipos //
var Types = function () {
	
	var type,
		script;
	
	this.LOAD_ALL = ['string', 'nifcifnie', 'email', 'tel', 'cp', 'login'];
	
	this.loadTypes = function (typesToLoad) {
		
		for (type in typesToLoad) {
			script      = document.createElement("script");
			script.type = "text/javascript";
			script.src  = "script/js/validator/types/" + typesToLoad[type] + ".js";
			document.body.appendChild(script);
		}
	};
	
	this.addType = function (newType, newFunction) {
		Types.prototype[newType] = newFunction;
		return;
	};

};


// TIPOS DE DATOS
// por optimizacion del tiempo de descarga los incluimoS en el script principal
// en vez de cargarlos 'on demand'

// string
Types.prototype.string = function (str) {
	
	return -1;
};

// email
Types.prototype.email = function (email) {
	
	if (/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(email)) {
		  
		  return  -1;
	} else {
		  
		  return 0;
	}
};


// utilidades //

//empty la usa siempre el core de la validacion
//no la cargamos sino que la incluimos aqui
String.prototype.empty = function () {
	
	if (this.length === 0 || /^\s+$/.test(this)) {
		return true;
	} else {
		return false;
	}
};



//xmlhttprequest object
var Ajax = {
	
	GetXmlHttpObject: function () {
		 
		var xmlHttp = null;
		
		try {
			
			// Firefox, Opera 8.0+, Safari
			xmlHttp = new XMLHttpRequest();
		
		} catch (e) {
			
			//Bill Gates 
			try {
				
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
		
		return xmlHttp;
	}
};

