var xmlDocumentLoaded;
var isIE = false;
var xmlDocVersions = new Array("Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "Msxml2.DOMDocument", "Microsoft.DOMDocument");
var XMLcache;

//Partie AJAX
function ServerRequest() {
  //Initialisation de la partie XMLHttpRequest
  if(window.XMLHttpRequest) {
    this.httpRequest = new XMLHttpRequest();
  }
  else {
    if(window.ActiveXObject) {
      this.httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
      isIE = true; 
    }
    else {
      // XMLHttpRequest non supporté par le navigateur   
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");   
      return;   
    }
  }
  
  // Pouet
  
  //Requête
  this.request = null;
  
  //Action à entreprendre 1:suppression 2:édition 3:ajout
  this.action = null;
  
  //Sauvegarde des anciennes informations d'un événement si besoin
  this.nodeBackup = null;
  
  //Identifiant unique si nécessaire
  this.identifiant = null;
  
  //L'élément à-t-il été ajouté dans le cache ? 1:oui 0:non
  this.cache = 0;
}

//Fonction de génération d'IDs aléatoires
function idRandom() {
  var id = Math.round(Math.random()*10000);
  if(id == 10000) {
    id = 0;
  }
  return id;
}

function getXHR(xhr_object,after) {
  //Utilisation de l'XMLHttpRequest pour l'appel au server
  xhr_object.httpRequest.open("POST", "xslt.aspx", true);   
  xhr_object.httpRequest.onreadystatechange = function() {
    xmlLoaded(xhr_object,after);
  }
  xhr_object.httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhr_object.httpRequest.send(xhr_object.request);
}

function xmlLoaded(xhr_object,after,actionResolutionProblem) {

  if (xhr_object.httpRequest.readyState == 4) {
    //try {
      if (xhr_object.httpRequest.status == 200) {
        if (isIE) {
          loadFromXml(xhr_object.httpRequest.responseXML.xml, 0);
        } 
        else {
          xmlDocumentLoaded = xhr_object.httpRequest.responseXML;
          //debug('xmlLoaded ==> xmlDocumentLoaded chargé');
        }
        
        //Fonction a exécuter pour le traitement
        //c'est-à-dire remplir le cache avec les infos reçues
        if(after) {
          //debug('xmlLoaded ==> appel after');
          eval(after);
        }
        
      }
      else {
      	if(actionResolutionProblem) {
          actionResolutionProblem(xhr_object);
        }
      }
    /*}
    catch(e) {
      alert("Catch : "+e)
      actionResolutionProblem(xhr_object);
    }*/
  }
  
}
//Fin partie AJAX

function loadFromXml(xmlText, index) {
  if (window.ActiveXObject && index < xmlDocVersions.length){ 
    try{ 
      xmlDocumentLoaded = new ActiveXObject("Msxml2.DOMDocument"); 
      xmlDocumentLoaded.async="false"; 
      xmlDocumentLoaded.loadXML(xmlText); 
      
    }
    catch(e){ 
      loadFromXml(xmlText, index+1); 
      return;
    } 
  } 
  if (document.implementation.createDocument){ 
    var parser = new DOMParser(); 
    xmlDocumentLoaded = parser.parseFromString(xmlText, "text/xml"); 
  } 
}

function actionResolutionProblem(xhr_object) {
}

function actionResolution(xhr_object) {
}

function xpathNodeList(expression,node,doc) {
  var isIE = false;
  var nodes = new Array();

  if(window.ActiveXObject) {
    isIE = true;
  }
  
  if (isIE) {
    var nodeList = node.selectNodes(expression);
    for(u=0;u<nodeList.length;u++) {
      nodes[u] = nodeList.item(u);
    }
  }
  else {
    var xpathresult = doc.evaluate(expression, node, null, 6, null);
    
    for(u=0;u<xpathresult.snapshotLength;u++) {
      nodes[u] = xpathresult.snapshotItem(u);    
    }
  }
  
  return nodes;
}

function getChildData(parentEl) {
  if (parentEl == null) {
    return null;
  }
  var tempNode = parentEl.firstChild;
  var text="";
  
  while (tempNode != null) {
    switch (tempNode.nodeType) {
      case 3 /*TEXT_NODE*/ :
        text+=tempNode.nodeValue;
      break;

      case 4 /*CDATA_SECTION_NODE*/ :
        text+=tempNode.nodeValue;
      break;
      
      default :
      break;
    }
    tempNode = tempNode.nextSibling;
  }
  return text;
}
