// JavaScript Document
/** Kibreria Ajax v 1.0
*
*/

/* Opciones para tipo de respuesta */

var $tipo = {
	XML: 0,
	TEXTO: 1,
	JSON: 2
}

// Opciones para el metodo
var $metodo = {
	GET: "GET",
	POST: "POST"
}

/* Realiza un nuevo requerimiento AJAX a la URL especificada con las ocopiens definidas
@param {String} url La URL donde realziar la peticion
@param {object} opciones, un objeto JSON con los atreibutos opcion */

function $Ajax(url, opciones) {
	//preguna si queremos cahce
	if (__$P(opciones, "cache", true)== false){
		//Agregamos un parametro random
		var caracter = "?";
		if (url.indexOf("f")>0) caracter = "&";
		url += caracter + Math.random();
	}
	
	var metodo = __$P(opciones, "Metodo", $metodo.GET);
	var parametros = __$P(opciones, "parametros");
	
	//Genera un JSON de propiedades necesarias para prototype
	//en el 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 definen parametgros los agregamos
	if (parametros!=undefined) {
		protoOpc.parameters = parametros;
	}
	
	//genera la nueva peticion via prototype
	var peticion = new Ajax.Request(url, protoOpc);
	
	// prende el cartel de cargando si existe
	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 infinish de la peticion
*/

function __$AjaxRecibir(opciones, xhr){
	
	// Si se ejcuta esta funcion, estramos seguros de que redystate ==4 y status==200
	
	//Apagamos el cartel 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) {
		
		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: 
			var objeto;
			try {
				objeto = xhr.responseText.evalJSON();
			} catch (e) {
				__$AjaxError(opciones, xhr, { code: -1, message: "JSON No valido" });
				return;
			}
			funcionRetorno(objeto, id);
		}
	}
}

/** funcion para prender o apagr el cartel de cargando **/
function __$AjaxCargando(cartel, prender) {
	if (prender) {
		$(cartel).show();
	} else {
		$(cartel).hide();
	}
}

/** Funcion intrna para recibir la ejecucion cuando se prdocuzca algun error en la peticion desde prototype*/
function __$AjaxError(opciones, xhr, excepcion) {
	//Agregamos cartel de cargadno si existe
	if (__$P(opciones, "avisoCargando")!=undefined){
		__$AjaxCargando(opciones.avisoCargando, false);
	}
	
	// Cuando se trata de un error de servidor no hay excepcion
	if (excepcion==undefined){
		excepcion = { code: xhr.status, message: "error en servidor" }
	}
	
	// se consulta si esta definido el evento on error
	var funcionError = __$P(opciones, "onerror");
	if (funcionError!=undefined) {
		funcionError(excepcion, __$P(opciones, "id"));
	}
}

//funcion inyterna que se encarga de entregar un parametro opcional
// desde una coleccion tipo JSPON, 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];
		}
	}
}


						
		
	
