/**
* LIBRAIRIE F6
*/

if(typeof Array.prototype.some === 'undefined') {
	Array.prototype.some = function(fnBoolean) {
		for (var _iKey = 0, _iCount = this.length; _iKey < _iCount; _iKey++) {
			if (fnBoolean(this[_iKey], _iKey, this)) {
				return true;
			}
		}
		return false;
	};
}

var F6 = window.F6 || {};

F6.extend = function(oObj, oExt, oOptions) {
	if(
		(typeof oObj === 'undefined') ||
		(oOptions && typeof oOptions !== 'object') && (
			(oOptions.override && typeof oOptions.override !== 'object' || oOptions.override.constructor != Array) ||
			(oOptions.filter && typeof oOptions.filter !== 'object' || oOptions.filter.constructor != Array) ||
			(oOptions.except && typeof oOptions.except !== 'object' || oOptions.except.constructor != Array)
		)
	) {
		throw new Error("Un des parametres de F6.extends n'est pas du bon type");
	}
	if(typeof oExt === 'undefined') {
		return oObj;
	}
	var _bSame = function(sValue) {
		for (var _iExcept = 0, _iExcepts = oOptions.except.length; _iExcept < _iExcepts; _iExcept++) {
			if (oOptions.except[_iExcept] == sValue) {
				return true;
			}
		}
		return false;
	};
	if (oOptions && oOptions.filter && oOptions.except && !oOptions.filter.some(_bSame)) {
		throw new Error("Les filtres et les exceptions des options de F6.extends contiennent des valeurs identiques");
	}
	var _sProp;
	var _bCondition = function(sValue) {
		return typeof sValue === 'string' && sValue == _sProp;
	};
	for (_sProp in oExt) {
		if (
			(
				typeof oObj[_sProp] === 'undefined' &&
				!oOptions || oOptions && (
					(!oOptions.filter && !oOptions.except) || (
						oOptions.filter &&
						oOptions.filter.some(_bCondition)
					) || (
						oOptions.except &&
						!oOptions.except.some(_bCondition)
					)
				)
			) || (
				typeof oObj[_sProp] !== 'undefined' &&
				oOptions && (
					!oOptions.filter ||
					oOptions.filter.some(_bCondition)
				) && (
					!oOptions.except ||
					!oOptions.except.some(_bCondition)
				) &&
				oOptions.override.some(_bCondition)
			)

		) {
			oObj[_sProp] = oExt[_sProp];
		}
	}
	return oObj;
};

F6.extend(
	Array.prototype, {

		'every': function(fnBoolean) {
			for (var iKey = 0, _iCount = this.length; iKey < _iCount; iKey++) {
				if (!fnBoolean(this[iKey], iKey, this)) {
					return false;
				}
			}
			return true;
		},

		'filter': function(fnBoolean) {
			var aFiltered = [];
			for (var iKey = 0, _iCount = this.length; iKey < _iCount; iKey++) {
				if (fnBoolean(this[iKey], iKey, this)) {
					aFiltered.push(this[iKey]);
				}
			}
			return aFiltered;
		},

		'forEach': function(fn) {
			if (typeof fn !== "function") {
				throw new Error();
			}
			for (var iKey = 0, _iCount = this.length; iKey < _iCount; iKey++) {
				fn(this[iKey], iKey, this);
			}
			return true;
		},

		'map': function(fn) {
			if (typeof fn !== "function") {
				throw new Error();
			}
			var aMap = [];
			for (var iKey = 0, _iCount = this.length; iKey < _iCount; iKey++) {
				aMap.push(fn(this[iKey], iKey, this));
			}
			return aMap;
		},

		'reduce': function(fn) {
			var iCount = this.length;
			if (typeof fn !== "function") {
				throw new Error();
			}
			if (iCount === 0 && arguments.length == 1) {
				throw new Error();
			}
			var iKey = 0;
			if (arguments.length > 1) {
				var oResult = arguments[1];
			}
			else {
				do {
					if (iKey in this) {
						oResult = this[iKey++];
						break;
					}
					if (++iKey >= iCount) {
						throw new Error();
					}
				}
				while (true);
			}
			for (; iKey < iCount; iKey++) {
				if (iKey in this) {
					oResult = fn.call(null, oResult, this[iKey], iKey, this);
				}
			}
			return oResult;
		},

		'reduceRight': function(fn) {
			var iCount = this.length;
			if (typeof fn != "function") {
				throw new Error();
			}
			if (iCount === 0 && arguments.length == 1) {
				throw new Error();
			}
			var iKey = iCount - 1;
			if (arguments.length > 1) {
				var oResult = arguments[1];
			}
			else {
				do {
					if (iKey in this) {
						oResult = this[iKey--];
						break;
					}
					if (--iKey < 0) {
						throw new Error();
					}
				}
				while (true);
			}
			for (; iKey >= 0; iKey--) {
				if (iKey in this) {
					oResult = fn.call(null, oResult, this[iKey], iKey, this);
				}
			}
			return oResult;
		}

	}
);

F6.extend(
	String.prototype, {

		'trim': function() {
			this.replace(/^\s+|\s+$/g, '');
			return this;
		},

		'ltrim': function() {
			this.replace(/^\s+/, '');
		},

		'rtrim': function() {
			this.replace(/\s+$/, '');
		}

	}
);

F6.extend(
	F6, {

		'Interface': function(sName, aMethods) {
			if (typeof sName !== 'string') {
				throw new Error("Le premier parametre de Interface n'est pas une chaine texte");
			}
			if (typeof aMethods !== 'object' || aMethods.constructor !== Array) {
				throw new Error("Le second parametre de Interface n'est pas un tableau");
			}
			for (var iMethod = 0, iMethods = aMethods.length; iMethod < iMethods; iMethod++) {
				if (typeof aMethods[iMethod] !== 'string') {
					throw new Error("Un des membres du tableau passe en parametre n'est pas une chaine texte");
				}
			}
			return [sName, aMethods];
		},

		'ensureImplements': function(oObj, aInterface) {
			if (arguments.length < 2) {
				throw new Error("ensureImplements prend un objet et, au minimum, une interface en tant que parametres");
			}
			if (typeof oObj !== 'object' && typeof oObj !== 'function') {
				throw new Error("Le premier parametre de ensureImplements n'est pas un objet ou une fonction");
			}
			for (var iInterface = 1, iInterfaces = arguments.length; iInterface < iInterfaces; iInterface++) {
				if (typeof arguments[iInterface] !== 'object' || arguments[iInterface].constructor !== Array) {
					throw new Error("Le " + (iInterface + 1) + "eme parametre de ensureImplements n'est pas un tableau");
				}
				for (var iMethod = 0, iMethods = aInterface[1].length; iMethod < iMethods; iMethod++) {
					if (!oObj.hasOwnProperty(aInterface[1][iMethod]) || typeof oObj[aInterface[1][iMethod]] !== 'function') {
						throw new Error("L'interface " + aInterface[0] + " n'est pas respectee car l'objet ne dispose pas de la methode " + aInterface[1][iMethod]);
					}
				}
			}
			return true;
		}

	}
);

F6.extend(
	F6, (function Event() {

		var _aFns = [];

		var Event = function() {
			throw new Error("F6.Event est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Event, {

				'setDialog': function(oDialog) {
					if (typeof oDialog !== 'object') {
						return;
					}
					for (var _sDialog in oDialog) {
						if (typeof _sDialog === 'string') {
							this.addEvents({
								'onSetDialog': oDialog[_sDialog]
							});
						}
					}
					for (var _sDialog2 in oDialog) {
						if (typeof _sDialog2 === 'string') {
							this.fireEvent(_sDialog2, oDialog[_sDialog2].params);
						}
					}
				},

				'fireEvent': function(sEvent, aBinds, iDelay) {
					if (typeof sEvent !== 'string') {
						throw new Error("Le premier parametre de F6.Event.fireEvent n'est pas une chaine texte");
					}
					/*
					Supprime pour le moment car, en retour de requete Ajax, ca pete une erreur;
					le tableau renvoye par PHP n'est pas reconnu comme tel malgre que ca ne pose pas de probleme par la suite... pourquoi ? mystere ?!!

					if(aBinds && (typeof aBinds !== 'object' || aBinds.constructor != Array)) {
					throw new Error("Le second parametre de F6.Event.fireEvent n'est pas un tableau");
					}
					*/
					if (iDelay && typeof iDelay !== 'number') {
						throw new Error("Le troisieme parametre de F6.Event.fireEvent n'est pas un objet");
					}
					_aFns.forEach(function(aEvent) {
						if (aEvent[0] == sEvent) {
							var _aBinds = aEvent[2] || aBinds || [];
							var _fnEvent = aEvent[1];
							if (typeof _fnEvent !== 'function') {
								throw new Error();
							}
							iDelay ?
								setTimeout(
									function() {
										_fnEvent.apply(null, _aBinds);
									},
									iDelay
								) :
								_fnEvent.apply(null, _aBinds);
						}
					});
					return sEvent == 'nodesRemoved' || sEvent == 'isNotLogged' ?
						null :
						this;
				},

				'domready': (function() {
					if (document.addEventListener) {
						return function(fnCallback) {
							document.addEventListener('DOMContentLoaded', fnCallback, false);
						};
					}
					if (document.attachEvent) {
						return function(fnCallback) {
							var _timer = setInterval(
								function() {
									try {
										document.documentElement.doScroll('left');
										if (fnCallback()) {
											_timer = clearInterval(_timer);
										}
									}
									catch (e) { }
								},
								10);
						};
					}
					if (/WebKit/i.test(navigator.userAgent)) {
						return function(fnCallback) {
							var _timer = setInterval(
								function() {
									if (/loaded|complete/.test(document.readyState)) {
										clearInterval(_timer);
										_timer = null;
										fnCallback();
									}
								},
								10);
						};
					}
				})(),

				'addEvents': (function() {
					if (document.addEventListener) {
						return function(oCallbacks) {
							if (typeof oCallbacks !== 'object') {
								return;
							}
							var aNodes = this;
							if (typeof this === 'undefined' || this.constructor != Array) {
								aNodes = F6.Node.get(window);
							}
							aNodes.forEach(
								function(oEl) {
									if (typeof oEl !== 'object') {
										return;
									}
									while (oEl.constructor == Array) {
										oEl = oEl[0];
									}
									for (var sEvent in oCallbacks) {
										if (typeof sEvent === 'string') {
											if (typeof oCallbacks[sEvent] === 'function') {
												if (sEvent.length > 2 && sEvent.slice(0, 2) == 'on') {
													var _sEvent = sEvent.slice(2, 3).toLowerCase() + sEvent.slice(3);
													_aFns.push([_sEvent, oCallbacks[sEvent]]);
												}
												else {
													oEl.addEventListener(sEvent, oCallbacks[sEvent], false);
												}
											}
											else if (sEvent == 'onSetDialog' && typeof oCallbacks[sEvent] === 'object') {
												var sRealEvent = oCallbacks[sEvent].event;
												var fnCallBack = oCallbacks[sEvent].action;
												var aParams = oCallbacks[sEvent].params;
												if (sRealEvent.length > 2 && sRealEvent.slice(0, 2) == 'on') {
													sRealEvent = sRealEvent.slice(2, 3).toLowerCase() + sRealEvent.slice(3);
													_aFns.push([sRealEvent, fnCallBack, aParams]);
												}
											}
										}
									}
								}
							);
							return aNodes.fireEvent('eventsAdd');
						};
					}
					if (document.attachEvent) {
						return function(oCallbacks) {
							if (typeof oCallbacks !== 'object') {
								return;
							}
							var aNodes = this;
							if (typeof this === 'undefined' || this.constructor != Array) {
								aNodes = F6.Node.get(window);
							}
							aNodes.forEach(
								function(oEl) {
									if (typeof oEl !== 'object') {
										return;
									}
									while (oEl.constructor == Array) {
										oEl = oEl[0];
									}
									for (var sEvent in oCallbacks) {
										if (typeof sEvent === 'string') {
											if (typeof oCallbacks[sEvent] === 'function') {
												if (sEvent.length > 2 && sEvent.slice(0, 2) == 'on') {
													var _sEvent = sEvent.slice(2, 3).toLowerCase() + sEvent.slice(3);
													_aFns.push([_sEvent, oCallbacks[sEvent]]);
												}
												else {
													oEl.attachEvent('on' + sEvent, oCallbacks[sEvent]);
												}
											}
											else if (sEvent == 'onSetDialog' && typeof oCallbacks[sEvent] === 'object') {
												var sRealEvent = oCallbacks[sEvent].event;
												var fnCallBack = oCallbacks[sEvent].action;
												var aParams = oCallbacks[sEvent].params;
												if (sRealEvent.length > 2 && sRealEvent.slice(0, 2) == 'on') {
													sRealEvent = sRealEvent.slice(2, 3).toLowerCase() + sRealEvent.slice(3);
													_aFns.push([sRealEvent, fnCallBack, aParams]);
												}
											}
										}
									}
								}
							);
							return aNodes.fireEvent('eventsAdd');
						};
					}
				})(),

				'removeEvents': (function() {
					if (document.addEventListener) {
						return function(oCallbacks) {
							if (typeof oCallbacks !== 'object') {
								return;
							}
							var aNodes = this;
							if (typeof this === 'undefined' || this.constructor != Array) {
								aNodes = F6.Node.get(window);
							}
							var _removeEvent = function(oEl) {
								if (typeof oEl !== 'object') {
									return;
								}
								while (oEl.constructor == Array) {
									oEl = oEl[0];
								}
								for (var sEvent in oCallbacks) {
									if (typeof sEvent === 'string' && typeof oCallbacks[sEvent] === 'function') {
										if (sEvent.length > 2 && sEvent.slice(0, 2) == 'on') {
											sEvent = sEvent.slice(2, 3).toLowerCase() + sEvent.slice(3);
											_aFns = _aFns.filter(
												function(aCallbacks) {
													return aCallbacks[0] != sEvent;
												}
											);
										}
										else {
											oEl.removeEventListener(sEvent, oCallbacks[sEvent], false);
										}
									}
								}
							};
							aNodes.forEach(_removeEvent);
							return aNodes.fireEvent('eventsRemove');
						};
					}
					if (document.detachEvent) {
						return function(oCallbacks) {
							if (typeof oCallbacks !== 'object') {
								return;
							}
							var aNodes = this;
							if (typeof this === 'undefined' || this.constructor != Array) {
								aNodes = F6.Node.get(window);
							}
							var _removeEvent = function(oEl) {
								if (typeof oEl !== 'object') {
									return;
								}
								while (oEl.constructor == Array) {
									oEl = oEl[0];
								}
								for (var sEvent in oCallbacks) {
									if (typeof sEvent === 'string' && typeof oCallbacks[sEvent] === 'function') {
										if (sEvent.length > 2 && sEvent.slice(0, 2) == 'on') {
											sEvent = sEvent.slice(2, 3).toLowerCase() + sEvent.slice(3);
											_aFns = _aFns.filter(
												function(aCallbacks) {
													return aCallbacks[0] != sEvent;
												}
											);
										}
										else {
											oEl.detachEvent('on' + sEvent, oCallbacks[sEvent]);
										}
									}
								}
							};
							aNodes.forEach(_removeEvent);
							return aNodes.fireEvent('eventsRemove');
						};
					}
				})(),

				'stopEvent': function(e) {
					if (e && e.stopPropagation && e.preventDefault) {
						e.stopPropagation();
						e.preventDefault();
					}
					else if (e && window.event) {
						window.event.cancelBubble = true;
						window.event.returnValue = false;
					}
					return F6.Node.get((e.target || e.srcElement)).fireEvent('stopEvent');
				},

				'getSrc': function(e) {
					return F6.Node.get((e.target || e.srcElement)).fireEvent('srcRegister');
				},

				'getRelTarget': function(e) {
					switch (e.type) {
						case 'mouseover': // Retourne l'element precedent le survol de l'element source de l'evenement
							return F6.Node.get((e.relatedTarget || e.fromElement)).fireEvent('relTargetRegister');
						case 'mouseout': // Retourne l'element sur lequel on entre une fois qu'on a quitte l'element source de l'evenement
							return F6.Node.get((e.relatedTarget || e.toElement)).fireEvent('relTargetRegister');
					}
				}
			}
		);

		return {
			'Event': Event
		};

	})()
);

F6.extend(
	F6, (function Browser() {

		var Browser = function() {
			throw new Error("F6.Browser est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Browser, {
				'IE': (window.attachEvent),
				'IE6': (this.IE && typeof XMLHttpRequest === 'undefined'),
				'IEGT7': (window.attachEvent && typeof XMLHttpRequest !== 'undefined'),
				'IELT7': (window.attachEvent && typeof XMLHttpRequest === 'undefined'),
				'IEQUIRKS': (this.IE6 && document.compatMode && document.compatMode == "BackCompat"),
				'OPERA': (window.opera),
				'WEBKIT': (typeof navigator.taintEnabled === 'undefined'),
				'HEIGHTSTYLE': this.IEQUIRKS || this.IE6 ?
					'height' :
					'minHeight'
			}
		);

		return {
			'Browser': Browser
		};

	})()
);

F6.extend(
	F6, (function Module() {

		var Module = function() {
			throw new Error("F6.Module est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Module, {

				'singleton': function(vFastOrFunc, func) {
					F6.extend(
						F6.Module,
						arguments.length == 2 ?
							func.apply(null, vFastOrFunc) :
							vFastOrFunc()
					);
					return F6.Event.fireEvent('singletonComplete');
				}
			}
		);

		return {
			'Module': Module
		};

	})()
);

F6.extend(
	F6, (function Util() {

		var Util = function() {
			throw new Error("F6.Util est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Util, {

				'hasCSS': function() {
					var _bHasCSS = false;
					var _oCont = document.createElement('div');
					document.body.appendChild(_oCont);
					_oCont.style.width = 10 + 'px';
					_oCont.style.padding = 10 + 'px';
					if (_oCont.scrollWidth == '30') {
						_bHasCSS = true;
					}
					else if (window.attachEvent && _oCont.scrollWidth == '20') {
						_bHasCSS = true;
					}
					document.body.removeChild(_oCont);
					return _bHasCSS;
				},

				'toArray': function(oObj) {
					if ((F6.Browser.WEBKIT && typeof oObj !== 'function') || typeof oObj !== 'object') {
						//throw new Error();
					}
					var aResult = [];
					for (var _oItem = 0, _oItems = oObj.length; _oItem < _oItems; _oItem++) {
						aResult.push(oObj[_oItem]);
					}
					return aResult;
				}
			}
		);

		return {
			'Util': Util
		};

	})()
);

F6.extend(
	F6, (function Debug() {

		var Debug = function() {
			throw new Error("F6.Debug est une classe abstraite et ne peut etre instanciee");
		};

		var _errors = function(sStatus) {
			F6.Node.get(window)[sStatus]({
				'onANodeIsNotFound': function(sMethod, oContext, sTag) {
					var sMsg = [
						"La condition definie pour ",
						sMethod,
						" renvoie false ce qui fait que la methode n'a pu trouver le ",
						sMethod === 'getFirst' ?
							("premier enfant " + sTag + " au sein de ") :
							sMethod === 'getLast' ?
								("dernier enfant " + sTag + " au sein de ") :
								sMethod === 'getPrevious' ?
									("noeud " + sTag + " precedent ") :
									sMethod === 'getNext' ?
										("noeud " + sTag + " suivant ") :
										sMethod === 'getParent' ?
											("noeud parent " + sTag + " de ") :
											("noeud " + sTag + " selectionne "),
						oContext && oContext[0] ?
							oContext[0] :
							'undefined'
					].join('');
					F6.Debug.trace(sMsg);
				}
			});
			return sStatus == 'addEvents' ?
				F6.Debug.trace("**********.oO{ ACTIVATION DU GESTIONNAIRE DE BUGS }Oo.**********") :
				F6.Debug.trace("*********.oO{ DESACTIVATION DU GESTIONNAIRE DE BUGS }Oo.********");
		};

		F6.extend(
			Debug, {

				'setDebug': function(bActive) {
					_errors(bActive ? 'addEvents' : 'removeEvents');
					return F6.Event.fireEvent('debugSetted');
				},

				'trace': function() {
					//					return;
					if (typeof window.console !== 'undefined' && typeof window.console.firebug !== 'undefined') {
						var _aArgs = F6.Util.toArray(arguments);
						if (typeof this !== 'function') {
							_aArgs.unshift('(contexte:', this, '/ type:', this.constructor == Array ? 'array' : typeof this, ')');
						}
						console.info.apply(console, _aArgs);
					}
					return typeof this !== 'function' ?
						this.fireEvent('trace') :
						this;
				}
			}
		);

		return {
			'Debug': Debug
		}
	})()
);

F6.extend(
	F6, (function Css() {

		var Css = function() {
			throw new Error("F6.Css est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Css, {

				'addClass': function(sClass) {
					var aNodes = this;
					aNodes.forEach(
						function(oEl) {
							if (typeof oEl !== 'object') {
								return;
							}
							while (oEl.constructor == Array) {
								oEl = oEl[0];
							}
							if (!aNodes.hasClass(sClass)) {
								oEl.className += oEl.className ?
									' ' + sClass :
									sClass;
							}
						}
					);
					return aNodes.fireEvent('classAdded');
				},

				'removeClass': function(sClass) {
					var aNodes = this;
					aNodes.forEach(
						function(oEl) {
							if (typeof oEl !== 'object') {
								return;
							}
							while (oEl.constructor == Array) {
								oEl = oEl[0];
							}
							var _sRep = oEl.className.match(' ' + sClass) ?
								' ' + sClass :
								sClass;
							oEl.className = oEl.className.replace(_sRep, '');
						}
					);
					return aNodes.fireEvent('classRemoved');
				},

				'hasClass': function(sClass) {
					return arguments.length === 2 ?
						(
							typeof arguments[1] === 'string' ?
								(new RegExp('\\b' + arguments[1] + '\\b')).test(arguments[0].className) :
								arguments[1].test(arguments[0].className)
						) :
						this.every(
							function(oEl) {
								if (typeof oEl !== 'object') {
									return;
								}
								while (oEl.constructor == Array) {
									oEl = oEl[0];
								}
								return typeof sClass === 'string' ?
									(new RegExp('\\b' + sClass + '\\b')).test(oEl.className) :
									sClass.test(oEl.className);
							}
						);
				},

				'swapClass': function(sClass1, sClass2) {
					var aNodes = this;
					aNodes.forEach(
						function(oEl) {
							if (typeof oEl !== 'object') {
								return;
							}
							while (oEl.constructor == Array) {
								oEl = oEl[0];
							}
							oEl.className = aNodes.hasClass(sClass1) ?
								oEl.className.replace(sClass1, sClass2) :
								oEl.className.replace(sClass2, sClass1);
						}
					);
					return aNodes.fireEvent('classSwaped');
				},

				'toggleClass': function(sClass) {
					this.hasClass(sClass) ?
						this.removeClass(sClass) :
						this.addClass(sClass);
					return this.fireEvent('classToggled');
				}
			}
		);

		return {
			'Css': Css
		};

	})()
);

F6.extend(
	F6, (function Style() {

		var Style = function() {
			throw new Error("F6.Style est une classe abstraite et ne peut etre instanciee");
		};

		F6.extend(
			Style, {

				'getStyle': function(sCssRule) {
					if (typeof this === 'undefined' || this.constructor != Array) {
						return F6.Node.get(document).fireEvent("thisIsNotAWrapper", ['getStyle', this, sCssRule]);
					}
					if (typeof sCssRule !== 'string') {
						return this.fireEvent('sCssRuleIsNotAString', ['getStyle', this, sCssRule]);
					}
					return this.map(
						function(oNode) {
							while (oNode && oNode.constructor == Array) {
								oNode = oNode[0];
							}
							var vValues = '';
							if (document.defaultView && document.defaultView.getComputedStyle) {
								try {
									switch (sCssRule) {
										case 'margin':
											vValues = ['margin-top', 'margin-right', 'margin-bottom', 'margin-left'].map(
												function(sValue) {
													return document.defaultView.getComputedStyle(oNode, null).getPropertyValue(sValue);
												}
											);
											break;
										case 'border':
											vValues = ['border-top', 'border-right', 'border-bottom', 'border-left'].map(
												function(sValue) {
													return document.defaultView.getComputedStyle(oNode, null).getPropertyValue(sValue);
												}
											);
											break;
										case 'padding':
											vValues = ['padding-top', 'padding-right', 'padding-bottom', 'padding-left'].map(
												function(sValue) {
													return document.defaultView.getComputedStyle(oNode, null).getPropertyValue(sValue);
												}
											);
											break;
										default:
											vValues = document.defaultView.getComputedStyle(oNode, null).getPropertyValue(sCssRule);
									}
								}
								catch (e1) {
									vValues = '';
								}
							}
							else if (oNode.currentStyle) {
								try {
									sCssRule = sCssRule.replace(
										/\-(\w)/g,
										function(sMatch, sP1) {
											return sP1.toUpperCase();
										}
									);
									vValues = oNode.currentStyle[sCssRule];
									if (vValues.match(/\s/)) {
										vValues = vValues.split(/\s/);
										if (vValues.length == 2) {
											vValues = vValues.concat(vValues);
										}
										else if (vValues.length == 3) {
											vValues.push(vValues[1]);
										}
									}
								}
								catch (e2) {
									vValues = '';
								}
							}
							return vValues;
						}
					);
				},

				'getIntStyle': function(sCSSRule) {
					return this.getStyle(sCSSRule).reduce(
						function(iPrevious, iCurrent) {
							return iPrevious.concat(iCurrent);
						}
					).map(
						function(sValue) {
							var iValue = parseInt(sValue);
							return isNaN(iValue) ?
								0 :
								iValue;
						}
					);
				},

				'getHStyle': function() {
					return this.map(
						function(oNode) {
							while (oNode && oNode.constructor == Array) {
								oNode = oNode[0];
							}
							return F6.Browser.IEQUIRKS ?
								0 :
								(
									parseInt(oNode.getIntStyle('padding-top')[0]) +
									parseInt(oNode.getIntStyle('padding-bottom')[0]) +
									parseInt(oNode.getIntStyle('border-top-width')[0]) +
									parseInt(oNode.getIntStyle('border-bottom-width')[0])
								);
						}
					);
				},

				'getWStyle': function() {
					return this.map(
						function(oNode) {
							while (oNode && oNode.constructor == Array) {
								oNode = oNode[0];
							}
							return F6.Browser.IEQUIRKS ?
								0 :
								(
									parseInt(oNode.getIntStyle('padding-left')[0]) +
									parseInt(oNode.getIntStyle('padding-right')[0]) +
									parseInt(oNode.getIntStyle('border-left-width')[0]) +
									parseInt(oNode.getIntStyle('border-right-width')[0])
								)
						}
					);
				},

				'getPosition': function(bOverflown) {
					return this.map(
						function(oNode) {
							while (oNode && oNode.constructor == Array) {
								oNode = oNode[0];
							}
							var iCurleft = 0, iCurtop = 0;
							if (oNode.offsetParent) {
								do {
									iCurleft += oNode.offsetLeft + (
										bOverflown ?
											(-oNode.scrollLeft) :
											0
									);
									iCurtop += oNode.offsetTop + (
										bOverflown ?
											(-oNode.scrollTop) :
											0
									);
								}
								while (oNode = oNode.offsetParent);
								return {
									'x': iCurleft,
									'y': iCurtop
								};
							}
						}
					);
				}
			}
		);

		return {
			'Style': Style
		};
	})()
);

F6.extend(
	F6, (function Node() {

		var Node = function() {
			throw new Error("F6.Node est une classe abstraite et ne peut etre instanciee");
		};

		var _initNodes = function() {
			var aNodes = [];
			[F6.Event, F6.Node, F6.Css, F6.Style, F6.Debug, F6.Ajax].forEach(
				function(oModule) {
					if (typeof oModule === 'function') {
						F6.extend(aNodes, oModule);
					}
				}
			);
			F6.extend(
				aNodes,
				F6, {
					'filter': ['extend']
				}
			);
			return aNodes.fireEvent('wrapperInit');
		};

		var _aNodes = _initNodes();

		var _setNodes = function(aTmpNodes) {
			var aNodes = this;
			if (aNodes.hasOwnProperty('fireEvent') && typeof aNodes === 'object' && aNodes.constructor == Array) {
				aTmpNodes.forEach(
					function(oNode) {
						if (typeof oNode === 'object') {
							aNodes.push(oNode);
							return aNodes.fireEvent('nodeSetted');
						}
					}
				);
				return aNodes.fireEvent('nodesSetted');
			}
		};

		F6.extend(
			Array.prototype, {
				'setNodes': _setNodes
			}
		);

		var _inject = function(aNodes, aTargets, sMethod) {
			var _aTmpNodes = aNodes.map(
				function(oNode, iNode) {
					var _oNode = oNode;
					while (_oNode.constructor == Array) {
						_oNode = _oNode[0];
					}
					var _oTarget = aTargets[iNode];
					while (_oTarget.constructor == Array) {
						_oTarget = _oTarget[0];
					}
					_oTarget.parentNode.insertBefore(
						_oNode,
						typeof sMethod === 'string' ?
							F6.Node.get(_oTarget)[sMethod]()[0] :
							_oTarget
					);
					return F6.Node.get(_oTarget.parentNode).fireEvent('nodeInject');
				}
			);
			var _aNodes;
			if ((_aNodes = _initNodes().setNodes(_aTmpNodes)) && _aNodes.length > 0) {
				return _aNodes.fireEvent('nodesInject');
			}
		};

		var _getExtremity = function(oThat, sThis, vTagOrFilter, fnFilter) {
			var _bFilter = (typeof vTagOrFilter !== 'function' && typeof fnFilter !== 'function') ? false : true;
			if (typeof vTagOrFilter === 'string') {
				var _aTmpNodes = oThat.map(
					function(oNode) {
						var _aEls = oNode.getElementsByTagName(vTagOrFilter);
						var iNode = sThis == 'first' ? 0 : _aEls.length - 1;
						oNode = _aEls[iNode];
						if (oNode && (_bFilter ? fnFilter(oNode, iNode, oThat) : true)) {
							return F6.Node.get(oNode).fireEvent('nodeRegister');
						}
					}
				);
			}
			else {
				var _aTmpNodes = oThat.map(
					function(oNode, iNode) {
						oNode = oNode[sThis == 'first' ? 'firstChild' : 'lastChild'];
						while (oNode && oNode.nodeType == 3 && oNode.nodeValue.trim() === '') {
							oNode = oNode[sThis == 'first' ? 'nextSibling' : 'previousSibling'];
						}
						if (oNode && (_bFilter ? vTagOrFilter(oNode, iNode, oThat) : true)) {
							return F6.Node.get(oNode).fireEvent('nodeRegister');
						}
					}
				);
			}
			var aNodes;
			if (
				!_aTmpNodes.some(
					function(oValue) {
						return typeof oValue === 'undefined';
					}
				) &&
				(aNodes = _initNodes().setNodes(_aTmpNodes)) &&
				aNodes.length > 0
			) {
				return aNodes.fireEvent('nodesRegister')[0];
			}
			return oThat.fireEvent('aNodeIsNotFound', [sThis == 'first' ? 'getFirst' : 'getLast', oThat, vTagOrFilter]);
		};

		var _moveTo = function(oThat, sProperty, oNode, vTagOrFilter, fnFilter) {
			if (fnFilter && typeof fnFilter === 'function') {
				while (
					oNode && oNode != document &&
					(oNode.nodeType != 1 || !fnFilter(oThat, sProperty, oNode, vTagOrFilter) || oNode.nodeName.toLowerCase() != vTagOrFilter)
				) {
					oNode = oNode[sProperty];
				}
			}
			else if (vTagOrFilter && typeof vTagOrFilter !== 'undefined') {
				if (typeof vTagOrFilter === 'string') {
					while (oNode && oNode != document && (oNode.nodeType != 1 || oNode.nodeName.toLowerCase() != vTagOrFilter)) {
						oNode = oNode[sProperty];
					}
				}
				else {
					while (oNode && oNode != document && (oNode.nodeType != 1 || !vTagOrFilter(oThat, sProperty, oNode, vTagOrFilter))) {
						oNode = oNode[sProperty];
					}
				}
			}
			else {
				while (oNode && oNode.nodeType != 1) {
					oNode = oNode[sProperty];
				}
			}
			return (sProperty == 'parentNode' && oNode == document) ?
				false :
				oNode;
		};

		var _getThis = function(oThat, sThis, vTagOrFilter, fnFilter) {
			if (!oThat || !sThis) {
				return;
			}
			var sProperty = (sThis == 'previous') ?
				'previousSibling' :
				(sThis == 'next') ?
					'nextSibling' :
					'parentNode';
			var _aTmpNodes = oThat.map(
				function(oNode) {
					while (oNode && oNode.constructor == Array) {
						oNode = oNode[0];
					}
					if (oNode) {
						oNode = oNode[sProperty];
						oNode = _moveTo(oThat, sProperty, oNode, vTagOrFilter, fnFilter);
						if (typeof oNode !== 'undefined') {
							return F6.Node.get(oNode);
						}
					}
				}
			);
			var aNodes;
			if (
				!_aTmpNodes.some(
					function(oValue) {
						return typeof oValue === 'undefined';
					}
				) &&
				(aNodes = _initNodes().setNodes(_aTmpNodes)) &&
				aNodes.length > 0
			) {
				return aNodes.fireEvent('nodesRegister')[0];
			}
			return oThat.fireEvent(
				'aNodeIsNotFound',
				[
					sThis == 'previous' ?
						'getPrevious' :
						sThis == 'next' ?
							'getNext' :
							'getParent',
					oThat,
					vTagOrFilter
				]
			);
		};

		F6.extend(
			Node, {

				'getNodes': function() {
					return _aNodes;
				},

				'hasAttr': function(vAttr) {
					if (typeof vAttr !== 'object' || typeof vAttr === 'string') {
						return;
					}
					return typeof vAttr === 'object' ?
						this.every(
							function(oNode) {
								while (oNode.constructor == Array) {
									oNode = oNode[0];
								}
								for (var sAttr in vAttr) {
									switch (sAttr) {
										case 'class':
											if (typeof oNode.className === 'undefined' || !oNode.className.test(vAttr[sAttr])) {
												return false;
											}
											break;
										case 'for':
											if (typeof oNode.htmlFor === 'undefined' && !oNode.htmlFor.test(vAttr[sAttr])) {
												return false;
											}
											break;
										default:
											if (typeof oNode[sAttr] === 'undefined' && !oNode[sAttr].test(vAttr[sAttr])) {
												return false;
											}
									}
								}
								return true;
							}
						) :
						this.every(
							function(oNode) {
								while (oNode.constructor == Array) {
									oNode = oNode[0];
								}
								switch (vAttr) {
									case 'class':
										if (typeof oNode.className === 'undefined') {
											return false;
										}
										break;
									case 'for':
										if (typeof oNode.htmlFor === 'undefined') {
											return false;
										}
										break;
									default:
										if (typeof oNode[vAttr] === 'undefined') {
											return false;
										}
								}
								return true;
							}
						);
				},

				'setAttr': function(oAttr) {
					if (typeof oAttr !== 'object') {
						return;
					}
					this.forEach(
						function(oNode) {
							while (oNode.constructor == Array) {
								oNode = oNode[0];
							}
							for (var sAttr in oAttr) {
								if (typeof sAttr === 'string') {
									switch (sAttr) {
										case 'class':
											F6.Node.get(oNode).addClass(oAttr[sAttr]);
											break;
										case 'for':
											oNode.htmlFor = oAttr[sAttr];
											break;
										case 'styles':
											for (var _sStyle in oAttr[sAttr]) {
												oNode.style[_sStyle] = oAttr[sAttr][_sStyle];
											}
											break;
										default:
											oNode[sAttr] = oAttr[sAttr];
									}
								}
							}
						}
					);
					return this.fireEvent('attrSet');
				},

				'getAttr': function(vAttr) {
					var aAttr = [];
					return this.map(
						function(oNode) {
							while (oNode.constructor == Array) {
								oNode = oNode[0];
							}
							if (typeof vAttr === 'string') {
								switch (vAttr) {
									case 'class':
										if (typeof oNode.className !== 'undefined') {
											return oNode.className;
										}
										break;
									case 'for':
										if (typeof oNode.htmlFor !== 'undefined') {
											return oNode.htmlFor;
										}
										break;
									default:
										if (typeof oNode[vAttr] !== 'undefined') {
											return oNode[vAttr];
										}
								}
							}
							else if (typeof vAttr === 'object') {
								for (var sAttr in vAttr) {
									switch (sAttr) {
										case 'class':
											if (typeof oNode.className !== 'undefined' && oNode.className.test(vAttr[sAttr])) {
												return oNode.className;
											}
											break;
										case 'for':
											if (typeof oNode.htmlFor !== 'undefined' && oNode.htmlFor.test(vAttr[sAttr])) {
												return oNode.htmlFor;
											}
											break;
										default:
											if (typeof oNode[sAttr] !== 'undefined' && oNode[sAttr].test(vAttr[sAttr])) {
												return oNode[sAttr];
											}
									}
								}
							}
						}
					);
				},

				'get': function() {
					var _aArgs = F6.Util.toArray(arguments);
					if (_aArgs.length === 0) {
						return;
					}
					_aNodes = _initNodes();
					_aArgs.forEach(
						function(oArg) {
							var _oEl;
							switch (typeof oArg) {
								case 'string':
									_oEl = document.getElementById(oArg);
									break;
								case 'object':
									if (oArg && oArg.constructor == Array) {
										if (typeof oArg.getElements === 'function') {
											_oEl = oArg[0];
										}
										else if (typeof oArg[0] === 'string') {
											if ((_oEl = document.getElementById(oArg[0]))) {
												_oEl = _oEl.getElementsByTagName(oArg[1])[0];
											}
										}
										else if (oArg[0].constructor == Array) {
											_oEl = oArg;
										}
										else if (oArg[0] && oArg[1]) {
											_oEl = oArg[0].getElementsByTagName(oArg[1])[0];
										}
									}
									else if (oArg) {
										_oEl = oArg;
									}
									break;
							}
							if (_oEl) {
								_aNodes.push(_oEl);
								return _aNodes.fireEvent('nodeRegister');
							}
							else {
								F6.Node.get(document).fireEvent('aNodeDoesntExist', ['get', _aArgs]);
							}
						}
					);
					if (_aNodes.length > 0) {
						return _aNodes.fireEvent('nodesRegister');
					}
					return F6.Node.get(document).fireEvent('allNodesDoesntExist', ['get', _aArgs]);
				},

				'getElements': function(vTagOrFilter, fnFilter) {
					var _aTmpNodes = [];
					var _aThisNodes = (typeof this !== 'object' || this.constructor != Array) ?
						F6.Node.get(document) :
						this;
					var _pushNodes = function() {
						var _aNodes = arguments[0] || _aThisNodes;
						_aNodes.forEach(
							function(oNode, iNode) {
								if (oNode.constructor == Array) {
									oNode = oNode[0];
								}
								(
									typeof vTagOrFilter === 'string' ?
										F6.Util.toArray(oNode.getElementsByTagName(vTagOrFilter)) :
										typeof vTagOrFilter === 'object' && vTagOrFilter.constructor == Array ?
											vTagOrFilter.map(function(sTag) {
												return oNode.nodeName.toLowerCase() != sTag ?
													F6.Util.toArray(oNode.getElementsByTagName(sTag)) :
													oNode;
											}) :
											F6.Util.toArray(oNode.getElementsByTagName('*'))
								).forEach(
									function(oEl, iEl) {
										if (oEl && oEl.constructor == Array) {
											if (oEl.length > 1) {
												return _pushNodes(oEl);
											}
											oEl = oEl[0];
										}
										if (!oEl) {
											return;
										}
										if (
											typeof fnFilter === 'function' ?
												fnFilter(oEl, iEl, oNode, iNode, _aNodes) :
												typeof vTagOrFilter === 'function' ?
													vTagOrFilter(oEl, iEl, oNode, iNode, _aNodes) :
													true
										) {
											_aTmpNodes.push(F6.Node.get(oEl).fireEvent('nodeRegister'));
										}
									}
								);
							}
						);
					};
					_pushNodes();
					var aNodes;
					if ((aNodes = _initNodes().setNodes(_aTmpNodes)) && aNodes.length > 0) {
						return aNodes.fireEvent('nodesRegister');
					}
					return F6.Node.get(document).fireEvent('allNodesDoesntExist', ['getElements', vTagOrFilter, fnFilter]);
				},

				'getFirst': function(vTagOrFilter, fnFilter) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _getExtremity(this, 'first', vTagOrFilter, fnFilter);
				},

				'getLast': function(vTagOrFilter, fnFilter) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _getExtremity(this, 'last', vTagOrFilter, fnFilter);
				},

				'getPrevious': function(vTagOrFilter, fnFilter) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _getThis(this, 'previous', vTagOrFilter, fnFilter);
				},

				'getNext': function(vTagOrFilter, fnFilter) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _getThis(this, 'next', vTagOrFilter, fnFilter);
				},

				'getParent': function(vTagOrFilter, fnFilter) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _getThis(this, 'parent', vTagOrFilter, fnFilter);
				},

				'remove': function() {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					this.forEach(
						function(oNode) {
							var _oNode = F6.Node.get(oNode);
							oNode.parentNode.removeChild(oNode);
							return _oNode.fireEvent('nodeRemove');
						}
					)
					this.fireEvent('nodesRemove');
					return;
				},

				'swap': function(aEls) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					if (typeof aEls != 'object' || aEls.constructor != Array || this.length != aEls.length) {
						return this.fireEvent('aElsIsNotAnArrayOrHaveNotTheSameLengthToThis');
					}
					var _aEls = this.map(
						function(oNode, iNode) {
							var _oNode = oNode;
							while (_oNode.constructor == Array) {
								_oNode = _oNode[0];
							}
							var _oEl = aEls[iNode];
							while (_oEl.constructor == Array) {
								_oEl = _oEl[0];
							}
							_oNode.parentNode.replaceChild(_oEl, _oNode);
							return F6.Node.get(_oEl).fireEvent('nodeSwap');
						}
					);
					return F6.Node.get(_aEls).fireEvent('nodesSwap');
				},

				'clone': function(bRecursive) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					var _aClones = this.map(
						function(oNode) {
							var _oNode = oNode;
							while (_oNode.constructor == Array) {
								_oNode = _oNode[0];
							}
							var _oClone = _oNode.cloneNode(bRecursive || false);
							_oClone = F6.Node.get(_oClone);
							return _oClone.fireEvent('nodeClone');
						}
					);
					return F6.Node.get(_aClones).fireEvent('nodesClone');
				},

				'create': function() {
					var _aNodes = _initNodes();
					F6.Util.toArray(arguments).forEach(
						function(oArg) {
							if (typeof oArg === 'object') {
								for (var sTag in oArg) {
									var _oNew = F6.Node.get(document.createElement(sTag));
									if (typeof oArg[sTag] === 'object') {
										for (var sParam in oArg[sTag]) {
											if (sParam != 'text' && sParam != 'events') {
												continue;
											}
											switch (sParam) {
												case 'text':
													_oNew.setText(oArg[sTag][sParam]);
													break;
												case 'events':
													_oNew.addEvents(oArg[sTag][sParam]);
													break;
											}
										}
										var _oParams = {};
										F6.extend(
											_oParams,
											oArg[sTag],
											{
												'except': ['text', 'events']
											}
										);
										_oNew.setAttr(_oParams);
									}
									_aNodes.push(_oNew.fireEvent('nodeCreate'));
								}
							}
							else if (typeof oArg === 'string') {
								_aNodes.push(F6.Node.get(document.createElement(oArg)).fireEvent('nodeCreate'));
							}
						}
					);
					return _aNodes.fireEvent('nodesCreate');
				},

				'adopt': function() {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					var _aEls = F6.Util.toArray(arguments);
					this.forEach(
						function(oNode) {
							var _oNode = oNode;
							while (_oNode.constructor == Array) {
								_oNode = _oNode[0];
							}
							_aEls.reduce(
								function(iPrevious, iCurrent) {
									return iPrevious.concat(iCurrent);
								}
							).forEach(
								function(oEl) {
									while (oEl.constructor == Array) {
										oEl = oEl[0];
									}
									_oNode.appendChild(oEl);
									return F6.Node.get(_oNode).fireEvent('nodeAdopt');
								}
							);
							return F6.Node.get(_oNode).fireEvent('nodesAdopt');
						}
					);
					return this.fireEvent('allNodesAdopt');
				},

				'injectBefore': function(oEl) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _inject(this, oEl);
				},

				'injectAfter': function(oEl) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _inject(this, oEl, 'getNext');
				},

				'injectTop': function(oEl) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _inject(this, oEl, 'getFirst');
				},

				'injectBottom': function(oEl) {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					return _inject(this, oEl, 'getLast');
				},

				'getText': function() {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					var getText = function(oNode) {
						while (oNode && oNode.constructor == Array) {
							oNode = oNode[0];
						}
						return oNode.innerHTML;
					};
					return this.length > 1 ?
						this.map(getText) :
						getText(this);
				},

				'setText': function() {
					if (typeof this !== 'object' || this.constructor != Array) {
						return;
					}
					var _aArgs = F6.Util.toArray(arguments);
					var setText = function(oNode) {
						while (oNode && oNode.constructor == Array) {
							oNode = oNode[0];
						}
						if (oNode) {
							oNode.innerHTML = _aArgs.join('');
						}
					};
					this.length > 1 ?
						this.forEach(setText) :
						setText(this);
					return this.fireEvent('textSet');
				}
			}
		);

		return {
			'Node': Node
		};

	})()
);

F6.extend(
	F6, (function Ajax() {

		var Ajax = function() {
			throw new Error("F6.Ajax est une classe abstraite et ne peut etre instanciee");
		};

		var _iTempoXHR = 2500;

		var _aMSXML = [
			'Microsoft.XMLHTTP',
			'MSXML2.XMLHTTP',
			'MSXML2.XMLHTTP.3.0',
			'MSXML2.XMLHTTP.4.0',
			'MSXML2.XMLHTTP.5.0',
			'MSXML2.XMLHTTP.6.0',
			'MSXML2.XMLHTTP.7.0'
		];

		var _createXHR = (function() {
			if (typeof XMLHttpRequest !== 'undefined') {
				return function() {
					return new XMLHttpRequest;
				};
			}
			else if (window.ActiveXObject) {
				var _iMSXML = _aMSXML.length;
				do {
					try {
						return function() {
							return new ActiveXObject(_aMSXML[--_iMSXML]);
						};
					}
					catch (oError) { };
				}
				while (_iMSXML > 0);
				throw new Error("L'objet oXHR n'a pas ete cree");
			}
		})();

		var _setRequest = function(oQuery) {
			var oContext = this;
			var oXHR = _createXHR();
			oXHR.open(oQuery.method, oQuery.url, oQuery.sync && oQuery.sync == 'true' ? false : true);
			var _timer = setTimeout(
				function() {
					if (oXHR) {
						oXHR.abort();
						return oContext.fireEvent('queryAbort', [oContext, oQuery, 'setRequest']);
					}
				},
				(oQuery.abort || _iTempoXHR)
			);
			oXHR.onreadystatechange = function() {
				if (oXHR.readyState == 4) {
					if (oXHR.status && /200|304/.test(oXHR.status)) {
						clearTimeout(_timer);
						var oResponse = oXHR[
							oQuery.response && oQuery.response == 'xml' ?
								'responseXML' :
								'responseText'
						];
						return typeof oResponse !== 'undefined' && (oQuery.method == 'get' ? (oResponse.trim() != '') : true) ?
							oContext.fireEvent('querySuccess', [oResponse, oContext, oQuery, 'setRequest']) :
							oContext.fireEvent('queryFail', [oContext, oQuery, 'setRequest']);
					}
					else {
						return oContext.fireEvent('queryFailed', [oContext, oQuery, 'setRequest']);
					}
				}
			};
			oXHR.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
			if (oQuery.method == 'post') {
				oXHR.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			}
			oQuery.method == 'get' ?
				oXHR.send(null) :
				oXHR.send(oQuery.params);
			return oContext.fireEvent('queryStart', [oContext, oQuery, 'setRequest']);
		};

		F6.extend(
			Ajax, {

				'setRequest': function(oQuery) {
					var _oContext = typeof this !== 'undefined' && this.constructor == Array ?
						this :
						F6.Node.get(document);
					if (typeof oQuery.events === 'object') {
						_oContext.addEvents(oQuery.events);
					}
					var _request = typeof oQuery.interval === 'number' ?
						function() {
							var _interval = setInterval(
								function() {
									return _setRequest.call(_oContext, oQuery);
								},
								oQuery.interval
							);
							if (oQuery.abort && _interval) {
								setTimeout(
									function() {
										clearInterval(_interval);
										return _oContext.fireEvent('queryAbort', [_oContext, oQuery, 'setRequest']);
									},
									oQuery.abort
								);
							}
						} :
						function() {
							_setRequest.call(_oContext, oQuery);
						};
					return oQuery.delay ?
						(oQuery.setTimeout = setTimeout(_request, oQuery.delay)) :
						_request();
				}
			}
		);

		return {
			'Ajax': Ajax
		};

	})()
);

/* FIN DU FRAMEWORK - DEBUT DE LA PARTIE CUSTOM */

/**
* Calculateur d'hydratation
*/

F6.Module.singleton(
	[F6.Node.get, F6.Node.create, F6.Event, F6.Debug], // Tableau de fonctions
	function($, $n, $e, $d) { // Raccourcis correspondants

		// Tableau des quantites
		var _aQtes = [120, 200, 250, 80, 150, 250, 330, 500];

		// Calcul d'une ligne de tableau
		var _calcThisLine = function(e) {

			if(e && !e.nodeName) {
			    $e.stopEvent(e);
			    var _oSrc = $e.getSrc(e);
			}
			else {
			    var _oSrc = $(e);
			}
			var _oTr = _oSrc.getParent('tr');
			_oTr.getLast('td')[0].innerHTML = _oTr.getElements('input').map(
				function(oWrapInput, iWrapInput) {

					var _iValue = isNaN(parseInt(oWrapInput[0].value)) ? 0 : parseInt(oWrapInput[0].value);
					return _iValue * _aQtes[iWrapInput];

				}
			).reduce(
				function(iValue, iValueB) {

					return iValue + iValueB;

				}
			) + 'mL';

		};

		// Calcul de la somme totale
		var _calcSomme = function(e) {
            
			$('fake').setAttr({ 'styles': { 'display': 'none'} });
			if(e) {
    			$e.stopEvent(e);
    	    }
			var _iSomme = $('calculateur').getElements(
				'tr',
				function(oWrapTr) {

					return $(oWrapTr).getParent()[0].nodeName.toLowerCase() == 'tbody';

				}
			).map(
				function(oWrapTr) {

					return parseInt($(oWrapTr).getLast('td')[0].innerHTML);

				}
			).reduce(
				function(iValue, iValue2) {

					return iValue + iValue2;

				}
			);
			var _oResults = $('results');
			var _iStart = window.attachEvent && !document.querySelector ? 255 : 295;
			var _iStop = window.attachEvent && typeof XMLHttpRequest === 'undefined' ? 547 : 587;
			var _sStart = _iStart + 'px';
			if (_oResults && _oResults[0].style.left == _sStart) {
				var _iDateStart = new Date().getTime();
				var _iDateStop = _iDateStart + 250;
				var _anim = setInterval(
					function() {

						var _iCurrentDate = new Date().getTime();
						if (parseInt(_oResults[0].style.left) < _iStop && _iCurrentDate < _iDateStop) {
							_oResults[0].style.left = parseInt(_oResults[0].style.left) + ((_iCurrentDate - _iDateStart) * (_iStop - _iStart) / 250) + 'px';
						}
						else {
							_oResults[0].style.left = _iStop + 'px';
							clearInterval(_anim);
						}

					},
					10
				);
			}
			var _iSucre = parseInt(
				$('calculateur').getLast(
					'tr',
					function(oWrapTr) {

						return $(oWrapTr).getParent()[0].nodeName.toLowerCase() == 'tbody';

					}
				).getLast('td')[0].innerHTML
			);
			$('qBu')[0].innerHTML = _iSomme;
			var _iCurrent = 0;
			if (_iSomme >= 1500) {
				$('reste').removeClass('show');
				_iCurrent = _iSucre < 500 ? 0 : 1;
			}
			else {
				$('reste').addClass('show');
				$('qRest')[0].innerHTML = 1500 - _iSomme;
				_iCurrent = _iSucre < 500 ? 2 : 3;
			}
			$('results').getElements(
				'div',
				function(oDiv) {

					return $(oDiv).getParent('div').hasClass('blockInside');

				}
			).forEach(
				function(oDiv, iDiv) {

					iDiv == _iCurrent ?
						$(oDiv).addClass('show') :
						$(oDiv).removeClass('show');

				}
			);

		};

		// Affectation des gestionnaires d'evenements pour la calcul d'hydratation
		var _calcHydr = function() {

			if (!document.getElementById('calculateur')) {
				return;
			}
			// Les ajouts de gestionnaire d'evenements sont effectues en dur sur les balises car
			// ca ne fonctionne plus a partir d'ici...
		};
		
		$(window).addEvents({'load': _calcHydr});
		
		return {
		    "calcThisLine": _calcThisLine,
		    "calcSomme": _calcSomme
		};

	}
);

	F6.Module.singleton(
	[F6.Node.get, F6.Node.create, F6.Event, F6.Debug, F6.Module], // Tableau de fonctions
	function($, $n, $e, $d, $m) { // Raccourcis correspondants

	    $(document.documentElement).addClass('hasJS');

	    // Objet de variables
	    var oV = {
	        'T': 'tranverse',
	        'CC': 'cocaCola',
	        'CCL': 'cocaColaLight',
	        'CCZ': 'cocaColaZero',
	        'CCCL': 'cocaColaCollection',
	        'CCLF': 'cocaColaLife',
	        'CCG': 'cocaColaGoodies',
	        'SH': 'shopper',
	        'FB': 'flashBackground',
	        'email': 'null',
	        'captcha': 'null',
	        'flashvars': {
	            'lang': 'fr'
	        }
	    };

	    // utilise pour recupererdes objet HTML
	    var oHtmlLink = {};

	    /************
	    comunication to flash

	    to send function to flash :
	    var oFlash = document.getElementById("flashBackground");
	    oFlash.setContentOffsetLeft(myParam);

	    *************/

	    // Detection de Flash
	    var flashDetect = function() {
	        if (swfobject) {
	            return swfobject.getFlashPlayerVersion().major;
	        }
	    };

	    // Communication avec le flash
	    var startAnimation = function(univers, link, target) {
	        if (typeof (target) == "undefined") {
	            target = "_self";
	        }
	        var _oFlash;
	        if (target == "_self" && (_oFlash = document.getElementById(oV.FB))) {
	            document.body.className += ' univers';
	            try {
	                _oFlash.setTransition(univers, link);
	                return;
	            } catch (e) {
	            }
	        }
	        if (target == "_self") {
	            document.location.href = link;
	            return;
	        }
	        window.open(link, target); //, target, null, false);
	    };

	    // Fonction utilise par le Flash
	    var getContentOffsetLeft = function() {
	        var oContent = document.getElementById("content");
	        var myFlash = document.getElementById("flashBackground");
	        if (oContent && myFlash) {
	            myFlash.setContentOffsetLeft(oContent.offsetLeft);
	        }
	    };

	    // pngFixLoader
	    // @function : objet pour permet le lancement des modifications des png via pngFix en decale sur le onload de la page.
	    // cela permet de contourner un bug d'internet explorer qui affiche un message d'erreur si le DOM est modifie pendant le chargement de la page.
	    var pngFixLoader = {
	        useOnload: true, // true : active l'execution du fixPng sur le load, et false, execute le fixPng des qu'il est appele par la CSS
	        functions: [], // toutes les fonctions a executer sur le onload de la page
	        addFunc: function(func) {
	            pngFixLoader.functions.push(func);
	        },
	        launch: function() {
	            pngFixLoader.useOnload = false; //une fois la page chargee, il faut laisser s'executer automatiquement la fonction pour d'autres actions (ex : ouverture layer)
	            var counter = 1;
	            while (pngFixLoader.functions.length > 0) {
	                //setTimeout(pngFixLoader.functions.pop(), 20*counter);
	                pngFixLoader.functions.pop()();
	                counter++;
	            }
	        },
	        init: function() {
	            if (pngFixLoader.useOnload && window.attachEvent && document.all) {
	                window.attachEvent(
						    'onload',
						    function() {
						        setTimeout(pngFixLoader.launch, 10);
						    }
					    );
	            }
	        }
	    };
	    pngFixLoader.init();
	    var pngFix = function(elm, noOverflow) {
	        elm.style.filter = ' ';
	        if (!(document.all && window.print && /MSIE [56]/.test(navigator.userAgent))) {
	            return;
	        }
	        var exec = (function(elm, noOverflow, scale) {
	            return function() {
	                var options = { noOverflow: noOverflow };
	                var repeat = elm.currentStyle.backgroundRepeat.toLowerCase() == 'repeat';
	                elm.style.filter = ' ';
	                // si l'element est un tag img, on va en faire creer une balise qui encadrera cette image et ensuite traiter la balise comme si c'etait un element qui avait une image de fond
	                if (elm.nodeName.match(/^(IMG|INPUT)$/)) {
	                    if (!elm.src.match(/.*\.png$/)) {
	                        return;
	                    }
	                    elm.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod='image', src='" + elm.src + "')";
	                    elm.width = elm.offsetWidth;
	                    elm.height = elm.offsetHeight;
	                    // recuperation de l'url du pixel transparent
	                    var url = elm.currentStyle.backgroundImage.match(/^url\(["'](.*\.gif)["']\)$/); //seulement les .png
	                    elm.src = url[1];
	                    elm.className = elm.className.replace(/pngFix/g, '');
	                }
	                else {
	                    if (elm.currentStyle.backgroundImage == "" || elm.currentStyle.backgroundImage == "url()") {
	                        return;
	                    }
	                    var url = elm.currentStyle.backgroundImage.match(/^url\(["'](.*\.png)["']\)$/); //seulement les .png
	                    if (!url || url.length < 2) {
	                        return;
	                    }
	                    var pngLayer = document.createElement('i'); // on genere un <i> en position:absolute (layer), qui viendra se placer sous le contenu du div qui avait besoin du style.
	                    with (pngLayer.style) {
	                        if (options.noOverflow) {
	                            width = elm.offsetWidth + 'px';
	                            height = elm.offsetHeight + 'px';
	                        }
	                        else {
	                            width = '32000px';
	                            height = '32000px';
	                        }
	                        position = 'absolute';
	                        zIndex = -1;
	                        fontSize = '1%';
	                        filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod='";
	                        filter += options.noOverflow ?
								    'crop' :
								    'image';
	                        filter += "', src='" + url[1] + "')";
	                        background = 'none'; //forcing car parfois il peut arriver qu'on ai une CSS qui vienne rajouter des images / couleurs de fond
	                        // positionnement de l'image en fonction du background-position sur l'element
	                        if (!repeat) {
	                            switch ((elm.currentStyle.backgroundPositionX + '').toLowerCase()) {
	                                case 'left':
	                                    left = 0;
	                                    break;
	                                case 'right':
	                                    right = 0;
	                                    break;
	                                case 'center':
	                                    left = '50%';
	                                    setTimeout(
											    function(pngLayer) {
											        return function() {
											            pngLayer.style.marginLeft = -(pngLayer.offsetWidth / 2) + 'px';
											        }
											    } (pngLayer),
											    50
										    );
	                                    break;
	                                default:
	                                    left = elm.currentStyle.backgroundPositionX;
	                            }
	                            switch ((elm.currentStyle.backgroundPositionY + '').toLowerCase()) {
	                                case 'top':
	                                    top = 0;
	                                    break;
	                                case 'bottom':
	                                    bottom = 0;
	                                    break;
	                                case 'center':
	                                    top = '50%';
	                                    setTimeout(
											    function(pngLayer) {
											        return function() {
											            pngLayer.style.marginTop = -(pngLayer.offsetHeight / 2) + 'px';
											        }
											    } (pngLayer),
											    100
										    );
	                                    break;
	                                default:
	                                    top = elm.currentStyle.backgroundPositionY || 0;
	                            }
	                        }
	                        else {
	                            left = 0; //elm.currentStyle.backgroundPositionX +'';
	                            top = 0; //elm.currentStyle.backgroundPositionY +'';
	                        }
	                    }
	                    // gestion automatique du sizingMethod='scale' ou sizingMethod='image', ne pouvant pas tester le backgroundRepeat correctement, on passe par une methode un peu plus tricky
	                    setTimeout(
							    function(elmN, pngLayerN, repeatN) {
							        return function() {
							            if (!elmN || elmN.parentNode || !pngLayerN || !pngLayerN.parentNode) {
							                return;
							            }
							            if (pngLayerN.filters['DXImageTransform.Microsoft.AlphaImageLoader'].sizingMethod == 'image') {
							                if (pngLayerN.offsetWidth < elmN.offsetWidth && repeatN) {
							                    pngLayerN.filters['DXImageTransform.Microsoft.AlphaImageLoader'].sizingMethod = 'scale';
							                }
							                else if (
											    pngLayerN.offsetWidth > elmN.offsetWidth &&
											    elm.currentStyle.backgroundPositionX.match(/^(left|0%|0px|0)$/) ||
											    elm.currentStyle.backgroundPositionY.match(/^(top|0%|0px|0)$/)
										    ) {
							                    pngLayerN.filters['DXImageTransform.Microsoft.AlphaImageLoader'].sizingMethod = 'crop';
							                }
							            }
							            else {
							                pngLayerN.sizingMethod = 'image';
							            }
							            if (elm.currentStyle.width.match(/^(0|[12](%|px)?)$/)) {
							                pngLayerN.filters['DXImageTransform.Microsoft.AlphaImageLoader'].sizingMethod = 'image';
							            }
							            if (pngLayerN.style.right != 'auto' && pngLayerN.style.right != '') {
							                setTimeout(
											    function() {
											        pngLayerN.style.right = parseInt(pngLayerN.style.right) - (elm.offsetWidth % 2 ? 1 : 0) + 'px';
											    },
											    50
										    )
							            }
							        };
							    } (elm, pngLayer, repeat),
							    200
						    );
	                    with (elm.style) {
	                        position = elm.currentStyle.position == "static" || elm.currentStyle.position == "" ?
								    'relative' :
								    position;
	                        if (elm.currentStyle.overflow != 'auto' && elm.currentStyle.overflow != 'hidden') {
	                            overflow = options.noOverflow ?
									    'visible' :
									    (
										    elm.currentStyle.width.match(/^(0|[12](%|px)?)$/) ?
											    'visible' :
											    'hidden'
									    );
	                        }
	                        backgroundImage = 'none';
	                    }
	                    elm.appendChild(pngLayer);
	                }
	            }
	        })(elm, noOverflow);
	        try {
	            pngFixLoader.useOnload ? pngFixLoader.addFunc(exec) : exec();
	        } catch (e) { };
	    };

	    // Function Delay de SWF pour IE6 Debug
	    // Cette fonction permet d'afficher les flash sous IE 6 en appliquant des timeout au swfobject
	    var delaySWF = function(url, target, width, height, version, expressInstall, flashvars, params, attributes, delayMS) {
	        setTimeout(
				    function() {
				        swfobject.embedSWF(url, target, width, height, version, expressInstall, flashvars, params, attributes);
				    },
				    delayMS
			    );
	    };

	    var toggleForm = function(sIdForm) {
	        if (typeof sIdForm !== 'string') {
	            return F6.Event.fireEvent('sIdFormIsNotAString');
	        }
	        if (!document.getElementById(sIdForm)) {
	            return F6.Event.fireEvent('oIdFormIsNotExist');
	        }
	        return $(sIdForm).toggleClass('formVisible').fireEvent('formToggled');
	    };

	    var displayForm = function(sAction, sIdForm) {
	        $d.trace("-- displayForm --");
	        var oFormSwitch = document.getElementById("switchFlashPage");
	        $('content').getElements(
				    'input',
				    function(oInput) {
				        return oInput.type == 'text';
				    }
			    ).forEach(
				    function(oInput) {
				        $(oInput).setAttr({ 'value': '' });
				    }
			    );
	        if (sAction == "hide") {
	            $d.trace("sAction : " + sAction);
	            $d.trace("trace step : hidding form");
	            return oFormSwitch.className = "step";
	        }
	        else {
	            $d.trace("sAction : " + sAction);
	            $d.trace("sIdForm : " + sIdForm);
	            switch (sIdForm) {
	                case 'inscriptionForm':
	                    $d.trace("trace step2 : show inscriptionForm");
	                    return oFormSwitch.className = "step2";
	                case 'addTipForm':
	                    $d.trace("trace step1 : show addTipForm");
	                    // send ->>
	                    return oFormSwitch.className = "step1";
	                case 'fullForm':
	                    $d.trace("trace step3 : show fullForm");
	                    return oFormSwitch.className = "step3";
	            }
	        }
	    };

	    var trackPopIn = function(iTrack) {
	        //document.getElementById("bluestreak_" + iTrack).innerHTML = "<img src='http://s0b.bluestreak.com/ix.e?bb&amp;t=" + iTrack + "' alt='' />";
	        bsk_img = new Image();
	        bsk_img.id = 'bskImg';
	        bsk_img.src = "http://s0b.bluestreak.com/ix.e?bb&t=" + iTrack;
	        $("bluestreak_" + iTrack).adopt($(bsk_img)).trace();
	        setTimeout(function() {
	            $("bluestreak_" + iTrack)[0].innerHTML = "";
	        }, 500);
	    };

	    /* generique fw f6 */
	    var ifrlayer = {
	        ie: document.all && window.print && !window.opera && document.getElementById,
	        $: function(obj) {
	            if (!obj) return null;
	            return (typeof (obj) == "string") ? document.getElementById(obj) : obj;
	        },
	        make: function(obj) {
	            obj = this.$(obj);
	            if (!obj) return;
	            if (this.ie) {
	                if (!obj.iframelayer) {
	                    var ifr = document.createElement('iframe');
	                    ifr.src = "javascript:false";
	                    obj.parentNode.insertBefore(ifr, obj);
	                    obj.iframelayer = ifr;
	                }
	                var ifr = obj.iframelayer;
	                if (obj.currentStyle.zIndex != "" && parseInt(obj.currentStyle.zIndex) > 1) {
	                    ifr.style.zIndex = parseInt(obj.currentStyle.zIndex) - 1;
	                }
	                with (ifr.style) {
	                    filter = "mask()";
	                    position = "absolute";
	                }
	                obj.iframelayer.style.visibility = "visible";
	                ifrlayer.move(obj, true);
	            }
	        },
	        hide: function(obj) {
	            obj = this.$(obj);
	            if (!obj) return;
	            if (obj.iframelayer) {
	                obj.iframelayer.style.visibility = "hidden";
	            }
	        },
	        kill: function(obj) {
	            obj = this.$(obj);
	            if (!obj) return;
	            if (obj.iframelayer) {
	                obj.iframelayer.parentNode.removeChild(obj.iframelayer);
	                obj.iframelayer = null;
	            }
	        },
	        move: function(obj, size) {
	            obj = this.$(obj);
	            if (obj && obj.iframelayer) {
	                with (obj.iframelayer.style) {
	                    top = obj.offsetTop + "px";
	                    left = obj.offsetLeft + "px";
	                    if (size) {
	                        width = obj.offsetWidth + "px";
	                        height = obj.offsetHeight + "px";
	                    }
	                }
	            }
	        }
	    };

	    /* Slider Simple en fin de quizz */
	    var oSlider = {
	        init: function(container, ref) {
	            var containerEl = document.getElementById(container);
	            var elRef = document.getElementById(ref);

	            if (!elRef || !containerEl) return false;
	            containerEl.style.marginLeft = -elRef.scrollWidth + "px";
	        }
	    };

	    /* Slider Anime en fin de quizz */
	    var oSliderAnimated = {
	        init: function(container, ref) {
	            var containerEl = document.getElementById(container);
	            var elRef = document.getElementById(ref);

	            if (!elRef || !containerEl) return false;

	            this.ctn = containerEl;
	            this.conf = {};
	            this.conf.startVal = this.ctn.scrollLeft;
	            this.conf.startTime = new Date().getTime();
	            this.conf.endVal = elRef.scrollWidth;
	            this.conf.step = (this.conf.endVal - this.conf.startVal) / 300;

	            this.doSlide();
	        },
	        doSlide: function() {
	            this.TO = setInterval(
				    function(obj) {
				        return function() {
				            var currentTime = new Date().getTime();
				            obj.ctn.scrollLeft = obj.conf.startVal + (currentTime - obj.conf.startTime) * obj.conf.step;

				            $d.trace(obj.ctn.scrollLeft, obj.conf.endVal);

				            if (currentTime >= obj.conf.startTime + 300) {
				                clearInterval(obj.TO);
				                obj.TO = null;
				                obj.ctn.scrollLeft = obj.conf.endVal;
				                $d.trace("Over");
				                $d.trace(obj.ctn.scrollLeft, obj.conf.endVal);
				            }
				        }
				    } (this)
			    , 30);
	        }
	    };

	    // GESTION DE LA SOUS-NAVIGATION
	    var _loadSsNav = function() {
	        // Initialisation de la largeur totale des elements de liste
	        var _iWidth = 0;
	        // Liste des liens
	        var _oUl = $('products').getElements(
				    'ul',
				    function(oUl) {
				        return $(oUl).hasClass('listing');
				    }
			    );
	        if (typeof _oUl[0][0] == 'undefined' || _oUl[0][0].nodeName.toUpperCase() != 'UL') { return false; }
	        var _iAffich = 0;
	        // Calcul de la largeur totale des elements de liste et affichage/masquage de ceux-ci selon le cas
	        $('products').getElements(
				    'li',
				    function(oLi) {
				        return $(oLi).getParent().hasClass('listing');
				    }
			    ).forEach(
				    function(oLi) {
				        if (oLi[0]) {
				            _iWidth += oLi[0].scrollWidth + 10;
				            if (_iWidth < 580) { // On fonctionne a l'envers (elements de liste invisibles sans js) vu que la priorite pour coca est l'esthetique et non l'accessibilite
				                $(oLi).removeClass('hideItems').setAttr({
				                    'styles': {
				                        'opacity': '1',
				                        'filter': null
				                    }
				                });
				            }
				            else {
				                _iAffich++;
				            }
				        }
				    }
			    );
	        // Initialisation de la largeur et du positionnement de la liste
	        if (_iWidth < 580) {
	            _oUl.setAttr({
	                'styles': {
	                    'left': 580 - _iWidth - _iWidth / 2 + 'px',
	                    'width': _iWidth + 'px',
	                    'margin': 'auto'
	                }
	            });
	        }
	        else { // Si la largeur max est depassee, on prend le second mode de positionnement de la liste et on affiche la fleche droite
	            _oUl.setAttr({
	                'styles': {
	                    'position': 'absolute',
	                    'left': '0' + 'px',
	                    'width': _iWidth + 'px'
	                }
	            });
	            $('products').getElements(
					    'a',
					    function(oA) {
					        return $(oA).getParent().hasClass('goaft');
					    }
				    ).setAttr({
				        'styles': {
				            'visibility': 'visible'
				        }
				    });
	        }
	        // Initialisation de la position du premier element de liste visible
	        var _iPosition = 0;
	        var _iFinalPosition = 0;
	        // Gestionnaire d'evenement au clic sur la bouton "precedent"
	        var _goBefore = function(e) {
	            $e.stopEvent(e);
	            _iPosition--;
	            // Si on a atteint la debut de la liste, on sort
	            if (_iPosition < 0) {
	                return;
	            }
	            // On definit un temps initial
	            var _iTime0 = new Date().getTime();
	            // On calcule la position finale
	            _iFinalPosition += $('products').getElements(
					    'li',
					    function(oLi) {
					        return $(oLi).getParent().hasClass('listing');
					    }
				    )[_iPosition][0].scrollWidth;
	            // On definit l'opacite finale
	            var _iFinalOpacity = 1;
	            // On definit un booleen indiquant si un item a ete rendu visible
	            var _bShow = false;
	            var _animation = setInterval(
					    function() {
					        var _iTime1 = new Date().getTime() - _iTime0;
					        if (_iTime1 > 1500 || Math.abs(parseInt(_oUl[0][0].style.left)) <= Math.abs(_iFinalPosition)) {
					            _oUl[0][0].style.left = parseInt(_iFinalPosition) + 'px';
					            clearInterval(_animation);
					            if (_iPosition == 0) {
					                $('products').getElements(
									    'a',
									    function(oA) {
									        return $(oA).getParent().hasClass('gobef');
									    }
								    ).setAttr({
								        'styles': {
								            'visibility': 'hidden'
								        }
								    });
					            }
					            else {
					                $('products').getElements(
									    'a',
									    function(oA) {
									        return $(oA).getParent().hasClass('goaft');
									    }
								    ).setAttr({
								        'styles': {
								            'visibility': 'visible'
								        }
								    });
					            }
					            var _oProducts = document.getElementById('products');
					            var _aLis = _oProducts.getElementsByTagName('li');
					            var _aFiltersLis = [];
					            var _iLi = 0;
					            for (var _iLis = _aLis.length; _iLi < _iLis; _iLi++) {
					                if (_aLis[_iLi].parentNode.className == 'listing') {
					                    _aFiltersLis.push(_aLis[_iLi]);
					                }
					            }
					            _iLi = _aFiltersLis.length;
					            while (--_iLi > 0) {
					                if (!$(_aFiltersLis[_iLi]).hasClass('hideItems')) {
					                    _aFiltersLis[_iLi].className = 'hideItems';
					                    _aFiltersLis[_iLi].style.opacity = 0;
					                    _aFiltersLis[_iLi].style.filter = 'alpha(opacity=0)';
					                    break;
					                }
					            }
					        }
					        else {
					            _oUl[0][0].style.left = parseInt(_oUl[0][0].style.left) - (parseInt(_oUl[0][0].style.left) - parseInt(_iTime1 * _iFinalPosition / 1500)) + 'px';
					        }
					    },
					    5
				    );
	        };
	        // Affectation du gestionnaire d'evenement au clic sur le bouton precedent
	        $('products').getElements(
				    'a',
				    function(oA) {
				        return $(oA).getParent().hasClass('gobef');
				    }
			    ).addEvents({
			        'click': _goBefore
			    });
	        // Gestionnaire d'evenement au clic sur le bouton "suivant"
	        var _goAfter = function(e) {
	            $e.stopEvent(e);
	            // Si on a atteint la fin de la liste, on sort
	            if (
					    _iPosition == $('products').getElements(
						    'li',
						    function(oLi) {
						        return $(oLi).getParent().hasClass('listing');
						    }
					    ).length - 1
				    ) {
	                return;
	            }
	            // On definit un temps initial
	            var _iTime0 = new Date().getTime();
	            // On calcule la position finale
	            var oFirstLi = $('products').getElements(
					    'li',
					    function(oLi) {
					        return $(oLi).getParent().hasClass('listing');
					    }
				    )[_iPosition][0];

	            _iFinalPosition -= oFirstLi.scrollWidth;
	            // On definit l'opacite finale
	            var _iFinalOpacity = 1;
	            // On definit un booleen indiquant si un item a ete rendu visible
	            var _bShow = false;
	            var _oProducts = document.getElementById('products');
	            var _aLis = _oProducts.getElementsByTagName('li');
	            var _oFilterLi = null;
	            for (var _iLi = 0, _iLis = _aLis.length; _iLi < _iLis; _iLi++) {
	                if (_aLis[_iLi].parentNode.className == 'listing') {
	                    if (_aLis[_iLi].className == 'hideItems' && !_oFilterLi && _iLi > _iPosition) {
	                        _oFilterLi = _aLis[_iLi];
	                    }
	                }
	            }
	            // On lance l'animation
	            var _animation = setInterval(
					    function() {
					        var _iTime1 = new Date().getTime() - _iTime0;
					        if (_iTime1 > 1500 || parseInt(_oUl[0][0].style.left) < _iFinalPosition) {
					            _oUl[0][0].style.left = parseInt(_iFinalPosition) + 'px';
					            clearInterval(_animation);
					            _iPosition++;
					            if (_iPosition != 0) {
					                $('products').getElements(
									    'a',
									    function(oA) {
									        return $(oA).getParent().hasClass('gobef');
									    }
								    ).setAttr({
								        'styles': {
								            'visibility': 'visible'
								        }
								    });
					            }
					            if (_oFilterLi) {
					                _oFilterLi.className = '';
					                _oFilterLi.style.opacity = 1;
					                _oFilterLi.style.filter = null;
					            }
					            if (_iPosition == _iAffich) {
					                $('products').getElements(
									    'a',
									    function(oA) {
									        return $(oA).getParent().hasClass('goaft');
									    }
								    ).setAttr({
								        'styles': {
								            'visibility': 'hidden'
								        }
								    });
					            }

					            var tryFirstLi = false;
					            var iLi = 0;
					            $('products').getElements('li', function(oLi) {
					                if (tryFirstLi) {
					                    return $(oLi).getParent().hasClass('listing') && oLi.style.opacity == 1;
					                }
					                if (oLi == oFirstLi) {
					                    tryFirstLi = true;
					                }
					            }).forEach(function(aElm) {
					                iLi = iLi + aElm[0].scrollWidth;
					            });
					            if (iLi > 580) {
					                var iDiff = iLi - 580;
					                _oUl[0][0].style.left = (parseInt(_oUl[0][0].style.left) - iDiff) + 'px';
					            }
					        }
					        else {
					            if (_oFilterLi) {
					                _oFilterLi.className = '';
					                _oFilterLi.style.opacity = _iTime1 / 1500;
					                _oFilterLi.style.filter = 'alpha(opacity=' + parseInt((_iTime1 * 100) / 1500) + ')';
					            }
					            _oUl[0][0].style.left = parseInt(_oUl[0][0].style.left) + parseInt(_iTime1 * _iFinalPosition / 1500) + 'px';
					        }
					    },
					    5
				    );
	        };
	        // Affectation du gestionnaire d'evenement au clic sur le bouton "suivant"
	        $('products').getElements(
				    'a',
				    function(oA) {
				        return $(oA).getParent().hasClass('goaft');
				    }
			    ).addEvents({
			        'click': _goAfter
			    });
	    };

	    var _verifMail = function(oInput) {
	        return /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,6}$/i.test(oInput.value);
	    };

	    var _verifNum = function(oInput) {
	        return /^[0-9]*$/.test(oInput.value);
	    };

	    var _verifNum2 = function(oInput) {
	        return /^[0-9]{2}$/.test(oInput.value);
	    };

	    var _verifNum4 = function(oInput) {
	        return /^[0-9]{4}$/.test(oInput.value);
	    };

	    var _verifNum5 = function(oInput) {
	        return /^[0-9]{5}$/.test(oInput.value);
	    };

	    var _verifPhone = function(oInput) {
	        return /^\+?(\d{2}[ .-]?){5,}$/i.test(oInput.value);
	    };

	    var _verifChecked = function(oInput) {
	        return oInput.checked;
	    };

	    var _verifForm = function() {
	        var gotError = false;
	        $('aspnetForm').getElements('input').forEach(
				    function(oInput) {
				        while (oInput.constructor == Array) {
				            oInput = oInput[0];
				        }
				        if ($(oInput).hasClass('required') && oInput.value.trim() == '') {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (oInput.value.trim() != '') {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('iemail') && !_verifMail(oInput)) {
				            openPopIn('IG_No_Email');
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifMail(oInput)) {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('iphone') && !_verifPhone(oInput)) {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifPhone(oInput)) {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('ichecked') && !_verifChecked(oInput)) {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifChecked(oInput)) {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('inumber2') && !_verifNum2(oInput)) {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifNum2(oInput)) {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('inumber4') && !_verifNum4(oInput)) {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifNum4(oInput)) {
				            $(oInput).removeClass('error');
				        }
				        if ($(oInput).hasClass('ipostCode') && !_verifNum5(oInput)) {
				            $(oInput).addClass('error');
				            gotError = true;
				        }
				        else if (_verifNum5(oInput)) {
				            $(oInput).removeClass('error');
				        }
				    }
			    );
	        return gotError;
	    };

	    /* addFormActions */

	    /* Add maxlength on textareas */
	    function maxLengthOntextarea() {
	        var container = document.body;
	        var textareas = container.getElementsByTagName("textarea");
	        for (var i = 0; i < textareas.length; i++) {
	            var x = textareas[i];
	            if (x.getAttribute("maxlength")) {
	                addEvent(x, "keyup", checkMaxlength);
	                addEvent(x, "keydown", checkMaxlength);
	                addEvent(x, "blur", checkMaxlength);
	            }
	        }
	    }
	    function checkMaxlength(e) {
	        var maxL = parseInt(this.getAttribute("maxlength"));
	        if (this.value.length > maxL) {
	            this.value = this.value.substr(0, maxL);
	            this.scrollTop = this.scrollHeight;
	        }
	    }
	    /* /maxlength */

	    function _formInput(inputId, attributes) {
	        var inp = document.getElementById(inputId);
	        if (!inp) return;
	        for (var i in attributes) {
	            inp.setAttribute(i, attributes[i]);
	        }
	    }

	    /**
	    * gestion de l'affichage des buttons push
	    */
	    var _btnPush = function() {

	        $('site').getElements(
	            'div',
	            function(oNode) {

	                return oNode.className == 'btnPush' || oNode.className == 'blockContent';

	            }
	        ).forEach(
	            function(oDiv) {

	                if (oDiv && oDiv.hasClass && oDiv.hasClass('btnPush')) {
	                    var _oDiv = oDiv[0];
	                    var _oParent = _oDiv.parentNode;

	                    // L'ajout de gestionnaires d'evenement ne fonctionne pas a partir d'ici
	                    // Va savoir pourquoi... :\
	                    // On passe donc par les fonctions OnOverPush et OnOutPush

	                    _oDiv.style.display = 'none';
	                    _oParent.style.cursor = "pointer";
	                }
	                else {
	                    if (oDiv && oDiv.getElements) {
	                        oDiv.getElements(
	                            'a',
	                            function(oNode) {

	                                return /\bfullFootLink\b/.test(oNode.className) && oNode.onclick;

	                            }
	                        ).forEach(
	                            function(oNode) {

	                                return ifrlayer.make(oNode[0]);

	                            }
	                        );
	                    }
	                }

	            }
	        );

	    };

	    var _ensurePopinSize = function() {
	        var aDivs = $('site').getElements('div', function(oEl) {
	            return $(oEl).hasClass('blockPopIn');
	        });

	        aDivs.forEach(function(oDiv, iDiv) {
	            var fnBloc = (function(o) {
	                return function() {
	                    if (!o || !o[0]) return;
	                    var obj = o[0].firstChild;
	                    if (!obj) return;
	                    while (obj.nodeType != 1) {
	                        obj = obj.nextSibling;
	                    }
	                    obj.style.display = 'block';
	                }
	            })(oDiv);
	            setTimeout(fnBloc, (10 * iDiv));
	        })
	    }

	    var _validQuizz = function() {
	        var _oQuizz = $('quizzOptf09');
	        if (_oQuizz[0].id) {
	            $('submitQuizzOptf09').addEvents({
	                'click': function(e) {
	                    $e.stopEvent(e);
	                    if (_oQuizz.getElements('input', function(oInput) {
	                        $d.trace(oInput);
	                        return oInput.value == 'click';
	                    }).every(function(oInput) {
	                        $d.trace(oInput[0]);
	                        return oInput[0].checked;
	                    })) {
	                        $d.trace('if');
	                        $e.fireEvent('goodResponses');
	                    }
	                    else if (_oQuizz.getElements('input', function(oInput) {
	                        $d.trace(oInput);
	                        return oInput.name == 'optf09Quizz01' || oInput.name == 'optf09Quizz02';
	                    }).every(function(oInput) {
	                        $d.trace(oInput[0]);
	                        return !oInput[0].checked;
	                    })) {
	                        $e.fireEvent('emptyOptf09GameForm');
	                    }
	                    else {
	                        $e.fireEvent('badResponses');
	                    }
	                }
	            });
	        }
	    };

	    /*

	    methode pour faire un scroll anime

	    * le deplacement est encore fixe, prevoir un cas non fixe
	    * prevoir via la class updown leftright le deplacement du scrollLeft ou scrollTop

	    */
	    var scrollBlock =
	    {
	        object:
		    {
		        'Prev': null,
		        'Next': null,
		        'scroller': null,
		        'ok': null
		    },
	        init: function(aObj) {
	            $d.trace('scroll block init');
	            if (aObj[0]) {
	                var iKill = 1;
	                var iTem = 0;
	                for (var i = 0; i < aObj.length; i++) {
	                    //					$d.trace('et de ', i+1);
	                    var aoTags = aObj[i].getElementsByTagName('*');
	                    for (var ii = 0; ii < aoTags.length; ii++) {
	                        //						$d.trace('ii ', ii);
	                        var aoXTags = $(aoTags[ii]);
	                        if (aoXTags.hasClass('prev')) {
	                            scrollBlock.object.Prev = aoXTags;
	                            iTem++;
	                        }
	                        if (aoXTags.hasClass('next')) {
	                            scrollBlock.object.Next = aoXTags;
	                            iTem++;
	                        }
	                        if (aoXTags.hasClass('scroller')) {
	                            scrollBlock.object.scroller = aoXTags;
	                            iTem++;
	                        }
	                        if (iTem == 3) {
	                            ii = ii + scrollBlock.object.scroller[0].getElementsByTagName('*').length; // on jump plus loin, optim perf
	                            iTem = 0; // on refait un tour des items
	                            iKill++; // on incremente le kill cf dessous
	                            scrollBlock.addEvent(scrollBlock.object.Prev, 'prev', scrollBlock.object.scroller[0]);
	                            scrollBlock.addEvent(scrollBlock.object.Next, 'next', scrollBlock.object.scroller[0]);
	                        }
	                        // si on a fait autant de tour que d'element dans le tableau alors on sort de la boucle
	                        if (iKill > (aObj.length)) {
	                            //							$d.trace('iKill ', iKill);
	                            //							$d.trace('aObj.length ', aObj.length);
	                            ii = 10000;
	                            i = 10000;
	                        }
	                    }
	                }
	            }
	        },
	        addEvent: function(aoXTags, sens, oScroller) {
	            aoXTags.addEvents(
			    {
			        'click': function(oScroller) {
			            return function() {
			                scrollBlock.move(sens, oScroller);
			            }
			        } (oScroller)
			    });
	        },
	        move: function(sens, oScroller) {
	            $d.trace("anim goes to " + sens);

	            if (scrollBlock.move.runing == true) { return; } // si on tourne deja, on kill
	            scrollBlock.move.runing = true; // on demarre

	            oToMove = oScroller;
	            $d.trace(oToMove);
	            if (!oToMove) { return false; }
	            oItemValToMove = oToMove.getElementsByTagName('*')[0];
	            if (!oItemValToMove) { return false; }
	            if (sens == 'prev') {
	                iMove = oToMove.scrollTop - oToMove.getElementsByTagName('*')[0].offsetHeight;
	            }
	            if (sens == 'next') {
	                iMove = oToMove.scrollTop + oToMove.getElementsByTagName('*')[0].offsetHeight;
	            }
	            /*
	            scrollBlock.object.scroller[0].scrollTop = scrollBlock.object.scroller[0].scrollTop + iMove;
	            scrollBlock.move.runing = false;
	            */
	            scrollBlock.move.conf = {};
	            scrollBlock.move.conf.startVal = oToMove.scrollTop;
	            scrollBlock.move.conf.startTime = new Date().getTime();
	            scrollBlock.move.conf.endVal = iMove;
	            scrollBlock.move.conf.step = (scrollBlock.move.conf.endVal - scrollBlock.move.conf.startVal) / 300;
	            $d.trace('startval ', scrollBlock.move.conf.endVal);
	            $d.trace('endval ', scrollBlock.move.conf.startVal);

	            scrollBlock.move.interval = setInterval(
		            function() {
		                return function() {
		                    var currentTime = new Date().getTime();
		                    oToMove.scrollTop = scrollBlock.move.conf.startVal + (currentTime - scrollBlock.move.conf.startTime) * scrollBlock.move.conf.step;
		                    // 						$d.trace(scrollBlock.move.conf.step);
		                    // 						$d.trace(currentTime);
		                    // 						$d.trace(scrollBlock.move.conf.startTime);
		                    if (currentTime >= scrollBlock.move.conf.startTime + 300) {
		                        clearInterval(scrollBlock.move.interval);
		                        scrollBlock.move.runing = false;
		                        oToMove.scrollTop = scrollBlock.move.conf.endVal;
		                        $d.trace("anim scroll is over");
		                    }
		                }
		            } (this)
			    , 30);

	        }
	    };

	    /*  addHover :
	    Cette fonction ajoute le fonctionnement de la pseudo classe hover en CSS, et seulement pour IE
	    Elle se base sur les evenement propres a IE qui sont les evenements qui ont le comportement le plus proche du :hover en CSS.
	    Pour utiliser cette fonction il faut le faire en CSS, on peut en plus ajouter en parametre la classe CSS qui sera ajoutee en CSS
	    ex :
	    #menu ul li {behavior:expression(addHover(this))}
	    #menu ul li {behavior:expression(addHover(this, "maclassehover"))}
	    */
	    var addHover = function(elm, className) {
	        elm.style.behavior = " ";
	        if (F6.Browser == "IE6") {
	            return elm;
	        }
	        className = className || "hover";
	        elm.hoverClassName = className;
	        elm.onmouseenter = function() {
	            this.className += ' ' + this.hoverClassName;
	        }
	        elm.onmouseleave = function() {
	            this.className = this.className.replace(new RegExp("\\b" + this.hoverClassName + "\\b", "g"), "");
	        }
	    };

	    var game = {
	        Start: function(gameName) { return Play(gameName); } // Bifurcation vers nouveau code des jeux
	    };

	    var _setLinkToBottom = function() {
	        $(document).getElements(
                'p',
                function(oEl) {
                    return $(oEl).hasClass('toBottom');
                }
            ).forEach(
                function(oEl, iEl) {
                    if (oEl && oEl.getParent) {
                        var _oText = oEl.getParent();
                        var _oMedia = _oText.getParent().getFirst('p');
                        if (_oText.hasClass('text') && _oText[0].scrollHeight < _oMedia[0].scrollHeight) {
                            //_oEl[0].style.paddingTop = _oMedia.scrollHeight - _oText.scrollHeight + 'px';
                            //_oEl always undefined... oEl[0] probably awaited ?.
                            if (oEl[0]) oEl[0].style.paddingTop = _oMedia.scrollHeight - _oText.scrollHeight + 'px';
                        }
                    }
                }
            );
	    };

	    $(window).addEvents({
	        'load': function() {
	            setTimeout(_ensurePopinSize, 300);
	            _loadSsNav(); //a mettre en dernier car return false semble couper les fonctions apres
	            _btnPush();
	            _validQuizz();
	            _setLinkToBottom();
	        }
	    });

	    return {
	        'univers': oV,
	        'oHtmlLink': oHtmlLink,
	        'delaySWF': delaySWF,
	        'startAnimation': startAnimation,
	        'pngFix': pngFix,
	        'toggleForm': toggleForm,
	        'displayForm': displayForm,
	        'getContentOffsetLeft': getContentOffsetLeft,
	        'ifrLayer': ifrlayer,
	        'trackPopIn': trackPopIn,
	        'vf': _verifForm,
	        'formInput': _formInput,
	        'slider': oSlider,
	        'scrollBlock': scrollBlock,
	        'addHover': addHover,
	        'game': game
	    };
	}
);

/**
* TMP fnctn JS hz chngd waiting flash change also
* FLASH COMMUNICATION
*/
function getContentOffsetLeft() {
	F6.Module.getContentOffsetLeft()
};
function displayForm(sIdForm, sAction) {
	F6.Module.displayForm(sIdForm, sAction);
};

function OnOverPush(oNode) {
    var _oCont = oNode.parentNode.parentNode;
    var _aDivs = _oCont.getElementsByTagName('div');
    var _iDiv = _aDivs.length;
    while(--_iDiv >= 0) {
        if(/\bbtnPush\b/.test(_aDivs[_iDiv].className)) {
            _aDivs[_iDiv].style.display = 'block';
            return _aDivs[_iDiv].style.zoom = 1;
        }
    }
}
function OnOutPush(oNode) {
    var _oCont = oNode.parentNode.parentNode;
    var _aDivs = _oCont.getElementsByTagName('div');
    var _iDiv = _aDivs.length;
    while(--_iDiv >= 0) {
        if(/\bbtnPush\b/.test(_aDivs[_iDiv].className)) {
            _aDivs[_iDiv].style.display = 'none';
            return _aDivs[_iDiv].style.zoom = 0;
        }
    }
}
