	// 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;
            }

            //fix wysiwyg
            var textAreas = $$(".xinha_textarea");
            
        //    alert(textAreas);
            
            for(var i = 0; i<textAreas.length;i++){
                updateTextAreas(textAreas[i].id);
            }


            // 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+"&fromajax=1",
				onLoading : function (){ x_showLoading(); if (enable_button) { x_showLoadingInContext()} },
				onSuccess : function (){ x_hideLoading(); if (enable_button) { x_hideLoadingInContext() }},
				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, this_controller) {

		//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();
				
		// Si no se recibe un controller se utiliza el de la vista que hizo la llamada
		if (typeof this_controller =="undefined") {
			 var url = controller+".php?";
		} else {
			var url = this_controller+".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("common.php?action=1&helper=filesystem&request=javascript_exist&module="+module+"&submodule="+submodule+"&controller="+controller) ;
					},
					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;
    }


    function sortElements(secuence,type){

        var secuenceSorted=Sortable.sequence($(secuence));
        x_doAjaxCall("post","common.php?action=1&modulo=common&submodulo=sort","secuencia="+secuenceSorted+"&tipo="+type,doSortElements,"","",true,false) ;

    }

    function doSortElements(responseText){
        //codigo aqui
        ;
    }



	/**
	*  Habilita/Deshabilita un determinado grupo de inputs segul el parametro state
	*
	* 	@author Emanuel del Barco <emanueldb@gmail.com>
	*
	*/

	function x_disableInupts(TypeInput){

        var elements = $$('input');

        for(var i=0;i < elements.length;i++ )
            if (elements[i].type == TypeInput)
                elements[i].disabled = true;

    }

	/**
	*  Habilita/Deshabilita un determinado grupo de inputs segul el parametro state
	*
	* 	@author Emanuel del Barco <emanueldb@gmail.com>
	*
	*/

	function x_enableInupts(TypeInput){

        var elements = $$('input');

		// Iteramos sobre los inputs
        for(var i=0;i < elements.length;i++ ) {
            if (elements[i].type == TypeInput)
                elements[i].disabled = false;

	    }
		
		// ahora verificamos que este activado el loading contextual
		if ($('active_loading_in_context')) {
			
				if ($F('active_loading_in_context') == "1") {
					
					x_hideLoadingInContext();
				}
		}
	}


