	// 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");
		//alert(arma_parametros_ajax(formulario));
      if  (validarVariables(formulario)){
	
        var url = formulario.action+"?";      

        //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, 
			onLoading : function (){ showLoading();;},
			onSuccess : function (){ hideLoading();;},
			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+")";

			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();
	
	//alert(form.action);
	//alert("Arma parametros ajax: " + params);
    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]');
   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){
		//alert("Validando variables");
		
		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())
							retorno = false; 
					}
				}
		}
		return retorno;
	}


	 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();
    }
	
	
    function hideLoading(){
        $('loading').hide();
    }
  
  
  
	/**
	*
	*  doAlta Funcion q se llama despues de hacer un alta 
	*  Nos quedamos en la misma página. No redireccionamos
	*
	*/
	
	function doAlta(responseText){
		//alert(unescape(responseText));	
		var cadena = evaluarRetornoAjax(responseText);
		asignaMensajesVariables(cadena['false']+cadena['true'] );

		return  ;
	}
	
  		
	/**
	* Realiza la carga de un modulo solicitado
	*
	*
	*/
	function loadModulo(modulo, parametros, destino) {
		
		//alert("loadModulo(modulo, parametros, destino)");
		var url = "go.php?";
		var parametros_new = "modulo="+modulo+"&"+parametros+"&fromajax=1&";

		if ($('conajax').value == "1") {
			
			var result = new String();
			
			var objetoAjax = new Ajax.Request(
				url, 
				{
					method: 'GET', 
					parameters: parametros_new, 
					onLoading : function (){ showLoading();},
					onSuccess : function (){ hideLoading();},
					onComplete: function(transport) {

									//alert("resutlado del go llamado desde ajax: "+unescape(transport.responseText));
									// Realizamos la carga del modulo
									showModulo(escape(transport.responseText), destino);
									
									// Cargamos el Archivo JS correspondinte al modulo
									ejecutaAjax("get","file_exists.php?file="+modulo,'','loadJs','',"doError", true) ;
									//loadJs(modulo);
					},
					onFailure:  "doError",
					asynchronous : true
				});
			
			// alert("Resultado evaluacion :" +func_completo+"; resultado :"+result);
			
			return result;   
		} else {
			document.location.href= url + parametros_new+"&fromajax=0&";	
		}
	}
	
	/**
	*
	*  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){
		//alert("showModulo");	
//		alert(unescape(responseText));	
hideLoading();
		$(destino).innerHTML = unescape(responseText);
	
		return  ;
	}


	/**
	* Carga un Js nuevo en la pagina
	*
	*
	*
	*/
	function loadJs(responseText) {
		
		//alert("Estoy en Load JS con: " + responseText);
		if (responseText != "") {
			
			fileref ="";
			fileref=document.createElement('script');
			fileref.setAttribute("type","text/javascript");
			fileref.setAttribute("src", responseText);
			document.getElementsByTagName("head").item(0).appendChild(fileref);
		}
	}