
function fenris_escape(data) {
  var t=data.split('=');
  var str=t[0];
  for (i = 1; i < t.length; i++) {
    str=str+"%3D"+t[i];
  }
  t=str.split('&');
  str=t[0];
    for (i = 1; i < t.length; i++) {
    str=str+"%26"+t[i];
  }
  return str;
 return
}

/* classe exception */
function createException(msgNum, msgText) {
  this.messageNumber = msgNum;
  this.messageText = msgText;
}

/* objets exception */
var XMLHTTPError = new createException(99, 'XmlHttp Error');
var XSLTError = new createException(98, 'XSLT Error');

/* instanciation de l'objet xmlhttprequest */
function getHTTPObject() {
  var xmlhttp = false;
  try {
    xmlhttp = new XMLHttpRequest();
  }
  catch (e) {
    xmlhttp = false;
  }
  return xmlhttp;
}

/* instanciation de l'objet xsltprocessor */
function getXSLTObject() {
  var xslproc = false;
  try {
    xslproc = new XSLTProcessor();
  }
  catch (e) {
    xslproc = false;
  }
  return xslproc;
}


var processor_cache = new Array;

/* classe xmlloader */
/* parametre : url de la feuille xsl*/
function XmlLoader(xsl) {
  /*declaration*/
  var processor;
  var xslhttp;
  var translator=false;
  var trhttp;
  var querystring="";

  /*initialisation*/
  if (xsl){
    translator=getXSLTObject();
    if (translator) {
      trhttp=getHTTPObject();
      trhttp.open("GET", '/i18n/localize.xsl', false);
      trhttp.send(null);
      if (trhttp.status == 200) {
        translator.importStylesheet(trhttp.responseXML);
      }
    }

    /*recherche si le xsl est deja dans le cache*/
    processor=processor_cache[xsl];
    if (!processor) {
      processor=getXSLTObject();
    }
    if (processor) {
      /*instanciation de la requete xmlhttprequest pour charger la feuille xsl*/
      xslhttp=getHTTPObject();
      if(xslhttp) {
        /*préparation de la requete en mode synchrone*/
        xslhttp.open("GET", "/xsl/"+xsl+".xsl", false);
        xslhttp.send(null);
        if (xslhttp.status == 200) {
	  /* le xsl a été récupéré, on initialise le processeur */
	  try {
            processor.importStylesheet(xslhttp.responseXML);
	    processor_cache[xsl] = processor;
          }
          catch (e) {
	    processor=false;
          }
        }else {
          processor=false;
        }
      } else {
        processor=false;
      }
    }
  }

  this.setParameter = function(name,value) {
    if (processor) {
      processor.setParameter("",name,value);
    }            
  }

  this.setQueryString = function(qs) {
    querystring="?"+encodeURI(qs);
  }

  /*methodes */
  /* update : met à jour le contenu de l'élément portant l'id "id"
              avec le xml chargé à l'url "url" */
  this.syncUpdate = function(id,lang,xml) {
    /* récupere l'element DOM correspondant à l'id */
    var snode=document.getElementById(id);
    try {
      if (snode) {
        var xmlhttp=getHTTPObject();
        if(xmlhttp) {
          var xmlurl;
          try {
            if (processor) {
   	      translator.setParameter("","src","/i18n/g/translations_"+xsl+"_"+lang+".xml");
              xmlurl=xml+"/xml"+querystring;
	      // appel synchrone
              xmlhttp.open("GET", xmlurl, false);
              xmlhttp.send(null);
              if (xmlhttp.status == 200) {
                while(snode.hasChildNodes()){
                  snode.removeChild(snode.firstChild);
                }
  	        var nnode = processor.transformToDocument(xmlhttp.responseXML, snode.ownerDocument);
	        var tnode = translator.transformToFragment(nnode,snode.ownerDocument);
  	        snode.appendChild(tnode);
              } else {
                throw XMLHTTPError;
              }
            } else {
              throw XMLHTTPError;
            }
          }
          catch (e) {
            xmlurl=xml+"/xhtml"+querystring;
	    // appel synchrone
            xmlhttp.open("GET", xmlurl, true);
            xmlhttp.onreadystatechange = function() {
              if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                  while(snode.hasChildNodes()){
                    snode.removeChild(snode.firstChild);
                  }
                  snode.innerHTML = (new XMLSerializer).serializeToString(xmlhttp.responseXML);
                } else {
	          throw XMLHTTPError;
                }
              }
            }
            xmlhttp.send(null);
          } 
        } else {
          throw XMLHTTPError;
        }
      }
    }
    catch (e) {
      window.location=xml+"/page"+querystring;
    }
  }

  var parameters='';
  var callback=function(p){};

  this.setCallback = function(cb,p) {
    callback=cb;
    parameters=p;
  }

  this.update = function(id,lang,xml) {
    var params='';
    /* récupere l'element DOM correspondant à l'id */
    var snode=document.getElementById(id);
    try {
      if (snode) {
        var xmlhttp=getHTTPObject();
        if(xmlhttp) {
          var xmlurl;
          if (processor) {
 	    translator.setParameter("","src","/i18n/g/translations_"+xsl+"_"+lang+".xml");
            xmlurl=xml+"/xml"+querystring;
            xmlhttp.onreadystatechange = function() {
              if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                  var snode=document.getElementById(id);
                  while(snode.hasChildNodes()){
                    snode.removeChild(snode.firstChild);
                  }
	          var nnode = processor.transformToDocument(xmlhttp.responseXML, snode.ownerDocument);
		  var tnode = translator.transformToFragment(nnode,snode.ownerDocument);
   		  snode.appendChild(tnode);
		  callback(parameters);
		  callback=function(p){};
                }
              }
            }
          } else {
            if (querystring=="")
	      xmlurl=xml+"/xhtml?rand="+Math.random();
            else
	      xmlurl=xml+"/xhtml"+querystring+"&rand="+Math.random();
            xmlhttp.onreadystatechange = function() {
              if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                  var snode=document.getElementById(id);
                  while(snode.hasChildNodes()){
                    snode.removeChild(snode.firstChild);
                  }
//                  try {
//                    var frag=snode.ownerDocument.importNode(xmlhttp.responseXML.documentElement,true);
//		    snode.appendChild(frag);
//                  }
//                  catch (e) {
                    var frag=(new XMLSerializer).serializeToString(xmlhttp.responseXML);
                    snode.innerHTML = frag;
//                  }
		  callback(parameters);
		  callback=function(p){};
                }
              }
            }
          } 
          xmlhttp.open("GET", xmlurl, true);
          xmlhttp.send(null);
        }
      }
    } 
    catch (e) {
      window.location=xml+"/page"+querystring;
    }
  }
}

