// Fonctions diverses
// (c) Eric Quillévéré 2008-09
// v. 1.2 (12/03/09)

/*-jsl:import 1-effets.js */


var agent = navigator.userAgent.toLowerCase();
var major = parseInt(navigator.appVersion);
var minor = parseFloat(navigator.appVersion);

var opera = (agent.indexOf("opera") != -1);
var ffox = (agent.indexOf("firefox") != -1);
var netscape = ((navigator.appName).indexOf("Netscape") != -1);

var ie = ((agent.indexOf("msie") != -1) &&	(agent.indexOf("opera") == -1));
var ie3 = (ie && (major < 4));
var ie4 = (ie && (major == 4) &&	(agent.indexOf("msie 4") != -1));
var ie5 = (ie && (major == 4) &&	(agent.indexOf("msie 5.") != -1) &&
	(agent.indexOf("msie 5.5") == -1) &&
	(agent.indexOf("mac") == -1));
var ie55 = (ie && (major == 4) &&	(agent.indexOf("msie 5.5") != -1));
var ie6 = (ie && (major == 4) &&	(agent.indexOf("msie 6.") != -1));
var ie7 = (ie && (major == 4) &&	(agent.indexOf("msie 7.") != -1));

// Renvoie la touche tapée
function toucheClavier(evenmt)
	{
	if (ie)
		toucheClavier=function(evenmt)
			{return window.event.keyCode;};
			
	else if (evenmt && evenmt.which)
		toucheClavier=function(evenmt)
			{return evenmt.which ;};
	else
		toucheClavier=function(evenmt)
			{return null;};
			
	return toucheClavier(evenmt);
		
	}	



// renvoie vrai si une variable n'est pas définie)
function nonDef(nomVariable)
	{
	if (typeof nomVariable=='undefined')
		return true;
	else if (nomVariable===null)
		return true;
	else
		return false;
	}


// Fonction créant un événement
// evenementCree( document, Array('mousemove'), mafonction);
// mousemove, mousedown, mouseup, click, dblclick, mouseover, mouseout, keypress, keyup, keydown
function evenementCree( objet, tabEven, fonction, mode_)
	{
	if (objet)
		{
		for (var i=0; i<tabEven.length; i++)
			{
			if (objet.addEventListener)
				objet.addEventListener( tabEven[i], fonction, mode_? mode_:false);
			else
				objet.attachEvent( 'on'+tabEven[i], fonction);
			}
		}
	}		

function evenementSuppr( objet, tabEven, fonction)
	{
	if (objet)
		{
		for (var i=0; i<tabEven.length; i++)
			{
			if (objet.addEventListener)
				objet.removeEventListener( tabEven[i], fonction, false);
			else
				objet.detachEvent( 'on'+tabEven[i], fonction);
			}
		}
	}	

	
function AJAX_Annule(objAJAX)
	{
	if (objAJAX && objAJAX.readyState !== 0)
		{
		objAJAX.abort();
		objAJAX=null;
		}
	}
	
// Permet avec l'outil Ajax d'effectuer dynamiquement des requêtes
function AJAX_Appel	(params)
	{
	
	if (nonDef(params['opt_asynchrone'])) params['opt_asynchrone']=true;
	if (nonDef(params['opt_coderAppel'])) params['opt_coderAppel']=true;
	if (nonDef(params['paramsEntree'])) params['paramsEntree']='';
	
    var objAJAX;

     // Crée l'objet AJAX
     try
         { objAJAX = new XMLHttpRequest();   }
     catch (e)
        {
         try
             { objAJAX = new ActiveXObject("Microsoft.XMLHTTP");  }
         catch(e)
             {
             try
                 { objAJAX = new ActiveXObject("Microsoft.XMLHTTP");  }
             catch(e)
                 { return null;  }
            }
        }

	var paramsCodes='';
	if (params['paramsEntree']!=='')
		{
		if (typeof params['paramsEntree']=='string')
			paramsCodes+= params['paramsEntree'];
		else
			{
			for (var i=0;i<params['paramsEntree'].length;i++)
				{
				if (i>0) paramsCodes+='|';
				paramsCodes+=params['paramsEntree'][i];
				}
			}
		}
	if (params['opt_coderAppel']) paramsCodes=AJAX_Codage(paramsCodes);
		
    // On défini le fichier appelé lors de l'envoi
    objAJAX.open("GET", params['page'] + '?param=' + paramsCodes, params['opt_asynchrone']);
	
    if (params['opt_asynchrone'])
        {
        objAJAX.onreadystatechange = function()
            {
			if (objAJAX)
				{
	            if (objAJAX.readyState == 4 && objAJAX.status == 200)
					{
					AJAX_Retour(objAJAX, params['opt_fonctionRetour'], params['opt_paramsRetour']);
					}
				}
            };
        }

    // On déclare le type des données échangées
    objAJAX.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    objAJAX.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); // Evite pb de cache

    // Envoi
    objAJAX.send(null);

    if (!params['opt_asynchrone'])
        AJAX_Retour(objAJAX, params['opt_fonctionRetour'], params['opt_paramsRetour']);

	return objAJAX;
	}
	
// Codage des caractères d'une chaîne pour les passer + facilement
function AJAX_Codage(chaine)
	{
	// Permet de faire passer " & + ...
	var source=String(chaine);
	var retour= "";
	for (var i=0;i<source.length;i++)
		{
		//retour += source.charCodeAt(i) + '-';
		var caract=source.charCodeAt(i).toString(16);
		if (caract.length<2) caract='0'+caract;
		retour += caract ;
		}
	return retour;
	}		

// Retour suite à l'appel au serveur
function AJAX_Retour(objAJAX, fonctionJavascriptRetour, paramsJSRetour)
    {
    // Fonction retour Javascript
    if (typeof fonctionJavascriptRetour!='undefined')
        {
        fonctionJavascriptRetour(objAJAX.responseText, paramsJSRetour);
        }
    }	
	
	
function objet_Renvoie(nomObjet)
	{
	if (typeof nomObjet=="string")
		return document.getElementById(nomObjet);
	else
		return nomObjet;
	}
	
// Détruit un objet (par nom ou objet)
function objet_Detruit(nomObjet)
	{
	var Objet=objet_Renvoie(nomObjet);
	if (Objet)
		{
		// removeChild ne fonctionne que si la fenêtre parent est positionnée		
		if (Objet.parentNode) 
			{(Objet.parentNode).removeChild(Objet);}
		}
	}	
	
// Renvoie hauteur/largeur d'un élément
function objet_TailleRenvoie(objet)
	{
	return {hauteur:objet.offsetHeight, 
		largeur:objet.offsetWidth, 
		haut:objet.offsetTop,
		gauche:objet.offsetLeft};
	}	


// Positionnement automatique
function objet_Pos(Element, posX, posY, opt_Abs)
	{
	if (nonDef(opt_Abs)) opt_Abs=true;
	var Objet=objet_Renvoie(Element);
	if (Objet)
		{
		if (opt_Abs) Objet.style.position = 'absolute';
		if (!nonDef(posX)) Objet.style.left= posX+ 'px';
		if (!nonDef(posY)) Objet.style.top	= posY + 'px';		
		}
	}	
	

function objet_TailleFixe(Element, largeur, hauteur)
	{
	var Objet=objet_Renvoie(Element);
	if (Objet)
		{
		if (!nonDef(largeur)) Objet.style.width= largeur+ 'px';
		if (!nonDef(hauteur)) Objet.style.height= hauteur + 'px';		
		}
	}	
	
function objet_CreeConteneur(objParent, OPT_Cacher, OPT_Classe)
	{	
	return objet_Cree('div',objParent, null, null, OPT_Cacher, OPT_Classe);
	}
	
// Crée un objet	

function objet_Cree(p_type, p_parent, p_id, OPT_ParamType, OPT_Cacher, OPT_Classe)
	{
	var obj=document.createElement(p_type);
	if (!nonDef(OPT_Cacher) && OPT_Cacher) 
		objet_Cacher(obj);
	p_parent.appendChild(obj);
	
	if (!nonDef(p_id)) obj.id=p_id;
	if (!nonDef(OPT_Classe)) obj.className=OPT_Classe;
	if (!nonDef(OPT_ParamType)) obj.type=OPT_ParamType;
	
	return obj;
	}
	
// Copie un objet
// retourne l'objet nbImagesChargees et nbImagesDemandees
function objet_Copie(objSource, OPT_objParent, OPT_CopierSousObjets)
	{
	if (nonDef(OPT_CopierSousObjets)) OPT_CopierSousObjets=true;
	if (nonDef(OPT_objParent))
		{
		OPT_objParent=objSource.parentNode;
		OPT_objParent.nbImagesChargees=0;
		OPT_objParent.nbImagesDemandees=0;
		}
	
	//alert('crée ' +objSource.nodeName + '/' + objSource.childNodes.length +' sous-élément(s)' +'\r\n'+ objSource.innerHTML);
	var objetDesti=objet_Cree(objSource.nodeName, OPT_objParent);
	
	objetDesti.style.cursor=objSource.style.cursor;
	objetDesti.style.overflow=objSource.style.overflow;
	
	
	var taille=objet_TailleRenvoie(objSource);
	//alert(objSource.id + '/'+taille.hauteur);
	
	var padding=objet_RenvoiePadding(objSource);
	var margin=objet_RenvoieMargin(objSource);
	//alert(taille.largeur +'/'+padding.gauche+'/'+padding.droite);
	objet_TailleFixe(objetDesti, taille.largeur-padding.gauche-padding.droite, taille.hauteur-padding.haut-padding.bas);
	
	if (taille.gauche==-1) taille.gauche=null;
	if (taille.haut==-1) taille.haut=null;
	objet_Pos(objetDesti, taille.gauche, taille.haut );
	objetDesti.style.position=objSource.style.position;
	objetDesti.style.border=objSource.style.border;
	
	objetDesti.style.paddingLeft=padding.gauche+'px';
	objetDesti.style.paddingRight=padding.droite+'px';
	objetDesti.style.paddingTop=padding.haut+'px';
	objetDesti.style.paddingBottom=padding.bas+'px';
	
	objetDesti.style.marginLeft=margin.gauche+'px';
	objetDesti.style.marginRight=margin.droite+'px';
	objetDesti.style.marginTop=margin.haut+'px';
	objetDesti.style.marginBottom=margin.bas+'px';
	
	if (objSource.align) objetDesti.align=objSource.align;
	
	objetDesti.className=objSource.className;
	
	if (objSource.onclick) objetDesti.onclick=objSource.onclick;
	if (objSource.onmouseover) objetDesti.onmouseover=objSource.onmouseover;
	if (objSource.onmouseout) objetDesti.onmouseout=objSource.onmouseout;
	
	if  (objSource.nodeName.toLowerCase()=='img') 
		{
		OPT_objParent.nbImagesDemandees++;
		objetDesti.onload=function()
			{
			OPT_objParent.nbImagesChargees++;
			};
			
		objetDesti.src=objSource.src;
		objetDesti.alt=objSource.alt;
		}
		
	// Copie sous-éléments
	if (OPT_CopierSousObjets)
		{
		for (var i=0;i<objSource.childNodes.length;i++)
			{
			
			var objet1=objSource.childNodes[i];
			if (objet1.nodeType==3) //'#text'
				{
				//Il ne faut pas utiliser innerHTML mais textnode
				objetDesti.appendChild(document.createTextNode(objet1.nodeValue));
				var alignement=objet_Style_Recherche(objSource, 'textAlign');
				objetDesti.style.textAlign=alignement;
				}
			else
				objet_Copie(objet1, objetDesti);
			}
		}
				
				

		return objetDesti;
	}


// Opacité	
function objet_FixeOpacite(obj, valeur)
	{
	if (ie) 
		objet_FixeOpacite=function(obj,valeur){if (obj) obj.style.filter="alpha(opacity="+valeur.toString()+")";};
	else if (ffox)
		objet_FixeOpacite=function(obj,valeur){if (obj) obj.style.setProperty("-moz-opacity", (valeur-10)/100, "");};
	else if (opera)
		objet_FixeOpacite=function(obj,valeur){if (obj) obj.style.opacity=valeur/100;};
	else
		objet_FixeOpacite=function(obj,valeur){if (obj) obj.style.filter="opacity="+ (valeur/100).toString()+")";};
	objet_FixeOpacite(obj, valeur);
	}		


	
	
// Renvoie la position absolue d'un élément
function objet_PosAbs(obj, opt_ArretPremierDiv) 
	{  
	
	if (nonDef(opt_ArretPremierDiv)) opt_ArretPremierDiv=false;
    var pos = new Object();  
    pos.gauche = 0; 
	pos.haut = 0;  
    if (obj !== null) 
		{  
        pos.gauche = obj.offsetLeft;   
        pos.haut = obj.offsetTop;   
          
        var offParent = obj.offsetParent;  
        var nodParent = obj.parentNode;  
  
        while (offParent !== null  ) 
			{  
			//offParent.style.border='2px solid white';alert(pos.haut + '/' + offParent.offsetTop + '/'+offParent.nodeType +'/'+offParent.nodeName);offParent.style.border='';
			
			pos.gauche += offParent.offsetLeft;  
			pos.haut += offParent.offsetTop;  
  
			if (offParent != document.body && offParent != document.documentElement) 
				{  
				pos.gauche -= offParent.scrollLeft;  
				pos.haut -= offParent.scrollTop;  
				}  
				
			// pour autre que IE
			if (!ie) 
				{  
				while (offParent != nodParent && nodParent !== null) 
					{  
					pos.gauche -= nodParent.scrollLeft;  
					pos.haut -= nodParent.scrollTop;  
					  
					nodParent = nodParent.parentNode;  
					}      
				}  
			// Objet suivant
			nodParent = offParent.parentNode;  
			offParent = offParent.offsetParent;  

			// Arrêt au premier DIV absolute  rencontré
			if (opt_ArretPremierDiv && offParent!==null)        
				{
				if (offParent.nodeName.toLowerCase()=='div')
					{
					if (offParent.style.position=='absolute')
						offParent=null;
						
					}
				}
			}  
		}  
	//alert(pos.gauche + '/'+pos.haut);
    return pos;  
	}  	
	
	

function objet_RenvoieMargin(obj) 
	{
	if(document.all) 
		{ // IE
		return {gauche:objet_Style_EnlevePx(obj.currentStyle.marginLeft),
				droite:objet_Style_EnlevePx(obj.currentStyle.marginRight),
				haut:objet_Style_EnlevePx(obj.currentStyle.marginTop),
				bas:objet_Style_EnlevePx(obj.currentStyle.marginBottom)};
		}
	else 
		{ // Mozilla
		
		return {gauche:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('margin-left')),
				droite:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('margin-right')),
				haut:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('margin-top')),
				bas:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('margin-bottom'))};
		}
	}	
	
function objet_RenvoiePadding(obj) 
	{
	if(document.all) 
		{ // IE
		
		return {gauche:objet_Style_EnlevePx(obj.currentStyle.paddingLeft),
				droite:objet_Style_EnlevePx(obj.currentStyle.paddingRight),
				haut:objet_Style_EnlevePx(obj.currentStyle.paddingTop),
				bas:objet_Style_EnlevePx(obj.currentStyle.paddingBottom)};
		}
	else 
		{ // Mozilla
		return {gauche:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('padding-left')),
				droite:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('padding-right')),
				haut:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('padding-top')),
				bas:objet_Style_EnlevePx(document.defaultView.getComputedStyle(obj, '').getPropertyValue('padding-bottom'))};
		}
	}	
	
	
// Enlève la partie px d'un style et renvoie la valeur numérique
function objet_Style_EnlevePx (valeur)
	{
	var posPX=valeur.indexOf('px');
	var valeurRetour=0;
	if (posPX!=-1)
		valeurRetour=parseInt(valeur.substring(0, posPX));
	return valeurRetour;
	}

	
// Fixe l'attribut  style d'un objet	
function objet_Style_Applique(Objet,Valeur)
	{
	// Attributs
	if(Objet) 
		{
		if (Objet.style.setAttribute)
			Objet.style.setAttribute('cssText',Valeur); // IE
		else
			Objet.setAttribute('style',Valeur);
		}
	else
		alert('objet inconnu (objet_Style_Applique)');
	}		
	
	
	

// Affiche/Cache un objet (par nom ou par objet)
function objet_AfficherCacher(nomObjet)
	{
	var Objet=objet_Renvoie(nomObjet);
	if (Objet)	
		{
		if (Objet.style.visibility=='hidden')
			objet_Afficher(Objet);
		else
			objet_Cacher(Objet);
		}	
	}
	

// Cache un objet (par nom ou par objet)
function objet_Cacher(nomObjet, OPT_nonPresent)
	{
	if (nonDef(OPT_nonPresent)) OPT_nonPresent=false;
	
	var Objet=objet_Renvoie(nomObjet);
	if (Objet)	
		{
		Objet.style.visibility='hidden';

		if (OPT_nonPresent) Objet.style.display='none' ;
		}	
	}

// Cache un objet (par nom ou par objet)
function objet_Afficher(nomObjet)
	{
	var Objet=objet_Renvoie(nomObjet);
	if (Objet)	
		{
		Objet.style.visibility='visible';
		
		if (Objet.style.display=='none' || Objet.style.display==='')
			Objet.style.display = 'block'; // visible
		}	
	else
		alert('objet inconnu : ' + nomObjet);
		
	}	
	
// Ajoute une donnée à un tableau
function tab_Ajoute(tab, donnee)
	{
	tab.push(donnee);
	}	
	
// Retire une donnée d'un tableau
function tab_Supprime(tab, donnee)
	{
	var Trouve=false;
	var i=0;
	while (i<tab.length && !Trouve)
		{
		if (tab[i]==donnee)
			Trouve=true;
		else
			i++;
		}	
	if (Trouve) tab.splice(i,1);
	return tab;
	}	
	
// Renvoie la position de la donnée dans le tableau (null si non trouvée)
function tab_Recherche(tab, donnee)
	{
	var i=0;
	while (i<tab.length)
		{
		if (tab[i]==donnee)
			return i;
		else
			i++;
		}
	return null;
	}
/*
// Recherche une valeur dans un tableau et la retourne (-1 sinon)
function tableauRechValeur(tableau, valeur)	
	{
	var valeurTrouvee=false;
	var i=0;
	while (i<tableau.length && valeurTrouvee===false)
		{
		if (tableau[i]==valeur)
			valeurTrouvee=true;
		else
			i++;
		}	
	if (valeurTrouvee)
		return i;
	else
		return -1;
	}
	
// Recherche une valeur dans un tableau et la retire du tableau en sortie
function tableauRetireValeur(tableau, valeur)	
	{
	var nouveauTableau=Array();
	var valeurTrouvee=false;
	
	for (var i=0; i<tableau.length; i++)
		{
		if (tableau[i]!=valeur)
			nouveauTableau.push (tableau[i]);
		}	
	return nouveauTableau;
	}	
	*/	

// Recupère les styles
function objet_Style_RecupereListe(objet) 
		{
		// IE/Opera
		if (objet.currentStyle)
			return objet.currentStyle;
		
		// Firefox
		if (document.defaultView.getComputedStyle)
			return document.defaultView.getComputedStyle(objet, null);
		
		// Autre
		if (objet.runtimeStyle)
			return objet.runtimeStyle;		
		
		return null;
        }

// Recherche une propriété dans la liste des styles
function objet_Style_Recherche(objet, proprieteStyle)
	{
	var valeurProp='';
	var styles=objet_Style_RecupereListe(objet);
	
	if (styles[proprieteStyle])
		return (styles[proprieteStyle]);
	else
		return null;
	}

// Renvoie vrai si l'objet est visible	
function objet_estVisible(obj)
	{
	// Si le style est fixé dans le css, ne fonctionne pas toujours
	var visib=obj.style.visibility;
	var disp=obj.style.display;
	if (visib==='') visib=objet_Style_Recherche(obj, 'visibility');
	if (disp==='') disp=objet_Style_Recherche(obj, 'display');
	
	if ( visib=='visible' && disp!='none')
		return true;
	else
		return false; 
	}

