// AUTEUR: addeo
// DATE DE CREATION: 11/10/00 (ET)
// MODIFICATIONS RA : 09/02/01
// MODIFICATIONS ET : 07/03/01
// MODIFICATIONS ET : 01/08/01 gestion clipping, ajout du parametre layer_param
// MODIFICATIONS RA : 26/04/04 extraction fonctions de d�tection navigateur
// MODIFICATIONS ET : 02/02/05 suppression des variables contenant le type et la version du navigateur

// Copyright 2001-2005 Addeo SA All rights reserved. addeo@addeo.com
// ----------------------------------------------------------------------------


// sous ie5 undefined n'est pas defini
if (typeof(undefined)=='undefined') var undefined="undefined";

var isMozilla = (navigator.userAgent.toLowerCase().indexOf('gecko')!=-1) ? true : false;


//*******************************************************************
// ! le layer parent n'est pas g�r� dans tous les cas � faire
function layer_creer(id_layer, x, y, largeur, hauteur, visibilite, layer_parent_id)
{
var html, layer, l_pere;

// ns 6 ie 5
if(document.createElement && document.body.appendChild)
	{
	layer = document.createElement('DIV');
	if(layer)
		{
		if(layer_parent_id)
			l_pere = layer_adresse(layer_parent_id);
		if(l_pere)
			l_pere.appendChild(layer);
		else	
			document.body.appendChild(layer);
		layer.id = id_layer;
		layer.name = id_layer;
		layer.style.position = 'absolute';
		layer.style.left = x;
	 	layer.style.top = y;
	 	if(largeur > 0)
	  		layer.style.width = largeur;
	 	if(hauteur > 0)	  		
		  	layer.style.height = hauteur;
		layer.visibility = (visibilite=='hidden')? 'hide' : 'show';
		}
	return(layer_adresse(id_layer));
	}

// ns 4
if (document.layers)
	{
	if (layer_parent_id)
		layer=eval("document."+layer_parent_id+".document."+id_layer + '=new Layer(width, document."+layer_parent_id+")');
	else
		{
		layer = document.layers[id_layer] = new Layer(largeur);
		eval("document."+id_layer+" = layer");
		}
	layer.name = id_layer;
	layer.left = x;
	layer.top = y;
	if (hauteur!=null)
		layer.clip.height = hauteur;
	layer.visibility = (visibilite=='hidden')? 'hide' : 'show';

	return(layer_adresse(id_layer));
	}

//ie 4
if (document.all)
	{
	html =  '\n<DIV id="' + id_layer + '" style=\"position: absolute; ';
	html += 'left: ' + x + 'px; top: ' + y +'px; width: '+ largeur+'px; height: '+hauteur+'px; ';
	html += 'clip:rect(0,'+largeur+','+hauteur+',0); ';
	html += 'visibility: ' + visibilite;
	html += '"> </DIV>';
	if (layer_parent_id)
		{
		pos=layer_parent_id.lastIndexOf(".");
		layer_parent = (pos != -1)? layer_parent_id.substr(pos+1) : layer_parent_id;
			document.all[layer_parent].insertAdjacentHTML("BeforeEnd",html);
		}
	else
		{
		document.body.insertAdjacentHTML("BeforeEnd",html);
		}
	return(layer_adresse(id_layer));
	}

return null;
}

/**
 * Supprime un element HTML
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_detruire(id_layer, layer_param)
{
	var layer, html;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;
	
	layer_cacher(id_layer);
	
	if (document.body.removeChild)
		{
		document.body.removeChild(layer);
		return;
		}
	
	if (document.layers)
		{
		delete document.layers[id_layer];
		return;
		}
	
	if (document.all)
		{
		document.all[id_layer].style.visibility = "hidden";
		document.all[id_layer].innerHTML = "";
		document.all[id_layer].outerHTML = "";
		return;
		}
}

/**
 * Retourne un ou plusieurs elements avec l'id donné
 * @param id_layer, nom de l'id à chercher
 * @return un ou plusieurs element, null si non trouvé
 */
function layer_adresse(id_layer)
{
	if (document.getElementById)	return (document.getElementById(id_layer));
	if (document.layers)			return (document.layers[id_layer]);
	if (document.all)				return (document.all[id_layer]);
	
	return(null);
}

/**
 * Affiche un element HTML
 * @param id_layer, nom de l'element
 * @param layer_param
 * @return null
 */
function layer_montrer(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param)		layer = layer_adresse(id_layer);
	else					layer=layer_param;
	
	if (!layer)				return;
	
	if (document.layers)	layer.visibility = "show";
	else					layer.style.visibility = "visible";

}

/**
 * Masque un element HTML
 * @param id_layer, id de l'element
 * @param layer_param
 * @return null
 */
function layer_cacher(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;
	if (document.layers)	layer.visibility = "hide";
	else					layer.style.visibility = "hidden";
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_visible(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return false;
	
	if (document.layers)		return(layer.visibility == "show");
	if (layer.style)			return(layer.style.visibility == "visible");
	
	return(false);
}
	
/**
 * 
 * @param id_layer
 * @param x
 * @param y
 * @param l
 * @param h
 * @param layer_param
 * @return
 */
function layer_placer(id_layer, x, y, l, h, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;
	
	layer_positionner(id_layer, x, y, layer);
	layer_dimensionner(id_layer, l, h, layer);
}

/**
 * 
 * @param id_layer
 * @param x
 * @param y
 * @param layer_param
 * @return
 */
function layer_positionner(id_layer, x, y, layer_param)
{
	var layer, px;

	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;

	if (x==null || x=="") x=layer_lire_position_x(id_layer, layer_param);
	if (y==null || y=="") y=layer_lire_position_y(id_layer, layer_param);

	if (document.layers)
	{
		layer.moveTo(x, y);
		return;
	}

	if (layer.style && layer.style.left!=undefined)
	{
		if (isMozilla) px="px"; else px="";
		layer.style.left = x + px;
		layer.style.top  = y + px;
		layer.style.posLeft = x + px;
		layer.style.posTop = y + px;
		return;
	}

	if (layer.pixelLeft!=undefined)
	{
		layer.pixelLeft = x;
		layer.pixelTop  = y;
		return;
	}

	if (layer.left!=undefined)
	{
		layer.left = x;
		layer.top  = y;
	}
}

/**
 * Renvoie la position X d'un element 
 * @param id_layer, id de l'element
 * @param layer_param
 * @return int ou -1 si erreur
 */
function layer_lire_position_x(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	if (layer.offsetLeft!=undefined)		return(parseInt(layer.offsetLeft));
	if (layer.style)						return(parseInt(layer.style.pixelLeft));
	if (layer.left!=undefined)				return (layer.left);
	
	return(-1);
}

/**
 * Renvoie la position Y d'un element
 * @param id_layer, id de l'element
 * @param layer_param
 * @return int ou -1 si erreur
 */
function layer_lire_position_y(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param)		layer = layer_adresse(id_layer);
	else layer=layer_param;
	
	if(layer == null)					return (-1);
	if (layer.offsetTop!=undefined)		return(parseInt(layer.offsetTop));
	if (layer.style)					return(parseInt(layer.style.pixelTop));
	if (layer.top!=undefined)			return (layer.top);
	
	return(-1);
}

/**
 * Renvoi la position X absolue (par rapport au layout)
 * @param obj, element HTML
 * @return int
 */
function layer_lire_position_x_absolue(obj)
{
	var sum_x = 0;
	var pere = obj;
	
	sum_x = obj.offsetLeft;
	while (pere = pere.offsetParent)
		sum_x += pere.offsetLeft;
	
	return(sum_x);
}

/**
 * Renvoie la position Y absolue
 * @param obj, element HTML
 * @return
 */
function layer_lire_position_y_absolue(obj)
{
	var sum_y = 0;
	var pere = obj;
	
	sum_y = obj.offsetTop;
	while (pere = pere.offsetParent)
		sum_y += pere.offsetTop;
	
	return(sum_y);
}

/**
 * Retourne la largeur en pixel
 * @param id_layer
 * @param layer_param
 * @return int ou 1- si erreur
 */
function layer_lire_largeur(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param)			layer = layer_adresse(id_layer);
	else						layer=layer_param;
	
	if (!layer)								return null;
	if (layer.offsetWidth!=undefined)		return(parseInt(layer.offsetWidth));
	if (layer.style)						return(parseInt(layer.style.width));
	if (layer.clip)							return (layer.clip.right-layer.clip.left);
	
	return(-1);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_hauteur(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	
	if (layer.offsetHeight!=undefined)		return(parseInt(layer.offsetHeight));
	if (layer.style>0)						return(parseInt(layer.style.height));
	if (layer.clip)							return (layer.clip.height);

	return(-1);
}

/**
 * penser a reactualiser le clipping apres un redimensionnement (layer_definir_clipping)
 */
function layer_dimensionner(id_layer, l, h, layer_param)
{
	var layer;

	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;
	
	if (isMozilla) px="px"; else px="";
	
	if (l>=0)
	{
		if (layer.clip && layer.clip.width!=undefined)	layer.clip.width = l+px;
		if (layer.style && layer.style.width)	layer.style.width = l+px;
		if (layer.width!=undefined)		layer.width = l+px;
	}

	if (h>=0)
	{
		if (layer.clip && layer.clip.height)	layer.clip.height = h+px;
		if (layer.style && layer.style.height)	layer.style.height = h+px;
		if (layer.height!=undefined)		layer.height = h+px;
	}
}

/**
 * Reactualise le clipping
 * @param id_layer
 * @param x
 * @param y
 * @param l
 * @param h
 * @param layer_param
 * @return
 */
function layer_definir_clipping(id_layer, x, y, l, h, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;
	
	if (document.layers){
		if (x>=0) layer.clip.left = x;
		if (l>=0) layer.clip.width = l;
		layer.clip.right = layer.clip.left + layer.clip.width;
	
		if (y>=0) layer.clip.top = y;
		if (h>=0) layer.clip.height = h;
		layer.clip.bottom = layer.clip.top + layer.clip.height;
	}
	if (layer.style.clip!=undefined){
		if (x<0) x=layer_lire_clipping_x(id_layer, layer_param);
		if (y<0) y=layer_lire_clipping_y(id_layer, layer_param);
		if (l<0) l=layer_lire_clipping_largeur(id_layer, layer_param);
		if (h<0) h=layer_lire_clipping_hauteur(id_layer, layer_param);
		layer.style.clip="rect(" + y +"px " + (x + l) +"px " + (y+h) + "px " + x + "px)";
	}
}

/**
 * 
 * @param layer
 * @param infos
 * @return
 */
function layer_style_clip_lire_infos(layer, infos)
{
	var clipv, valeur, clipProp, pixel, reg_exp;

	valeur=-1;

	if (layer.style.clip.length ==0) return(0);
	clipv = layer.style.clip.split("rect(")[1].split(")")[0].split("px");
	reg_exp=new RegExp(",");

	if (infos=="x")		valeur=new Number(clipv[3].replace(reg_exp, ''));
	if (infos=="y")		valeur=new Number(clipv[0].replace(reg_exp, ''));
	if (infos=="l")		valeur=new Number(clipv[1].replace(reg_exp, ''))- new Number(clipv[3].replace(reg_exp, ''));
	if (infos=="h")		valeur=new Number(clipv[2].replace(reg_exp, ''))- new Number(clipv[0].replace(reg_exp, ''));

	return(valeur);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_clipping_x(id_layer, layer_param)
{
	var layer;
	var clipv;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	if (layer.style.clip)		return(layer_style_clip_lire_infos(layer, "x"));
	if (layer.clip)				return(layer.clip.left);
	if(layer.currentStyle)		return(parseInt(layer.currentStyle.clipLeft));
	
	return(-1);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_clipping_y(id_layer, layer_param)
{
	var layer;
	var clipv;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	
	if (layer.style.clip)		return(layer_style_clip_lire_infos(layer, "y"));
	if (document.layers)		return(layer.clip.top);
	if(layer.currentStyle)		return(parseInt(layer.currentStyle.clipTop));
	
	return(-1);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_clipping_largeur(id_layer, layer_param)
{
	var layer;
	var clipv;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	
	
	if (layer.style.clip)		return(layer_style_clip_lire_infos(layer, "l"));
	if (document.layers)		return(layer.clip.width);
	if(layer.currentStyle)		return(parseInt(layer.currentStyle.clipRight) - parseInt(layer.currentStyle.clipLeft));
	
	return(-1);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_clipping_hauteur(id_layer, layer_param)
{
	var layer;
	var clipv;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	
	if (layer.style.clip)		return(layer_style_clip_lire_infos(layer, "h"));
	if (document.layers)		return(layer.clip.height);
	if(layer.currentStyle)		return(parseInt(layer.currentStyle.clipBottom) - parseInt(layer.currentStyle.clipTop));
	
	return(-1);
}

/**
 * 
 * @param id_layer
 * @param layer_param
 * @return
 */
function layer_lire_zindex(id_layer, layer_param)
{
	var layer;
	
	if (!layer_param)			layer = layer_adresse(id_layer);
	else 						layer=layer_param;
	
	if (!layer)			return(-1);
	
	if (document.layers)		return(layer.zIndex);
	else						return(layer.style.zIndex);
}

/**
 * 
 * @param id_layer
 * @param z
 * @param layer_param
 * @return null
 */
function layer_definir_zindex(id_layer, z, layer_param)
{
	var layer;
	
	if (!layer_param)		layer = layer_adresse(id_layer);
	else					layer=layer_param;
	
	if (!layer)			return;
	
	if (document.layers)		layer.zIndex = z;
	else						layer.style.zIndex = z;
}

/**
 * 
 * @param id_layer
 * @param couleur
 * @param image
 * @param layer_param
 * @return -1 en cas d'erreur
 */
function layer_definir_fond(id_layer, couleur, image, layer_param)
{
	var layer;
	
	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return(-1);
	
	if (couleur == null || couleur == 'transparent')		{
		if(document.layers)			couleur = null;
		else					   	couleur = 'transparent';
	}
	
	if(document.layers)				layer.bgColor = couleur;
	else							layer.style.backgroundColor = couleur;
	
	if (image){
		if(document.layers)			layer.background.src = image;
		else						layer.style.backgroundImage = "url(" + image + ")";
	}
	return(-1);
}

/**
 * Ecrit une chaine dans un element HTML
 * @param id_layer
 * @param contenu
 * @param layer_param
 * @return
 */
function layer_ecrire_contenu(id_layer, contenu, layer_param)
{
	var layer;

	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)	return;

	if (document.layers)
	{
		layer.document.close();
		layer.document.open();
		layer.document.write(contenu);
		layer.document.close();
		return;
	}

	if (layer.innerHTML!=undefined)
	{
		layer.innerHTML = contenu;
		return;
	}

	if (navigator.appName == 'Netscape' && document.getElementById)
	{
		while (layer.hasChildNodes()) layer.removeChild(layer.lastChild);
		var range = document.createRange();
		range.selectNodeContents(layer);
		layer.appendChild(range.createContextualFragment(contenu));
		return;
	}
}

/**
 * retourne l'adresse d'un formulaire dans un layer
 * @param id_layer
 * @param formulaire
 * @return element HTML
 */
function layer_adresse_form(id_layer, nom_formulaire)
{
	var layer;
	
	if (document.layers){
		layer=layer_adresse(id_layer);
		if (!layer)						return(null);
		return(document.layers[id_layer].document.forms[nom_formulaire]);
	}
	
	if (document.forms)					return(document.forms[nom_formulaire]);
	
	return(null);
}

/**
 * Retourne l'élement id_layer présent dans id_obj
 * @param id_layer
 * @param id_obj
 * @return element HTLM
 */
function layer_adresse_obj(id_layer, id_obj)
{
	if (document.getElementById)		return(document.getElementById(id_obj));
	
	if (document.layers){
		if(id_layer)					return(document.layers[id_layer].document[id_obj]);
		else							return(document[id_obj]);
	}
	
	if (document.all)				 	return(document[id_obj]);
	
	return(null);
}

/**
 * Centrer un element HTML
 * @param id_layer
 * @param layer_param
 * @return null
 */
function layer_centrer(id_layer, layer_param)
{
	var layer, x;
	
	if (!layer_param)		layer = layer_adresse(id_layer);
	else					layer=layer_param;
	
	if(layer == null)		return ;
	
	x = (document_largeur()-layer_lire_largeur(id_layer, layer))/2;
	
	if (x<0)				x=0;
	
	layer_positionner(id_layer, x, -1, layer);
}

/**
 * Modifie l'opacité d'un element HTML et retourne sa valeur
 * @param id_layer
 * @param opacite
 * @return int ou -1 si erreur
 */
function layer_definir_opacite(id_layer, opacite)
{
	var layer;				//opacite=0 to 100
	
	layer = layer_adresse(id_layer);
	if (!layer)						return(-1);
	if(layer.style.opacity)			layer.style.opacity = opacite/100;
	if(layer.style.filter)			layer.style.filter = "alpha(opacity=" + opacite + ")";
	
	return(opacite);
}

/**
 * Créé un nouvel element HTML positionné 
 * @param id_layer
 * @param x
 * @param y
 * @param l
 * @param h
 * @param action_in
 * @param action_out
 * @param action_clic
 * @return null
 */
function layer_actif_creer(id_layer, x, y, l, h, action_in, action_out, action_clic)
{
	var html='';
	var layer;
	
	layer=layer_creer(id_layer, x, y, l, h, "hidden");
	layer_cacher(id_layer);
	if(layer){
		if (action_in)		layer.onmouseover=action_in;
		if (action_out)		layer.onmouseout=action_out;
		if (action_clic)	layer.onmousedown=action_clic;
	}
}

/**
 * Sert a faire defiler un contenu avec deux boutons style barre de defilement
 * d'une part, fait bouger le layer, d'autre part fait bouger en sens inverse la zone visible du layer pour simuler la zone de defilement.
 * 
 * @param id_layer
 * @param scroll_x
 * @param scroll_y
 * @param layer_param
 * @return null
 */
function layer_scroller(id_layer, scroll_x, scroll_y, layer_param)
{
	var layer;
	var x,y,l,h ;  // variables du d�placement du clip
	var x_pos, y_pos ; // variables du d�placement du layer
	var x_max, y_max, l_max, h_max ; // coordonn�es maximales autoris�es
	var x_clip, y_clip,  l_clip, h_clip; // coordonn�es du clip
	var x_layer, y_layer, l_layer, h_layer ; // coordonn�es  du layer

	if (!layer_param) layer = layer_adresse(id_layer); else layer=layer_param;
	if (!layer)			return;
	
	x_layer = layer_lire_position_x(id_layer, layer) ;
	y_layer = layer_lire_position_y(id_layer, layer) ;
	
	x_clip = Math.max(layer_lire_clipping_x(id_layer, layer),0) ;
	y_clip = Math.max(layer_lire_clipping_y(id_layer, layer), 0) ;
	l_clip = Math.max(layer_lire_clipping_largeur(id_layer, layer), 0);
	h_clip = Math.max(layer_lire_clipping_hauteur(id_layer, layer),0);
	
	if (scroll_x!=0){
		l_layer = layer_lire_largeur(id_layer, layer) ;								// eviter de scroller si on a atteint le debut du layer
		if (scroll_x > 0)			scroll_x = Math.min(scroll_x, l_layer - x_clip - l_clip) ;
		if (scroll_x < 0)			scroll_x = Math.max(scroll_x, - x_clip) ;
	}
	x = x_clip + scroll_x ;
	x_pos = x_layer - scroll_x ;
	
	if (scroll_y!=0){
		h_layer = layer_lire_hauteur(id_layer, layer) ;								// eviter de scroller si on a atteint le debut du layer
		if (scroll_y > 0)			scroll_y = Math.min(scroll_y, h_layer - y_clip - h_clip) ;
		if (scroll_y < 0)			scroll_y = Math.max(scroll_y, - y_clip) ;
	}
	y = y_clip + scroll_y ;
	y_pos = y_layer - scroll_y;

	layer_definir_clipping(id_layer, x, y, l_clip, h_clip, layer);
	layer_positionner(id_layer, x_pos, y_pos, layer);
}
