// JavaScript Document

function getAjax() {
	try {
		//alert('msxml2');
		return new ActiveXObject('Msxml2.XMLHTTP');
	} catch (e) {
		try {
			//alert('microsoft');
			return new ActiveXObject('Microsoft.XMLHTTP');
		} catch (e) {
			//alert('xmlhttpreq');
			return new XMLHttpRequest();
			
		}
	}
}

/**
 * Perform AJAX call.
 *
 * @param {string} url URL of AJAX service.
 * @param {function} func Function to call when response arrives.
 * @param {string} method Request method post or get.
 * @param {Array} array Array with arguments to send.
 * ex : sendAjax("ajax.cfm", self.ajaxCallback, 'post', "arg1=value&arg2=value", [param1,param2]);
 */
function sendAjax(url, func, method, array, funcarray) {
	var x = getAjax();

	x.open(method, url, true);

	x.onreadystatechange = function() {
		if (x.readyState == 4) {
			//alert('responseXML : '+x.responseXML);
			//alert('responseTest : '+x.responseText);
			func(x.responseText, x.responseXML, funcarray);
			
			/*if (mode == "xml") {
				func(x.responseXML, funcarray);
			}
			else {
				func(x.responseText, funcarray);
			}*/
		}
	};

	if (method == 'post')
		x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

	x.send(array);
}


/***** FONCTIONS D'AIDE *****/


/**	Extrait le message d'erreur du XML et l'affiche dans une boite d'alerte
	xml : la structure XML donnée au callback Ajax.
*/
function showAjaxError(xml) {
	alert(xml.firstChild.firstChild.nodeValue);	
}

/**	Scan toutes les divs de debug Ajax et ajoute leur contenu à la fin de body
*/
function showHtmlAjaxError() {
	var divs = document.getElementsByTagName('div');
	var x = 0;
	//var dbg = document.getElementById('debug');
	//dbg.innerHTML += "<hr>";
	for (var i=0; i < divs.length; i++) {
		//dbg.innerHTML += "<p>class="+divs[i].getAttribute('class') + " ; " + "shown="+(divs[i].getAttribute('shown') != "true")+"</p>";
		if (divs[i].getAttribute('class') == "ajaxdebug" && divs[i].getAttribute('shown') != "true") {
			window.status = 'Found HTML debug';
			//dbg.innerHTML += "OK,";
			divs[i].setAttribute('shown', "true");
			appendDebug(divs[i].innerHTML);
			//x++;	
		}
	}
	//dbg.innerHTML += x+"/"+divs.length;
	//alert(x+"/"+divs.length);
}


/**	Extrait le debug du xml en fonction de l'état d'erreur et le renvoie.
	xml : le xml retourné au callback Ajax
	err : la valeur de l'attribut "erreur" du xml : var err = xml.getAttribute('erreur');
*/
function getDebug(xml, err) {
	//console.log(xml);
	
	if (err=="true"){
		var debug = xml.firstChild.nextSibling.firstChild.nodeValue;
	}
	else {
		var debug = xml.firstChild.firstChild.nodeValue;
	}
	
	return debug;
}

/**	Ajoute le contenu HTML passé en paramètre à la fin du BODY (après le débug Coldfusion classique s'il existe)
*/
function appendDebug(debug) {
	var ajaxdebugzone = document.getElementById('ajaxdebugzone');
	if (ajaxdebugzone == null) {
		var ajaxdebugzone = document.createElement('div');
		document.body.appendChild(ajaxdebugzone);
	}
	ajaxdebugzone.innerHTML = ajaxdebugzone.innerHTML + debug;	
}


/** Traite le callback Ajax et renvoie true si tout s'est bien passé
	Note : L'erreur n'est détectable que si du XML a été renvoyé. Si du HTML est renvoyé, true sera toujours renvoyé
	text, xml, params : les mêmes variables que celles envoyées au callback
	debugMode : par défaut à false, si true le debug est activé et affiché sur la page
*/
function checkAjax(text, xml, params, debugMode) {
	if (debugMode == null) { debugMode == false; }
	if (text == null && (xml == null || xml.documentElement == null)) {
		alert("Erreur : la fonction n'a renvoyé ni HTML, ni XML");
		return false;
	}
		
	//alert(xml);
	//alert(xml.documentElement);
	//alert(xml.firstChild);

	if (xml != null && xml.firstChild != null) {	// renvoi d'un XML
		
		//console.log("xml=", xml);
		
		if (xml.documentElement != null) {
			var xml = xml.documentElement;
		}
		
		var err = xml.getAttribute('erreur');
		var errType = xml.getAttribute('errortype');
		
		if (debugMode) { var debug = getDebug(xml,err); }
	
		if (err=="true") {
			if (errType == "-1") {	// pas une erreur custom, donc on affiche une alerte jscript
				showAjaxError(xml);
			}
			
			if (debugMode) { appendDebug(debug); }
			return false;
		}
		else {
			if (debugMode) { appendDebug(debug); }
			return true;
		}
	}
	else {	// renvoi d'un contenu HTML
		if (debugMode) { var t = setTimeout("showHtmlAjaxError()", 500); }	// scanne les divs de debug et les affiche
		return true;
	}
}

function getXML(xml) {
	if (xml != null && xml.firstChild != null) {	// renvoi d'un XML
		
		if (xml.documentElement != null) {
			var xml = xml.documentElement;
		}
		
		return xml;
		
	}
	else {	
		//throw();	// TODO
	}
}

/** Renvoie la valeur de l'attribut demandé pour le XML donné (tjs sous forme de chaine).
	L'attribut doit être un attribut de la toute première balise (<res>).
	Une chaine vide est renvoyée si l'attribut n'est pas renseigné ou n'existe pas.
*/
function getXMLAttribute(xml, attribute) {
	xml = getXML(xml);
	
	return xml.getAttribute(attribute);
}

function getXMLError(xml) {
	var res = new Object();
	res.erreur = "false";
	res.errortype = "-1";
	
	res.erreur = getXMLAttribute(xml, "erreur");
	res.errortype = getXMLAttribute(xml, "errortype");
	
	return res;
}

/**	Execute le code javascript des balises <script> contenues dans l'élément "divContent"
	A appeler une fois un contenu Ajax placé dans une page.
*/
function executeJavascript(divContent) {
	var AllScripts=divContent.getElementsByTagName("script")
	for (var i=0; i<AllScripts.length; i++) {
		var s=AllScripts[i];
		if (s.src && s.src!="") {
			// Précédement asynchrone, mis en synchrone pour éviter 
			//des problèmes de dépendances de scripts
			eval(getFileContent(s.src))
		}
		else {
			eval(s.innerHTML)
		}
	}
}

function getFileContent(url) {
	var Xhr=getAjax();
	Xhr.open("GET",url,false);
	Xhr.send(null);
	return Xhr.responseText;
}


/** Analyse le formulaire (element HTML) passé en paramètre et transforme les valeurs passées en une chaine de paramètres "nom=valeur&nom2=valeur2"
*/
function getFormAsString(form) {
	var elems = form.elements;
	var args = "";
	
	for (i=0; i < elems.length; i++) {
		args = args + elems[i].name + "=" + elems[i].value + "&";
	}
	
	args = args.substring(0,args.length-1);
	
	return args;
}

/*	Analyse le formulaire (element HTML) passé en paramètre et transforme les valeurs passées en une chaine de paramètres "nom=valeur&nom2=valeur2"
	Envoie ensuite le tout à une page Ajax qui gère l'update.
	
	ICI A TITRE D'EXEMPLE POUR UTILISER "getFormAsString()"
*/
/*function submitForm(form, pk) {
	var args = getFormAsString(form);
	
	sendAjax("/backoffice/generique/ajaxeditliste.cfm?configbase=#configbase#&modifpk="+pk, self.submitCallback, 'post', args, [pk]);
}*/

