function addEvent(source, type, callback) 
{
    // fonction d'abstraction pour enregistrer un gestionnaire d'evenement
    // comprend le DOM standard, la syntaxe prorietaire MSIE, l'ancien modele HTML
    // source : objet sur lequel ajouter le gestionnaire d'evenement
    // type : type d'evenement
    // callback : fonction qui traitera l'evenement
    if (source.addEventListener)
    {		
        // code standard DOM
        source.addEventListener(type, callback, false);
        return true;
    } 
    else if (source.attachEvent)
    { 	
        // code propriétaire MSIE
        var r = source.attachEvent('on'+type, callback);
        return r;
    } 
    else 
    {
        // code navigateur sans support DOM-event
        eval('source.on' + type + '= callback') ;
    }
}
function getStandardEvent(e) 
{
    // abstraction pour recuperer un objet standard pour l'evenement en cours
    // comprend le modele DOM standard et le modele proprietaire de MSIE
    // e : parametre recu lors de l'appel du gestionnaire d'evenement
    // retour : objet d'evenement standard
    if (e == null && window.event) 
    {
        // cas particulier de MSIE pour recuperer l'evenement en cours
        e = window.event ;
    }
    
    if (e.target == null && e.srcElement) 
    {
        // cas particulier de MSIE pour recuperer la balise DOM cible
        e.target = e.srcElement ;
    }
    
    if (!e.preventDefault)
    {
        // cas particulier de MSIE pour empecher l'action par defaut du navigateur
        e.preventDefault = function() { this.returnValue = false; };
    }
    
    return e;
}
// Récupère dans un tableau tous les éléments de balise "tag" (toutes si non précisée), du noeud "node" (document si non défini)
// auxquelles la classe "searchClass" est appliquée
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}
// bascule l'affichage du bloc obj (ou ayant pour id "obj")
function toggle(obj) {
	var el = $(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}
Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
        if (this[i] == value) {
			return true;
		}
	}
	return false;
};
// A nice reusable utility function !! (show sample code below...)
// ... push it in your js toolkit
function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}	
// Sample Usage:
/*
var obj1 = document.getElementById('element1');
var obj2 = document.getElementById('element2');
function alertElements() {
  var i;
  var elements = $('a','b','c',obj1,obj2,'d','e');
  for ( i=0;i<elements.length;i++ ) {
    alert(elements[i].id);
  }
}
*/

/* source: http://www.dynamicajax.com/fr/AJAX_Suggest_Tutorial-271_290_312.html */

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert('!??! Votre navigateur ne supporte pas le XMLHttpRequest ?!!?');
	}
}
function getXhr(){
	if(window.XMLHttpRequest) // Firefox et autres
	   xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject){ // Internet Explorer 
	   try {
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
	}
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert('Votre navigateur ne supporte pas les objets XMLHTTPRequest...'); 
	   xhr = false; 
	}
}
// JavaScript Document
var windowname = 'popup';
var windowproperties = 'resizable=yes,scrollbars=no,status=no,toolbar=no,menubar=no,left,top';
function popup(url, theme, width, height) {
	windowproperties += ',width='+width+',height='+height;
	var w=window.open(url, windowname, windowproperties);
	w.document.close();
	w.focus(); // popup au premier plan ;)
	w.resizeTo(width+20, height+40); // redimensionnement
	return false;
}
function openimage( img , width , height , titre , auteur) { 
  // Compatible IE5+ / NN6+ / Mozilla
  oFenetre = window.open('','Image','width='+width+',height='+height+',toolbar=no,scrollbars=no,resizable=yes');
  oFenetre.document.write("<html><head><title>"+titre+"</title><style type=\"text/css\"><!-- body { background-color:#000; } //--></style></head>"); 
  oFenetre.document.write("<script type=\"text/javascript\">function twAjustePopUp() { if (document.images[0].complete) { window.resizeTo(document.images[0].width+10,document.images[0].height+60); window.focus();} else { setTimeout('twAjustePopUp()',1000) } }</"+"script>");
  oFenetre.document.write("<body onload='twAjustePopUp()' onblur='window.close()' onclick='window.close()' leftMargin=0 topMargin=0 marginwidth=0 marginheight=0>"); 
  oFenetre.document.write("<table width='100%' border='0' cellspacing='0' cellpadding='0' height='100%'><tr><td valign='middle' align='center'>"); 
  oFenetre.document.write("<img src='"+img+"' border='0' alt='"+auteur+"' title='"+auteur+"'>");
  oFenetre.document.write("</td></tr></table></body></html>"); 
  oFenetre.document.close();
  return false;
} 
function openBlank(URL) {
window.open(URL);
return false;
}