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

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

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

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

}

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

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

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

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

	//alert( x + ", " + y	);

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

}

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



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

// -------------------------------------------------------------------------------------------------------
// A reporter dans addeo_layer 

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

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

// Fin A reporter dans addeo_layer 
// -------------------------------------------------------------------------------------------------------


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

//**************************
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 à réactuliser le clipping après 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;
	}

}

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


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

	//alert (infos +"=" + valeur);
	return(valeur);
}

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

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

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

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


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

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

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


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

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


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

}

//**************************
function layer_definir_opacite(id_layer, opacite)
{
//opacite=0 to 100
var layer;

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 + ")";
/*if(layer.style.filters && layer.style.filters.opacity)
	layer.style.filters.opacity = opacity;
if(layer.filters.alpha.opacity)
	layer.filters.alpha.opacity  = opacite;*/
/*if(layer.style.alpha)
	{
	layer.style.filter="alpha(opacity=100)";
    layer.filters.alpha.opacity  = opacite;
	}

else
	{
    layer.style.setProperty("-moz-opacity",opacite,"");
    }*/
return(opacite);
}

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

// ----------------------------------------------------------------------------
function layer_scroller(id_layer, scroll_x, scroll_y, layer_param)
{
// sert à faire défiler un contenu avec deux boutons style barre de défilement
// 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 défilement.
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


//alert( ' - scroll_x = ' +  scroll_x + '- scroll_y = ' + scroll_y );

//alert('id_layer = ' + id_layer + ' - scroll_x = ' +  scroll_x + '- scroll_y = ' + scroll_y + ' - layer_param = ' + layer_param);

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 début 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 début 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;

//	alert ( " layer =" + x_layer + ", " + y_layer + ", " + l_layer + ", " + h_layer + "  CLIP= " + x_clip + " " + y_clip + " " + l_clip + " " + h_clip + "   SCROLL = " + scroll_x + ", " + scroll_y ) ;
//	alert ( " pos =" + x_pos + ", " + y_pos + "  CLIP= " + x + " " + y + " " + l_clip + " " + h_clip + "   SCROLL = " + scroll_x + ", " + scroll_y ) ;


layer_definir_clipping(id_layer, x, y, l_clip, h_clip, layer);

layer_positionner(id_layer, x_pos, y_pos, layer);

}


