<!---
/**
*	Original:  Eddie Traversa (psych3@primus.com.au)
*	Web Site:  http://dhtmlnirvana.com/
*
*	This script and many more are available free online at
*	The JavaScript Source!! http://javascript.internet.com
*
*	Home  BG Effects  Persistent Layer 
*	Float a layer on the screen so that it stays in place while a user scrolls the page. It has an animation script that slides the layer into position.
*	Netscape 6 compatible 
*/


// Begin
window.onerror = null;

var ns6 = (!document.all && document.getElementById);
var ie6 = (document.all && document.getElementById);
var ie4 = (document.all);
var ns4 = (document.layers);

var allFloatLayers = new Array();

function getLayerStyleById( id ) {
var obj ;
if (ns6 || ie6) {
	obj = document.getElementById(id).style;
}
else if(ie4) {
	obj = document.all[id].style;
}
else if(ns4) {
	obj = document.layers[id];
}
return obj ;
}


//	recherche un objet
function getLayerById( id ) {
var obj ;
if (ns6 || ie6) {
	obj = document.getElementById(id);
}
else if(ie4) {
	obj = document.all[id];
}
else if(ns4) {
	obj = document.layers[id];
}
return obj ;
}


//Fonction permettant de positionner un DIV à une position occupée par une ancre
function setToAnchor(idAnchor,idDiv)
{
var divLeft = 0;
var divTop = 0;

if ( setToAnchor.arguments.length > 3 ) {
	divTop=setToAnchor.arguments[2];
	divLeft=setToAnchor.arguments[3];
}
if (ns6 || ie6)
{
	layerNavPos = document.getElementById(idAnchor);
	if ( layerNavPos == null ) {
	//	alert("erreur Achor:" + idAnchor );
		return ;
	}
	divLeft += getLeft(layerNavPos);
	divTop += getTop(layerNavPos);
	
	divSet = document.getElementById(idDiv)
	if ( divSet == null ) {
	//	alert("erreur Div:" + idDiv );
		return ;
	}
	
	document.getElementById(idDiv).style.left = divLeft;
	document.getElementById(idDiv).style.top = divTop;
}
else if (ie4) 
{
	layerNavPos = document.all[idAnchor];
	divLeft += getLeft(layerNavPos);
	divTop += getTop(layerNavPos);
//	alert("i-e:" + divTop + "/" +divLeft);
	document.all[idDiv].style.posLeft = divLeft ;
	document.all[idDiv].style.posTop = divTop ;
}
else if (ns4)
{
	layerNavPos = document.anchors[idAnchor];
	divLeft += layerNavPos.x;
	divTop += layerNavPos.y;
	document.layers[idDiv].pageX = divLeft;
	document.layers[idDiv].pageY = divTop;
}
}

//Fonction permettant de connaître la position d'un objet
function getLeft(lObj) {
if (lObj.offsetParent)
	return (lObj.offsetLeft + getLeft(lObj.offsetParent));
else 
	return (lObj.offsetLeft);
}

//Fonction permettant de connaître la position d'un objet
function getTop(lObj) {
if (lObj.offsetParent)
	return (lObj.offsetTop + getTop(lObj.offsetParent));
else
	return (lObj.offsetTop);
}

//	Changer le style d'un objet
function chgtStyle( cellId, newClass ) {

var st = getLayerById( cellId ) ;

	if ( st != null && st != 'undefined' ) {
//		alert("change:" + cellId + " en:" + newClass);
		st.className=newClass;
	}
}

//	Last Layer to be hide
var lastHidden ="";
var the_timeout = 0;

// Make an object visible
function showLayer(id) {

var obj = getLayerStyleById( id );
 if ( obj != null ) {
	if (ie4 || ns6) obj.visibility = "visible";
	else if (ns4) obj.visibility = "show";
 }
 
 if ( lastHidden != "" ) {
	if ( id == lastHidden ) {
		if ( the_timeout > 0 ) {
			clearTimeout(the_timeout);
			the_timeout = 0;
		}
		lastHidden = "";
	}
	else {
		hideLayerNow( lastHidden ) ;
	}
 }
}

// hide the layer at the end off timeout
function hideLayerNow( id ) {
var obj = getLayerStyleById( id );
 if ( obj != null ) {
	if (ie4 || ns6) obj.visibility = "hidden";
	else if (ns4) obj.visibility = "hide";
 }
 if ( lastHidden == id ) {
	 the_timeout = 0;
	 lastHidden = "";
 }
}

// Hides an object
function hideLayer( id ) {

	var tmp = "hideLayerNow('" + id + "')"
	the_timeout = setTimeout( tmp, 500 );
	lastHidden=id;
}

//
//	New object layer
//	id:
//	topMagin : final position in the window
//
function layerObject(_id, _topMargin ) {
this.id = _id;
this.topMargin = _topMargin ;
this.slideTime = 1000;
this.targetY = 0 ;
this.currentY = 0 ;
this.currentH = 20;
this.moveLength = 0;
this.moveTime = 0;
this.moveStart = 0;
this.obj = getLayerById(_id);

this.absolutTop=-1;
}

function getLayerObject( id ) {
	return allFloatLayers[id] ;
}

function setLayerObject( id, layerObj ) {
	allFloatLayers[id] = layerObj ;
}

var  layerStarted=false;

// déplacement de tous les layer
function layerMover() {

	for ( fl in allFloatLayers ) {
		if ( fl != null && fl.id != 'undefined' ) {
			layerMain( fl );
		}
	}
}


// main action moving the layer
function layerMain( layerId ) {
var scrollTop ;
var layerObj = getLayerObject( layerId ) ;
if ( layerObj == null ) {
	return ;
}

if (ns4) {
	layerObj.currentY = document.layers[ layerId ].top;
	layerObj.currentH = document.layers[ layerId ].height;
	scrollTop = window.pageYOffset;
	clientHeight=600;
} else if(ns6) {
	layerObj.currentY = parseInt(document.getElementById(layerId).style.top);
	layerObj.currentH = parseInt(document.getElementById(layerId).style.height);
	scrollTop = window.scrollY;
	clientHeight=window.innerHeight;

} else if(ie4) {
	layerObj.currentY = document.all[layerId].style.pixelTop;
	layerObj.currentH = document.all[layerId].style.pixelHeight ;
	scrollTop = document.body.scrollTop;
	clientHeight=document.body.clientHeight;
}

if ( layerObj.absolutTop == -1 ) {
	layerObj.absolutTop = getTop( layerObj.obj );
}

var newTargetY = scrollTop + layerObj.topMargin;

if ( layerObj.absolutTop > clientHeight ) {
	if ( newTargetY + clientHeight < layerObj.absolutTop ) {
	//	window.status="c'est plus bas";
		return ;
	}
	max = clientHeight - layerObj.absolutTop ;
	newTargetY = clientHeight + scrollTop - layerObj.absolutTop - layerObj.currentH - 5 ;
	// window.status="scroll:" + scrollTop + " cHeight:" + clientHeight + " absTop:"+layerObj.absolutTop;
}

if ( layerObj.currentY != newTargetY ) {
	if ( newTargetY != layerObj.targetY ) {
		layerObj.targetY = newTargetY;
		floatStart( layerObj );
	}
	animator( layerObj );
}
}

function floatStart( layerObj ) {

if (ns4 || ns6) {
	findHt = window.innerHeight;
} else if(ie4) {
	findHt = document.body.clientHeight;
}
// window.status=" current="+ layerObj.currentY + " target='" + layerObj.targetY +"'";
var now = new Date();
diff = layerObj.targetY - layerObj.currentY;
layerObj.moveTime = now.getTime();
if (Math.abs(diff) > findHt) {
	if ( diff > 0 ) {
		layerObj.moveStart = layerObj.targetY - findHt ;
		layerObj.moveLength = findHt ;
	} else {
		layerObj.moveStart = layerObj.targetY + findHt;
		layerObj.moveLength = -findHt;
	}
}
else {
	layerObj.moveStart = layerObj.currentY;
	layerObj.moveLength = diff ;
}
}

function animator( layerObj ) {
var now = new Date();
var slidePerTime = Math.PI / ( 2 * layerObj.slideTime );
var newY = layerObj.moveLength * Math.sin( slidePerTime * ( now.getTime() - layerObj.moveTime ) ) + layerObj.moveStart;
newY = Math.round(newY);

if (( layerObj.moveLength > 0 && newY > layerObj.currentY ) || ( layerObj.moveLength < 0 && newY < layerObj.currentY )) {
	if ( ie4 )document.all[ layerObj.id ].style.pixelTop = newY;
	if ( ns4 )document.layers[ layerObj.id ].top = newY;
	if ( ns6 )document.getElementById( layerObj.id ).style.top = newY + "px";
//window.status="new: "+ newY + " a=" + A + " do-it";
}
}

//
//	Public fonction
//		layerId: id form the layer
//		topMargin, finial position in the window
//		slideTime, move rate
//
function layerSetup( layerId, topMargin, slideTime ) {
floatLyr = new layerObject( layerId, topMargin );

	floatLyr.slideTime = slideTime ;
	setLayerObject( layerId, floatLyr );
	
	if ( ! layerStarted ) {
		window.setInterval("layerMover()", 10)
		layerStarted = true;
	}
}

//
//	Arrèt d'un layer
function layerStop( layerId ) {
	if ( allFloatLayers[layerId] != null && allFloatLayers[layerId] != 'undefined' ) {
		delete allFloatLayers[layerId];
	}
}

//  End -->

