	// JavaScript Document
	
	// Removes leading whitespaces
	function LTrim( value ) {
		
		var re = /\s*((\S+\s*)*)/;
		return value.replace(re, "$1");
		
	}
	
	// Removes ending whitespaces
	function RTrim( value ) {
		
		var re = /((\s*\S+)*)\s*/;
		return value.replace(re, "$1");
		
	}
	
	// Removes leading and ending whitespaces
	function trim( value ) {
		
		return LTrim(RTrim(value));
		
	}	
	  /**
	   * sendAndLoad Toma el formulario del document actual y ejecuta su ajax
	   * Valida primero que todos los requeridos y demas condiciones   
	   *  Autor: Sebastian Balestrini sbalestrini@gmail.com
	   *   
	   */         	 
	function sendAndLoad(func_completo, formulario) {
		//alert('SendAndLoad Va a ejecutar: '+func_completo);
		//alert(formulario.name);
		if  (validarVariables(formulario)){
			//alert('Se termino de Validar Variables');
			var url = formulario.action+"?";      
			//alert("url de Ajax: "+ url); 
			//form de abm
			//var form = $("formulario");    
			/* creacion del objeto ajax y llamada a la accion*/ 
			ejecutaAjax("get",url,arma_parametros_ajax(formulario),func_completo,'',"doError", true) ;
		}		

	return;
	}	  
	  /**
	   * Ejecuta una funcion pasada como parametro  
	   * params metodo: 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    
	   */              
	function ejecutaAjax(metodo, url, parametros, func_completo,params_func,func_error, asincrono ){

		if(asincrono==false)
			asincrono = false;
		else
			asincrono = true;


		var result = new String();	  
		var objetoAjax = new Ajax.Request(
			url, 
			{
				method: metodo, 
				parameters: parametros, 
				onComplete: function(transport) {
				//alert("Funcion: "+ func_completo);
				//alert("Resultado: "+transport.responseText);
				var strFuncionCompleta = func_completo;
				if (params_func =="")
					strFuncionCompleta= strFuncionCompleta +"('"+escape(transport.responseText)+"')";
				else
					strFuncionCompleta= strFuncionCompleta +"('"+escape(transport.responseText)+"',"+params_func+")";
		//				alert("Cadena evaluacion "+"result = "+strFuncionCompleta) ;
						result = eval(strFuncionCompleta);
		//					alert(result);					
				},
				onFailure:  func_error,
				asynchronous : asincrono
			});

		// alert("Resultado evaluacion :" +func_completo+"; resultado :"+result);

		return result;   
	}
	  
	  
	  
	/**
	*
	*  arma_parametros_ajax Dado un form recorre todo los elementos y se arma
	*  string con forma de parametro GET de php
	*/ 
	  
	function arma_parametros_ajax(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
	*   evaluarTrue si evaluamos x falos o por true
	*/         		
	function evaluarRetornoAjax(cadenaEvaluacion){
		var retorno=  new Object();
		retorno['false'] = extraerPorDelimitador(cadenaEvaluacion,'[false]')
		retorno['true']  = extraerPorDelimitador(cadenaEvaluacion,'[true]');
		retorno['error']  = extraerPorDelimitador(cadenaEvaluacion,'[error]');
		return retorno; 		 	
	}
	  

	/**
	 *   Extra una cadena segun un delimitador
	 *   si no puede extrar devuleve vacio	 
	 */    
	 function extraerPorDelimitador(cadenaEvaluacion,delimitador) { 
		var data = new String(unescape(cadenaEvaluacion));
		//alert(data); 
		var begin =data.indexOf(delimitador)+delimitador.length;
		if (begin > 0){
			var data_t= data.substring(begin,data.length);
            var end = data_t.indexOf(delimitador);
			if (end>0)
			return data = data_t.substring(0,end);
			else
			return '';	
		}else
		return '';
	      
	  }
	/**
	 *   Una vez obtenida la cadena limpia con evaluarRetornoAjax
	 *   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.
	 *    	 
	 */    
	function retornoArrayParametrosAjax(cadenaArray){
		var arrayResult = new Object(); 

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

		// arrayResult = new Array();
		for (var i=0 ; i < arrayVariables.length ;i++ ){
			//corte = new Array('9','10'); //arrayVariables[i].split("=");
			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
    */   
	function asignaMensajesVariables(cadena){
		var mensajes = new Object(); 
		mensajes = retornoArrayParametrosAjax(cadena);    
		for ( keyVar in mensajes ) {
			//alert("Vaiables a setar :"+keyVar+", contenido :"+mensajes[keyVar]);
			variables[keyVar].mensajeAjax(mensajes[keyVar],'');
		}
	}
	 /**
	* Llama al metodo validate de todas las variables widgets.
	* Autor: Sebastian Balestrini sbalestrini@gmail.com
	*/       
	 function validarVariables(formulario){
		var retorno = true;
		for ( keyVar in variables ) {	
				//alert("Validando " + keyVar);
				if (formulario.elements[keyVar])  {
					//alert(keyVar + " Existe en el formulario");
					if (!formulario.elements[keyVar].disabled ){
						//alert(keyVar + " NOT DISABLED");
						if (!variables[keyVar].validate()) {
							//alert("False");
							retorno = false; 
						}
					}
				}
		}
		return retorno;
	}


	/**
	* Realiza la carga de un modulo solicitado
	*
	*
	*/
	function loadModulo(modulo,submodulo, parametros, destino) {
		
		variables = new Object(); 
        var url = "http://www.tusprogramas.com/";
		var parametros_new = "modulo="+modulo+"&"+"submodulo="+submodulo+"&"+parametros+"&fromajax=1&";
//		alert("LoadModulo params: " + parametros_new);
		var result = new String();

			var objetoAjax = new Ajax.Request(
				url+"go.php?", 
				{
					method: 'GET', 
					parameters: parametros_new, 
					onLoading : function (){ showLoading();} ,
					onSuccess : function (){ hideLoading();},
					onComplete: function(transport) {

									//alert("LoadModulo: " + transport.responseText);
									// Realizamos la carga del modulo
									showModulo(escape(transport.responseText), destino);
									
									// Cargamos el Archivo JS correspondinte al modulo
									ejecutaAjax("get",url+"file_exists.php?file="+submodulo,'','loadJs','',"doError", true) ;
									//loadJs(modulo);
					},
					onFailure:  "doError",
					asynchronous : true
				});
			
			// alert("Resultado evaluacion :" +func_completo+"; resultado :"+result);
			
			return result;   

	}
	/**
	*
	*  showModulo Funcion que carga por AJAX un Modulo HTML
	*  Nos quedamos en la misma página. No redireccionamos. Solo cambiamos el contenido del id=destino
	*
	*/	
	function showModulo(responseText, destino){

		$(destino).innerHTML = unescape(responseText);
	
		return  ;
	}
	/**
	* Carga un Js nuevo en la pagina
	*
	*
	*
	*/
	function loadJs(responseText) {
		
	
		if (responseText != "") {
			
			fileref ="";
			fileref=document.createElement('script');
			fileref.setAttribute("type","text/javascript");
			fileref.setAttribute("src", responseText);
			document.getElementsByTagName("head").item(0).appendChild(fileref);
		}
	}
	
	
    /**
     *
     *  Muestra el mensaje de cargando
     *
     */   	
    function showLoading(){
        
        if( typeof( window.innerWidth ) == 'number' ){
            //Non-IE
            myWidth = window.innerWidth;
            myHeight = window.innerHeight;
        } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
            //IE 6+ in 'standards compliant mode'
            myWidth = document.documentElement.clientWidth;
            myHeight = document.documentElement.clientHeight;
        } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
            //IE 4 compatible
            myWidth = document.body.clientWidth;
            myHeight = document.body.clientHeight;
        }
        
        $('loading').style.left = (myWidth - 180) + "px";
        $('loading').style.top = "8px" ;        
        $('loading').show();
        
    }
    /**
     *
     *  Oculta el mensaje de cargando
     *
     */                       
    function hideLoading(){
        $('loading').hide();
      //  alert('termine');
    }
