// Langue
function langue(sMot, aRemplace) {
	if($defined( langueJS)) {
		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;
};

// Events
function getEvent(e) { return e || window.event; }
function getSrcElement(e) {
	if (e.srcElement) return e.srcElement;
	var node = e.target;
	while (node.nodeType != 1) node = node.parentNode;
	return node;
}

function $redirect(sUrl, oWindow) {
	if ( !$defined(oWindow)) oWindow = window;
	if ( !$defined(sUrl) || sUrl == '' ) sUrl = oWindow.location;
	oWindow.location = sUrl;
}

function $defined(o) {
	return (o != undefined);
}
function $is_true(t, v) {
	return $defined(t) ? t : v;
}
function $type(o){
	if (!$defined(o)) return false; // non defini
	if (o.htmlElement) return 'element';
	var type = typeof o; // 'object', 'string', 'number', 'boolean', 'function'
	if (type == 'object' && o.nodeName){ // noeud
		switch(o.nodeType){
			case 1: return 'element'; // element
			case 3: return (/\S/).test(o.nodeValue) ? 'textnode' : 'whitespace';
		}
	}
	if (type == 'object' || type == 'function'){
		switch(o.constructor){
			case Array: return 'array'; 	// tableau
			case RegExp: return 'regexp';	// expression
			//case Class: return 'class';		// class
		}
		if (typeof o.length == 'number'){
			if (o.item) return 'collection'; // childNodes, getElementsByTagName...
			if (o.callee) return 'arguments';// object argument
		}
	}
	return type;
}

function $id(element) {
	return (element) ? document.getElementById(element) : null;
}

function $insertCSS(url, sMedia) {
	$('head').append('<link rel="stylesheet" href="' + url + '" type="text/css"  media="screen" />');
}
function $insertScript(url, sMedia) {
	$('head').append('<script src="' + url + '" type="text/javascript"></script>');
}

var prechargement = {
	load : function(a) {
		this.chargement = a;
		for (var el in a) {
			var img = document.createElement('img');
			img.setAttribute('src', this.chargement[el]);
			this.chargement[el] = img;
		};
	},
	image : function(sNom) {
		return this.chargement[sNom];
	}
};

var WindowObjectReference = null;
function popup(sURL, sNom, sOption, iW, iH, isCenter) {
	//if(WindowObjectReference == null || WindowObjectReference.closed) {
		if (sOption == "all=yes")
			sOption = 'directories=1,location=1,menubar=1,resizable=1,scrollbars=1,status=1,toolbar=1,';
		else
			sOption += (sOption!='') ? ',' : '';

		if (window.screen && isCenter)
			sOption += 'left=' + ((screen.width-iW)/2) + ',top=' + ((screen.height-iH)/2);

		WindowObjectReference = window.open(sURL,sNom,sOption + ((sOption!='') ? ',' : '') + 'width=' + iW + ',height=' + iH);
		WindowObjectReference.focus();
	/*}
	else
		WindowObjectReference.focus();*/
}

// DEBUG
// Author: Denis Howlett <feedback@isocra.com>
// WWW: http://www.isocra.com/
// Modification : ActenGo
function debug(text) {
	showDebug();
	if (window.top.dW && ! window.top.dW.closed)
		window.top.dW.document.write(text + '\n');
}
function showDebug() {
	window.top.dW = window.open('', 'Debug', 'left=0,top=0,width=300,height=700,scrollbars=yes,status=yes,resizable=yes');
	window.top.dW.opener = self;
	window.top.dW.document.open();
	window.top.dW.document.write('<html><head><title>Debug</title></head><body><pre>\n');
}
function hideDebug() {
	if (window.top.dW && ! window.top.dW.closed) {
		window.top.dW.close();
		window.top.dW = null;
	}
}

// TODO : � virer
// 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' :
				$id(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) {
	$('script').each(function() { eval(this.innerHTML);	});
}

// 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 && $id(oElem) && sText != '') {
		var oEl = $id(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);
	}
}

// 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;
}

//nouveaut� //

// @see d_box_alert en php
function d_box_alert( options) {
	var o = $.extend({
		code: 'attention',
		text: '',
		id: 'box_alert'
	}, options);

	switch( o.code) {
		case 'attention': 			sCode = ' help-attention'; 		break;
		case 'information': 		sCode = ' help-information'; 	break;
		case 'critique': 			sCode = ' help-critique'; 		break;
		case 'interrogation': 		sCode = ' help-interrogation'; 	break;
		case 'formulaire-echec':	sCode = ' help-form-echec'; 	break;
		case 'formulaire-ok': 		sCode = ' help-form-ok'; 		break;
		default: sCode = '';
	}

	return '<div id="' + o.id + '" class="helpBoxInfos-ON ' + sCode + '">' + o.text + '</div>';
}

function alert_box( options) {
	var o = $.extend({
		titre: '',
		text: ''
	}, options);

	$('#dialog_alertBox').remove();
	$('body').append('<div id="dialog_alertBox" title="' + o.titre + '">' + o.text + '</div>');

	$('#dialog_alertBox').dialog({
		buttons: { 'Ok': function() { $(this).dialog('close'); } },
		resizable: true,
		height: $('#dialog_alertBox').width(500).height() + 100,
		width: 500,
		modal: true
	});
}

// "Constante" prédéfinie
function constante( sCode, aParam) {
	switch( sCode) {
		case 'ajaxError' : return _lg( 'Une erreur est survenue :\n\nRafraichissez la page et essayer à nouveau.\nSi le problème persiste, contactez le webmaster.');
		case 'ajaxIdentError' : return _lg( 'Votre session est terminée :\n\nRafraichissez la page et essayer à nouveau.\nSi le problème persiste, contactez le webmaster.');
		case 'formError' : return sprintf(
				pluriel(
					_lg( 'Erreur de saisie : %d erreur rencontrée lors de la validation du formulaire.'),
					_lg( 'Erreur de saisie : %d erreurs rencontrées lors de la validation du formulaire.'),
					aParam
				),
				_lgNombre( aParam)
			);
		default: return '[Erreur code: "' + sCode + '" inconnu.]';
	}
}

// langue
function _lg(s) {
	return ( $defined(i18n) && i18n[s]) ? i18n[s] : s;
}
function _lgNombre(n) {
	var o = '';
	n += '';

	for ( i = n.length; i > 3; i -= 3) {
		o = i18n.thousands_sep + n.slice(i - 3, i) + o;
	}
	return ( n.slice(0, i) + o );
}

// Tronque la chaine passée en paramètre
function tronquer( s, iMax) {
	s = $.trim( s);
	return ( s.length > iMax ) ? s.substr( 0, iMax / 2) + '[\u2026]' + Right(s, iMax / 2) : s;
}

// coupe
function couper( s, iMax) {
	s = $.trim( s);
	return ( s.length > iMax ) ? Left(s, iMax) + '[\u2026]' : s;
}

function Left( s, n){
	if (n <= 0) {
		return '';
	} else if (n > String(s).length){
		return s;
	} else {
		return String(s).substring(0, n);
	}
}
function Right( s, n){
	if (n <= 0) {
	return '';
	} else if (n > String(s).length) {
	return s;
	} else {
	var iLen = String(s).length;
	return String(s).substring(iLen, iLen - n);
	}
}

// Encode
function js_encode( s) {
	return s.replace(/\\/g, '\\\\').replace(/"/g, '\&#34;').replace(/\'/g, '\&#39');
}
function url_encode( s) {
	return encodeURIComponent( s);
}
function html_encode( s) {
	return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
function html_decode( s) {
	return s.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');
}
function isHtml_encode( s) {
	return (s.search(/&amp;/g) != -1 || s.search(/&lt;/g) != -1 || s.search(/&gt;/g) != -1);
}
function html_decode_if_encode() {
	return isHtml_encode(s) ? html_decode(s) : s;
}

// syncho avec PHP
function format_html_id( s, sReplace) {
	sReplace = $defined(sReplace) ? sReplace : '';
	return s.replace(/^[^a-z_]+/i, sReplace).replace(/\W+/, sReplace);
}