/*
 * ATTENTION ! IE ne gère pas bien les JS en UTF-8
 * Pour éviter les bugs, il ne faut pas laisser de caractère accentués (ou symboles) en fin de ligne, sinon, les caractères suivants ne sont pas interprétés correctements
 * 
 */



//window.onbeforeunload = BeforeUnload;
AddEvent (window,'beforeunload', BeforeUnload);

document.onkeypress = KeyPress;
//AddEvent (window,'keypress', KeyPress);

AddEvent (window, 'load', afterLoad);



function afterLoad()
{
	
	// Génère automatiquement les window.open pour les liens externes qui n'ont riend e défini dans le source
	var els = document.getElementsByTagName('a' );
	for ( i=0;i<els.length;i++ )
	{
		var url = els[i].getAttribute('href',false);
		if( url && url.substr(0,7) == 'http://' )
		{
			if( els[i].getAttribute('onclick', false ) == null && els[i].getAttribute('target', false ) == null )
			{
				els[i].onclick= function(){window.open( this.getAttribute('href',false) );return false;}; 
			}
		}
	}
	
}


function getRadioValue( radioname )
{
	var radios = document.getElementsByName( radioname );
	for( i in radios )
		if( radios[i].checked )
			return radios[i].value;
}

function KeyPress( event )
{
	var t=Key(event);
	//Debug ( AlertTab(event) );
	//alert( t );
	var target = FindTarget(event);
	var tname = target.tagName;
	if ( t == 'k9' && tname == 'TEXTAREA'  )
	{
		var scroll = target.scrollTop;
		var text= GetSelect( target ) ;
		//target.value = text[0]+text[1]+'\t'+text[2]; // Tabulation
		target.value = text[0]+text[1]+'    '+text[2]; // 4 espaces
		var pos = text[0].length+text[1].length+4; // +1 pour tab ; +4 pour espaces
		target.setSelectionRange( pos, pos );
		target.focus();
		target.scrollTop = scroll;
		return false;
	}
	if( t == 'cs83' || t == 'cs19' ) // cs19 pour ie6
		if( typeof window.LaunchCssEditor == 'function' )
			LaunchCssEditor();
		else
			alert ( "Vous ne disposez pas des droits n\351cessaires !\nConnectez vous \340 votre interface d'administration avant d'utiliser cette fonction !" );
	if( t == 'cs68' || t == 'cs68' || t=='cs66' || t=='cs81' ) // cs?? pour ie6
		if( typeof window.LaunchBrowseData == 'function' )
			LaunchBrowseData();
		else
			alert ( "Vous ne disposez pas des droits n\351cessaires !\nConnectez vous \340 votre interface d'administration avant d'utiliser cette fonction !" );
	if( t == 'c115' )
	{
		if( typeof window.LaunchSaveAjax == 'function' )
			return LaunchSaveAjax();
	}
}

function BeforeUnload()
{
	if(typeof ExternalCSSEditor == 'function')
		if ( csseditorpopup != 0 )
			csseditorpopup.close();
}

function Swap( id )
{
	var el = document.getElementById( id );
	if( !el ) 
		return;
	if( el.style.display!='block' )
		el.style.display='block';
	else
		el.style.display='none';
	return false; // en général, utilisé via des liens !
}
function Hide( id )
{
	$( id ).style.display='none';
}
function Show( id )
{
	$( id ).style.display='block';
}

function SwapOnglet( NomOnglet, num )
{
	for( i=0;i<10;i++)
	{
		if( el = $( NomOnglet+i ) )
			el.style.display='none';
		if( el1 = $( NomOnglet+'Lien'+i ) )
			el1.className='';
	}
	if( el = $( NomOnglet+num ) )
		el.style.display='block';
	if( el = $( NomOnglet+'Lien'+num ) )
		el.className='OngletCurrent';
		
}

// Récupère la valeur de champ, que ce soit un text, un pass, un radio, un checkbox ...
function formGetValOf( champ )
{
	if( typeof( champ ) == 'string' )
		champ = document.getElementsByName( champ )[0];
	switch( champ.type )
	{
		case 'radio':
			var els = document.getElementsByName( champ.name );
			var val = 'undefined';
			for( var i=0;i<els.length;i++ )
				if( els[i].checked )
					val = els[i].value;
			return val;
			break;
		case 'checkbox':
			break;
		default:
			return champ.value;	
	}
}


function VerifChamp( champ, regex, idform, k )
{
	if( champ.value.search( regex )!=-1 )
	{
		champ.className = 'FormChampOK';
		if( typeof( Form )!= "undefined" )
			Form[ idform ][ k ] = 'ok';
	}
	else
	{
		champ.className = 'FormChampNOK';
		if(  typeof( Form )!= "undefined" )
			Form[ idform ][ k ] = 'nok';
	}
}

function VerifOption( champ, option, idform, k )
{
	if( option == 'nohtml' )
	{
		if( champ.value.search( /<a|<script|<h[0-7]|http:/ )==-1 )
		{
			champ.className = 'FormChampOK';
			Form[ idform ][ k ] = 'ok';
		}
		else
		{
			champ.className = 'FormChampNOK';
			Form[ idform ][ k ] = 'nok';
			alert( 'Le balises HTML ne sont pas autorisees !!!' );
		}
	}
}



function VerifForm( idform )
{
	for ( k in Form[ idform ] )
		if( Form[ idform ][ k ] != 'ok' )
		{
			alert( "Tous les champs ne sont pas valides. Merci de corriger" );
			if( $( 'FORM'+idform+'.'+k ) )
				$( 'FORM'+idform+'.'+k ).focus();
			return false;	
		}
	return true;
}

function cls( id )
{
	var el = document.getElementById( id );
	if( el )
		el.innerHTML = '';
}
function Del( id )
{
	var el = document.getElementById( id );
	if( el )
		el.parentNode.removeChild( el );
}


function MarkDeplieur( id )
{
	var etat = 0;
	if( $( id ).style.display!='none' )
		etat = 1;
	AjaxReturn( 'markdeplieur?id='+id+'&etat='+etat );
}

function BrouterClass()
{
	this.IE = 0;
	this.FF = 0;
	this.Check = function()
	{
		if (document.all)
            this.IE = 1;
        else
        	this.FF = 1;
	  
  }
  this.Check(); 
}
var Brouter = new BrouterClass;


function FindTarget(e)
{
    var targ = "";
    if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	return targ;
}

function Key(e) 
{
	var ret = '';
	if (Brouter.IE) 
	{ 
		if ( window.event.altKey ) ret += 'a';
		if ( window.event.ctrlKey ) ret += 'c';
		if ( window.event.shiftKey ) ret += 's';
		ret += window.event.keyCode;
	}
	else 
	{
		if ( e.metaKey ) ret += 'm';
		if ( e.altKey ) ret += 'a';
		if ( e.ctrlKey ) ret += 'c';
		if ( e.shiftKey ) ret += 's';
		if ( e.which != 0 )
			ret += e.which; //+','+e.charCode+','+e.keyCode;
		else
			ret += 'k'+e.keyCode;
	}
	return ret;
}


function GetSelect( obj )
{ // Sous FF pour des textarea et input
	objectValue = obj.value;

	deb = obj.selectionStart;
	fin = obj.selectionEnd;

	ValueDeb = objectValue.substring( 0 , deb );
	ValueFin = objectValue.substring( fin , obj.textLength );
	Selected = objectValue.substring( deb ,fin );
	
	return [ ValueDeb, Selected, ValueFin ];

}

function setSelectionRange(input, selectionStart, selectionEnd) {
    if (input.setSelectionRange) {
        input.setSelectionRange(selectionStart, selectionEnd);
    }
    else if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd("character", selectionEnd);
        range.moveStart("character", selectionStart);
        range.select();
    }
    input.focus();
}

function setCaretToPosition(input, position) {
    setSelectionRange(input, position, position);
}

function replaceSelection (input, replaceString) {
	var len = replaceString.length;
    if (input.setSelectionRange) {
        var selectionStart = input.selectionStart;
        var selectionEnd = input.selectionEnd;

        input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd);
		input.selectionStart  = selectionStart + len;
		input.selectionEnd  = selectionStart + len;
    }
    else if (document.selection) {
        var range = document.selection.createRange();
		var saved_range = range.duplicate();

        if (range.parentElement() == input) {
            range.text = replaceString;
			range.moveEnd("character", saved_range.selectionStart + len);
			range.moveStart("character", saved_range.selectionStart + len);
			range.select();
        }
    }
    input.focus();
}

function addToFavorites( titre, url ) 
{
	if ( !Brouter.IE )
		window.sidebar.addPanel( titre ,url ,""); 
	else 
		window.external.AddFavorite( url , titre ); 
}

function AddTabToSel( target )
{	
	var replaceString = '\t';
	var len = replaceString.length;
    if (input.setSelectionRange) {
        var selectionStart = input.selectionStart;
        var selectionEnd = input.selectionEnd;

        input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd);
		input.selectionStart  = selectionStart + len;
		input.selectionEnd  = selectionStart + len;
    }
    else if (document.selection) {
        var range = document.selection.createRange();
		var saved_range = range.duplicate();

        if (range.parentElement() == input) {
            range.text = replaceString;
			range.moveEnd("character", saved_range.selectionStart + len);
			range.moveStart("character", saved_range.selectionStart + len);
			range.select();
        }
    }
    input.focus();
}


function AlertTab( t )
{
	var ret = '';
	for( e in t )
		ret += e+'->'+t[e]+" - ";
	return ret ;
}

// Utilisé pour l'ajax ! essentiellement à cause d'IE qui plante sur des innerHTML
function TryInnerHTML( id, data )
{
	try
	{
		if( typeof( id ) == 'object' )
		{
			d = id.cloneNode( false ); // Copie l'objet (vierge)
			d.innerHTML = data;
			OBJ.replace( id, d );
		}
		else
		{
			/*d = OBJ.createEl($(id).tagName);
			OBJ.addAttr(d,'id',id);
			d.innerHTML = data;
			OBJ.replace( $(id), d );*/
			d = OBJ.createEl(document.getElementById(id).tagName);
			OBJ.addAttr(d,'id',id);
			d.innerHTML = data;
			OBJ.replace( document.getElementById(id), d );
		}
		//$( id ).innerHTML = data; // trop de PB avec IE !!!
	}
	catch(err)
	{
		txt="Fonction JS : TryInnerHTML( "+id+" ).\n\n";
		txt+="Un erreur est survenue.\n\n";
		txt+="Error description: " + err.description + "\n\n";
		txt+="Si cette erreur persiste, merci de nous en faire part";
		alert(txt);	
	}
}

function Popup( url, nompopup, params )
{
	nompopup = nompopup || '_blank';
	params = params || "width=300,height=400,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no";
	var win = window.open( url, nompopup, params );
}
function SupprElements( idObj )
{
	var liste = document.getElementById( idObj );
	while ( liste.selectedIndex != -1 )
		liste.options[ liste.selectedIndex ] = null;
	
}
function ValideForm( form )
{
	var els = document.getElementsByTagName( 'SELECT');
	for( e in els )
		if( els[e].className == 'AutoFullSelect' ) 
			FullSelect( els[e] );
	
	cp = document.getElementById('phpcp_cp');
	if(cp && cp.disabled )
		phpcp.toggleEditor();
	return true;
}
function FullSelect( selObj )
{
	for (var i=0; i<selObj.options.length; i++) 
	    selObj.options[i].selected = true;
  
}

// Coche un multisélect à partir d'une chaine contenant les valeurs à cocher ( 1,3,12,A,E ...)
function checkMultiSelect( selObj, vals )
{
	vals = vals.split(',');
	for (var i=0; i<selObj.options.length; i++) 
	{
		if( in_array( selObj.options[i].value, vals ) )
		{
	    	selObj.options[i].selected = true;
		}
	}
}

// idem fonction PHP
function in_array( needle, haystack )
{
	for( e in haystack )
	{
		if( haystack[e] == needle )
			return true;
	}
	return false;
}
//-------------------------------------------- AJAX
function GetAjax( url, id )
{
	var data = AjaxReturn( url );
	//alert( data );
	//$('nl'+id).innerHTML = data;
	TryInnerHTML( 'nl'+id, data );
}

var http = getHTTPObject();


function getHTTPObject()
{
	if (window.XMLHttpRequest)
		return new XMLHttpRequest();
	else if (window.ActiveXObject) 
	{
		var objXhr = false;
		var ieXHR = new Array(
		"Msxml2.XMLHTTP.7.0","Msxml2.XMLHTTP.6.0",
		"Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0",
		"MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
		for (var I=0; I<ieXHR.length; I++) 
		{
			try
			{
				objXhr = new ActiveXObject(ieXHR[I]);
				break;
			}
			catch(e)
			{
			}
		}
		return objXhr;
	}
	return false;
}
/*
function getHTTPObject(){
	var xmlhttp;
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
	{
		try
		{
			xmlhttp = new XMLHttpRequest();
		}
		catch (e)
		{
			xmlhttp = false;
		}
	}
	return xmlhttp;
}*/

function AjaxPopup( URL, id, evalJS )
{
	//$(id).innerHTML = AjaxReturn( URL );
	TryInnerHTML( id,  AjaxReturn( URL ) );
	
	evalJS = evalJS || 0; // Pour la compatibilité, par défaut, on n'éxécute pas le JS
	if( evalJS != 0 )
		evalIncludedJS( id ); // Execute le JS Inclus dans le retour
}

function AjaxReturn( URL ){
	http.open("GET", URL , false);
	http.send(null);
	var data = http.responseText;
//	alert( data );
	if ( data.substring(0,8) == ":::JS:::" )
	{
		eval( data.substring( 8 , data.length  ));
		return '<!-- NORETOUR -->';
	}
	//data = Traite( data );
	//_Debug( data );  
	return data; // Retourne le résultat de la requette
}
function AjaxReturnPost( URL, data ){
	http.open("POST", URL , false);
	http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http.send(data);
	var retour = http.responseText;
	if ( retour.substring(0,8) == ":::JS:::" )
	{
		eval( retour.substring( 8 , retour.length -8 ));
		return '';
	}
	return retour; // Retourne le résultat de la requette
}

function file( URL ){
	var data = AjaxReturn( URL );
	return data.split( "\n" );
}


function AjaxAuto( Cle, Vals, id )
{
	id = id || false;
	
	CleModule = Cle.replace(/_[0-9]+/,'');	// Permet d'avoir plusieurs emplacement différents dans la page pour le même module 
	var data = AjaxReturn( '/ajax.php?AjaxVals='+CleModule+'&'+Vals );
	if( data != '<!-- NORETOUR -->' ) // évite de tout vider dans le cas d'instruction JS
	{
		var el;
		if( id )
			//el = $( id ); // dans le cas ou on force un ID
			el = document.getElementById( id ); // dans le cas ou on force un ID
		else
			//el = $( Cle ); // cas normal, utilise le nom de la clé pour rafraichir
			el = document.getElementById( Cle ); // cas normal, utilise le nom de la clé pour rafraichir
		//el.innerHTML = data ;
		TryInnerHTML( el, data );
	}
	else
		return false;
}

function AjaxAutoForm(form, Cle ) // pour valider des fonctions auto en ajax (ex : login module User)
{
	var retour = GetAjaxAutoForm( form, Cle );
	TryInnerHTML( CleModule, retour );
	return false;
}
function GetAjaxAutoForm( form, Cle )
{
	var data = "";
    CleModule = Cle.replace(/_[0-9]+/,'');	// Permet d'avoir plusieurs emplacement différents dans la page pour le même module 
	for ( i=0 ; i<form.length ; i++ )
    {
        if ( (form[i].type!='radio' && form[i].type!='checkbox') || ((form[i].type=='radio' || form[i].type=='checkbox') &&   form[i].checked==true ) )
			data +=  form[ i ].name+"="+encodeURIComponent(form[ i ].value)+"&" ;
    }
    return AjaxReturnPost( '/ajax.php?AjaxVals='+CleModule , data );
}
function AjaxFormAuto(form, Cle ) // Pour le formulaire XML ! ne pas utiliser en dehors de çà...
{
	var data = "";
    for ( i=0 ; i<form.length ; i++ )
    {
        if ( (form[i].type!='radio' && form[i].type!='checkbox') || ((form[i].type=='radio' || form[i].type=='checkbox') &&   form[i].checked==true ) )
			data +=  form[ i ].name+"="+encodeURIComponent(form[ i ].value)+"&" ;
    }
    var retour = AjaxReturnPost( '/ajaxform.php' , data );
	//$(Cle).innerHTML = retour;
	TryInnerHTML( Cle, retour );
	return false;
}
function AjaxMF(idChamp, data, fct, aff ) // Pour le MINI formulaire ! ne pas utiliser en dehors de çà...
{ // fct = get / set
	fct = fct || 'get';
	aff = aff || 0;
	if( fct != 'set' && fct != 'get' ) // par défaut, on get le champ 
		fct = 'get';
	var retour = AjaxReturnPost( '/ajaxform.php?MiniForm='+idChamp+'&MFfct='+fct+'&MFaff='+aff , data );
	//$( idChamp ).innerHTML = retour;
	TryInnerHTML( idChamp, retour );
	evalIncludedJS( idChamp ); // Execute le JS Inclus dans le retour
	return false;
}
function FormMakePostDataFromId( id )
{
	el = $( id );
	if ( (el.type!='radio' && el.type!='checkbox') || ((el.type=='radio' || el.type=='checkbox') &&   el.checked==true ) )
		return FormMakePostData( id, el.value ) ;
}
function FormMakePostData( nom, value )
{
	return nom+"="+encodeURIComponent(value)+"&" ;
}

function RetourAjaxForm()
{
	if (http.readyState == 4)
	{
		var results = Traite(http.responseText);
		
	}
}

function AjaxGet( url, id, evalJS )
{
	id = id || false; // facultatif
	evalJS = evalJS || 0; // Pour la compatibilité, par défaut, on n'éxécute pas le JS
	data = AjaxReturn( url );
	if( typeof( id ) == 'string' )
	{
		//$( id ).innerHTML = data;
		TryInnerHTML( id, data );
		if( evalJS != 0 )
			evalIncludedJS( id ); // Execute le JS Inclus dans le retour
	}
	if( typeof( id ) == 'object' )
	{
		//id.innerHTML = data;
		TryInnerHTML( id, data );
	}
	return data;
}

function Ajax( url ){
	http.open("GET", url, true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
	return false; 
}

function AjaxPost( url,data, fonctionRetour ){
	http.open("POST", url, true);
	http.onreadystatechange = fonctionRetour;
	http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http.send(data);
	return false; 
}

function AjaxGetPostForm( form, url, id, evalJS )
{
	id = id || false;
	evalJS = evalJS || 0; // Pour la compatibilité, par défaut, on n'éxécute pas le JS
	var data = "";
    for ( i=0 ; i<form.length ; i++ )
    {
        if ( (form[i].type!='radio' && form[i].type!='checkbox') || ((form[i].type=='radio' || form[i].type=='checkbox') &&   form[i].checked==true ) )
			//data +=  form[ i ].name+"="+encodeURIComponent(form[ i ].value)+"&" ;
			data += getEncodeInputValue( form[i] );
    }
    var retour = AjaxReturnPost( url , data );
	if( id ) // si on a un id, on envoi à l'intérieur
	{
		//$( id ).innerHTML = retour ;
		TryInnerHTML( id, retour );
		if( evalJS != 0 )
			evalIncludedJS( id ); // Execute le JS Inclus dans le retour
		return false;
	}
	return retour; // sinon, on retourne simplement la donnée...
}

function AjaxForm( form, URL, fonctionRetour ){
    var data = "";
    for ( i=0 ; i<form.length ; i++ )
    {
        if ( (form[i].type!='radio' && form[i].type!='checkbox') || ((form[i].type=='radio' || form[i].type=='checkbox') &&   form[i].checked==true ) )
			//data +=  form[ i ].name+"="+encodeURIComponent(form[ i ].value)+"&" ;
			data += getEncodeInputValue( form[i] );
    }
    AjaxPost( URL , data, fonctionRetour );
    return false; // pour ne pas valider le formulaire
}

function getEncodeInputValue( input )
{
	if( input.type == 'select-multiple' )
	{
		var ret = "";
		var n=0;
		for (var i=0; i<input.options.length; i++) 
		{
			if( input.options[i].selected == true )
				ret += input.name+"["+n+"]"+"="+encodeURIComponent( input.options[i].value )+"&";
			n++;
		}
		return ret;
	}
	if ( (input.type!='radio' && input.type!='checkbox') || ((input.type=='radio' || input.type=='checkbox') &&   input.checked==true ) )
		return input.name+"="+encodeURIComponent( input.value )+"&";
			
	
}

function alertHttpResponse(){
	if (http.readyState == 4)
	{
		$('inputSaveAjax').style.background='#fff';
		//alert( http.responseText );
	}
}

function handleHttpResponse(){
	if (http.readyState == 4)
	{
		var results = Traite(http.responseText);
		//alert( results );
		//document.getElementById('Centre').innerHTML = results;
	  
		return results;
		//_Debug( results );
		//Affiche ( results );
	}
}


function evalIncludedJS( id )
{
	var allscript = $( id ).getElementsByTagName('script');
    for(var i=0;i< allscript.length;i++)
	{
		window.eval(allscript[i].text);
    }
}
// -------------------- Fin AJAX


// ------------------------------ Fonctions sur les objets et navigateur
function isdefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}


function $(element) 
{
  if (arguments.length > 1) 
  {
  	for (var i = 0,elements = [],length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return element;
}

// OBSOLETE : OBJ.createEl
function El( Typ, Texte )
{
	ele = document.createElement( Typ );
	if ( Texte != undefined )
	{
		var t = document.createTextNode( Texte );
		ele.appendChild( t );
	}
	return ele;
}

// OBSOLETE : OBJ.addAttr
function AddAttr( el, Nom, Valeur )
{
	a = document.createAttribute( Nom );
	a.nodeValue = Valeur;
	el.setAttributeNode( a );
}

// OBSOLETE : OBJ.classHas
function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
// OBSOLETE : OBJ.classHad
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
// OBSOLETE : OBJ.classRemove
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}


/**
 * addAfter
 * el = élément parent. On ajoute après celui là dans le DOM
 * type = tagname du nouvel élément (span, div, h1 ...)
 * inner = innerHTML dans le nouvel élément
 * clas = nom de la classe à rajouter sur le nouvel élément
 * replace (0/1) : si un élément du même type et de la même classe existe déjà juste après, on le remplace (ou pas)
 */
// OBSOLETE : OBJ.addAfter
function addAfter( el, type, inner, clas,replace)
{
	clas = clas || '';
	replace = replace || 0;
	type = type.toUpperCase(); // le type est toujours en cap pour les comparaisons
	
	if( replace == 1 ) // Si on doit remplacer
		if( suiv = el.nextSibling ) // si un noeud suivant existe
			if( suiv.nodeName == type ) // si il est du bon type
				if( clas == '' || hasClass( suiv, clas) ) // si il a la classe correspondante (ou pas de classe)
				{
					suiv.innerHTML = inner;
					return;
				}
	// sinon
	var nel = El( type );
	addClass(nel,clas);
	nel.innerHTML = inner;
	insertAfter( nel, el );  
}

/**
 * addBefore
 * el = élément parent. On ajoute après celui là dans le DOM
 * type = tagname du nouvel élément (span, div, h1 ...)
 * inner = innerHTML dans le nouvel élément
 * clas = nom de la classe à rajouter sur le nouvel élément
 * replace (0/1) : si un élément du même type et de la même classe existe déjà juste après, on le remplace (ou pas)
 */
// OBSOLETE : OBJ.addBefore
function addBefore( el, type, inner, clas,replace)
{
	clas = clas || '';
	replace = replace || 0;
	type = type.toUpperCase(); // le type est toujours en cap pour les comparaisons
	
	if( replace == 1 ) // Si on doit remplacer
		if( prev = el.previousSibling ) // si un noeud précédent existe
			if( prev.nodeName == type ) // si il est du bon type
				if( clas == '' || hasClass( prev, clas) ) // si il a la classe correspondante (ou pas de classe)
				{
					prev.innerHTML = inner;
					return;
				}
	// sinon
	var nel = El( type );
	addClass(nel,clas);
	nel.innerHTML = inner;
	el.parentNode.insertBefore( nel, el );  
}

/**
 * insertAfter
 * Ne doit pas être appelé depuis le noeud parent (il est déduis du refNode)
 * newNode : Noeud à insérer
 * refNode : Noeud référent
 */
// OBSOLETE : OBJ.insertAfter
function insertAfter ( newNode, refNode )
{
	if(refNode.nextSibling) {
		return refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
	} else {
		return refNode.parentNode.appendChild(newNode);
	}
}

/**
 * round2
 * arrondi un nombre à n décimales. Par défaut, 2 décimales
 */
function round2( val , n)
{
	n = n || 2; // par défaut, 2 décimales.
	v = Math.round( val * Math.pow( 10, n ) ) / 100;
	return v;
}


function Milliseconde()
{
    d = new Date();
    return ''+d.getHours()+d.getMinutes()+d.getSeconds()+d.getMilliseconds();
}
function Switch( id, checkbox )
{
	var el = $( id );
	if( !checkbox )
	{
		if ( el.style.display=='none' )
			el.style.display='block';
		else
			el.style.display='none';
	}
	else // Si on a une checkbox en param, on utilise sa valeur pour savoir si on affiche ou pas ...
	{
		if( checkbox.checked )
			el.style.display='block';
		else
			el.style.display='none';
	}
}
// OBSOLETE : OBJ.eventAdd
function AddEvent(obj, evType, fn)
{
    if (obj.addEventListener)
    {
       obj.addEventListener(evType, fn, false);
       return true;
    } 
    else if (obj.attachEvent)
    {
       var r = obj.attachEvent("on"+evType, fn);
       return r;
    } 
    else 
    {
       return false;
    }
}
// OBSOLETE : OBJ.eventRemove
function RemoveEvent(obj, evType, fn)
{
    if (obj.removeEventListener)
    {
       obj.removeEventListener(evType, fn, false);
       return true;
    } 
    else if (obj.detachEvent)
    {
       var r = obj.detachEvent("on"+evType, fn);
       return r;
    } 
    else 
    {
       return false;
    }
}

// ----------------------------------- fin de fonction surles objets



// ------------------------------ traitement des urls
function extractPath( url )
{
	var pos = url.lastIndexOf('/');
	if ( pos == -1 )
		return '';
	else
		return url.substr(0,pos+1);
}
function extractFile( url )
{
	var pos = url.lastIndexOf('/');
	if ( pos == -1 )
		return url;
	else
		return url.substr(pos+1,200);
}

function VerifUrl( champ )
{
	var url = champ.value;
	
	url = url.replace(/[\x7B-\xFF]/g,'-'); 
	url = url.replace(/[\x00-\x1F]/g,'');
	url = url.replace(/\s/g,'-');
	url = url.replace(/\\/g,'/');
	
	champ.value = url;
}

//------------------------- fin traitement urls

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var STR = {
 
	// private property
	_keyStr64 : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
 
 	// public method for encoding
	base64_encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		//input = this.utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			}else{
				if (isNaN(chr3)) {
					enc4 = 64;
				}
			}
 
			output = output +
			this._keyStr64.charAt(enc1) + this._keyStr64.charAt(enc2) +
			this._keyStr64.charAt(enc3) + this._keyStr64.charAt(enc4);
 
		}
 
		return output;
	},
	
	
	
	// public method for decoding
	base64_decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr64.indexOf(input.charAt(i++));
			enc2 = this._keyStr64.indexOf(input.charAt(i++));
			enc3 = this._keyStr64.indexOf(input.charAt(i++));
			enc4 = this._keyStr64.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		//output = this.utf8_decode(output);
 
		return output;
 
	},
 
 	
	// public method for UTF-8 encoding
	utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else{ 
				if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				} 
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
			}
 
		}
 
		return utftext;
	},
	
	// public method for UTF-8 decoding
	utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else{
				if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
			}
 
		}
 
		return string;
	},
 

	crypt : function( chaine, cle )
	{
		var strcrypt = '';
		var n = 0;
		while ( n < chaine.length )
		{
			for( i=0;i<cle.length; i++)
			{
				if( n<chaine.length )
					strcrypt += String.fromCharCode( chaine.charCodeAt(n) ^ (cle.charCodeAt(i)+i) ); 
				n++;
			}
		}
		return this.base64_encode( strcrypt );
	},
	
	uncrypt : function( chaine, cle )
	{
		chaine = this.base64_decode( chaine );
		cle = this.md5( cle );
		var uncrypt = '';
		var n = 0;
		while ( n < chaine.length )
		{
			for( i=0;i<cle.length; i++)
			{
				if( n<chaine.length )
					uncrypt += String.fromCharCode( chaine.charCodeAt(n) ^ (cle.charCodeAt(i)+i) ); 
				n++;
			}
		}
		return uncrypt;
	},	
 
 	idUncrypt : function( id )
	{
		pass = prompt( 'Entrez le code de décryptage' );
		if( pass )
		{
			$( id ).innerHTML = this.utf8_decode(this.uncrypt( $( id ).innerHTML , pass ));
		}
	},
	
	md5 : function ( str ) {
		// http://kevin.vanzonneveld.net
		// +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
		// + namespaced by: Michael White (http://getsprink.com)
		// +    tweaked by: Jack
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +      input by: Brett Zamir (http://brett-zamir.me)
		// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// -    depends on: utf8_encode
		// *     example 1: md5('Kevin van Zonneveld');
		// *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'
	 
		var xl;
	 
		var rotateLeft = function(lValue, iShiftBits) {
			return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
		};
	 
		var addUnsigned = function(lX,lY) {
			var lX4,lY4,lX8,lY8,lResult;
			lX8 = (lX & 0x80000000);
			lY8 = (lY & 0x80000000);
			lX4 = (lX & 0x40000000);
			lY4 = (lY & 0x40000000);
			lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
			if (lX4 & lY4) {
				return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
			}
			if (lX4 | lY4) {
				if (lResult & 0x40000000) {
					return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
				} else {
					return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
				}
			} else {
				return (lResult ^ lX8 ^ lY8);
			}
		};
	 
		var _F = function(x,y,z) { return (x & y) | ((~x) & z); };
		var _G = function(x,y,z) { return (x & z) | (y & (~z)); };
		var _H = function(x,y,z) { return (x ^ y ^ z); };
		var _I = function(x,y,z) { return (y ^ (x | (~z))); };
	 
		var _FF = function(a,b,c,d,x,s,ac) {
			a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
	 
		var _GG = function(a,b,c,d,x,s,ac) {
			a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
	 
		var _HH = function(a,b,c,d,x,s,ac) {
			a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
	 
		var _II = function(a,b,c,d,x,s,ac) {
			a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));
			return addUnsigned(rotateLeft(a, s), b);
		};
	 
		var convertToWordArray = function(str) {
			var lWordCount;
			var lMessageLength = str.length;
			var lNumberOfWords_temp1=lMessageLength + 8;
			var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
			var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
			var lWordArray=new Array(lNumberOfWords-1);
			var lBytePosition = 0;
			var lByteCount = 0;
			while ( lByteCount < lMessageLength ) {
				lWordCount = (lByteCount-(lByteCount % 4))/4;
				lBytePosition = (lByteCount % 4)*8;
				lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
				lByteCount++;
			}
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
			lWordArray[lNumberOfWords-2] = lMessageLength<<3;
			lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
			return lWordArray;
		};
	 
		var wordToHex = function(lValue) {
			var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;
			for (lCount = 0;lCount<=3;lCount++) {
				lByte = (lValue>>>(lCount*8)) & 255;
				wordToHexValue_temp = "0" + lByte.toString(16);
				wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);
			}
			return wordToHexValue;
		};
	 
		var x=[],
			k,AA,BB,CC,DD,a,b,c,d,
			S11=7, S12=12, S13=17, S14=22,
			S21=5, S22=9 , S23=14, S24=20,
			S31=4, S32=11, S33=16, S34=23,
			S41=6, S42=10, S43=15, S44=21;
	 
		//str = utf8_encode(str);
		x = convertToWordArray(str);
		a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
		
		xl = x.length;
		for (k=0;k<xl;k+=16) {
			AA=a; BB=b; CC=c; DD=d;
			a=_FF(a,b,c,d,x[k+0], S11,0xD76AA478);
			d=_FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
			c=_FF(c,d,a,b,x[k+2], S13,0x242070DB);
			b=_FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
			a=_FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
			d=_FF(d,a,b,c,x[k+5], S12,0x4787C62A);
			c=_FF(c,d,a,b,x[k+6], S13,0xA8304613);
			b=_FF(b,c,d,a,x[k+7], S14,0xFD469501);
			a=_FF(a,b,c,d,x[k+8], S11,0x698098D8);
			d=_FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
			c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
			b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
			a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);
			d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);
			c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);
			b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);
			a=_GG(a,b,c,d,x[k+1], S21,0xF61E2562);
			d=_GG(d,a,b,c,x[k+6], S22,0xC040B340);
			c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);
			b=_GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
			a=_GG(a,b,c,d,x[k+5], S21,0xD62F105D);
			d=_GG(d,a,b,c,x[k+10],S22,0x2441453);
			c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
			b=_GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
			a=_GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
			d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);
			c=_GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
			b=_GG(b,c,d,a,x[k+8], S24,0x455A14ED);
			a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
			d=_GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
			c=_GG(c,d,a,b,x[k+7], S23,0x676F02D9);
			b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
			a=_HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
			d=_HH(d,a,b,c,x[k+8], S32,0x8771F681);
			c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
			b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
			a=_HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
			d=_HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
			c=_HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
			b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
			a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
			d=_HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
			c=_HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
			b=_HH(b,c,d,a,x[k+6], S34,0x4881D05);
			a=_HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
			d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
			c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
			b=_HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
			a=_II(a,b,c,d,x[k+0], S41,0xF4292244);
			d=_II(d,a,b,c,x[k+7], S42,0x432AFF97);
			c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);
			b=_II(b,c,d,a,x[k+5], S44,0xFC93A039);
			a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);
			d=_II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
			c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
			b=_II(b,c,d,a,x[k+1], S44,0x85845DD1);
			a=_II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
			d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
			c=_II(c,d,a,b,x[k+6], S43,0xA3014314);
			b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);
			a=_II(a,b,c,d,x[k+4], S41,0xF7537E82);
			d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);
			c=_II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
			b=_II(b,c,d,a,x[k+9], S44,0xEB86D391);
			a=addUnsigned(a,AA);
			b=addUnsigned(b,BB);
			c=addUnsigned(c,CC);
			d=addUnsigned(d,DD);
		}
	 
		var temp = wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);
	 
		return temp.toLowerCase();
	}
	
	
 
}




/**
*
*  Javascript string replace
*  http://www.webtoolkit.info/
*
**/
 
// standart string replace functionality
function str_replace(haystack, needle, replacement) {
	var temp = haystack.split(needle);
	return temp.join(replacement);
}
 
// needle may be a regular expression
function str_replace_reg(haystack, needle, replacement) {
	var r = new RegExp(needle, 'g');
	return haystack.replace(r, replacement);
}

/**
*
*  Javascript trim, ltrim, rtrim
*  http://www.webtoolkit.info/
*
**/
 
function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}


function validEmail(email){      
	var emailReg = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,5}$/;
	return emailReg.test(email); 
}





var OBJ = {
	
	createEl : function( Typ, Texte ){
		ele = document.createElement( Typ );
		if ( Texte != undefined )
		{
			var t = document.createTextNode( Texte );
			ele.appendChild( t );
		}
		return ele;
	},
	
	addAttr : function( el, Nom, Valeur ){
		a = document.createAttribute( Nom );
		a.nodeValue = Valeur;
		el.setAttributeNode( a );
	},
	
	classHas : function(ele,cls) {
		if( ele.className )
			return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
		return false;
	},
	
	classAdd : function(ele,cls) {
		if (!this.classHas(ele,cls)) ele.className += " "+cls;
	},
	
	classRemove : function(ele,cls) {
		if (this.classHas(ele,cls)) {
			var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
			ele.className=ele.className.replace(reg,' ');
		}
	},


	/**
	 * addAfter
	 * el = élément parent. On ajoute après celui là dans le DOM
	 * type = tagname du nouvel élément (span, div, h1 ...)
	 * inner = innerHTML dans le nouvel élément
	 * clas = nom de la classe à rajouter sur le nouvel élément
	 * replace (0/1) : si un élément du même type et de la même classe existe déjà juste après, on le remplace (ou pas)
	 */
	addAfter : function( el, type, inner, clas,replace)
	{
		clas = clas || '';
		replace = replace || 0;
		type = type.toUpperCase(); // le type est toujours en cap pour les comparaisons
		
		if( replace == 1 ){ // Si on doit remplacer
			if( suiv = el.nextSibling ){ // si un noeud suivant existe
				if( suiv.nodeName == type ){ // si il est du bon type
					if( clas == '' || hasClass( suiv, clas) ) // si il a la classe correspondante (ou pas de classe)
					{
						suiv.innerHTML = inner;
						return;
					}
				}
			}
		}
		// sinon
		var nel = El( type );
		addClass(nel,clas);
		nel.innerHTML = inner;
		insertAfter( nel, el );  
	},

	/**
	 * addBefore
	 * el = élément parent. On ajoute après celui là dans le DOM
	 * type = tagname du nouvel élément (span, div, h1 ...)
	 * inner = innerHTML dans le nouvel élément
	 * clas = nom de la classe à rajouter sur le nouvel élément
	 * replace (0/1) : si un élément du même type et de la même classe existe déjà juste après, on le remplace (ou pas)
	 */
	addBefore : function( el, type, inner, clas,replace)
	{
		clas = clas || '';
		replace = replace || 0;
		type = type.toUpperCase(); // le type est toujours en cap pour les comparaisons
		
		if( replace == 1 ){ // Si on doit remplacer
			if( prev = el.previousSibling ){ // si un noeud précédent existe
				if( prev.nodeName == type ){ // si il est du bon type
					if( clas == '' || hasClass( prev, clas) ) // si il a la classe correspondante (ou pas de classe)
					{
						prev.innerHTML = inner;
						return;
					}
				}
			}
		}
		// sinon
		var nel = El( type );
		addClass(nel,clas);
		nel.innerHTML = inner;
		el.parentNode.insertBefore( nel, el );  
	},

	/**
	 * insertAfter
	 * Ne doit pas être appelé depuis le noeud parent (il est déduis du refNode)
	 * newNode : Noeud à insérer
	 * refNode : Noeud référent
	 */
	insertAfter : function ( newNode, refNode )
	{
		if(refNode.nextSibling) {
			return refNode.parentNode.insertBefore(newNode, refNode.nextSibling);
		} else {
			return refNode.parentNode.appendChild(newNode);
		}
	},
	
	/**
	 * insertTop : Insère au début du début du parent
	 * newNode : Noeud à insérer / ou HTML
	 * parNode : Noeud Parent
	 */
	insertTop : function ( newNode, parNode )
	{
		if(parNode.firstChild) {
			return parNode.insertBefore(this.makeNode(newNode), parNode.firstChild);
		} else {
			return parNode.appendChild(this.makeNode(newNode));
		}
	},
	
	/**
	 * makeNode : renvoi un node (si le param est une chaine, créé un nouvel objet div
	 * Node : Contenu 
	 */
	makeNode : function( Node )
	{
		if( typeof( Node ) == 'string' )
		{
			n = El( 'span' );
			n.innerHTML = Node;
			return n;
		}
		return Node;	
	},
	
	/**
	 * replace : remplace un node par un autre
	 * oldNode : Ancien noeud à remplacer
	 * newNode : Nouveau noeu à poser
	 */
	replace : function( oldNode, newNode )
	{
		oldNode.parentNode.replaceChild( this.makeNode(newNode), oldNode );
	},
	
	
	eventAdd : function(obj, evType, fn)
	{
		if (obj.addEventListener)
		{
		   obj.addEventListener(evType, fn, false);
		   return true;
		} 
		else if (obj.attachEvent)
		{
		   var r = obj.attachEvent("on"+evType, fn);
		   return r;
		} 
		else 
		{
		   return false;
		}
	},

	eventRemove : function(obj, evType, fn)
	{
		if (obj.removeEventListener)
		{
		   obj.removeEventListener(evType, fn, false);
		   return true;
		} 
		else if (obj.detachEvent)
		{
		   var r = obj.detachEvent("on"+evType, fn);
		   return r;
		} 
		else 
		{
		   return false;
		}
	}
	
	
}

