// Evenements
function onDomReady(f) { //(C)webreflection.blogspot.com + fixe actengo.com
	var a=onDomReady,b=navigator.userAgent,d=document,w=window,c="onDomReady",e="addEventListener",o="opera",r="readyState",
	s="<scr".concat("ipt defer src='//:' on",r,"change='if(this.",r,"==\"complete\"){this.parentNode.removeChild(this);",c,".",c,"()}'></scr","ipt>");
	a[c]="";a[c]=(function(o){return function(){a[c]=function(){};for(a=arguments.callee;!a.done;a.done=1)f(o?o():o)}})(a[c]);
	if(d[e])d[e]("DOMContentLoaded",a[c],false);
	if(/WebKit|Khtml/i.test(b)||(w[o]&&parseInt(w[o].version())<9))(function(){/loaded|complete/.test(d[r])?a[c]():setTimeout(arguments.callee,1)})();
	else if(/MSIE/i.test(b))d.write(s);
}
function addEvents(oElem, sEvent, fn) {
	if (oElem.addEventListener)
		return oElem.addEventListener(sEvent, fn, false);
	else
		if (oElem.attachEvent) { // ie + fixe pb mem
			var f = function() { fn.call(oElem) }; // evite de perdre le "this"		
			window.attachEvent('onunload', function() {
				oElem.detachEvent('on' + sEvent, f);
				window.detachEvent('onunload', arguments.callee);
			});
			return oElem.attachEvent('on' + sEvent, f);
		}
		else 
			return oElem['on' + sEvent] = fn;
}
function removeEvents(oElem, sEvent, fn) {
	return oElem.removeEventListener?
      oElem.removeEventListener(sEvent, fn, false):
      oElem.detachEvent?
         oElem.detachEvent('on' + sEvent, fn):
         oElem['on' + sEvent] = fn;
}
function getEvent(e) { return e || window.event; }

// Langue
function langue(sMot, aRemplace) {
	if(typeof( langueJS ) != "undefined") {
		var s = langueJS[sMot];
		if(aRemplace)
			for(var i = 0;i<aRemplace.length;i++)
				s = s.replace(aRemplace[i][0], aRemplace[i][1]);
		return s;
	}
	else
		return "Erreur traduction : " + sMot;
};

// Util
document.getElementsByClass = function (nomClass, node, tag) {
	var i, j = 0, classElements = [];
    if ( node == null ) node = document;
    if ( tag == null ) tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)" + nomClass + "(\\s|$)");

	for (i = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) )
            classElements[j++] = els[i];
    }
    return classElements;
};

function addClass(element, className) {
    if (!hasClass(element, className)) {
        if (element.className) element.className += " " + className;
        else element.className = className;
    }
}

function removeClass(element, className) {
    var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
	element.className = element.className.replace(regexp, "$2");
}

function hasClass(element, className) {
    var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
    return regexp.test(element.className);
}

function insertCSS(url) {	
	if (!$defined(document.createStyleSheet)) { // max 31
		var elm = document.createElement("link");
		elm.type  = 'text/css';
		elm.rel   = 'stylesheet';
		elm.media = 'screen';	
		elm.href = url;
		var headArr = null;
		if (document.getElementsByTagName("head")) headArr = document.getElementsByTagName("head");
		if (headArr != null && headArr.length > 0) headArr[0].appendChild(elm);
	}
	else
		var styleSheet = document.createStyleSheet(url);
}
function insertScript(url) {
	var elm = document.createElement("script");
	elm.type  = 'text/javascript';
	elm.href = url;
	var headArr = null;
	if (document.getElementsByTagName("head")) headArr = document.getElementsByTagName("head");
	if (headArr != null && headArr.length > 0) headArr[0].appendChild(elm);
}

// trim
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); };

// Classe ajax
function Ajax() {
	var datas = "";

	this.init = function(settings) {
		this.settings = settings;

		this.def("parametres", null); 	// parametres passes a la fonction appelee en retour
		this.def("prechargement", null); // fonction, nom d'id, ou objet pour afficher le message de chargement en cours
		this.def("prechargement_complementaire", null); // fonction d'execution complementaire au prechargement
		this.def("prechargement_message", langue("ajaxChargement")); // message de chargement
		this.def("async", true);	// mode de synchronisation (asynchrone par defaut)
		this.def("alerte", true);	// si true, affiche les erreurs et n'execute pas la fonction de recuperation
		this.def("debug", false);	// si true execute la fonction debug
	};

	this.def = function(key, def_val) {
		this.settings[key] = this.getParam(key, def_val);
	};

	this.getParam = function(name, def_val) {
		var v = (typeof(this.settings[name]) == "undefined") ? def_val : this.settings[name];
		return (v == "true" || v == "false") ? (v == "true"): v;
	};

	this.debug = function(s) {
		if(typeof this.settings["debug"] == "object") {
			this.settings["debug"].value = s;
			this.settings["debug"].innerHTML = s;
		}
		else
			alert(s);
	};

	this.prechargement = function() {
		switch (typeof this.settings["prechargement"]) {
			case null:
				break;
			case "function" :
				this.settings["prechargement"]();
				break;
			case "object" :
				if (this.settings["prechargement"] != null)
					this.settings["prechargement"].innerHTML = this.settings["prechargement_message"];
				break;
			case "string" :
				document.getElementById(this.settings["prechargement"]).innerHTML = this.settings["prechargement_message"];
		}
	};

	this.prechargement_complementaire = function() {
		if (typeof this.settings["prechargement_complementaire"] == "function")
			this.settings["prechargement_complementaire"]();
	};

	this.charger = function( sMethod, sUrl, funct ) {
		var xhr, oReturn = new Object();
		var parametres = this.settings["parametres"];
		var alerte = this.settings["alerte"];
		sMethod = sMethod.toUpperCase(); // en majuscules comme specifie par la norme HTTP

		// objet a utiliser selon navigateur
		if (window.XMLHttpRequest)
			xhr = new XMLHttpRequest();
		else if (window.ActiveXObject) // IE/Windows ActiveX version
			xhr = new ActiveXObject("Microsoft.XMLHTTP");

		if (xhr) {
			this.prechargement_complementaire();
			this.prechargement();

			if(datas.length > 0 && sMethod == "GET") {
				(sUrl.indexOf("?") == -1) ? sUrl += "?" : sUrl += "&";
				sUrl += datas;
			}
			xhr.open(sMethod, sUrl, this.settings["async"]);

			// le script qu'on appel doit savoir que c'est un XMLHttpRequest
			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

			// s'assurer que le navigateur envoie le bon header
			if ( xhr.overrideMimeType )
				xhr.setRequestHeader("Connection", "close");

			xhr.onreadystatechange = function() {
				if (xhr.readyState == 4) {
					if(xhr.status == 200) {
						oReturn.erreur = false;
						oReturn.responseText = xhr.responseText;
						oReturn.responseXML = xhr.responseXML;
					}
					else {
						oReturn.erreur = true;
						oReturn.message = langue("alertErreurXml") + "\n" + xhr.statusText + " (" + xhr.status + ")";
					}

					// libere la memoire
					xhr.onreadystatechange = function(){};
					xhr = null;

					if (alerte && oReturn.erreur)
						alert(oReturn.message);
					else
						funct(oReturn, parametres);
				}
			};
			if (sMethod == "POST") {
				xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				xhr.send(datas);
			}
			else
				xhr.send(null);
		}
		else {
			oReturn.erreur = true;
			oReturn.message = langue("alertGetXml");
			if (alerte)
				alert(oReturn.message);
			else
				funct(oReturn, parametres);
		}
		if (this.settings["debug"]) this.debug("url: " + sUrl + "\n data: " + datas );
	};

	this.donnees = function(o) {
		var s = [];
		for ( var j in o )
			s.push( j + "=" + encodeURIComponent(o[j]) );
		datas = s.join("&");
	};

	this.effaceDonnees = function() {
		datas = "";
	};
};

// classe gestion de cookies
var Cookies = {
	ecrire : function( name, value, expires, path, domain, secure ) {
		expires = new Date((new Date()).getTime() + (expires * 365 * 24 * 60 * 60 * 1000));
		document.cookie = escape(name) + '=' + escape(value)
			+ (expires ? '; expires=' + expires.toGMTString() : '')
			+ (path ? '; path=' + path : '')
			+ (domain ? '; domain=' + domain : '')
			+ (secure ? '; secure' : '');
	},

	lire : function( name ) {
		var value = '';
		var posName = document.cookie.indexOf(escape(name) + '=');
		if (posName != -1) {
			var posValue = posName + (escape(name) + '=').length;
			var endPos = document.cookie.indexOf(';', posValue);
			value = (endPos != -1) ? unescape(document.cookie.substring(posValue, endPos)) : unescape(document.cookie.substring(posValue));
		}
		return value;
	},

	supprimer : function( name ) {
		Cookies.ecrire(name, "", -1);
	}
};

// type vairable (MooTools)
function $defined(obj) {
	return (obj != undefined);
}
function $type(obj){
	if (!$defined(obj)) return false; // non defini
	if (obj.htmlElement) return 'element';
	var type = typeof obj; // 'object', 'string', 'number', 'boolean', 'function'
	if (type == 'object' && obj.nodeName){ // noeud
		switch(obj.nodeType){
			case 1: return 'element'; // element
			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
		}
	}
	if (type == 'object' || type == 'function'){
		switch(obj.constructor){
			case Array: return 'array'; 	// tableau
			case RegExp: return 'regexp';	// expression
			//case Class: return 'class';		// class
		}
		if (typeof obj.length == 'number'){
			if (obj.item) return 'collection'; // childNodes, getElementsByTagName...
			if (obj.callee) return 'arguments';// object argument
		}
	}
	return type;
}

// insertion d'un lien imprimer
// iPos = la position d'un LI a rajouter si le conteneur est un ul
function windowPrint(oElem, sText, iPos) {
	if (window.print && document.getElementById(oElem) && sText != '') {
		var oEl = document.getElementById(oElem);
		var oA = document.createElement('a');
		oA.setAttribute('href', '#');
		oA.appendChild(document.createTextNode(sText));
		oA.onclick = function() { window.print(); return false; };

		var bInsert = false, cpt = 0; i = 0;
		if (oEl.tagName == "UL" || oEl.tagName == "OL") {
			if (oEl.childNodes || oEl.childNodes.length>0) {
				var oLi = document.createElement('li');
				oLi.appendChild(oA);
				while(i<oEl.childNodes.length && !bInsert) {
					if (oEl.childNodes[i].nodeName == "LI") {
						if(++cpt==iPos)	{
							oEl.insertBefore(oLi,oEl.childNodes[i]);
							bInsert = true;
						}
					}
					i++;
				}
			}
			if(!bInsert) oEl.appendChild(oLi);
		}
		else
			oEl.appendChild(oA);
	}
};

function js_encode( s) {
	return s.replace(/\\/g, '\\\\').replace(/"/g, '\\x22').replace(/\'/g, '\\x27');
}

/* en cours
addEvents(window,"load",lienPopup);

function getStandardEvent(e) { // IE fixe
	if (e == null && window.event) e = window.event;
	if (e.target == null && e.srcElement) e.target = e.srcElement;
	if (! e.preventDefault ) { e.preventDefault = function() { this.returnValue = false; } }

	return e;
}

function openLienPopup(e) {
	e = getStandardEvent(e);
	var liens = e.target;
	var href = '';

	if (liens.tagName=='IMG') {
		href = liens.parentNode;
		popup_image(href);
	}
	else {
		href = liens.getAttribute('href');
		window.open(href);
	}

	e.preventDefault();
	return false;
}

function lienPopup() {
	var oL, liens = document.getElementsByClass('lien_ext', null, 'a');
	for(var i=0; i<liens.length; i++) {
		liens[i].title = 'S\'ouvre dans une nouvelle fenetre';
		addEvents(liens[i], 'click', openLienPopup);
	}
}*/

