// Evenements
function onDomReady(f) {
	var b = navigator.userAgent;
	
	// Mozilla et opera
	if ( document.addEventListener)
		document.addEventListener( "DOMContentLoaded", f, false );	
	else {
		// si IE sans frame
		// on vérifie continuyellement si le document est pret
		if ( /MSIE/i.test(b) && !/opera/.test(b) && window == top ) {
			(function(){		
				try {
					// fixe IE : Diego Perini
					// http://javascript.nwbox.com/IEContentLoaded/
					document.documentElement.doScroll("left");
				} catch( error ) {
					setTimeout( arguments.callee, 0 );
					return;
				}		
				f.call( document);
			})();	
		}
		else {
			if ( /WebKit|Khtml/i.test(b) ) {
				var numStyles;
				(function(){
					if ( document.readyState != "loaded" && document.readyState != "complete" ) {
						setTimeout( arguments.callee, 0 );
						return;
					}							
					f.call( document);
				})();
			}
			else				
				addEvents( window, "load", f ); // Vieux navigateur
		}
	}
}

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, sMedia) {
	var elm = document.createElement('link');
	elm.type  = 'text/css';
	elm.rel   = 'stylesheet';
	elm.media = sMedia;
	elm.href = url;
	var headArr = null;
	if (document.getElementsByTagName('head')) headArr = document.getElementsByTagName('head');
	if (headArr !== null && headArr.length > 0) headArr[0].appendChild(elm);
}
function insertScript(url) {
	var elm = document.createElement('script');
	elm.type  = 'text/javascript';
	elm.src = url;
	var headArr = null;
	if (document.getElementsByTagName('head')) headArr = document.getElementsByTagName('head');
	if (headArr !== null && headArr.length > 0) headArr[0].appendChild(elm);
}

function $(element) {
    return (element) ? document.getElementById(element) : null;
}

// trim (methode la plus rapide sur tout les navigateurs)
// methode simple : this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
String.prototype.trim = function() {
	var	s = this.replace(/^\s\s*/, ''),
		i = s.length;
	while (/\s/.test(s.charAt(--i)));
	return s.slice(0, i + 1);
};

// 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' :
				$(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 = '';
	};
};

function evalScript(obj) {
	var sScripts = obj.getElementsByTagName('script');
	for (var i=0; i<sScripts.length; i++)
		eval(sScripts[i].innerHTML);
}

// 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 && $(oElem) && sText != '') {
		var oEl = $(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);
	}
}

// DEBUG
// Author: Denis Howlett <feedback@isocra.com> / ActenGo
// WWW: http://www.isocra.com/
function debug(text) {
	showDebug();
	if (window.top.debugWindow && ! window.top.debugWindow.closed)
		window.top.debugWindow.document.write(text + '\n');
}
function showDebug() {
	window.top.debugWindow = window.open('', 'Debug', 'left=0,top=0,width=300,height=700,scrollbars=yes,status=yes,resizable=yes');
	window.top.debugWindow.opener = self;
	window.top.debugWindow.document.open();
	window.top.debugWindow.document.write('<html><head><title>Debug</title></head><body><pre>\n');
}
function hideDebug() {
	if (window.top.debugWindow && ! window.top.debugWindow.closed) {
		window.top.debugWindow.close();
		window.top.debugWindow = null;
	}
}


// xml
function noeudContientEnfant(parent) { return parent.hasChildNodes(); }
function firstChildNode(parent) {
	if (parent.hasChildNodes()) {
		var node = parent.firstChild;
		while ( new RegExp("^\\s$").test(node.nodeValue) && node.nodeType != 1 ) {
			if (node.nextSibling)
				node = node.nextSibling;
			else
				break;
		}
		return node;
	}
	else 
		return parent;	
}

/* 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);
	}
}*/