// 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) {
	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
		
		if (xml.documentElement != null) {
			var xml = xml.documentElement;
		}
		
		var err = xml.getAttribute('erreur');
		
		if (debugMode) { var debug = getDebug(xml,err); }
	
		if (err=="true") {
			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;
	}
}

/**	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)
		}
	}
}
