/**
* Created on 07/03/2006
* @author Salva
*/

function AJAX ()
{
  var debug = false;
  var http_request = false;
  var xml = false;

  this.alerta = function(msg)
  {
    if (this.debug)
      alert(msg);
  }
  
  this.makeRequestXML = function  (url, funcioCallBack)
  {
    this.xml = true;
    this.makeRequest(url, funcioCallBack);
    this.xml = false;
  }
  
  this.makeRequest = function (url, funcioCallBack)
  {
    // Inici creaci� objece AJAX  
    this.http_request = false;
    if (window.XMLHttpRequest) 
    { // Mozilla, Safari,...
      this.http_request = new XMLHttpRequest();
      if (this.http_request.overrideMimeType) 
              this.http_request.overrideMimeType('text/xml');   
    } 
    else if (window.ActiveXObject) 
    { // IE
      var MSxmlHttp = new Array ("Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
      for (var i=0; i<MSxmlHttp.length; i++)
      {
        try
        {
          this.http_request = new ActiveXObject(MSxmlHttp[i]);
        } catch (e) { this.alerta("A1"+e.message); }
      }
    }

    if (!this.http_request) 
    {
      this.alerta('No XMLHTTP');
      return false;
    }
    // Fi creaci� objece AJAX  

    var crida = funcioCallBack.split(")");
    crida = crida[0].split("(");
    var capa = document.getElementById(crida[1]);
    var ini = capa.innerHTML;
  
    try
    {
      // Assigna una funci� d'espera de resultat
      this.http_request.onreadystatechange = this.getFuncio(this.http_request, eval(crida[0]), crida[1], ini, this.xml);
//      var Qurl = "q="+url.substr(url.search("=")+1,url.length);
      this.http_request.open("GET", url, true);
//      this.http_request.open("POST", url, true);
          
      this.http_request.setRequestHeader("Cache-Control", "no-cache");
      this.http_request.setRequestHeader("Pragma", "no-cache");
      this.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      this.http_request.setRequestHeader("Content-length", url.length);
      this.http_request.setRequestHeader("Connection", "close");
      this.http_request.send(null);//Qurl
    }
    catch(e){ this.alerta("A2"+e.message); }

    return true;
  }
  
  this.makeRequestAfegir = function (url, funcioCallBack)
  {
    // Inici creaci� objece AJAX  
    this.http_request = false;
    if (window.XMLHttpRequest) 
    { // Mozilla, Safari,...
      this.http_request = new XMLHttpRequest();
      if (this.http_request.overrideMimeType) 
              this.http_request.overrideMimeType('text/xml');   
    } 
    else if (window.ActiveXObject) 
    { // IE
      var MSxmlHttp = new Array ("Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
      for (var i=0; i<MSxmlHttp.length; i++)
      {
        try
        {
          this.http_request = new ActiveXObject(MSxmlHttp[i]);
        } catch (e) { this.alerta("A1"+e.message); }
      }
    }

    if (!this.http_request) 
    {
      this.alerta('No XMLHTTP');
      return false;
    }
    // Fi creaci� objece AJAX  

    var crida = funcioCallBack.split(")");
    crida = crida[0].split("(");
    var capa = document.getElementById('divNull');
    var ini = capa.innerHTML;
  
    try
    {
      // Assigna una funci� d'espera de resultat
      this.http_request.onreadystatechange = this.getFuncioAfegir(this.http_request, eval(crida[0]), 'divNull', crida[1], ini, this.xml);
//      var Qurl = "q="+url.substr(url.search("=")+1,url.length);
      this.http_request.open("GET", url, true);
//      this.http_request.open("POST", url, true);
          
      this.http_request.setRequestHeader("Cache-Control", "no-cache");
      this.http_request.setRequestHeader("Pragma", "no-cache");
      this.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      this.http_request.setRequestHeader("Content-length", url.length);
      this.http_request.setRequestHeader("Connection", "close");
      this.http_request.send(null);//Qurl
    }
    catch(e){ this.alerta("A2"+e.message); }

    return true;
  }


  this.makeRequestPost = function (url, params, funcioCallBack)
  {
    // Inici creaci� objece AJAX  
    this.http_request = false;
    if (window.XMLHttpRequest) 
    { // Mozilla, Safari,...
      this.http_request = new XMLHttpRequest();
      if (this.http_request.overrideMimeType) 
              this.http_request.overrideMimeType('text/xml');   
    } 
    else if (window.ActiveXObject) 
    { // IE
      var MSxmlHttp = new Array ("Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
      for (var i=0; i<MSxmlHttp.length; i++)
      {
        try
        {
          this.http_request = new ActiveXObject(MSxmlHttp[i]);
        } catch (e) { this.alerta("A1"+e.message); }
      }
    }

    if (!this.http_request) 
    {
      this.alerta('No XMLHTTP');
      return false;
    }
    // Fi creaci� objece AJAX  

    var crida = funcioCallBack.split(")");
    crida = crida[0].split("(");
    var capa = document.getElementById(crida[1]);
    var ini = capa.innerHTML;
  
    try
    {
      // Assigna una funci� d'espera de resultat
      this.http_request.onreadystatechange = this.getFuncio(this.http_request, eval(crida[0]), crida[1], ini, this.xml);

      this.http_request.open("POST", url, true);          
      this.http_request.setRequestHeader("Cache-Control", "no-cache");
      this.http_request.setRequestHeader("Pragma", "no-cache");
      this.http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      this.http_request.setRequestHeader("Content-length", url.length);
      this.http_request.setRequestHeader("Connection", "close");
      this.http_request.send(params);//Qurl
    }
    catch(e){ this.alerta("A2"+e.message); }

    return true;
  }


  this.makeRequestForm = function (url, nameOfFormToPost, funcioCallBack)
  {
    // Agafem els parametres del formulari.
    var params = this.getFormAsString(nameOfFormToPost);
    this.makeRequestPost(url, params, funcioCallBack);

    return true;
  }
  
  //Aquesta funcio fa un submit del formulari, si la funcio que se li pasa com a parametre (funcioValidar) retorna true
  this.makeRequestFormValidat = function (url, nameOfFormToPost, funcioCallBack, funcioValidar)
  {
    if(eval(funcioValidar))
    {
      // Agafem els parametres del formulari.
      var params = this.getFormAsString(nameOfFormToPost);
      this.makeRequestPost(url, params, funcioCallBack);
      return true;
    }

    return false;
  }
  
  //Aquesta funcio fa un submit del formulari, si la funcio que se li pasa com a parametre (funcioValidar) retorna true
  this.makeRequestFormValidatFormName= function (url, nameOfFormToPost, funcioCallBack, funcioValidar)
  {
    var crida = funcioValidar.split(")");
    crida = crida[0].split("(");
    var formName = crida[1]
    var funVali = crida[0].concat("('").concat(formName).concat("')");
	 
	if(eval(funVali))
	{
	  // Agafem els parametres del formulari.
	  var params = this.getFormAsString(nameOfFormToPost);
	  this.makeRequestPost(url, params, funcioCallBack);
	  return true;
	}
	return false;
}

  this.makeRequestTooltip = function (msgKey, objRef)
  {
    url='thoro/util/tooltip.jps?msg.key='+msgKey;
    this.makeRequest(url, 'ajaxResultatTooltip(tooltip, objRef)');

    return true;
  }
  
  this.getFuncio = function (req, call, obj, ini, xml)
  {
    return function ()
    {
      var capa = document.getElementById(obj);
      try
      {
        switch (req.readyState)
        {
          case 0:
          case 1:
              capa.innerHTML = "<center><img src=\"/img/load.gif\" title=\"Loading...\" /></center>";
              break;			
          case 2:
              capa.innerHTML = "<center>Loaded</center>";
              break;
          case 3:
              capa.innerHTML = "<center><img src=\"/img/load.gif\" title=\"Procesing...\" /></center>";
              break;			
          case 4:
              if (req.status == 200) 
              {
                capa.innerHTML = ini;
                if (xml) call(req.responseXML, obj);
                else call(req.responseText, obj);
               }
               else
               {
                 alert("A4:"+req.status+': '+req.responseText);
                 return false
               }
               break;
        }
      } catch(e) { /*alert("A3:"+e.message); */ }
    }
  }

  this.getFuncioAfegir = function (req, call, obj, codi, ini, xml)
  {
    return function ()
    {
      var capa = document.getElementById(obj);
      try
      {
        switch (req.readyState)
        {
          case 0:
          case 1:
              capa.innerHTML = "<center><img src=\"/img/load.gif\" title=\"Loading...\" /></center>";
              break;			
          case 2:
              capa.innerHTML = "<center>Loaded</center>";
              break;
          case 3:
              capa.innerHTML = "<center><img src=\"/img/load.gif\" title=\"Procesing...\" /></center>";
              break;			
          case 4:
              if (req.status == 200) 
              {
                capa.innerHTML = ini;
                if (xml) call(req.responseXML, obj, codi);
                else call(req.responseText, obj, codi);
               }
               else
               {
                 alert("A4:"+req.status+': '+req.responseText);
                 return false
               }
               break;
        }
      } catch(e) { /*alert("A3:"+e.message); */ }
    }
  }
////////////////////////////////////////////////////////////////	
  this.fillGSelect = function (resposta, obj)
  {
    var sel = document.getElementById(obj);
    var i;
    for (i = sel.length - 1; i>=0; i--)
    sel.remove(i);

    var texts = resposta.split('#');  	
    for (val=0;val<texts.length;val++)
    {
      var OptNew = document.createElement('option');
      var tmp = texts[val].split("@");  
      OptNew.text = tmp[0];
      OptNew.value = tmp[1];
      
      try 
      {
        sel.add(OptNew, null); //standards
      }
      catch(ex) { sel.add(OptNew); /* IE */ }
    }
  }

  this.toolTip = function(msg, posicio)
  {
    var capa = document.getElementById('tooltip');
    var content = '<div id="tooltipObj">'+
                    '<div id="tooltip_arrow" class="tooltip_arrow"></div>'+
                      '<div id="tooltip_content" class="tooltip_content">'+msg+
                      '</div>'+
                    '</div>';
//    var content = "<center>"+msg+"</center>";
//    content += '<center><form name="f" method="post" action="">';
//    content += '<input type="button" name="s" value=" Aceptar " onclick="document.getElementById(\''+obj+'\').style.display = \'none\';"/></form></center>';

    var x = (posicio[0] + 30);
    var y = posicio[1];
    capa.innerHTML = content;
    capa.style.left = x + 'px';
    capa.style.top = y + 'px';
    capa.style.display = "block";
  }

this.getFormAsStringOriginal = function (formName)
{

  //Setup the return String
  returnString ="";
  
  //Get the form values
  formElements=document.forms[formName].elements;
  
  //loop through the array , building up the url
  //in the form /strutsaction.do&name=value
  
  for ( var i=formElements.length-1; i>=0; --i )
  {
    //we escape (encode) each value
    returnString=returnString+"&"+escape(formElements[i].name)+"="+escape(formElements[i].value);
  }
  
  returnString = returnString.substring(1,returnString.length);
  //return the values
  return returnString; 
}

this.getFormAsString = function (formName)
{
  //Setup the return String
  returnString ="";
  returnString2 ="";
  
  //Get the form values
  formElements=document.forms[formName].elements;
  
  for ( var i=formElements.length-1; i>=0; --i )
  {
    //we escape (encode) each value
    //alert(formElements[i].tagName+' -- '+formElements[i].type+'**'+(formElements[i].type != "checkbox"?escape(formElements[i].value):formElements[i].checked));
    if (formElements[i].tagName == "INPUT") {
      if (formElements[i].type == "text") 
      {
      	if(BrowserDetect.browser == "Firefox" || BrowserDetect.browser == "Chrome")
      		{
      		returnString += formElements[i].name + "=" + this.escapeMozilla(formElements[i].value) + "&";
//      		alert(this.escapeMozilla(formElements[i].value));
      		}
      		
      	else
      		returnString += formElements[i].name + "=" + escape(formElements[i].value) + "&";
      	
      }
      if (formElements[i].type == "hidden") {
      	if(BrowserDetect.browser == "Firefox")
      		returnString += formElements[i].name + "=" + this.escapeMozilla(formElements[i].value) + "&";
      	else
      		returnString += formElements[i].name + "=" + escape(formElements[i].value) + "&";
      }
      if (formElements[i].type == "checkbox") {
         if (formElements[i].checked) {
      	   returnString += formElements[i].name + "=true&";
         } else {
      	   returnString += formElements[i].name + "=false&";
         }
      }
      if (formElements[i].type == "radio") {
         if (formElements[i].checked) {
      	   returnString += formElements[i].name + "=" + formElements[i].value + "&";
         }
      }
   }   
    else if (formElements[i].tagName == "SELECT") {
      var sel = formElements[i];
      var x = sel.selectedIndex;
      if(x==-1) x=0;
      returnString += sel.name + "=" + sel.options[x].value + "&";
   }
    else if (formElements[i].tagName == "TEXTAREA") {
    	if(BrowserDetect.browser == "Firefox" || BrowserDetect.browser == "Chrome")
    	{	
    		returnString += formElements[i].name + "=" + this.escapeMozilla(formElements[i].value) + "&";
    	}
    	else
  	 	returnString += formElements[i].name + "=" + escape(formElements[i].value) + "&";
//    	returnString += formElements[i].name + "=" + this.escapeMozilla(formElements[i].value) + "&";
//    	returnString += formElements[i].name + "=" + formElements[i].value + "&";
//    returnString += formElements[i].name + "=" + encodeURIComponent(formElements[i].value) + "&";
  	 
//  	alert("moz: "+this.escapeMozilla(formElements[i].value)+"\nesc: "+escape(formElements[i].value));
//  	alert(encodeURIComponent(formElements[i].value));
    }
    //returnString2=returnString2+"&"+escape(formElements[i].name)+"="+(formElements[i].type != "checkbox"?escape(formElements[i].value):formElements[i].checked);
  }
  //returnString2 = returnString2.substring(1,returnString2.length);
  //return the values
  //alert(returnString);
  return returnString; 
}

this.escapeMozilla = function (str)
{
	  str = str.replace(/%/g,"%25");
	  str = str.replace(/&/g,"%26");
//	  str = str.replace(/€/g,"%80");
	  return str.replace(/\+/g,"%2B");
}

}

