// Fonctions Ajax



if(typeof(NC)=='undefined') NC={};
	NC.ajax= {

	ajaxLoaders:new Array(),		// Mémo des images de progression utilisées

	/* Ajax loader : chargement d'une page. Pour préserver une compatibilité maxi malgré l'utilisation du mode POST,
	 * qui évite l'écueil du cache avec IE6, et le pb de la conversion UTF8, ce script ajax ne devrait lancer que des scripts PHP 
	 * qui reverront en échange un contenu UTF8'isé, après quelques checks simples de sécurité
	 * params :
	 *		serverScript = URL absolue du script ( /xxxx/yyy/page.php )
	 *		clientID = ID de l'objet de la page courante dans lequel placer le contenu Ajax, via innerHTML
	 *		clientClass = CSS className to apply to clientID after its update
	 *		callback = optional callback function. We first launch the content redraw function, then this function if supplied
	 *		params = 	1- chaine type GET des paramètres à expédier, sous la forme "nom=value&nom2=value2" etc., chaque segment devant déjà être 
	 *						URL encodé via encodeURIComponent() en javascript, ou rawurlencode en PHP
	 *					2- ou : objet sous la forme { fieldname:value}, non encodé URI dans ce cas
	 *		loader = array() = infos sur un objet indiquant que le chargement est en cours, gif animé ou autre :
	 *			- alpha = transparence alpha du conteneur parent
	 *			- id = ID de l'objet à render visible
	 *			- autoCenter = true / false (default) -> centrer automatiquement, ou pas, l'objet vis à vis de son conteneur
	 */
	load:function(params) {
		if(typeof(params.clientClass)=='undefined') params.clientClass='';
		params.callback=
			  "NC.ajax.refresh(x, '" + params.clientID + "','"
			+ (typeof(params.clientClass)=='undefined' ? '' : params.clientClass) + "')"
			+ (typeof(params.callback)=='undefined' ? '' : ';' + params.callback)
		;
		// Gestion de l'éventuel objet de progression
		if(params.loader) {
			if(!params.loader.alpha) params.loader.alpha=20;		// container alpha while waiting for Ajax answer
			var loaderID=document.getElementById(params.loader.id);
			if(loaderID) {
				// Centrage de l'image
				if(params.loader.autoCenter) {
					var style=NC.tools.getStyle(loaderID),
						container=loaderID.parentNode,
						containerStyle=NC.tools.getStyle(container),
						size=NC.tools.objSize(container),
						sizes=new Array(parseInt(style.width,10), parseInt(style.height,10), size.width, size.height);

					// Les modifs se font après avoir rendu le container visible (tab2), sinon IE6/7 n'y accèdent pas
					loaderID.style.display=containerStyle['display'];
					loaderID.style.left=(parseFloat(containerStyle['paddingLeft'],10) + Math.round((sizes[2]-sizes[0])/2)) + 'px';
					loaderID.style.top=(parseFloat(containerStyle['paddingTop'],10) + Math.round((sizes[3]-sizes[1])/2)) + 'px';
				}
				this.ajaxLoaders[params.clientID]=params.loader.id;
			}
		}

		// Appel Ajax
		var x = false;
		if (window.XMLHttpRequest) x = new XMLHttpRequest();
		else if (window.ActiveXObject) {
			try { x = new ActiveXObject("Msxml2.XMLHTTP") }
			catch (e) {
				try { x = new ActiveXObject("Microsoft.XMLHTTP") }
				catch (e) {};
		 	}
	 	}
		//	on lancera la fct callback à la réception de réponse.
		// Attention : en cas d'erreur, x.readyState vaut bien 4 mais x.status n'est pas égal à 200
		if(x && params.callback) x.onreadystatechange=function() { if(x.readyState == 4) eval(params.callback); }
		x.open("POST",params.serverScript, true); 						// POST évite le cache (pas GET), true -> mode asynchrone

		// Header, indispensable en mode POST
		x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		x.setRequestHeader("Connection", "close");
		var getString=params.params;
		if(typeof(getString)=='object') {
			// Convert params.params object to string GET like format
			var gs='', sep='||';		// Array to string delimiter for checkgroup multiple entries
			for(var i in getString) {
				if(getString[i]!='') {
					gs+= (gs ? '&' : '') + encodeURIComponent(i) + '=';
					if(typeof(getString[i])=='object') gs+=encodeURIComponent(sep + getString[i].join(sep) + sep);	// Array to string conversion (checkboxes)
					else gs+= encodeURIComponent(new String(getString[i]));											// Or simple value
				}
			}
			getString=gs;
		}
		if(!getString) getString='sf_form=true';	// to have some parameters to send
		x.send(getString);
		return false;
	},


	/* extrait les éventuels paramètres imbriqués en début de contenu Ajax
	* forme : "::param=valeur:param=valeur::end::code HTML"
	* Retourne ret[0]=tableau des paramètres trouvés, ret[1]=contenu HTML
	*/
	getResponse:function(r) {
		var ret=new Array(new Array(),'');
		if(r.responseText) {
			var j=0,i=0,k,key;
			if(r.responseText.substring(0,2)=='::') {
				do {
					j=i+2;
					i=r.responseText.indexOf('::',j);
					if(i!=-1) {
						x=r.responseText.substring(j,i);
						k=x.indexOf('=');
						if(k==-1) { if(x!='end') ret[0][x]='' }
						else ret[0][x.substring(0,k)]=x.substring(k+1);
					}
				}
				while(i!=-1 && !ret[0]['end']);
			}
			ret[1]=r.responseText.substring(j);
		}
		return ret;
	},

	// MAJ du contenu du conteneur id, après la réponse Ajax r. Cette fonction est appelée par défaut si aucune fonction de callback n'est spécifiée
	refresh:function(r, id, className) {
		var	r=this.getResponse(r);		// extraction des éventuels paramètres passés au début de la réponse
		if(typeof(style)=='undefined') var style='';

		// On efface l'éventuelle image "loader", et on replace la transparence normale sur son containeur
		if(this.ajaxLoaders[id]) {
			document.getElementById(this.ajaxLoaders[id]).style.display='none';
		}
		
		var obj=document.getElementById(id);
		if(obj) {
			obj.innerHTML=r[1];
			if(className) NC.tools.changeClass(obj, className);
		}
		for(var i in r[0]) eval(i+'="'+r[0][i]+'"');
		if(typeof(NC.autoslide)!='undefined') { for(i in NC.autoslide.names) setTimeout('NC.autoslide.run("' + NC.autoslide.names[i]+'")',100) };	// MAJ des autoSlide
	}
	
}

