/**
* Test de fonction HTTP Javascript pour la création d'un objet xmlhttp.
* Plusieurs tests assurent la compatibilité avec tous les navigateurs gérants XMLHTTPREQUEST.
* Fonction récupérée sur http://www.openweb.eu.org/.
*/
function getHTTPObject() {
	var xmlhttp = false;

	/* Compilation conditionnelle d'IE */
	/*@cc_on
	@if (@_jscript_version >= 5)
		try	{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)	{
			try	{
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (E)	{
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
	@end
	@*/

	/* on essaie de créer l'objet si ce n'est pas déjà fait */
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		}
		catch (e) {
			xmlhttp = false;
		}
	}

	
	if (xmlhttp) {
		/* on définit ce qui doit se passer quand la page répondra */
		xmlhttp.onreadystatechange =
		function() {
			if (xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200) {
					response(xmlhttp.responseText);
				}
			}
		}
	}
	return xmlhttp;
}

var bSendRequest = true;

/**
* Cette fonction permet d'insérer du code HTML dans une page html.
* Si le code HTML contient du javascript il est éxécuté. 
* \param sPostAction Fichier appelé par l'ajax.
* \param sValues     Valeurs à passer en paramètre au fichier appelé par l'ajax.
*/
function sendPOSTRequest(sPostAction, sValues) {
	if(bSendRequest) {
		var oXmlHttp = getHTTPObject();
		oXmlHttp.open("POST", sPostAction, true);
		oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		// Transformation des caractères accentués contenus dans les valeurs des paramètres de l'URL
		var aValue = sValues.match(/[\w][^\|&=\/\\.;:@\[\]`']*/g);
		if (aValue){
			var i=0;
			while(aValue[i]) {
				sValues = sValues.replace(aValue[i], escape(aValue[i]));
				i++		
			}
		}
		oXmlHttp.send("PHPSESSID="+sSessId+sValues);	
	} else {
		bSendRequest = true;
	}
}

/**
* Cette fonction permet d'insérer du code HTML dans une page html.
* Si le code HTML contient du javascript il est éxécuté. 
* \param divContent Objet div devant contenir le code HTML.
* \param HTML       Code html à insérer dans un div (pouvant contenir du code javascript).
*/
function setInnerHTML(divContent, HTML) {
    divContent.innerHTML=HTML; 
    try {
      var All=divContent.getElementsByTagName("*");
      for (var i=0; i<All.length; i++) {
        All[i].id=All[i].getAttribute("id")
        All[i].name=All[i].getAttribute("name")
        All[i].className=All[i].getAttribute("class")
      }
    } catch (ex) {}
    try {
      var AllScripts=HTML.extractTags("script");
      AllScripts.forEach(function (v) {
        eval(v);
      })
    } catch (ex) {}
    try {
      var AllStyles=HTML.extractTags("style");
      AllStyles.forEach(function (v) {
        var s=document.createStyleSheet()
        s.cssText=v;
        s.enabled=true;
      }, true)
    } catch (ex) {}
}
 
String.prototype.extractTags=function(tag) {
    var matchAll = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'img');
    var matchOne = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }
 
Object.prototype.forEach=function(delegate, ownpropertiesonly) {
        if (typeof(delegate)=="function") {
            if (this instanceof Array && typeof(ownpropertiesonly)=="undefined") {
                ownpropertiesonly=true;
            }
            for (key in this) {
                var ok = (!ownpropertiesonly);
                if (!ok) {
                    try {
                        ok=this.hasOwnProperty(key)
                    } catch (ex) {}
                }
                if (ok) {
                    try { delegate(this[key], key, this) } catch(e) {
                        // ...
                    }
                }
            }
        }
        return false;
    }
 
Object.prototype.map=function(iterator) {
    var results = [];
    this.forEach(function(value, index) {
      results.push(iterator(value, index));
    });
    return results;
  }

