<!--
//Heavily modified by Sébastien Mouren
/*  Prototype JavaScript framework, version 1.3.0
 *  (c) 2005 Sam Stephenson <sam@conio.net>
 *
 *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
 *  against the source tree, available from the objPrototype darcs repository. 
 *
 *  objPrototype is freely distributable under the terms of an MIT-style license.
 *
 *  For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

//définit la méthode prototype push des tableaux si elle n'existe pas
// fonction litterale ajoutant la valeur des arguments passés à la méthode push au tableau; cette fonction renvoie la nouvelle taille du tableau
if (!Array.prototype.push) {
	Array.prototype.push = function() {
		for(var i = 0; i < arguments.length; i++) this[this.length] = arguments[i];
		return this.length;
	};
}

//définit la méthode prototype "apply" des fonctions si elle n'existe pas
//fonction litterale qui convertissant les valeurs du taleau argArgs en chaine de caractère dans un autre tableau,
//utilise la fonction "eval" pour normaliser l'expression ainsi formée et la retourner
if (!Function.prototype.apply) {
	Function.prototype.apply = function(objObj, argArgs) {
		var arArgsStrings = new Array();
		if (!objObj) objObj = window;
		if (!argArgs) argArgs = new Array();
		for (var i = 0; i < argArgs.length; i++) arArgsStrings[i] = "argArgs[" + i + "]";
		objObj.__apply__ = this;
		var funcApply = eval("objObj.__apply__(" + arArgsStrings.join(", ") + ")");
		objObj.__apply__ = null;
		return funcApply;
	};
}

if (!Function.prototype.call) {
	Function.prototype.call = function () {
		var objObject = arguments[0];
		objObject._this_func = this;
		var argArgs = new Array();
		for (var i=1; i < arguments.length; i++) argArgs[argArgs.length] = "arguments[" + i + "]";
		eval("objObject._this_func(" + argArgs.join(",") + ")");
		objObject._this_func = null;
	};
}


//définition de l'objet Class et d'une de ses méthodes create
var Class = {
	create: function() {return function() {this.initialize.apply(this, arguments);}}
};

//
Object.extend = function(objDestination, objSource) {
		for (strProperty in objSource) objDestination[strProperty] = objSource[strProperty];
		return objDestination;
};

Object.prototype.extend = function(objObject) {return Object.extend.apply(this, [this, objObject]);};

//Définition d'une méthode prototype de l'objet Function qui a pour objectif d'accrocher à la fonction appelante une méthode apply
//avec comme argument l'objet passé en argument et le tableau d'arguments de la fonction appelante
//l'objectif est de former quelques chose de similaire à object.CallingFunction(arguments)
Function.prototype.bind = function(objObject) {
	var __method = this;
	return function() {return __method.apply(objObject, arguments);}
};

Number.prototype.toColorPart = function() {
	var digits = this.toString(16);
	if (this < 16) return '0' + digits; return digits;
};

//Objet objTry qui contient une méthode "these" 
var objTry = {
	these: function() {
		var returnValue;
		for (var i = 0; i < arguments.length; i++) {
			var lambda = arguments[i];
			try {
				returnValue = lambda();
				break;
			} catch (e) {
			}
		}
		return returnValue;
	}
};

/*document.getElementsByClassName = function(strClassName) {
	var arDocumentChildrens = (document.getElementsByTagName) ? document.getElementsByTagName('*') : document.all;
	var arDocumentElements = new Array();
	for (var i = 0; i < arDocumentChildrens.length; i++) {
		var objEnumeratedChildNode = arDocumentChildrens[i];
		var arClassNames = objEnumeratedChildNode.className.split(' ');
		for (var j = 0; j < arClassNames.length; j++) {
			if (arClassNames[j] == strClassName) {
				arDocumentElements.push(objEnumeratedChildNode);
				break;
			}
		}
	}
	return arDocumentElements;
};*/

//fonction qui itère dans son tableau des arguments les valeurs, tente de les convertir en objet s'il s'agit de chaîne de caractère
//et renvoie la nouvelle valeur de ces valeurs dans une varable ou un tableau
function idToObject() {
	var arWithSearchedIdElements = new Array();
	var strElementId;
	for (var i = 0; i < arguments.length; i++) {
		strElementId = arguments[i];
		strElementId = (typeof strElementId == "object") ? strElementId : (typeof strElementId == 'string') ? document.getElementById(strElementId) : undefined;
		if (arguments.length == 1) return strElementId;
		arWithSearchedIdElements.push(strElementId);
	}
	return arWithSearchedIdElements;
};

/*--------------------------------------------------------------------------*/

if (!window.Element) var Element = new Object();

Object.extend(
	Element,
	{
		toggle: function() {
			for (var i = 0; i < arguments.length; i++)
			{
				var element = idToObject(arguments[i]);
				element.style.display = (element.style.display == "none" ? "" : "none");
			}
		},

		hide: function() {
			for (var i = 0; i < arguments.length; i++)
			{
				var element = idToObject(arguments[i]);
				element.style.display = "none";
			}
		},

		show: function() {
			for (var i = 0; i < arguments.length; i++) {
				var element = idToObject(arguments[i]);
				element.style.display = "";
			}
		},

		remove: function(element) {
			element = idToObject(element);
			element.parentNode.removeChild(element);
		},

		getHeight: function(element) {
			element = idToObject(element);
			return element.offsetHeight; 
		},

		hasClassName: function(element, className) {
			element = idToObject(element);
			if (!element) return;
			var a = element.className.split(' ');
			for (var i = 0; i < a.length; i++) {if (a[i] == className) return true;}
			return false;
		},

		addClassName: function(element, className) {
			element = idToObject(element);
			Element.removeClassName(element, className);
			element.className += ' ' + className;
		},

		removeClassName: function(element, className) {
			element = idToObject(element);
			if (!element) return;
			var newClassName = '';
			var a = element.className.split(' ');
			for (var i = 0; i < a.length; i++) {
				if (a[i] != className) {
					if (i > 0) newClassName += ' ';
					newClassName += a[i];
				}
			}
			element.className = newClassName;
		},

// removes whitespace-only text node childrens
		cleanWhitespace: function(element) {
			element = idToObject(element);
			for (var i = 0; i < element.childNodes.length; i++) {
				var node = element.childNodes[i];
				if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) Element.remove(node);
			}
		}
	}
);

var Toggle = new Object();
Toggle.display = Element.toggle;

if (!Event) var Event = new Object;
Object.extend(
	Event,
	{
		KEY_BACKSPACE: 8,
		KEY_TAB: 9,
		KEY_RETURN: 13,
		KEY_ESC: 27,
		KEY_LEFT: 37,
		KEY_UP: 38,
		KEY_RIGHT: 39,
		KEY_DOWN: 40,
		KEY_DELETE: 46,
		formatEvent: function (objEvent) {
				objEvent.charCode = (objEvent.type == "keypress") ? objEvent.keyCode : 0;
				objEvent.eventPhase = 2;
				objEvent.isChar = (objEvent.charCode > 0);
				objEvent.preventDefault = (objEvent.preventDefault) ? objEvent.preventDefault : function () {this.returnValue = false;};
				objEvent.stopPropagation = (objEvent.stopPropagation) ? objEvent.stopPropagation : function () {this.cancelBubble = true;};
				objEvent.timeStamp = (objEvent.timeStamp) ? objEvent.timeStamp : (new Date).getTime();
				return objEvent;
		},

		getEvent: function(objEvent) {
			if (Event.getEvent.caller != null) return Event.getEvent.caller.arguments[0];
			else return this.formatEvent(window.event);
		},

//this is the element where the event took place !not where it was registered
		element: function(objEvent) {return objEvent.target || objEvent.srcElement;},


		relatedElement: function(objEvent) {
			var objRelatedElement = (objEvent.relatedTarget) ? objEvent.relatedTarget : (objEvent.type == "mouseout" && objEvent.toElement) ? objEvent.toElement : (objEvent.type == "mouseover" && objEvent.fromElement) ? objEvent.fromElement : null;
			return objRelatedElement;
		},

		isLeftClick: function(objEvent) {
			return (((objEvent.which) && (objEvent.which == 1)) || ((objEvent.button) && (objEvent.button == 1)));
		},

		pointerX: function(objEvent) {
			return objEvent.pageX || (objEvent.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
		},

		pointerY: function(objEvent) {
			return objEvent.pageY || (objEvent.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
		},

		stop: function(objEvent) {
			if (objEvent.stopPropagation) {
				objEvent.stopPropagation(); 
				objEvent.preventDefault();
				return true;
			} else if (typeof objEvent.cancelBubble != undefined){
				objEvent.cancelBubble = true;
				objEvent.returnValue = false;
				return true;
			} else return false;
		},

		cancelBubble: function(objEvent) {
			if (objEvent.stopPropagation) {
				objEvent.stopPropagation(); 
				return true;
			} else if (typeof objEvent.cancelBubble != undefined){
				objEvent.cancelBubble = true;
				return true;
			} else return false;
		},

	// find the first node with the given tagName, starting from the
	// node the event was triggered on; traverses the DOM upwards
		findElement: function(objEvent, strTagName) {
			var objElement = Event.element(objEvent);
			while (objElement.parentNode && (!objElement.tagName || (objElement.tagName.toUpperCase() != strTagName.toUpperCase()))) objElement = objElement.parentNode;
			return objElement;
		},

		observers: false,

		_observeAndCache: function(objEventTarget, strEventType, fEventListener, bolCaptures) {
			if (!this.observers) this.observers = new Array;
			this.observers.push(arguments);
		},

		unloadCache: function() {
			if (!Event.observers) return;
			for (var i = 0; i < Event.observers.length; i++) {
				Event.stopObserving.apply(this, Event.observers[i]);
				Event.observers[i][0] = null;
			}
			Event.observers = [];
		},

		observe: function (objEventTarget,strEventType,fEventListener,bolCaptures) {
			var bolSubscribeEventHandle;
			bolCaptures = (bolCaptures) ? bolCaptures : false;
			if (document.addEventListener) {
				objEventTarget.addEventListener(strEventType,fEventListener,bolCaptures);
				bolSubscribeEventHandle = true;
			} else if (document.attachEvent) {
				strEventType = "on" + strEventType;
				bolSubscribeEventHandle = objEventTarget.attachEvent(strEventType,fEventListener);
			} else {
				strEventType = "on" + strEventType;
				objEventTarget[strEventType] = fEventListener(event);
				bolSubscribeEventHandle = true;
			}
			this._observeAndCache(objEventTarget, strEventType, fEventListener, bolCaptures);
			return bolSubscribeEventHandle;
		},

		stopObserving: function (objEventTarget,strEventType,fEventListener,bolCaptures) {
		var bolUnsubscribeEventHandle;
		bolCaptures = (bolCaptures) ? bolCaptures : false;
		if ( document.removeEventListener ) {
			objEventTarget.removeEventListener(strEventType,fEventListener,bolCaptures);
			bolUnsubscribeEventHandle = true;
		} else if (document.detachEvent) {
			strEventType = "on" + strEventType;
			bolUnsubscribeEventHandle = objEventTarget.detachEvent(strEventType,fEventListener);
		} else {
			strEventType = "on" + strEventType;
			objEventTarget[strEventType] = null;
			bolUnsubscribeEventHandle = true;
		}
		return bolUnsubscribeEventHandle;
	//	if (name == "keypress" && ((navigator.appVersion.indexOf("AppleWebKit") > 0) || element.detachEvent)) name = "keydown";
		}
	}
);

/*--------------------------------------------------------------------------*/

String.prototype.extend({
	stripTags: function() {return this.replace(/<\/?[^>]+>/gi, '');},
	escapeHTML: function() {var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML;},
	unescapeHTML: function() {var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0].nodeValue;}
});

/*--------------------------------------------------------------------------*/
//Heavily remixed by Sébastien Mouren

// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// Parts (c) 2005 Justin Palmer (http://encytemedia.com/)
// Parts (c) 2005 Mark Pilgrim (http://diveintomark.org/)
// 
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


var Effect = {};
var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
	linear: function(pos) {return pos;},

	sinoidal: function(pos) {return (-Math.cos(pos*Math.PI)/2) + 0.5;},

	reverse: function(pos) {return 1-pos;},

	flicker: function(pos) {return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25);},

	wobble: function(pos) {return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;},

	pulse: function(pos) {return (Math.floor(pos*10) % 2 == 0 ? (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));},

	none: function(pos) {return 0;},

	full: function(pos) {return 1;}
};

/* ------------- element ext -------------- */

Element.makePositioned = function(element) {
	element = idToObject(element);
	if (element.style.position == "") element.style.position = "relative";
};

Element.makeClipping = function(element) {
	element = idToObject(element);
	element._overflow = element.style.overflow || "visible";
	if(element._overflow!="hidden") element.style.overflow = "hidden";
};

Element.undoClipping = function(element) {
	element = idToObject(element);
	if(element._overflow!="hidden") element.style.overflow = element._overflow;
};

Element.setContentZoom = function(element, percent) {
	element = idToObject(element);
	element.style.fontSize = (percent/100) + "em";
	if(navigator.appVersion.indexOf("AppleWebKit") > 0) window.scrollBy (0,0);
};

Element.getStyle = function(element, style) {
	element = idToObject(element);
	var value = element.style[style.camelize()];
	if(!value) {
		if(document.defaultView && document.defaultView.getComputedStyle) {
			var css = document.defaultView.getComputedStyle(element, null);
			value = (css != null) ? css.getPropertyValue(style) : null;
		} else if(element.currentStyle) value = element.currentStyle[style.camelize()];
	}
	if(value == "auto") value = null;
	return value;
};

String.prototype.camelize = function() {
	var oStringList = this.split("-");
	if(oStringList.length == 1) return oStringList[0];
	var ret = this.indexOf("-") == 0 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0];
	for(var i = 1, len = oStringList.length; i < len; i++){
		var s = oStringList[i];
		ret += s.charAt(0).toUpperCase() + s.substring(1)
	}
	return ret;
};


/* ------------- core effects ------------- */

//Definit une base commune à tous les objets dérivés de la classe Effect
Effect.Base = function() {};
Effect.Base.prototype = {
//Les options par défaut présente dans tous les objets Effect sont initialisées ici
//définit une fonction initialisant les options dans le cadre de l'objet appelant
	setOptions: function(options) {
		this.options = Object.extend({
			transition: Effect.Transitions.sinoidal,//definit la transition employée
			duration: 1.0,// seconds
			fps: 25.0,// max. 100fps
			sync: false, // true for combining
			from: 0.0,//état initial
			to: 1.0//état final
		}, options || {});
//extend option permet lorsque l'on dérive Effect de rajouter de nouvelles options spécifique à l'objet
	},

//définit une fonction des états relatifs au démarrage de l'exécution de l'objet Effect
	start: function(options) {
		this.setOptions(options || {});
		this.currentFrame = 0;// initialise à 0 un compteur d'image accroché à l'objet contextuel
		this.startOn = new Date().getTime();//initialise une constante du temps de démarrage accroché à l'objet contextuel
		this.finishOn = this.startOn + (this.options.duration*1000);//cacule et attribue une constante du temps d'arrêt accrochée à l'objet contextuel
		if(this.options.beforeStart) this.options.beforeStart(this);//appelle la fonction beforeStart si son exécution a été définie dans les options
		if(!this.options.sync) this.loop();//éxucte la fonction loop dans le contexte de l'objet appelant si l'option non synchrone est vrai
	},

//définit une fonction du temps qui contrôle le déroulement de l'animation dans le temps
	loop: function() {
		var timePos = new Date().getTime();//prends un pointeur temporel
//si ce pointeur temporel est au-delà du temps de cloture de l'animation
		if(timePos >= this.finishOn) {
			this.render(1.0);
//effecture le rendu au point final
			if(this.finish) this.finish();
			if(this.options.afterFinish) this.options.afterFinish(this);//S'il existe une option declarée afterFinish, l'exécute
			return;
		}
		var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);//prend un pointeur sur la position en nombre absolu
		var frame = Math.round(pos * this.options.fps * this.options.duration);//calcule la position en nombre d'image
		if(frame > this.currentFrame) {this.render(pos); this.currentFrame = frame;}//conditionne le rendu et la mise à jour du compteur d'image au décalage ente le nombre actuel du compteur et la position en images dans le temps
		this.timeout = setTimeout(this.loop.bind(this), 10);//accroche à la propriété Timeout de l'objet contextuel une fonction qui exécutera de nouveau la fonction toutes les 10ms
	},

//définit une fonction qui effectue le rendu à partir d'un argument de position
	render: function(pos) {
		if(this.options.transition) pos = this.options.transition(pos);//conditionne l'exécution d'une transition avec pour argument la position à la présence d'une option de transition attachée à l'objet appelant
		pos *= (this.options.to-this.options.from);//attribue à l'argument de position sa valeur multipliée par la diffèrence entre l'origine et la destination definis dans les option de l'objet appelant
		pos += this.options.from;//ajoute à l'argument de position, la valeur de l'option de destination de l'objet appelant
		if(this.options.beforeUpdate) this.options.beforeUpdate(this);//conditionne l'exécution d'une option beforeUpdate à son existence auprès de l'objet appelant
		if(this.update) this.update(pos);////conditionne l'exécution d'une fonction update à son existence auprès de l'objet appelant
		if(this.options.afterUpdate) this.options.afterUpdate(this);//conditionne l'exécution d'une option afterUpdate à son existence auprès de l'objet appelant
	},

//définit une fonction d'abandon de la fonction setTimeout positionnée par la fonction de l'option loop
	cancel: function() {if(this.timeout) clearTimeout(this.timeout);}
};

//Assigne à la méthode Parrallel de l'objet Effect la méthode Create() de la l'objet Class
Effect.Parallel = Class.create();
//Assigne la création d'un nouvel objet Effect.Base au prototype de Effect.Parallel et l'étend avec de nouveaux types
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
//definit l'option initialize. Il s'agit d'une fonction qui
	initialize: function(effects) {
		this.effects = effects || [];
		this.start(arguments[1]);
	},

	update: function(position) {for (var i = 0; i < this.effects.length; i++) this.effects[i].render(position);},

	finish: function(position) {for (var i = 0; i < this.effects.length; i++) if(this.effects[i].finish) this.effects[i].finish(position);}
});

// Internet Explorer caveat: works only on elements that have
// a 'layout', meaning having a given width or height. 
// There is no way to safely set this automatically.
Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
	initialize: function(element) {
		this.element = idToObject(element);
		options = Object.extend({from: 0.0, to: 1.0}, arguments[1] || {});

		this.start(options);
	},

	update: function(position) {this.setOpacity(position);},

	setOpacity: function(opacity) {
		if(opacity == 1.0) {
			this.element.style.opacity = null;
			this.element.style.filter = null;
		} else {
			this.element.style.opacity = opacity;
			this.element.style.filter = "alpha(opacity:"+opacity*100+")";
		}
	}
});

Effect.MoveBy = Class.create();
Object.extend(Object.extend(Effect.MoveBy.prototype, Effect.Base.prototype), {
	initialize: function(element, toTop, toLeft) {
		this.element = idToObject(element);
		this.originalTop = parseFloat(Element.getStyle(element,"top") || "0");
		this.originalLeft = parseFloat(Element.getStyle(element,"left") || "0");
		this.toTop = toTop;
		this.toLeft = toLeft;
		Element.makePositioned(this.element);
		this.start(arguments[3]);
	},

	update: function(position) {
		var topd = this.toTop * position + this.originalTop;
		var leftd = this.toLeft * position + this.originalLeft;
		this.setPosition(topd, leftd);
	},

	setPosition: function(topd, leftd) {
		this.element.style.top = topd + "px";
		this.element.style.left = leftd + "px";
	}
});

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
	initialize: function(element, percent) {
		this.element = idToObject(element),
//scale mode take 'box' or 'contents' or {} with provided values as input
		options = Object.extend({scaleX: true, scaleY: true, scaleContent: true, scaleFromCenter: false, scaleMode: "box", scaleFrom: 100.0}, arguments[2] || {});
		this.originalTop = this.element.offsetTop;
		this.originalLeft = this.element.offsetLeft;
		if(Element.getStyle(element, "font-size") == "") this.sizeEm = 1.0;
		if(Element.getStyle(element, "font-size") && Element.getStyle(element, "font-size").indexOf("em") > 0) this.sizeEm = parseFloat(Element.getStyle(element,"font-size"));
		this.factor = (percent / 100.0) - (options.scaleFrom / 100.0);
		if(options.scaleMode == "box") {
			this.originalHeight = this.element.clientHeight;
			this.originalWidth = this.element.clientWidth; 
		} else if(options.scaleMode == "contents") {
			this.originalHeight = this.element.scrollHeight;
			this.originalWidth = this.element.scrollWidth;
		} else {
			this.originalHeight = options.scaleMode.originalHeight;
			this.originalWidth = options.scaleMode.originalWidth;
		}
		this.start(options);
	},

	update: function(position) {
		var currentScale = (this.options.scaleFrom / 100.0) + (this.factor * position);
		if(this.options.scaleContent && this.sizeEm) this.element.style.fontSize = this.sizeEm * currentScale + "em";
		this.setDimensions(this.originalWidth * currentScale, this.originalHeight * currentScale);
	},

	setDimensions: function(width, height) {
		if(this.options.scaleX) this.element.style.width = width + "px";
		if(this.options.scaleY) this.element.style.height = height + "px";
		if(this.options.scaleFromCenter) {
			var topd = (height - this.originalHeight)/2;
			var leftd = (width - this.originalWidth)/2;
			if(Element.getStyle(this.element, "position") == "absolute") {
				if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px";
				if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px";
			} else {
				if(this.options.scaleY) this.element.style.top = -topd + "px";
				if(this.options.scaleX) this.element.style.left = -leftd + "px";
			}
		}
	}
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
	initialize: function(element) {
		this.element = idToObject(element);
// try to parse current background color as default for endcolor
// browser stores this as: "rgb(255, 255, 255)", convert to "#ffffff" format
		var endcolor = "#ffffff";
		var current = Element.getStyle(this.element, "background-color");
		if(current && current.slice(0,4) == "rgb(") {
			endcolor = "#";
			var cols = current.slice(4,current.length-1).split(",");
			var i=0; do {endcolor += parseInt(cols[i]).toColorPart()} while (++i<3);
		}
		var options = Object.extend({startcolor: "#ffff99", endcolor: endcolor,restorecolor: current}, arguments[1] || {});
// init color calculations
		this.colors_base = [
			parseInt(options.startcolor.slice(1,3),16),
			parseInt(options.startcolor.slice(3,5),16),
			parseInt(options.startcolor.slice(5),16)
		];
		this.colors_delta = [
			parseInt(options.endcolor.slice(1,3),16)-this.colors_base[0],
			parseInt(options.endcolor.slice(3,5),16)-this.colors_base[1],
			parseInt(options.endcolor.slice(5),16)-this.colors_base[2]
		];
		this.start(options);
	},

	update: function(position) {
		var colors = [
			Math.round(this.colors_base[0]+(this.colors_delta[0]*position)),
			Math.round(this.colors_base[1]+(this.colors_delta[1]*position)),
			Math.round(this.colors_base[2]+(this.colors_delta[2]*position))
		];
		this.element.style.backgroundColor = "#" + colors[0].toColorPart() + colors[1].toColorPart() + colors[2].toColorPart();
	},

	finish: function() {
		this.element.style.backgroundColor = this.options.restorecolor;
	}
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
	initialize: function(element) {
		this.element = idToObject(element);
		Position.prepare();
		var offsets = Position.cumulativeOffset(this.element);
		var max = window.innerHeight ? window.height - window.innerHeight : document.body.scrollHeight - (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight);
		this.scrollStart = Position.deltaY;
		this.delta  = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
		this.start(arguments[1] || {});
	},

	update: function(position) {
		Position.prepare();
		window.scrollTo(Position.deltaX, this.scrollStart + (position*this.delta));
	}
});


/* ------------- prepackaged effects ------------- */

Effect.Fade = function(element) {
	options = Object.extend({
		from: 1.0,
		to: 0.0,
		afterFinish: function(effect) 
		{
		Element.hide(effect.element);
		effect.setOpacity(1); } 
	}, arguments[1] || {});
	return new Effect.Opacity(element,options);
};

Effect.Appear = function(element) {
	options = Object.extend({
		from: 0.0,
		to: 1.0,
		beforeStart: function(effect) {
			effect.setOpacity(0);
			Element.show(effect.element);
			},
		afterUpdate: function(effect) {Element.show(effect.element);}
	}, arguments[1] || {});
	return new Effect.Opacity(element,options);
};

Effect.Puff = function(element) {
	return new Effect.Parallel([
			new Effect.Scale(element, 200, {sync: true, scaleFromCenter: true, scaleMode: "box"}), 
			new Effect.Opacity(element, {sync: true, to: 0, from: 1.0})
		], {
			duration: 0.6,
			fps: 30,
			beforeUpdate: function(effect) {
				effect.effects[0].element.style.zindex = "1001";
				effect.effects[0].element.style.position = "absolute";
			}//,
			//afterFinish: function(effect) {Element.hide(effect.effects[0].element);}
		}
	);
};

Effect.BlindUp = function(element) {
	Element.makeClipping(element);
	return new Effect.Scale(
		element,
		0,
		Object.extend({
			scaleContent: false, 
			scaleX: false, 
			afterFinish: function(effect)
			{
				Element.hide(effect.element);
				Element.undoClipping(effect.element);
			}
		}, arguments[1] || {})
	);
};

Effect.BlindDown = function(element) {
	idToObject(element).style.height = "0px";
	Element.makeClipping(element);
	Element.show(element);
	return new Effect.Scale(
		element,
		100, 
		Object.extend({
			scaleContent: false, 
			scaleX: false, 
			scaleMode: "contents",
			scaleFrom: 0,
			afterFinish: function(effect) {Element.undoClipping(effect.element);}
		}, arguments[1] || {})
	);
};

Effect.SwitchOff = function(element) {
	return new Effect.Appear(
		element,
		{
			duration: 0.4,
			transition: Effect.Transitions.flicker,
			afterFinish: function(effect) {
				effect.element.style.overflow = "hidden";
				new Effect.Scale(
					effect.element,
					1,
					{
						duration: 0.3,
						scaleFromCenter: true,
						scaleX: false,
						scaleContent: false,
						afterUpdate: function(effect) {Element.makePositioned(this.element);},
						afterFinish: function(effect) {Element.hide(effect.element);}
					}
				)
			}
		}
	);
};

Effect.DropOut = function(element) {
	return new Effect.Parallel([
			new Effect.MoveBy(element, 100, 0, { sync: true }),
			new Effect.Opacity(
				element,
				{
					sync: true,
					to: 0.0,
					from: 1.0
				}
			)
		],
		{
			duration: 0.5,
			afterFinish: function(effect) {Element.hide(effect.effects[0].element);}
		}
	);
};

Effect.Shake = function(element) {
	return new Effect.MoveBy(
		element,
		0,
		20,
		{
			duration: 0.05,
			afterFinish: function(effect) {
				new Effect.MoveBy(
					effect.element,
					0,
					-40,
					{
						duration: 0.1,
						afterFinish: function(effect) {
							new Effect.MoveBy(
								effect.element,
								0,
								40,
								{
									duration: 0.1,
									afterFinish: function(effect) {
										new Effect.MoveBy(
											effect.element,
											0,
											-40,
											{
												duration: 0.1,
												afterFinish: function(effect) {
													new Effect.MoveBy(
														effect.element,
														0,
														40,
														{
															duration: 0.1,
															afterFinish: function(effect) {
																new Effect.MoveBy(
																	effect.element,
																	0,
																	-20,
																	{
																		duration: 0.05,
																		afterFinish: function(effect) {}
																	}
																)
															}
														}
													)
												}
											}
										)
									}
								}
							)
						}
					}
				)
			}
		}
	);
};

Effect.SlideDown = function(objElement) {
	objElement = idToObject(objElement);
	objElement.style.height = "0px";
	Element.makeClipping(objElement);
	Element.cleanWhitespace(objElement);
	Element.makePositioned(objElement.firstChild);
	Element.show(objElement);
	return new Effect.Scale(
		objElement,
		100,
		Object.extend({
			scaleContent: false,
			scaleX: false,
			scaleMode: "contents",
			scaleFrom: 0,
			afterUpdate: function(effect) {effect.element.firstChild.style.bottom = (effect.originalHeight - effect.element.clientHeight) + "px";},
			afterFinish: function(effect) {Element.undoClipping(effect.element);}
		}, arguments[1] || {})
	);
};

Effect.SlideUp = function(objElement) {
	objElement = idToObject(objElement);
	Element.makeClipping(objElement);
	Element.cleanWhitespace(objElement);
	Element.makePositioned(objElement.firstChild);
	Element.show(objElement);
	return new Effect.Scale(
		objElement,
		0, 
		Object.extend({
			scaleContent: false,
			scaleX: false,
//			scaleMode: "contents",
			afterUpdate: function(effect) {effect.element.firstChild.style.bottom = (effect.originalHeight - effect.element.clientHeight) + "px";},
			afterFinish: function(effect)
			{
				Element.hide(effect.element);
				Element.undoClipping(effect.element);
			}
		}, arguments[1] || {})
	);
};

Effect.Squish = function(element) {
	return new Effect.Scale(
		element,
		0,
		{afterFinish: function(effect) {Element.hide(effect.element);}}
	);
};

Effect.Grow = function(objElement) {
	objElement = idToObject(objElement);
	var objOptions = arguments[1] || {};
	var nScaleTo = objOptions.scaleTo || 100;
	var nScaleFrom = objOptions.scaleFrom || 0;
	var nOriginalWidth = objElement.clientWidth;
	var nOriginalHeight = objElement.clientHeight;
	var strDirection = objOptions.direction || "center";
	var fMoveTransition = objOptions.moveTransition || Effect.Transitions.sinoidal;
	var fScaleTransition = objOptions.fScaleTransition || Effect.Transitions.sinoidal;
	var fOpacityTransition = objOptions.fOpacityTransition || Effect.Transitions.full;
	var nInitialMoveX, nInitialMoveY;
	var nMoveX, nMoveY;
	objElement.style.overflow = "hidden";
	Element.show(objElement);
	switch (strDirection) {
		case "top-left":
			nInitialMoveX = nInitialMoveY = nMoveX = nMoveY = 0; 
			break;
		case "top-right":
			nInitialMoveX = nOriginalWidth;
			nInitialMoveY = nMoveY = 0;
			nMoveX = -nOriginalWidth;
			break;
		case "bottom-left":
			nInitialMoveX = nMoveX = 0;
			nInitialMoveY = nOriginalHeight;
			nMoveY = -nOriginalHeight;
			break;
		case "bottom-right":
			nInitialMoveX = nOriginalWidth;
			nInitialMoveY = nOriginalHeight;
			nMoveX = -nOriginalWidth;
			nMoveY = -nOriginalHeight;
			break;
		case "center":
			nInitialMoveX = nOriginalWidth / 2;
			nInitialMoveY = nOriginalHeight / 2;
			nMoveX = -nOriginalWidth / 2;
			nMoveY = -nOriginalHeight / 2;
			break;
	}
	return new Effect.Parallel([
		new Effect.Opacity(objElement, {sync: true, to: 1.0, from: 0.0, transition: fOpacityTransition}),
//		new Effect.MoveBy(objElement, nMoveY, nMoveX, {sync: true, transition: fMoveTransition}),
		new Effect.Scale(objElement, nScaleTo, {scaleMode: {originalHeight: nOriginalHeight, originalWidth: nOriginalWidth}, sync: true, scaleFrom: nScaleFrom, transition: fScaleTransition})
	], objOptions);
};

Effect.Shrink = function(objElement) {
	objElement = idToObject(objElement);
	var objOptions = arguments[1] || {};
	var nOriginalWidth = objElement.clientWidth;
	var nOriginalHeight = objElement.clientHeight;
	var nScaleTo = objOptions.scaleTo || 100;
	var nScaleFrom = objOptions.scaleFrom || 0;
	objElement.style.overflow = "hidden";
	Element.show(objElement);
	var strDirection = objOptions.direction || "center";
	var fMoveTransition = objOptions.fMoveTransition || Effect.Transitions.sinoidal;
	var fScaleTransition = objOptions.fScaleTransition || Effect.Transitions.sinoidal;
	var fOpacityTransition = objOptions.fOpacityTransition || Effect.Transitions.none;
	var nMoveX, nMoveY;
	switch (strDirection) {
		case "top-left":
			nMoveX = nMoveY = 0;
			break;
		case "top-right":
			nMoveX = nOriginalWidth;
			nMoveY = 0;
			break;
		case "bottom-left":
			nMoveX = 0;
			nMoveY = nOriginalHeight;
			break;
		case "bottom-right":
			nMoveX = nOriginalWidth;
			nMoveY = nOriginalHeight;
			break;
		case "center":  
			nMoveX = nOriginalWidth / 2;
			nMoveY = nOriginalHeight / 2;
			break;
	}
	return new Effect.Parallel([
		new Effect.Opacity(objElement, {sync: true, to: 0.0, from: 1.0, transition: fOpacityTransition}),
		new Effect.Scale(objElement, nScaleTo, {sync: true, scaleFrom: nScaleFrom, transition: fMoveTransition}),
//		new Effect.MoveBy(objElement, nMoveY, nMoveX, {sync: true, transition: fScaleTransition})
	],
	objOptions);
};

Effect.Pulsate = function(element) {
	var options = arguments[1] || {};
	var transition = options.transition || Effect.Transitions.sinoidal;
	var reverser = function(pos) {return transition(1-Effect.Transitions.pulse(pos))};
	reverser.bind(transition);
	return new Effect.Opacity(
		element,
		Object.extend(Object.extend({
			duration: 3.0,
			afterFinish: function(effect) {Element.show(effect.element);}
		}, options), {transition: reverser})
	);
};

Effect.Fold = function(element) {
	idToObject(element).style.overflow = "hidden";
	return new Effect.Scale(
		element,
		5,
		Object.extend({
			scaleContent: false,
			scaleTo: 100,
			scaleX: false,
			afterFinish: function(effect) {
				new Effect.Scale(
					element,
					1, {
						scaleContent: false,
						scaleTo: 0,
						scaleY: false,
						afterFinish: function(effect) {Element.hide(effect.element)}
					}
				);
			}
		}, arguments[1] || {})
	);
};

Effect.SlideRightIntoView = function(objElement) {
	objElement = idToObject(objElement);
	objElement.style.width = "0px";
	objElement.style.overflow = "hidden";
	objElement.firstChild.style.position = "relative";
	Element.show(objElement);
	new Effect.Scale(
		objElement,
		100, {
			scaleContent: false,
			scaleY: false,
			scaleMode: "contents",
			scaleFrom: 0,
			afterUpdate: function(effect) {effect.objElement.firstChild.style.width = (effect.originalWidth - effect.objElement.clientWidth) + "px";}
		}.extend(arguments[1] || {})
	);
}

Effect.SlideRightOutOfView = function(objElement) {
	objElement = idToObject(objElement);
	objElement.style.overflow = "hidden";
	objElement.firstChild.style.position = "relative";
	Element.show(objElement);
	new Effect.Scale(
		objElement,
		0, {
			scaleContent: false,
			scaleY: false,
			afterUpdate: function(effect) {effect.objElement.firstChild.style.width = (effect.originalWidth - effect.objElement.clientWidth) + "px";},
			afterFinish: function(effect) {Element.hide(effect.objElement);}
		}.extend(arguments[1] || {})
	);
}


/*Author: Sébastien Mouren	*/

/*------------------------------------------------------------------------------------------------*/
function objectToId (objElement) {
	var strElementId;
	strElementId = (objElement.getAttribute && (objElement.getAttribute("id") != null)) ? objElement.getAttribute("id") : objElement.id;
	return strElementId;
}

function obtainNumberedCharacterFromPageName (nCharacterNumber) {
	var strDocumentURL = document.URL; //retrouve l'URL de la page
	var regShlashes = /\//;
	var arURLStrings = strDocumentURL.split(regShlashes);
	strDocumentURL = (arURLStrings != null) ? arURLStrings[arURLStrings.length - 1].substring(nCharacterNumber, nCharacterNumber + 1) : "w";
	return strDocumentURL;
}

/*------------------------------------------------------------------------------------------------*/
function getFirstNodeOfType(nodeType, objParentNode) {
	objParentNode = (objParentNode) ? objParentNode : document;
	for ( var objNode = objParentNode.firstChild; objNode != null; objNode = objNode.nextSibling ) {
		switch (nodeType) {
			case Node.ELEMENT_NODE:
				if (objNode.nodeType == 1) return objNode;
				break;
			case Node.TEXT_NODE:
				if (objNode.nodeType == 3) return objNode;
				break;
		}
	}
	return null;
}

function getFirstElementOfClass(strTagName, strClassName, objSearchRootElement) {
	objSearchRootElement = idToObject(objSearchRootElement);
	objSearchRootElement = (objSearchRootElement) ? objSearchRootElement : window.document;
	var objNode, arChildNodeElements;
	arChildNodeElements = objSearchRootElement.getElementsByTagName(strTagName);
	for ( var j = 0; j < arChildNodeElements.length; j++ ) if ( arChildNodeElements[j].className.indexOf(strClassName) != -1 ) objNode = arChildNodeElements[j];
	return objNode;
}

function getElementsByClassName(strTagName, strClassName, objSearchRootElement) {
	objSearchRootElement = idToObject(objSearchRootElement);
	objSearchRootElement = (objSearchRootElement) ? objSearchRootElement : window.document;
	var arNodeObjects, arChildNodeElements;
	arNodeObjects = new Array();
	arChildNodeElements = objSearchRootElement.getElementsByTagName(strTagName);
	for (var i = 0; i < arChildNodeElements.length; i++) {
		if (arChildNodeElements[i].className.indexOf(strClassName) != -1 ) arNodeObjects[arNodeObjects.length] = arChildNodeElements[i];
	}
	return arNodeObjects;
}

function getFirstAncestorOfTagName(objNode, strTagName) {
	objNode = idToObject(objNode);
	//alert('entering recurse');
	if (!objNode.parentNode) return;
	else if (objNode.parentNode.nodeName.toLowerCase() == strTagName) return objNode.parentNode;
	else getFirstAncestorOfTagName(objNode.parentNode,strTagName);
}

function getFirstChildOfTagName(objNode, strTagName) {
	objNode = idToObject(objNode);
	if (objNode.hasChildNodes()) {
		for ( var i = 0; i < objNode.childNodes.length; i++ ) {
			if ( objNode.childNodes[i].nodeName.toLowerCase() == strTagName ) return objNode.childNodes[i];
		}
	}
}

/*function getFirstChildOfTagName(objNode, strTagName) {
	if (!objNode.hasChildNodes()) return;
	else {
		for (var i = 0; i < objNode.childNodes.length; i++) {
			if ( objNode.childNodes[i].nodeName.toLowerCase() == strTagName ) return objNode.childNodes[i];
		}
		for (var i = 0; i < objNode.childNodes.length; i++) {
			getFirstChildOfTagName(objNode.childNodes[i], strTagName);
	}
	return;
}*/

//le code de la fonction est pourrie: à rendre objet et doit utiliser des méthodes de téléchargement XMLHTTpRequest
function preloadImages() {
	if(document.images) {
		if(!document.arImages) {
			document.arImages = new Array();
		}
		var j = document.arImages.length;
		for(var i=0; i < arguments.length; i++) {
			if (arguments[i].indexOf("#") != 0) {
					document.arImages[j] = new Image;
					document.arImages[j++].src=arguments[i];
				}
		}
	}
}

/*------------------------------------------------------------------------------------------------*/

function openLinkExternally() {
	if (!document.links) return;
	var objLink;
	for (var i = 0; i < document.links.length; i++) {
		objLink = document.links[i];
		if (objLink.getAttribute("href") && objLink.getAttribute("rel") == "external") objLink.target = "_blank";
		else if ((objLink.getAttribute("href") != "") && (window.getElementsByClassName("div", "rubricBand", document)[0] != null)) Event.observe(objLink, "mousedown", slideUpRubricBand, false);
	}
}

function findActualCoordinates(objElement) {
	var objCoordinateValues = {top: 0, left:0};
	if (objElement.offsetParent)
	{
		while (objElement.offsetParent)
		{
			objCoordinateValues.top += objElement.offsetTop
			objCoordinateValues.left += objElement.offsetLeft
			objElement = objElement.offsetParent;
		}
	} else if (objElement.x && objElement.y) {
		objCoordinateValues.top += objElement.y;
		objCoordinateValues.left += objElement.x;
	}
	return objCoordinateValues;
}

function resizeOverHandle(objEvent) {
	objEvent = Event.getEvent(objEvent);
	objElement = Event.element(objEvent);
	Event.cancelBubble(objEvent);
	if ((objElement.width > document.gallery.maxSize) || (objElement.height > document.gallery.maxSize)) return;
	new Effect.Grow(objElement, {scaleTo: 200, scaleFrom: 100, direction: "center" });
}

function resizeOutHandle(objEvent, nMinSize) {
	objEvent = Event.getEvent(objEvent);
	Event.cancelBubble(objEvent);
	objElement = Event.element(objEvent);
	nElement = parseInt(objElement.id);
	for ( var i = 0; i < document.gallery.icons.length; i++ ) {
		if ((parseInt(document.gallery.icons[i].id) == nElement) && ((parseInt(document.gallery.icons[i].style.width) > document.gallery.minSize) || (parseInt(document.gallery.icons[i].style.height) > document.gallery.minSize))) {
			new Effect.Shrink(objElement, {scaleFrom: 100, scaleTo: 50, direction: "center"});
		}
	}
}

function switchText() {
	var objEvent = Event.getEvent();
	var objLink = Event.element(objEvent);
	var strObjLinkId = objectToId(objLink);
	var objTextParagraphElement = document.getElementById("text");
	strObjLinkId = "mainText" + strObjLinkId.substring(4, 8);
	var objLangText = document.getElementById(strObjLinkId);
	for (var i = 0; i < objTextParagraphElement.childNodes.length; i++) {
		if ((objTextParagraphElement.childNodes.item(i).nodeType == 1) && (objTextParagraphElement.childNodes.item(i).nodeName.toLowerCase() == "p")) {
			if (objectToId(objTextParagraphElement.childNodes.item(i)) != strObjLinkId) objTextParagraphElement.childNodes.item(i).style.display = "none";
		}
	}
	objLangText.style.display = "block";
}


function makeOpaqueLayer() {
	var objEvent = Event.getEvent();
	var objTarget = Event.element(objEvent);
	var objRelatedTarget = Event.relatedElement(objEvent);
	var objSelectorElement = objTarget;
	if (objTarget.nodeName.toLowerCase() != "img") return;
	if (objRelatedTarget == null) return;
	while ((objTarget != objRelatedTarget) && !((objRelatedTarget.className == "selectorObjects") || (objRelatedTarget.nodeName.toLowerCase() == "body"))) {
		objRelatedTarget = objRelatedTarget.parentNode;
		if (objRelatedTarget == objTarget) return;
	}
	while (objSelectorElement.id.substring(0,10) != "selElement") {
		objSelectorElement = objSelectorElement.parentNode;
	}
	new Effect.Opacity(objSelectorElement, {duration: 0.4, fps: 30.0, from: 0.2, to: 1});
}

function makeTransparentLayer() {
	var objEvent = Event.getEvent();
	var objRelatedTarget = Event.relatedElement(objEvent);
	var objTarget = Event.element(objEvent);
	var objSelectorElement = objTarget;
	if (objRelatedTarget == null) return;
	while ((objRelatedTarget != objTarget) && !((objRelatedTarget.className == "selectorObjects") || (objRelatedTarget.nodeName.toLowerCase() == "body"))) {
		objRelatedTarget = objRelatedTarget.parentNode;
		if (objRelatedTarget == objTarget) return;
	}
		while (objSelectorElement.id.substring(0,10) != "selElement") {
		objSelectorElement = objSelectorElement.parentNode;
	}
	new Effect.Opacity(objSelectorElement, {duration: 0.3, fps: 30.0, from: 1, to: 0.2});
}

function zoomAndFadeLayer() {
	var objEvent = Event.getEvent();
	var objTarget = Event.element(objEvent);
	var objSelectorElement = objTarget;
	var objCurrentCoordinates;
	if (objTarget.nodeName.toLowerCase() != "img") return;
	while (objSelectorElement.id.substring(0,10) != "selElement") {
		objSelectorElement = objSelectorElement.parentNode;
	}
//	objSelectorDuplicatedElement = objSelectorElement.cloneNode(true);
//	objSelectorDuplicatedElement.id = "";
	objSelectorElement.style.zIndex = "1001";
//	objSelectorDuplicatedElement.style.position = "absolute";
//	objCurrentCoordinates = findActualCoordinates(objSelectorElement);
//	objSelectorDuplicatedElement.style.top = "" + objCurrentCoordinates.top + "px";
//	objSelectorDuplicatedElement.style.left = "" +objCurrentCoordinates.left  + "px";
	Event.stopObserving(objSelectorElement, "mousedown", zoomAndFadeLayer, false);
	Event.stopObserving(objSelectorElement, "mouseover", makeOpaqueLayer, false);
	Event.stopObserving(objSelectorElement, "mouseout", makeTransparentLayer, false);
//	objSelectorElement.parentNode.insertBefore(objSelectorDuplicatedElement, objSelectorElement);
	new Effect.Puff(objSelectorElement, {fps: 30.0, scaleFromCenter: true});
	
}

function slideDownRubricBand() {
	var objEvent = Event.getEvent();
//	var arBand = document.getElementById("band").getElementsByTagName("div");
	var arBand = window.getElementsByClassName("div", "rubricBand", document.getElementById("band"));
	var objBand = arBand[0];
	objBand.style.visibility = "visible";
//	for (var i = 0; i < arBand.length; i++) {
//		objBand = arBand[i];
		new Effect.SlideDown(objBand,{fps: 30.0, duration: 0.6});
//	}
}

function slideUpRubricBand() {
//	Event.preventDefault = true;
	var objEvent = Event.getEvent();
//	var arBand = document.getElementById("band").getElementsByTagName("div");
	var arBand = window.getElementsByClassName("div", "rubricBand", document.getElementById("band"));
	var objBand = arBand[0];
//	for (var i = 0; i < arBand.length; i++) {
//		objBand = arBand[i];
		new Effect.SlideUp(objBand,{fps: 30.0, duration: 0.3});
//	}
}

function showRubricSubMenu() {
	var objEvent = Event.getEvent();
	var objTarget = Event.element(objEvent);
	var objRelatedTarget = Event.relatedElement(objEvent);
	if (objTarget.nodeName.toLowerCase() != "td") return;
	if (objRelatedTarget == null) return;
	while ((objTarget != objRelatedTarget) && (objRelatedTarget.nodeName.toLowerCase() != "body")) {
		objRelatedTarget = objRelatedTarget.parentNode;
		if (objRelatedTarget == objTarget) return;
	}
	var objSubMenu = document.getElementById("subM" + objectToId(objTarget).substring(1));
	for(var i = 0; i < objSubMenu.parentNode.childNodes.length; i++) {
		var exObjSubMenu = objSubMenu.parentNode.childNodes.item(i);
		if(exObjSubMenu.nodeName.toLowerCase() == "ul") exObjSubMenu.style.display = "none";
	}
	if(objSubMenu.nodeName.toLowerCase() == "ul") objSubMenu.style.display = "block";
}


function hideAllSubMenu() {
	var objEvent = Event.getEvent();
	var objRelatedTarget = Event.relatedElement(objEvent);
	var objTarget = Event.element(objEvent);
	var strDocumentURL = obtainNumberedCharacterFromPageName(0);
	var objNavigator = objRelatedTarget;
	if (objRelatedTarget == null) return;
	while ((objRelatedTarget != objTarget) && (objRelatedTarget.nodeName.toLowerCase() != "body")) {
		objRelatedTarget = objRelatedTarget.parentNode;
		if (objRelatedTarget == objTarget) return;
	}
	while (objectToId(objNavigator) != "navigator" && (objNavigator.nodeName.toLowerCase() != "body")) {
		objNavigator = objNavigator.parentNode;
	if (objectToId(objNavigator) == "navigator") return;
	}
	arSubMenu = document.getElementById("subMenu").getElementsByTagName("ul");
	for(var i = 0; i < arSubMenu.length; i++) {
		var objSubMenu = arSubMenu[i];
		var strSubMenuId = objectToId(objSubMenu);
		if (strSubMenuId.substring(7, 8) != strDocumentURL) objSubMenu.style.display = "none";
		else objSubMenu.style.display = "block";
	}
}

var menuShown = {
	hasSubMenuShown: 1,
	rubricNumberId: 0
};



function registerEventHandler()
{
	var strDocumentURL = obtainNumberedCharacterFromPageName(0); //appelle une fonction d'analyse pour retrouver la première lettre du nom de la page
	var strSubDocumentReference;
// Tableaux stockant des collections d'elements dans un tableau. Ceci permet de les énumérer pour y attacher des gestionnaires d'événement
	var arMenuObjects = new Array();
	var arSubMenuObjects = new Array();
	var arIntraSelectorObjects = new Array();
	if (document.getElementById("subMenu")) arSubMenuObjects = document.getElementById("subMenu").getElementsByTagName("li");
	if (document.getElementById("menu")) arMenuObjects = document.getElementById("menu").getElementsByTagName("td");
	if (document.getElementById("intraSelector")) arIntraSelectorObjects = document.getElementById("intraSelector").getElementsByTagName("div");

// Objets stockant les elements pour y réaliser des opérations
	var objSubMenu;
	var objLink;
	var objMenu;
	var objIntroRubric;
	var objRubric;
	var objIntraSelectorElement;

// Booléen stockant les enregistrements de gestionnaires d'événement
	var bolIntroRubricClickEventHandle;
	var bolLinkClickEventHandle;
	var bolMenuRolloverEventHandle;
	var bolMenuRollbackEventHandle = Event.observe(document.getElementById("navigator"), "mouseout", hideAllSubMenu, false);
	var bolGenLinkClickEventHandle;
	var bolRubricClickEventHandle;
	var bolMenuCacheRollOverEventHandle;
	var bolMenuCacheRollBackEventHandle;
	var bolMenuCacheClickEventHandle;
	if (window.getElementsByClassName("div", "rubricBand", document)[0] != null) slideDownRubricBand();
	openLinkExternally ();
	document.gallery = {maxSize: 120, minSize: 60, icons: []};
	document.gallery.icons = getElementsByClassName("img", "icon", "galleryInner");


	for(var i = 0; i < arMenuObjects.length; i++) {
//vérifie que le noeud existe et est un objet ELEMENT_NODE
		if (arMenuObjects[i].nodeType == 1) {
			objMenu = arMenuObjects[i];
			bolMenuRolloverEventHandle = Event.observe(objMenu, "mouseover", showRubricSubMenu, false);
		}
	}

	for (var h = 0; h < arSubMenuObjects.length; h++) {
//vérifie que le noeud existe et est un objet ELEMENT_NODE
		if (arSubMenuObjects[h].nodeType == 1) {
			objSubMenu = arSubMenuObjects[h];
//vérifie que nous ne sommes pas dans la page
			if (strDocumentURL && objSubMenu.parentNode.id.substring(7, 8) != strDocumentURL) {
				objSubMenu.parentNode.style.display="none";
			}
		}
	}

	for (var n = 0; n < arIntraSelectorObjects.length; n++) {
//vérifie que le noeud existe et est un objet ELEMENT_NODE
		if (arIntraSelectorObjects[n].nodeType == 1) {
			objIntraSelectorElement = arIntraSelectorObjects[n];
			strSubDocumentReference = obtainNumberedCharacterFromPageName(2);
			if (objectToId(objIntraSelectorElement).substring(10, 11) != strSubDocumentReference) {
				bolMenuCacheRollOverEventHandle = Event.observe(objIntraSelectorElement, "mouseover", makeOpaqueLayer, false);
				bolMenuCacheRollBackEventHandle = Event.observe(objIntraSelectorElement, "mouseout", makeTransparentLayer, false);
				bolMenuCacheClickEventHandle = Event.observe(objIntraSelectorElement, "mousedown", zoomAndFadeLayer, false);
			}
		}
	}

	if (document.gallery.icons != null) {
		for (var o = 0; o < document.gallery.icons.length; o++) {
			Event.observe(document.gallery.icons[o], "mouseover", resizeOverHandle, false);
			Event.observe(document.gallery.icons[o], "mouseout", resizeOutHandle, false);
		}
//		Event.observe(objWrapper,"mousemove",docMoveHandle);
//		if (window.event) {
//				Event.observe(objShade,"mousemove",resizeOutHandle);
//		} else {
//			//Should be putting this on the document 
//			Event.observe(document,"mouseout",resizeOutHandle);
//		}
	}
}

var bolOnLoadWindowEventHandle = Event.observe(window, "load", registerEventHandler, false); //enregistre la fonction initialiseMenu au gestionnaire d'événement load de la fenêtre

/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);
-->