/* Especifica opciones para tipo respuesta
*/
var $tipo = {
	XML:0,
	TEXTO:1,
	JSON: 2
}

/* Especifica opciones para metodo de envio
*/
var $metodo = {
	GET: "GET",
	POST: "POST"
}

/*Realiza un requerimiento ajax a la url especificada
 * Opciones:
 * 		id: un identificador interno para ser recibido junto a los datos
 * 		metodo: $metodo.POST o $metodo.GET
 * 		tipoRespuesta: $tipo.TEXTO, $tipo.JSON, $tipo.XML
 * 		parametros: un string en formato URL o un objeto hash
 * 		cache: true o false
 * 		avisoCargando: define el id del elemento que queremos usar como cartel de "Cargando" mientras se hace la peticion
 * 		onfinish: funcion a ejectutarse cuando se reciban los datos. Esta funcion recibe el TEXTO, JSON, XML recibido y el id de la peticion
 * 		onerror: Funcion a ejecutarse cuando se produzca un error, recide un objeto con el detalle del error y el id de la peticion
*/

function $Ajax(url, opciones){
	//Preguntamos si NO quiere cache
	if (__$P(opciones, "cache", true)==false){
		//Agregamos un parametro ramdom a la URL
		//Ponemos ? o & segun el parametro anterior
		var caracter = "?";
		if(url.indexOf("?")>0) caracter ="&";
		url += caracter + Math.random();
	}
	
	var metodo = __$P(opciones, "metodo", $metodo.GET);
	var parametros = __$P(opciones,"parametros");
	
	//Genera JSON de propiedades necesarias para Prototype
	//En un futuro puede ser reemplazado por otra libreria
	var protoOpc = {
		method: metodo,
		onSuccess: __$AjaxRecibir.bind(this, opciones),
		onException: __$AjaxError.bind(this, opciones),
		onFailure: __$AjaxError.bind(this, opciones)
	}
	
	//Si se definieron los parametros los agregamos
	if(parametros!=undefined){
		protoOpc.parameters=parametros;
	}
	
	//Genera la nueva peticion via Prototype
	var peticion = new Ajax.Request(url, protoOpc);
	
	//Prende el carte de Cargando, si existiera
	if (__$P(opciones, "avisoCargando")!=undefined){
		__$AjaxCargando(opciones.avisocargando, true);
	}	
}

/*
 * Funcion interna que se encarga de recibir la peticion lista
 * desde Prototype y ejecutar el evento onfinish de la peticion
*/
function __$AjaxRecibir(opciones, xhr){
	//Si se ejecuta este metodo estamos seguros de que readyState==4 y status==200
	
	//Apagamos el cartel de Cargando si existiera
	if(__$P(opciones, "avisoCargando")!=undefined){
		__$AjaxCargando(opciones.avisoCargando, false);
	}
	
	//Traemos la funcion onFinish si fue definida
	var funcionRetorno = __$P(opciones, "onfinish");
	//Traemos el identificador de la peticion si fue definido
	var id = __$P(opciones, "id");

	if(funcionRetorno != undefined){
		//Si el usuario indico que quiere recibir la respuesta suponemos TEXTO como tipo por defecto
		var tipoRespuesta = __$P(opciones, "tipoRespuesta", $tipo.TEXTO);
		switch(tipoRespuesta){
			case $tipo.TEXTO:
				funcionRetorno(xhr.responseText, id);
				break;
			case $tipo.XML:
				funcionRetorno(xhr.responseXML, id);
				break;
			case $tipo.JSON:
				//Intentamos evaluar el JSON por si no es valido
				var objeto;
				try{
					objeto = xhr.responseText.evalJSON();
				}catch(e){__$AjaxError(opciones, xhr, {code: -1, message: "JSON No Valido"});
					return; 
				}
				funcionRetorno(objeto,id);
		}
	}
}

/*
 * Funcion interna que se encarga de prender o apagar el cartel de cargando, si existiera
*/
function __$AjaxCargando(cartel, prender){
	if(prender){
		$("divCargando").show();
	} else {
		$("divCargando").hide();
	}
}

/*
 * Funcion interna que se encarga de recibir la ejecucion
 * cuando se produzca algun error en la peticion desde Prototype
*/
function __$AjaxError(opciones, xhr, exception){
	//Apagamos cartel de Cargando si existiera
	if(__$P(opciones, "avisoCargando")!=undefined){
		__$AjaxCargando(opciones.avisoCargando,false);
	}
	
	//Cuando se trata de un error de servidor, no hay excepcion
	if(exception==undefined){
		exception = {code:xhr.status, message:"Error del servidor"}
	}
	
	//Consulto si estaba definido el evento onError
	var funcionError = _$P(opciones, "onerror");
	if(funcionError!=undefined){
		funcionError(excepcion, __$P(opciones, "id"));
	}
}

/*
 * Funcion interna que se encarga de entregar un parametro opcional
 * desde una coleccion de tipo JSON, con un valor por defecto
*/
function __$P(coleccion, parametro, defecto){
	if(coleccion==undefined){
		return defecto;
	} else {
		if(coleccion[ parametro]==undefined){
			return defecto;
		}else {
			return coleccion[ parametro];
		}
	}
}
function validar(Element){
	
	if(document.contact.Name.value == ""){
		$("error").innerHTML="Error: Please check your name";
		return false;
	}
	
	if(echeck(document.contact.Email.value)==false){
		$("error").innerHTML="Error: Invalid e-mail address";
		return false;
	}
	
	if(document.contact.Subject.value == ""){
		$("error").innerHTML="Error: Please check your subject";
		return false;
	}
	
	if(document.contact.Message.value == ""){
		$("error").innerHTML="Error: Check your message";
		return false;
	}

}

/**
 * DHTML email validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */

function echeck(str) {

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){
		   
		   return false
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		
		   return false
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		  
		    return false
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		
		    return false
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		   
		    return false
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		 
		    return false
		 }
		
		 if (str.indexOf(" ")!=-1){
		    
		    return false
		 }

 		 return true					
	}




Event.observe(window, 'load', function() { 
  //ANIMATE SCROLL FUNCTION
  $$('a[href^=#]:not([href=#])').each(function(element) {
    element.observe('click', function(event) {
      new Effect.ScrollTo(this.hash.substr(1));
      Event.stop(event);
    }.bindAsEventListener(element))
  });
});

function contact(){
	var n = document.contact.Name.value;
	var e = document.contact.Email.value;
	var s = document.contact.Subject.value;
	var m = document.contact.Message.value;
	var t = document.contact.Telephone.value;
	
	$Ajax('sendc.php?n='+n+'&e='+e+'&s='+s+'&m='+m+'&t='+t, {cache:false,
				   onfinish:function(html){ $("error").innerHTML="Message sent!";
				   },
				   avisoCargando:"divCargando"
		});
}
