	// JavaScript Document for Ajax Functions
	
	
	/**
	* 	x_sendForm(Ex sendAndLoad) envía un formulario por por ajax
	*	
	*	Valida primero que todos los requeridos y demas condiciones   
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*	@version 2.0
	*
	*	@param form string ID del Formulario que se desea serializar y enviar a una url
	*	@param disable_button bool Valor que indica si al enviarse el formulario deben ponerse en disable los botones dle mismo
	*   @param url_script string Parametro opcional que indica la url a la cual se deben enviar los datos. Por defecto envia al action del mismo
	*   @param hide_form bool Indica que el formulario debe ocultarse durante el procesamiento 
	*   @param txt_loading string Si el formulario es ocultado durnte su procesamiento se mostrara un txt_loading en su lugar 
	*   @param func_js_end string Funcion JS que deberá ejecutarse al finalizar el envio de ajax del formulario
	*   @param params_js string Parametros de la función JS que se ejecutará al finalizar el envío del formulario
	*/
	function x_sendForm(form, disable_button, func_js_end, params_js, url_script, hide_form, txt_loading) {				

		//TODO: ver de simplificar los parametros usando JSON
        if  (x_validateForm(form)){
        
            
            
            // Si no se reciben parametros se envia un string vacío. Params son parámetros de que serán pasados a la funcion func_completo
            if (typeof params_js =="undefined")    
                params_js = "";
            
            // Si se envía un script se toma este como destino. en caso contrario se usa el action del form
            if (typeof url_script =="undefined" || url_script == "" ) {   
                url_script = "";
                var url = form.action;
            }else
                var url = url_script;
                
            if (typeof disable_button == "undefined" || !disable_button)
                var enable_button = false;
            else{
                x_disableInupts("button");
                enable_button = true;
            }
                                
            
            // creacion del objeto ajax y llamada a la accion 
            x_doAjaxCall("post",url,x_serializeForm(form),func_js_end,"'"+params_js+"'","doError", true,enable_button) ;
        }		
        
        return;
	}	  
	
	/**
	* 	Ejecuta una ena llamada mediante AJAX
	* 	
	*	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	* 	@version 1.0
	*	
	*	params method: GET o POST
	* 	url: El archivo php q nos va a responder el ajax
	* 	parametros: Array tipo GET PHP.
	* 	func_completo funcion q se va a ejecutar en el onComplete del ajax 
	* 	params_func son los parametros opcioneales q le podemos mandar a  func_completo tienen que estar separados x coma
	* 	ej: 'param1','param2' si es string tiene que tener ''    
	* 	func_error funcion de error    
	* 	asincrono boolean que indica si se llamara al AJAX de moso Asincrono o Sincrono 
	* 	enble_button boolean que indica si hay que habilitar los botones del form	
	*/              
	function x_doAjaxCall(method, url, params, func_completo,params_func,func_error, asincrono,enable_button ){
		
		//TODO: Podríamos hacaer que se pueda recibir mas de una funcion, es decir un arreglo de string de funciones con sus respectivos parametros. Por defecto a la primera se le evnia el retorno del AJAX

		// Por defecto la llamada es asincrona
		if(asincrono==false)
			asincrono = false;
		else
			asincrono = true;

        

		var result = new String();	  
		var objetoAjax = new Ajax.Request(
			url, 
			{
				method: method, 
				parameters: params, 
				onLoading : function (){ x_showLoading();},
				onSuccess : function (){ x_hideLoading();},
				onComplete: function(transport) {
				var strFuncionCompleta = func_completo;
				//Armamos la llamada a la función de retorno
				if (params_func =="") {
					strFuncionCompleta= strFuncionCompleta +"('"+escape(transport.responseText)+"')";
				} else {
					strFuncionCompleta= strFuncionCompleta +"('"+escape(transport.responseText)+"',"+params_func+")";
				}
				result = eval(strFuncionCompleta);
			
				
				if (enable_button)
				    x_enableInupts("button");
				

				},
				onFailure:  func_error,
				asynchronous : asincrono
			});

		return result;   
	}
	  
	  
	  
	/**
	*
	*  x_serializeForm Dado un form arma un string con forma de parametro GET de php
	*  Esta funcion actualmente se encuentra prototipada pero se escribe para prever alguna modificacion o sobrecarga futura.
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*/ 	  
	function x_serializeForm(form){	  
		var params =""; 
		params = form.serialize();
		return params+"&ms="+new Date().getTime();
	}
	  
	/**
	*   Evalua una respuesta de un php Abierto x un ajax  
	*
	*	params:retorno string, cadenaEvaluacion retorno del ajax limpio
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*
	*/         		
	function x_evalAjaxResponse(evalText){
		
		// TODO: Esto debe cambiar. Se deben  definir todos los posibles retornos y posteriormente su tratamiento
		var retorno=  new Object();
		retorno['false'] = x_extractBetween(evalText,'[false]')
		retorno['true']  = x_extractBetween(evalText,'[true]');
		retorno['msg']  =  x_extractBetween(evalText,'[msg]');
		retorno['alert'] = x_extractBetween(evalText,'[alert]');
		retorno['spry']  = x_extractBetween(evalText,'[spry]');
		retorno['error']  = x_extractBetween(evalText,'[error]');
		return retorno;  		 	
	}
	  

	/*
	*   Extrae una cadena segun un delimitador
	
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*/
	function x_extractBetween(evalText,delimiter) { 
		var data = new String(unescape(evalText));
		var begin =data.indexOf(delimiter)+delimiter.length;

		if (begin > 0){
			var data_t= data.substring(begin,data.length);
			var end = data_t.indexOf(delimiter);
			if (end>0)  {
				return data = data_t.substring(0,end);
			} else {
				return '';	
			}
		} else {
			return '';	      
		}
	}
	  
	/**
	*   Una vez obtenida la cadena limpia con x_evalAjaxResponse
	*   se retorna un array asociatovio con el error o la variable que sea y el 
	*   valor de la siguiente manera variable =  valor. Variable deberia estar
	*   creada.
	*
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*    	 
	*/    
	function x_ajaxResponseToArray(cadenaArray){
		var arrayResult = new Object(); 

		var arrayVariables = cadenaArray.split('&');

		for (var i=0 ; i < arrayVariables.length ;i++ ){

			corte = arrayVariables[i].split("=");
			if (corte.length>1){
				var indice = ""+corte[0];
				arrayResult[indice] = trim(corte[1]);
			} 
		}

		return arrayResult;    
	}

	/**
    * Recorre todas las variables en cadena y asigna el mesaje corresponidente
    * a cada una. Se utiliza para los Spry
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>	
    */   
	function x_assignMsgVars(cadena){
		var mensajes = new Object(); 
		mensajes = x_ajaxResponseToArray(cadena);    
		for ( keyVar in mensajes ) {
				global_vars[keyVar].mensajeAjax(mensajes[keyVar],'');
		}
	}
	
	/**
	* Llama al metodo validate de todas las variables widgets.
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>	
	*/       
	 function x_validateForm(formulario){
		var retorno = true;
		for ( keyVar in global_vars ) {	
	
				if (formulario.elements[keyVar])  {
	
					if (!formulario.elements[keyVar].disabled ){
	
						if (!global_vars[keyVar].validate()) {
							retorno = false; 
						}
					}
				}
		}
		return retorno;
	}
	
	/**
	*
	*  	muestra el mensaje de Cargando 
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>
	*/   	
    function x_showLoading(){
        
        if ($('loading')){
            $('loading').show();              
        }
        
    }

	/**
    *
    *  Oculta el mensaje de cargando
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*	@author Emanuel del Barco <emanueldb@gmail.com>	 
    */                       
    function x_hideLoading(){
        
        if ($('loading')){            
            $('loading').hide();              
        }
    }
	

	/**
	*	Realiza la carga de un modulo solicitado en un div determinado (destination_id)
	*	Se considera un modulo una entidad dividida en tres:
	*		- HTML (presentacion)
	*		- PHP (Logica del modulo)
	*		- JS (JS propio del modulo)
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*/
	function x_loadModule(module,submodule, params, destination_id) {
		
		//TODO: realizar version 2.0 con parametros extras donde se pueda setear si se oculta el div.. si se muestra un mensaje.. si se ejecuta alguna funcion.. etc.
		global_vars = new Object(); 
        var url = "go.php?";
		var parametros_new = "modulo="+module+"&"+"submodulo="+submodule+"&"+params+"&fromajax=1&";

		var result = new String();

			var objetoAjax = new Ajax.Request(
				url, 
				{
					method: 'POST', 
					parameters: parametros_new, 
					onLoading : function (){ x_showLoading();},
					onSuccess : function (){ x_hideLoading();},
					onComplete: function(transport) {

									// Realizamos la carga del modulo
									x_showModule(escape(transport.responseText), destination_id);									
									// Cargamos el Archivo JS correspondinte al modulo
									//x_loadJs("core/helpers/help.filesystem.php?request=javascript_exist&module="+module+"&submodule="+submodule) ;
									x_loadJs("go.php?action=1&helper=filesystem&request=javascript_exist&module="+module+"&submodule="+submodule) ;
					},
					onFailure:  "doError",
					asynchronous : true
				});
			
			return result;   
	}
	


	/**
	*
	*  x_showModule Funcion que carga por AJAX un Modulo HTML
	*  Nos quedamos en la misma página. No redireccionamos. Solo cambiamos el contenido del id=destino
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*/	
	function x_showModule(responseText, destino){
		//TODO: cambiar el nombre a showContentIntoDiv() o similar para darle mas de un uso
		$(destino).innerHTML = unescape(responseText);
	
		return  ;
	}

	/**
	* Carga un Js nuevo en la pagina
	*
	* 	@author Sebastian Balestrini <sbalestrini@gmail.com>
	*
	*/
	function x_loadJs(script) {

        var objetoAjax = new Ajax.Request(
        	script, 
        	{
        		method: 'GET', 
        		parameters: "", 
        		onComplete: function(transport) {
        
                        	if (transport.responseText != "") {
                        		
                        		fileref ="";
                        		fileref=document.createElement('script');
                        		fileref.setAttribute("type","text/javascript");
                        		fileref.setAttribute("src", transport.responseText);
                        		document.getElementsByTagName("head").item(0).appendChild(fileref);
                        	}
        		},
        		onFailure:  "doError",
        		asynchronous : true
        	});
        

	}
	
    /**
     *  Maneja las distintas respuesta de un script
     *  Errores, mensajes, alertas...etc.     
     *  Tambien asigna si existen los mensajes spry
     *  
     *   @author Emanuel del Barco <emanueldb@gmail.com>     
     *
     */                   		
	function x_processResponse(responseText){
        
        var responseObject = new Object();
        
        responseObject = x_evalAjaxResponse(responseText);
        
        if (responseObject['true']){
            x_showMsg(responseObject['true'],'true');
        }else if (responseObject['msg']){
            x_showMsg(responseObject['msg'],'msg');
        }else if (responseObject['alert']){
            x_showMsg(responseObject['alert'],'alert');
        }else if (responseObject['false']){
            x_showMsg(responseObject['false'],'false');
        }else if (responseObject['spry']){
            x_assignMsgVars(responseObject['spry']);
        }
        
        return;
    }

