/*
 * 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);


var topopener = false;

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;}; 
			}
		}
	}
	
	// Génère le listing des fenêtres ouvertes
	if( window.opener ) 
	{	// cas d'une popup
		if( window.opener.topopener ) // le parent à un topopener déclaré , donc on l'utilise
			window.topopener = window.opener.topopener; // sinon, pas de topopener
		else
			window.topopener = window.opener;
	}
	else
	{ // Si on est pas sur une popup
		if( window.top.topopener ) // le plus haut parent dispose d'un topopener,
			window.topopener = window.top.topopener; // on l'utilise
		else
			window.topopener = window; // sinon, on prend cette fenêtre comme topopener
	}
	
	
}


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 alertKey( event )
{
	var t=Key(event);
	alert( t );
	return false;
}

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!='none' )
		el.style.display='none';
	else
	{
		if( el.tagName == 'TABLE' )
			el.style.display='table';
		else
			el.style.display='block';
	}
	return false; // en général, utilisé via des liens !
}
function Hide( id )
{
	if( $( id ) )
		$( id ).style.display='none';
}
function Show( id )
{
	if( $( 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;	
	}
}

var Form = new Array();

function VerifChamp( champ, regex, idform, k )
{
	var val = champ.value;
	if( typeof(champ.initialValue) != 'undefined' )
	{
		if( champ.value == champ.initialValue )
			val = '';	// ignore le contenu du champ si celui-ci correspond à la valeur initiale
	}
	
	if( val.search( regex )!=-1 )
	{
		champ.className = 'FormChampOK';
		var typ = typeof( Form );
		if(  typ == "object" && typeof(Form[ idform ]) != 'undefined' ){
			Form[ idform ][ k ] = 'ok';
		}
	}
	else
	{
		champ.className = 'FormChampNOK';
		var typ = typeof( Form );
		if(  typ == "object" && typeof(Form[ idform ]) != '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 )
{
	//alert( AlertTab( Form[ idform ] ) );
	for ( k in Form[ idform ] )
	{
		if( Form[ idform ][ k ] != 'ok' )
		{
			alert( "Tous les champs ne sont pas valides. Merci de corriger ("+k+")" );
			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 ) // id ou el directement ( Del( this ) )
{
	var el = false;
	if( typeof( id ) == 'object' )
		el = id;
	else
		el = document.getElementById( id );
	if( el )
		el.parentNode.removeChild( el );
}

function display( id, val )
{
	var el = get( id ); // récupère l'objet (id ou direct objet)
	if( val )
		el.style.display='block';
	else
		el.style.display='none';
}

function get( id )
{
	if( typeof( id ) == 'object' )
		return id;
	else
		return $(id);
}

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 = '';
	var e;
	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 AjouterElements(idObj,chaine,valeur) 
{
	valeur = valeur || chaine;
	var o=new Option(chaine,valeur);
	document.getElementById( idObj ).options[ document.getElementById( idObj ).options.length ]=o;
} 
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;
		}
	}
}



function formCopyValues( form, champsSrc, champsDest )
{
	var tSrc = champsSrc.split(',');
	var tDest = champsDest.split(',');
	
	var n = Math.min( tSrc.length, tDest.length );
	
	for( var i=0;i<n;i++)
	{
		var A = form.elements[ tSrc[i] ];
		var B = form.elements[ tDest[i] ];
		
		B.value = A.value;
	}
	
}


function in_string( quoi, dans )
{
	var res = dans.indexOf( quoi );
	if( res == -1 )
		return false;
	else
		return true;
}


// idem fonction PHP
function in_array( needle, haystack )
{
	for( e in haystack )
	{
		if( haystack[e] == needle )
			return true;
	}
	return false;
}

function ksort( tab )
{
	var cles = [];
	var newTab = [];
	
	for(k in tab) {
		cles.push(k);
	}
	
	cles.sort( function ( a, b ) { return a*1 - b*1; } );
	
	for(c in cles) {
		newTab[ cles[c] ] = tab[ cles[c] ];
	}
	
	return newTab;
 
}

//-------------------------------------------- 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
	return false;
}

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, evalJS )
{
	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 );
		if( evalJS != 0 )
			evalIncludedJS( id ); // Execute le JS Inclus dans le retour
	}
	else
		return false;
}

function AjaxAutoForm(form, Cle ) // pour valider des fonctions auto en ajax (ex : login module User)
{
	var retour = GetAjaxAutoForm( form, Cle );
	//alert( retour );
	TryInnerHTML( CleModule, retour );
	evalIncludedJS( CleModule ); // Execute le JS Inclus dans le 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( document.getElementById(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 AjaxGetAsync( url, fonctionRetour ){
	http.open("GET", url, true);
	http.onreadystatechange = fonctionRetour;
	http.send(null);
	return false; 
}

var AjaxAsyncId = '';
function AjaxAsync( url, id )
{
	if( AjaxAsyncId == '' ) // Sinon, on zappe ...
	{
		AjaxAsyncId = id;
		Ajax( url );
	}
}

function postToWindow(form, url, name)
{
	var newWindow = window.open('', name);
	if (!newWindow) return false;
	var html = "";
	html += "<html><head></head><body><form id='formid' method='post' action='" + url + "'>";
	for ( var 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 ) )
			html += "<input type='hidden' name='" + form[i].name + "' value=\"" + str_replace(form[i].value,'"','&quot;') + "\" />";
    }
    //alert( html );
	//html += "</form>FIN</body></html>";
	html += "</form><script type='text/javascript'>document.getElementById(\"formid\").submit()</script></body></html>";
	newWindow.document.write(html);
	return newWindow;
}


// appelle une url en asynchrone sans attendre de retour ...
// utilisé pour les stats, comptage ...
function AjaxTouch( url )
{
	http.open("GET", url, true);
	http.send(null);
	return false; 
}

function AjaxGetPostForm( form, url, id, evalJS )
{
	if( typeof( form ) == 'string' )
	{
		form = document.getElementById( form ); // recherche le form par son id
		if( !form )
		{
			forms = document.getElementsByName( form ); // recherche le form par son name
			for( e in forms )
			{
				if( typeof(forms[e]) == 'object' ) // trouvé !
					break;
			}
		}
	}
	if( !form ) // aucun form de trouvé !
	{
		alert( 'Erreur, le formulaire est introuvable');
		return false;
	}
	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;
	  
	    if( AjaxAsyncId != '' )
		{
		    var id = AjaxAsyncId;
		    alert( id );
			AjaxAsyncId = ''; // la requette est finie, on dégage l'id...
			TryInnerHTML( document.getElementById( id ), 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 )
{
	OBJ.setAttr( 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 sqlDate()
{
	d = new Date();
    return d.getFullYear()+'-'+d.getMonth()+'-'+d.getDate()+' '+d.getHours()+':'+d.getMinutes()+':'+d.getSeconds();
}
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';
	}
}

function convertSecondesToJHMS(time)
{
	if (time>=86400)
    {
		var jour = Math.floor(time/86400);
		var reste = time%86400;
		var heure = Math.floor(reste/3600);
		var reste = reste%3600;
		var minute = Math.floor(reste/60);
		var seconde = reste%60;
		var result = jour+'j '+heure+'h '+minute+'min '+seconde+'s';
	}
	else
	{
		if (time>=3600)
		{
			var heure = Math.floor(time/3600);
			var reste = time%3600;
			var minute = Math.floor(reste/60);
			var seconde = reste%60;
			var result = heure+'h '+minute+'min '+seconde+' s';
		}
		else
		{
			if (time>=60)
			{
				var minute = Math.floor(time/60);
				var seconde = time%60;
				var result = minute+'min '+seconde+'s';
			}
			else
			{
				if (time < 60) 
				{
					var result = time+'s';
				}
			}
		}
	}
	return result;	
}


// 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;
}

// récupère l'uri (url hors paramêtres)
function extractUri( url )
{
	return url.split('?')[0];
}


/*
 * Extraits les variables GET de l'url
 * @param url contient l'url à analyser. Si vide, on utilise le href de la page
 * @param name nom de la variable à extraire
 * @return Si 'name' est vide : un tableau associatif clé=>valeur 
 *         Si 'name' = une clé présente : juste cette valeur (sinon false)
 */
function getUrlVars( url, name )
{
	var vars = [], hash;
	
	if( !url ) url = window.location.href;
	
	var hashes = url.slice(url.indexOf('?') + 1).split('&');
	 
	for(var i = 0; i < hashes.length; i++)
	{
		hash = hashes[i].split('=');
		if( name && name == hash[0] ) // si on a demandé un name et que c'est celui là
			return hash[1]; 
		vars.push(hash[0]);
		vars[hash[0]] = hash[1];
	}
	if( name ) return false; // si on a demandé une variable précise et que l'on ne l'a pas trouvée
	
	return vars; // sinon, on renvoi le tableau complet.
}

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

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var STR = {
 
	// private property
	_keyStr64 : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
 
    urldecode: function( str )
    {
		return decodeURIComponent((str + '').replace(/\+/g, '%20'));
	},
 
 	// 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;
	},
 
    testpass : function( chaine )
    {
		var minus = new RegExp("[a-z]", "g");
		var majus = new RegExp("[A-Z]", "g");
		var nombr = new RegExp("[0-9]", "g");
		var speci = new RegExp("[\s,;:\.!\?&é\"#'\{\[\(\)\]\}\|èçà@=\+_`*µ\$£ø%ù§<>*-]", "g");
		var val = 0;
		var len = chaine.length;
		if( len >= 4 ) val = 1;
		if( len >= 6 ) val = 2;
		if( len >= 8 ) val = 4;
		if( len >= 10 ) val = 8;
		if( len >= 12 ) val = 16;
		if( minus.test( chaine ) ) val *= 2;
		if( majus.test( chaine ) ) val *= 2;
		if( nombr.test( chaine ) ) val *= 2;
		if( speci.test( chaine ) ) val *= 2;
		
		return val;
	},
	
	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();
	}
	
	
 
}

function json64 ( chaine ) 
{
	if( !chaine ) return '';
	chaine = STR.base64_decode( chaine );
	var val = eval( '('+chaine+')' );
	return val;
}
function json_decode( chaine )
{
	if( !chaine ) return '';
	var val = eval( '('+chaine+')' );
	return val;
}


/**
*
*  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); 
}

function empty( val )
{
	if( typeof( val ) == 'undefined') return true;
	if( typeof( val ) == 'number' && val == 0 ) return true;
	if( typeof( val ) == 'boolean' ) return !val; // empty retourne l'inverse d'un booleen
	if( typeof( val ) == 'string' )
	{
		val = trim( val ); // supprime les espaces
		if( val == '' || val == '0' || val == 'no' || val == 'non' || val == 'false' )
			return true;
	}
	if( typeof( val ) == 'object' && val.length == 0 ) return true;
	
	return false; // dans tous les autres cas, la valeur n'est pas empty !
}

var FORM = {
	
	// vérifie si au moins 1 des champs radio du nom 'nomRadio' est coche
	checkRadio : function( form, nomRadio ){
		var i=0;
		for( i=0; i< form.elements[ nomRadio ].length; i++ )
		{
			if( form.elements[ nomRadio ][ i ].checked == true )
				return true;
		}
		return false;
	},
	
	verifAuto : function( form ){
		var err = 0;
		var mess = '';
		
		for ( i=0 ; i<form.length ; i++ )
		{
			if( OBJ.classHas( form[i], 'VERIFTXT' ) && form[i].value == '' )
				mess += "Merci de saisir le champ : "+form[i].name+"\n";
			if( OBJ.classHas( form[i], 'VERIFRADIO' ) && !FORM.checkRadio( form, form[i].name) )
				mess += "Merci selectionner une option : "+form[i].name+"\n";
		}
		
		/*
		for( e in form.elements )
		{
			if( OBJ.classHas( form.elements[ e ], 'VERIFTXT' ) )
			{
				if( form.elements[ e ].value=='' )
				{
					err ++;
					mess += "Merci de saisir le champ : "+form.elements[ e ].name+"\n";
				}
			}
			// if ( (form[i].type!='radio' && form[i].type!='checkbox') || ((form[i].type=='radio' || form[i].type=='checkbox') &&   form[i].checked==true ) )
			if( OBJ.classHas( form.elements[ e ], 'VERIFRADIO' ) )
			{
				alert( AlertTab( form[ form.elements[ e ].name ] ) );
				
				if( form.elements[ e ].checked == false )
				{
					err ++;
					mess += "Merci de saisir le champ : "+form.elements[ e ].name+"\n";
				}
			}
		}*/
		if( mess == '' )
			return true;
		else
		{
			alert( mess );
			return false;
		}
	},
	autoValues : function( html, values)
	{
		var inp = html.getElementsByTagName( '*' );
		for( var i=0;i< inp.length;i++ ) 
		{
			var autoval;
			if( autoval = OBJ.getAttr( inp[i], 'autoval') )
			{
				if( values[ autoval ] )
				{
					if( inp[i].tagName.toLowerCase() == 'input' || inp[i].tagName.toLowerCase() == 'textarea' )
					{
							inp[i].value = values[ autoval ];
							if( inp[i].onchange )
								inp[i].onchange();
					}
					else
						inp[i].innerHTML = values[ autoval ];
				}
			}
		}
	},
	getValuesByName : function( name ) // récupère les valeurs des inputs name[index] dans un tableau [ index=>valeur, ...]
	{
		var inps = FORM.getInputsByName( name );
		var tab = [];
		for( var e in inps)
		{
			if( inps[ e ].getValue ) // cas des inputs selfCheck
			{
				var v = inps[e].getValue();
				if( v === false ) return false; // arrête tout si le résultat n'est pas valide.
				tab[ e ] = v;
			}
			else
				tab[ e ] = inps[e].value;
		}
		return tab;
	},
	setValuesByName : function(name, valeurs) // défini les values des champs name[index] à partir d'un tableau [ index=>valeur, ...]. Si une valeur manque, le champ est ignoré, donc pas modifié !
	{
		if( !valeurs ) return;
		var inps = FORM.getInputsByName( name );
		var e;
		for( e in inps)
			if( typeof(valeurs[ e ])!='undefined' )
			{
				inps[ e ].value = valeurs[e];
				if( inps[ e ].testOnBlur ) inps[ e ].testOnBlur();
			}
	},
	getInputsByName : function( name, form ) // renvoi un tableau des tous les inputs du même nom : name[index]
	{
		if( form )
			var inps = form.getElementsByTagName( '*' );
	    else
			var inps = document.getElementsByTagName( '*' );
		var re = new RegExp('^'+name+"\\[(.*)\\]");
		var tab = [];
		var i;
		var n=0;
		for( i=0;i<inps.length;i++)
		{
			if( inps[i].name )
			{
				
				var find = inps[i].name.match( re  );
				if( find && find[1] ) 
					tab[ find[1] ] = inps[i];
				else
				{
					if( inps[i].name == name ) // ajouté le 08-02-12 : le name==name (pour les inputs qui n'ont pas de [] ... renvoi quand même un tableau)
						tab[ n++ ] = inps[i];
				}
			}
		}
		return tab;
	}
}


var OBJ = {
	
	createEl : function( Typ, Texte ){
		var ele = document.createElement( Typ );
		if ( Texte != undefined )
		{
			var t = document.createTextNode( Texte );
			ele.appendChild( t );
		}
		return ele;
	},
	
	addEl : function( parent, type, id, cls, texte ){
		var ele = this.createEl( type, texte );
		if( id ) this.addAttr( ele, 'id', id );
		if( cls ) this.addAttr( ele, 'class', cls );
		parent.appendChild( ele );
		return ele;
	},
	
	addAttr : function( el, Nom, Valeur ){
		OBJ.setAttr( el, Nom, Valeur );
		// var a = document.createAttribute( Nom );
		// a.nodeValue = Valeur;
		// el.setAttributeNode( a );
	},
	
	setAttr : function( el, nom, val ){
		el.setAttribute( nom, val );
	},
	getAttr : function( el, nom ) {
		return el.getAttribute( nom );
		//var attr = el.getAttributeNode( nom );
		//if( attr )
		//	return attr.value;
		//else
		//	return false;
	},
	
	classHas : function(ele,cls) {
		if( ele && 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,' ');
		}
	},
	
	getChildWithClass : function( ele, cls ){
		if( this.classHas( ele,cls ) )
			return ele;
		if( ele.hasChildNodes() )
		{
			var enfants = ele.childNodes;
			for( var i=0;i<enfants.length;i++)
			{
				var e;
				if( e = this.getChildWithClass( enfants[i], cls ) )
					return e;
			}
		}
		return false;
	},


	/**
	 * 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, capture )
	{
		capture = capture || false;
		if (obj.addEventListener)
		{
		   obj.addEventListener(evType, fn, capture );
		   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;
		}
	},
	
	remove : function( obj )
	{
		obj.parentNode.removeChild( obj );
	}
	
	
}


function Debug( data, nom )
{
	if( typeof(DebugWin) != 'undefined' )
	{
		DebugWin.Debug( data, nom );
	}
}


function findObjetParent( obj, classname )
{
	if ( classname != undefined )
	{
		while ( obj && ! OBJ.classHas( obj, classname) )
			obj = obj.parentNode;
		return obj;
	}
	else
	{
		obj = obj.parentNode;
		return obj;
	}
}
function findParentTag( obj, tag, n )
{
	var reste = n || 100; // nombre de tentative de parent avant de quitter
	if ( tag != undefined )
	{
		while ( obj.tagName != tag && obj.tagName != 'HTML' && --n>0 )
			obj = obj.parentNode;
		if( obj.tagName == tag ) // on a bien trouvé le tag qu'on cherchais
			return obj;
		else
			return false; // sinon erreur ! (on ne renvoi qu'un objet dont le type est demandé )
	}
	else
	{
		obj = obj.parentNode;
		return obj;
	}
}


function findObjDim( obj )
{
	var curleft = curtop = 0;
    var width=obj.offsetWidth;
    var height=obj.offsetHeight;
    
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return {x:curleft,y:curtop,w:width,h:height};
}

function isPointInRect( point, rect )
{
	if( point.x >= rect.x && point.x<= (rect.x+rect.w) )
		if( point.y >= rect.y && point.y<= (rect.y+rect.h) )
			return true;
	return false;
}



function getMouseOffset(obj, ev){
	ev = ev || window.event;

	var docPos    = getPosition(obj);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}
function getPosition(obj){
	var left = 0;
	var top  = 0;

	while (obj.offsetParent){
		left += obj.offsetLeft;
		top  += obj.offsetTop;
		obj   = obj.offsetParent;
	}

	left += obj.offsetLeft;
	top  += obj.offsetTop;

	return {x:left, y:top};
}


function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY, cx:ev.clientX, cy:ev.clientY };
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop,
		cx:ev.clientX,
		cy:ev.clientY
	};
}

function disableSelection(element) 
{
	element.onselectstart = function() {
		return false;
	};
    element.unselectable = "on";
    element.style.MozUserSelect = "none";
    element.style.cursor = "default";
}

function decToHex( val, nZero )
{
	nZero = nZero || 2;
	var hex = val.toString(16);
	while(  hex.length < nZero )
		hex = '0'+hex;
	return hex;
}
function rvbToHex( color )
{
	if( color.r < 0 ) color.r = 0;
	if( color.v < 0 ) color.v = 0;
	if( color.b < 0 ) color.b = 0;
	if( color.r > 255 ) color.r = 255;
	if( color.v > 255 ) color.v = 255;
	if( color.b > 255 ) color.b = 255;
	return '#'+decToHex(color.r)+decToHex(color.v)+decToHex(color.b);
}


// ---------------- Gestion des cookies
function getCookie(c_name)
{
	var i,x,y,ARRcookies=document.cookie.split(";");
	for (i=0;i<ARRcookies.length;i++)
	{
		x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
		y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
		x=x.replace(/^\s+|\s+$/g,"");
		if (x==c_name)
		{
			return unescape(y);
		}
	}
	return false;
}

function setCookie(c_name,value,exdays)
{
	var exdate=new Date();
	exdate.setDate(exdate.getDate() + exdays);
	var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
	document.cookie=c_name + "=" + c_value;
}

function isCookieEnabled(){
	var r = false;
	setCookie('nico',1,1);
	if( getCookie('nico') )
		return true;
	return false;
}

/**
 * Rafraichit la page sur elle même, sur une url précise, avec délai
 * @param delai Délai en ms avant le rechargement de la page
 * @param url Url de destination, si vide : utilise la fonction reload
 * 
 */
function refresh( delai, url )
{
	if( url )
	{
		window.setTimeout( function(){ document.location=url; }, delai );
	}
	else
		window.setTimeout( function(){ window.location.reload(); }, delai );
	
}




