// 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
// Copyright 2001-2004 Addeo SA All rights reserved. addeo@addeo.com
// ----------------------------------------------------------------------------


// sous ie5 undefined n'est pas defini 
if (typeof(undefined)=='undefined') var undefined="undefined";

//*******************************************************************
// ! 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;
// ns 6 ie 5
if(document.createElement && document.body.appendChild)
	{
	layer = document.createElement('DIV');
	if(layer)
		{
		document.body.appendChild(layer);
		layer.id = id_layer;
		layer.name = id_layer;
		layer.style.position = 'absolute';
		layer.style.left = x;
	 	layer.style.top = y;
  		layer.style.width = largeur; 
	  	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_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;

	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 (x==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) 
	{
		layer.style.left = x;
		layer.style.top  = y;
		layer.style.posLeft = x;
		layer.style.posTop = y;
		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);	
}


//**************************
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 (l>=0)
	{
		if (layer.clip && layer.clip.width!=undefined)	layer.clip.width = l;
		if (layer.style && layer.style.width)	layer.style.width = l;
		if (layer.width!=undefined)		layer.width = l;
	}

	if (h>=0)
	{
		if (layer.clip && layer.clip.height)	layer.clip.height = h;
		if (layer.style && layer.style.height)	layer.style.height = h;
		if (layer.height!=undefined)		layer.height = h;
	}

}

//**************************
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;

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;

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;


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;

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;
}

//**************************
function layer_adresse(id_layer) 
{
var layer = null;

if (document.layers) 
	layer= document.layers[id_layer]; 
if (document.all) 
	layer = document.all[id_layer];
if (document.getElementById) 
	layer = document.getElementById(id_layer);
return(layer);
}

//**************************
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.alpha)
	{
	layer.style.filter="alpha(opacity=100)";
    layer.filters.alpha.opacity  = opacite;
	}
     
else 
	{         
    layer.style.setProperty("-moz-opacity",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);

}



