﻿// JavaScript Document
// no pongo &ntildes ni acentos en los comentarios porque esto se puede rayar, ya me paso una vez y casi me vuelvo loco :S

function config()
{
	//binding de  eventos y demas configuraciones generales 
	
	//$("body").click(function(event){show_coords(event);});
	
	//login
	$("input:text","#login").focus();
	
	//comprobar disponibilidad de nuevo usuario
	$("#checkuser").bind("click",function(event){checkUser($("#regform #usuario").val(),event);});
	
	//contacto
	$("input:first-child","#contacto").focus();

	//validacion de formularios: contacto,afiliacion,registro de nuevo usuario,login
	$("form").bind("submit",function(e){validateForm(e);});
	
	//calendario, navegacion por meses y aniosssss
	$(".arrow").live("click",switchMonth);
	
	
	
	// miscelanea //
	//cerrar notificacion noscript
	$("a","#noscriptWarning").click(function(){$(this).closest("p").hide("slow");});
	
	//menu de salto para selects de publicaciones digitales
	$("#publiDigital :input").bind("change",function(event){publiDigital(event);});
	
	//abrir ayuda "¿que es esto?"
	//$(".quesesto").click(function(event){quesesto(event);});
	
	//tooltip de olvide mi contraseña
	$("#nuevopsswd").click(function(){$("#olvidemipwd").fadeIn("slow");});//abrimos
	$("#olvidemipwd a").click(function(){$("#olvidemipwd").fadeOut("slow");});//cerramos
	
	//tooltip de olvide mi contraseña
	$("#quesestoRedes a").click(function(){$("#ayudaQuesestoRedes").fadeIn("slow");});//abrimos
	$("#ayudaQuesestoRedes a").click(function(){$("#ayudaQuesestoRedes").fadeOut("slow");});//cerramos

	
	// ...............................................................
	//cargamos el calendario en la zona de agenda
	//al inicio no enviamos parametros (mes y ano), la clase php (psoealf_web) se encarga de inicializar estos valores
	//desde el archivo que cargamos en ajax, luego se envian desde el query string de las flechitas del calendario
	loadCalendar("");
}

//funciones de calendario
//carga el calendario en la zona de agenda
function loadCalendar(parameters)
{
	sid=Math.random();//evitamos el cacheo del output del servidor, cada peticion ha de ser unica
	$.ajax({url: "inc/colIzquierda/calendarioxmlhttp.php?sid=" + sid + "&" + parameters,
			type: "GET",
			dataType: "html",
			success: function(xmlResponseText){$("#agenda").html(xmlResponseText);}});
	
	//control de error en la peticion, la funcion se ejecuta automaticamente si la respuesta no es success (es un evento)
	$("#agenda").ajaxError(function(event, request, settings){
	$(this).html("<p>Informaci&oacute;n de AGENDA no disponible temporalmente. Disculpen las molestias.</p>\n");
	});
	
	
}

//cambia de mes (y ano :) ) en el navegador de meses y anos ( :) :)) del calendario....
function switchMonth(e)
{
	e.preventDefault();
	
	//con firefox no hay problema porque no compone la url absoluta a partir del href
	//pero con ie hay que montar todo este coplero
	url=$(this).attr("href");
	splitUrl=url.split("?");
	parameters=splitUrl[1];
	
	loadCalendar(parameters);//ahora si enviamos los datos de mes y ano (:)) generados por php en la etiqueta html
	
}
//acaba funciones de calendario, se acabaron los anos (deo gratia)



//validacion de datos antes de enviarlos al servidor
function validateForm(e)
{
	if(confirm("¿Está seguro/a de que desea continuar?")) 
	{//sguiente paso: validacion de los datos del formulario
	
		var id=e.target.id;//id del formulario que hay que validar
		var params=[];
		
		
		//asignamos la matriz de opciones de validacion segun el caso
		//params[
		//["nombre campo",
		//obligatorio(0|1),
		//"tipo de dato",(string,number,imagen etc...any=cualquier tipo de dato)
		//longitud minima(0=no hay minimo),
		//longitud maxima(0=no hay maximo)],
		//opciones,........]
		
		//inicialmente solo existen restricciones en la obligatoriedad de algunos campos, esto podria cambiar
		switch(id)
		{
		case 'aphilia':
		params=[["nombre",1,"string",0,0],
			["apellidos",1,"string",0,0],
			["email",1,"email",0,0],
			["telefono",0,"number",9,9],
			["movil",1,"number",9,9]];
		break;
		case 'contact':
		params=[["nombre",1,"string",0,0],
			["email",1,"email",0,0],
			["movil",1,"number",9,9],
			["consulta",1,"string",0,0]];
		break;
		case 'loginform':
		 return true;
		break;
		case 'regform':
		params=[["nombre",1,"string",0,0],
			["apellido",1,"string",0,0],
			["afiliado",1,"number",1,6],
			["telefono",1,"number",9,9],
			["email",1,"email",0,0],
			["usuario",1,"string",1,20],
			["password",1,"string",6,20]];
		break;
		}
		
		//encapsulamos la validacion en bloque try/catch para facilitar el proceso
		//en caso de error en los datos 
		try
		{
			//validamos los datos
			results=checkForm(params);
			//si los datos no pasan la  validacion generamos un error
			//y enviamos el string con los errores al bloque catch
			if(results!="ok") throw results;
			//si los datos son correctos devolvemos true para que pueda continuar
			//la accion por defecto del evento submit, enviando los datos al servidor
			return true;
		}
		catch(results)
		{
			e.preventDefault();//evitamos que se produzca el submit
			alert(results);//mostramos los errores
			return false;//se acaba la fiesta
		}
	
	}
	else
	{
		e.preventDefault();
		return false;//el usuario no desea  continuar enviando los datos
	}
	
	//validacion de datos! esta funcion es la que lleva a cabo todo el proceso de validacion
	//contrastando los valores actuales del formulario con el array de requisitos para cada valor del formulario
	function checkForm(params)
	{	
		var errores="Por favor, revise los siguientes errores:\n";
		var err=false;
		
		
		//vamos a validar solo los campos especificados en el array de parametros
		for(index in params)
		{	
			
			//ahora iniciamos los valores requeridos para el campo actual y recuperamos sus valores
			campo=params[index][0];//nombre del campo que se analiza
			required=params[index][1];//campo obligatorio-no obligatorio
			value=$("#" + campo + "").val();//valor actual del campo
			valueLength=value.length;//longitud del valor actual
			minLength=params[index][3];//longitud minima requerida
			maxLength=params[index][4];//longitud maxima requerida
			type=params[index][2];//tipo de dato requerido
			valueType=typeof(value);//tipo de dato actual
			//opciones=params[index][5];//opciones adicionales
			
			
			//proceso de validacion//
			
			//es un campo obligatorio
			if(required && (value==null || valueLength==0 || /^\s+$/.test(value)))
			{
				err=true;
				errores+=campo + ": el campo es obligatorio\n";
				continue;
			}
			
			//archivos
			//TODO: todo.... :)
			//investigar si es posible algun tipo de validacion javascript de files
			if(type=="file" && (value!=null || valueLength!=0 || /^\s+$/.test(value)))
			{
				
				/*err=true;
				errores+=campo + ": el campo es obligatorio\n";
				continue;*/
				continue;
			}
			
			//tipos numericos
			//TODO: ampliar tipos numericos
			if(type=="number" && isNaN(Number(value)))
			{	
				err=true;
				errores+=campo + ": el valor es incorrecto\n";
				continue;
			}
			
			//validacion de urls
			//TODO: validacion de cualquier URI
			if(type=="url")
			{
				var patt0 = new RegExp("^http://www.","i");
				var patt1 = new RegExp("^http://","i");
				var patt2 = new RegExp("^www.","i");
				
				if(!patt0.test(value))
				{
					if(!patt1.test(value))
					{
						if(!patt2.test(value))
						{
							err=true;
							errores+=campo + ": la dirección es incorrecta\n";
							continue;
						}
					}
				}
			
			}
			
			
			//validacion sintactica de emails
			if(type=="email" && !/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(value))
			{
				err=true;
				errores+=campo + ": el email es incorrecto\n";
				continue;
			}
			
			
			
			//longitudes maximas y minimas
			if(valueLength)
			{
				if(minLength && (valueLength<minLength))
				{
					err=true;
					errores+=campo + ": el valor es incorrecto\n";
					continue;
				}
				
				if(maxLength && valueLength>maxLength)
				{
					err=true;
					errores+=campo + ": el valor es incorrecto\n";
					continue;
				}
				
				
			}
			
			
			//correccion y disponibilidad de usuario en formulario de registro
			/*if(campo=='usuario')
			{
				var resultados=checkUser(value);
				
				if(typeof resultados!='boolean')
				{
					err=true;
					errores+=campo + ": No fue posible comprobar la disponibilidad\n";
					continue;
				}
				else if(!resultados)
				{
					err=true;
					errores+=campo + ": el usuario ya está registrado\n";
					continue;
				}
			}
			*/
			
		
			
				
		}
		
		if(err) return errores;
	
		return "ok";//resultados;
	
	}
	
}

//acaba validacion de formularios//

// menu de salto para selects de publicaciones digitales //

function publiDigital(event)
{
	var selectId=event.target.id;
	var selectVal=event.target.value;
	var option=event.target.selectedIndex;
	
	if(option!=0){window.open(selectVal);}
	
	return;
}

function quesesto(event)
{
	//obtenemos las coordendas del cursor en la pantalla del navegador
	var x=event.clientX;
	var y=event.clientY;
	
	//obtenemos la id del elemento desde el que se llama al handler
	var ayudaId=event.target.id;
	
	//determinamos que ventanita de ayuda habra que hecer visible, segun la id obtenida 
	switch(ayudaId)
	{
		case 'helpCompartir':
		pId='#ayudaCompartir';
		break;
		case 'helpRedes':
		pId='#ayudaRedes';
		break;
	}
	
	//colocamos de forma absoluta el elemento de ayuda correspondiente, segun las coordenadas obtenidas
	//y lo hacemos visible
	$(pId).css("left",x).css("top",y).show("slow");
	
	
	//alert(x + ", " + y + ", " + ayudaId);
	
}

function show_coords(event)
{
	x=event.clientX;
	y=event.clientY;
	alert("X coords: " + x + ", Y coords: " + y);
}


//comprueba la correccion y disponibilidad del usuario introducido en el formulario de registro
function checkUser(user)
{
	var valueLength=user.length;
	var minLength=1;
	var maxLength=20;
	//esto es un parche para determinar el origen de la llamada a checkUser y hacer una cosa u otra
	//de momento no se me ocurre otra cosa
	var args=checkUser.arguments.length;
	var err=false;
	var resultado="";
	
	//primero validamos las longitudes maximas y minimas del usuario
	if(minLength && (valueLength<minLength)){err=true;}
	if(maxLength && (valueLength>maxLength)){err=true;}
	
	//usuario incorrecto
	if(err) {alert("El usuario no es correcto"); return;}
				
	
	//usuario correcto			
	//ahora comprobamos la disponibilidad del usuario mediante peticion ajax al servidor y consulta a la db
	var sid=Math.random();//evitamos el cacheo del output del servidor, cada peticion ha de ser unica
	//var parameters="user=" + user;
	var caso;
	
	var caso=$.ajax({
			url: "lib/utils.php?sid=" + sid,// + "&" + parameters,
			type: "GET",
			data: {user: user},
			dataType: "text",
			success: function(xmlResponseText){caso=xmlResponseText.responseText;return caso;}
			});
	
	//ajax success
	//no confundir con resultados de la comprobacion de disponibilidad; ajaxSuccess significa que se pudo establecer la conexion via ajax y todo fue ok
	//los resultados, el output del servidor, se analizan luego
	
			
			
			
			alert(caso);
		
		var resultado="resultado";
		var args=checkUser.arguments.length;
		//la llamada la hacemos desde la utilidad de comprobacion de disponibilidad del formulario
		if(args==2)
		{
			
			switch(caso)
			{
				case 0:
				resultado+="<img src=\"\" width=\"\" height=\"\" />";
				resultado+="&nbsp;Usuario NO disponible";
				break;
				case 1:
				resultado+="<img src=\"img/ok.gif\" width=\"15\" height=\"15\" />";
				resultado+="&nbsp;Usuario disponible";
				break;
				/*case "Fallo en la consulta":
				break;
				case "Fallo en selección db":
				break;
				case "Fallo en la consulta":
				break;*/
				//default:alert("Lo sentimos. Esta función no está disponible temporalmente.\nDisculpe las molestias.");return;
			}
			
			alert(resultado);
			
			$(this).after(resultado); // dom element listening
			return;
		}
		
		//la llamada la hacemos desde la rutina de validacion de los datos del formulario
		switch(XMLHttpRequest.responseText)
		{
			case 0:
			resultado=false;
			break;
			case 1:
			resultado=true;
			break;
			/*case "Fallo en la consulta":
			break;
			case "Fallo en selección db":
			break;
			case "Fallo en la consulta":
			break;*/
			default:resultado="Lo sentimos! No fue posible comprobar la disponibilidad.\nPor favor vuelva a intentarlo.";
		}
		
		return resultado;
		
	
	
	
	//ajaxError
	//control de error en la peticion, la funcion se ejecuta automaticamente si la respuesta no es success (es un evento)
	$("#checkResults").ajaxError(function(event, XMLHttpRequest, ajaxOptions){
		alert("Esta función no está disponible temporalmente.\nDisculpe las molestias.");
	});
}


var newWindow2 = function (url) {
  
  //window.open(URL,name,specs,replace)
  window.open(url, '', 'width=820,height=640,left=100,top=100,location=0,menubar=1,toolbar=1,titlebar=1,status=1,resizable=1,scrollbars=yes', '');
};
