/* BIBLIOTHEQUE */
(function() {

/** *********************************************************************************************************
     SELECTEURS
     EXEMPLES :
	var oEl = $.get('test');                                                                                         // retourne l'objet ayant l'id 'test'
	var oEl2 = $.get(oEl);                                                                                          // retourne oEl
	var aEls = $.get(oEl, 'a');                                                                                    // retourne tous les liens de oEl
	var aEls2 = $.get('test', 'a');                                                                              // retourne tous les liens du conteneur ayant pour id 'test'
	var oEl3 = $.get(oEl, 'a')[0];                                                                              // retourne le premier lien de oEl
	var aEls = $.getElements(oCont);                                                                       // retourne un tableau de tous les elements de oCont ou l'element contenu dans oCont s'il n'y en a qu'un
	var aEls = $.getElements(oCont, {'className': 'maClasse', 'id': 'monId'});        // retourne un tableau de tous les elements de oCont ayant la classe 'maClasse' et
	                                                                                                                              l'id 'monId'ou l'element contenu dans oCont et ayant ces proprietes s'il n'y en a qu'un
	var aEls = $.getFirst(oCont);                                                                              // retourne le premier element contenu dans oCont
	var aEls = $.getFirst(oCont, {'className': 'maClasse', 'id': 'monId'});               // retourne le premier element contenu dans oCont ayant la classe 'maClasse' et l'id 'monId'
																     (fonctionnement similaire pour les methodes $.getLast, $.getPrevious, $.getNext et $.getParent)
*/

var $ = {
	get: function() {
		var aArgs = arguments;
		if(aArgs.length > 1 && typeof aArgs[1] == 'string') {
			return typeof aArgs[0] == 'string' ?
				document.getElementById(aArgs[0]).getElementsByTagName(aArgs[1]):
				aArgs[0].getElementsByTagName(aArgs[1]);
		}
		else switch(typeof aArgs[0]) {
			case 'string':
				return document.getElementById(aArgs[0]);
			case 'object':
				return aArgs[0];
		}
		return false;
	},
	getElements: function(oCont, oProp) {
		var sTag = oProp['tag'] || '*', aEls = oCont.getElementsByTagName(sTag), iEl = aEls.length, aResults = [];
		getElements: while(iEl-- > 0) {
			if(oProp) for(var sProp in oProp) {
				if(sProp == 'tag') continue;
				try {
					if(!aEls[iEl][sProp] || sProp == 'className' ? !$c.has(aEls[iEl], oProp[sProp]) : (aEls[iEl][sProp] != oProp[sProp])) continue getElements;
				}
				catch(e) {
					try {
						if(!(aEls[iEl].getAttribute(sProp)) || aEls[iEl].getAttribute(sProp) != oProp[sProp]) continue getElements;
					}
					catch(e) {
						return false;
					}
				}
			}
			aResults.push(aEls[iEl]);
		}
		return aResults.length > 1 ? aResults : aResults[0];
	},
	getFirst: function(oCont, oProp) {
		if(!oCont.hasChildNodes()) return false;
		var oEl = oCont.firstChild;
		while(oEl && oEl.nodeType != 1) oEl = oEl.nextSibling;
		if(oProp) for(var sProp in oProp) {
			try {
				if(!oEl[sProp] || sProp == 'className' ? !$c.has(oEl, oProp[sProp]) : (oEl[sProp] != oProp[sProp])) return $.getNext(oEl, oProp);
			}
			catch(e) {
				try {
					if(!(oEl.getAttribute(sProp)) || oEl.getAttribute(sProp) != oProp[sProp]) return $.getNext(oEl, oProp);
				}
				catch(e) {
					return false;
				}
			}
		}
		return oEl || false;
	},
	getLast: function(oCont, oProp) {
		if(!oCont.hasChildNodes()) return false;
		var oEl = oCont.lastChild;
		while(oEl && oEl.nodeType != 1) oEl = oEl.previousSibling;
		if(oProp) for(var sProp in oProp) {
			try {
				if(!oEl[sProp] || sProp == 'className' ? !$c.has(oEl, oProp[sProp]) : (oEl[sProp] != oProp[sProp])) return $.getPrevious(oEl, oProp);
			}
			catch(e) {
				try {
					if(!(oEl.getAttribute(sProp)) || oEl.getAttribute(sProp) != oProp[sProp]) return $.getPrevious(oEl, oProp);
				}
				catch(e) {
					return false;
				}
			}
		}
		return oEl || false;
	},
	getPrevious: function(oEl, oProp) {
		while((oEl = oEl.previousSibling) && oEl.nodeType != 1);
		if(oProp) for(var sProp in oProp) {
			try {
				if(!oEl[sProp] || sProp == 'className' ? !$c.has(oEl, oProp[sProp]) : (oEl[sProp] != oProp[sProp])) return $.getPrevious(oEl, oProp);
			}
			catch(e) {
				try {
					if(!(oEl.getAttribute(sProp)) || oEl.getAttribute(sProp) != oProp[sProp]) return $.getPrevious(oEl, oProp);
				}
				catch(e) {
					return false;
				}
			}
		}
		return oEl || false;
	},
	getNext: function(oEl, oProp) {
		while((oEl = oEl.nextSibling) && oEl.nodeType != 1);
		if(oProp) for(var sProp in oProp) {
			try {
				if(!oEl[sProp] || sProp == 'className' ? !$c.has(oEl, oProp[sProp]) : (oEl[sProp] != oProp[sProp])) return $.getNext(oEl, oProp);
			}
			catch(e) {
				try {
					if(!(oEl.getAttribute(sProp)) || oEl.getAttribute(sProp) != oProp[sProp]) return $.getNext(oEl, oProp);
				}
				catch(e) {
					return false;
				}
			}
		}
		return oEl || false;
	},
	getParent: function(oEl, oProp) {
		if(oEl) if(oProp) getParent: while(oEl = oEl.parentNode) {
			for(var sProp in oProp) {
				try {
					if(!oEl[sProp] || sProp == 'className' ? !$c.has(oEl, oProp[sProp]) : (oEl[sProp] != oProp[sProp])) continue getParent;
				}
				catch(e) {
					try {
						if(!(oEl.getAttribute(sProp)) || oEl.getAttribute(sProp) != oProp[sProp]) continue getParent;
					}
					catch(e) {
						return false;
					}
				}
			}
			return oEl;
		}
		else if(oEl.parentNode) return oEl.parentNode;
		else return false;
	},
	getCtrl: function(oEl, sCss, sTxt) {
		if(sCss) $c.add(oEl.parentNode, sCss);
		if(oEl.nodeName.toLowerCase() != 'a') {
			var sNode = '<a href="#"><span>&nbsp;</span>' + oEl.innerHTML;
			if(sTxt)
				
			sNode += '</a>';
			oEl.innerHTML = sNode;
			oEl = $.getFirst(oEl);
		}
		return oEl;
	}
};

var $s = {
	setElement: function(sEl, oProp) {
		var oEl = false;
		if(sEl && typeof(sEl) == 'string') {
			oEl = document.createElement(sEl);
			if(oProp && typeof(oProp) == 'object') for(var sParam in oProp) switch(sParam) {
				case 'text': oEl.appendChild(document.createTextNode(oProp[sParam])); break;
				case 'class': oEl.className = oProp[sParam]; break;
				default: oEl.setAttribute(sParam, oProp[sParam]);
			}
		}
		return oEl;
	}
};

/** *********************************************************************************************************
    OBJET DE GESTION DE CLASSE - INSPIRE DE http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html
    EXEMPLES :
	$c.add(oEl, 'test');                    //  Ajout d'une classe a l'element oEl
	$c.has(oEl, 'test');                    //  Verification de l'existence de la classe 'test' sur l'element oEl via une chaine texte
	$c.has(oEl, /\btest\b/);             //  Verification de l'existence de la classe 'test' sur l'element oEl via une expression reguliere
	$c.swap(oEl, 'test', 'test2');      //  Modification de la classe 'test' de l'element oEl en classe 'test2' (ou inversement)
	$c.remove(oEl, 'test2');            //  Suppression de la classe 'test2' de l'element oEl
 */

var $c = {
	remove: function(oEl, sClass) {
		var rep = oEl.className.match(' ' + sClass) ? ' ' + sClass : sClass;
		oEl.className = oEl.className.replace(rep, '');
	},
	add: function(oEl, sClass) {
		if(!$c.has(oEl, sClass))
			oEl.className += oEl.className ? ' ' + sClass : sClass;
	},
	swap: function(oEl, sClass1, sClass2) {
		oEl.className = !$c.has(oEl, sClass1) ?
			oEl.className.replace(sClass2, sClass1):
			oEl.className.replace(sClass1, sClass2);
	},
	has: function() {
		return typeof arguments[1] == 'string' ?
			new RegExp('\\b' + arguments[1] + '\\b').test(arguments[0].className):
			arguments[1].test(arguments[0].className);
	}
};

var $p = {
	setOpacity: function(oEl, iVal) {
			oEl.style.opacity = oEl.style.MozOpacity = oEl.style.KhtmlOpacity = (iVal / 100);
			oEl.style.filter = 'alpha(opacity=' + iVal + ')';
	}
};

/** *********************************************************************************************************
    GESTIONNAIRE D'EVENEMENT
    EXEMPLES :
	$e.add('domready', alerte);                                                    // Lance le gestionnaire alerte au chargement de la page
	$e.add(oEl, 'click', alerte);                                                     // Ajoute le gestionnaire alerte au clic sur oEl en mode 'effervescence'
	$e.add(oEl, 'click', alerte, true);                                             // Ajoute le gestionnaire alerte au clic sur oEl en mode 'capture' (IE ne sait pas faire)
	$e.remove(oEl, 'click', alerte);                                               // Supprime le gestionnaire alerte au clic sur oEl
	$e.add(oEl, 'click', function(e) { $e.stop(e); });                        // Si oEl est un lien, $e.stop(e); stoppe la transmission de l'evenement et annule l'action normale du lien
	$e.add(oEl, 'click', function(e) { alert($e.getSrc(e)); });            // Retourne la source de l'evenement
	$e.add(oEl, 'mouseover', function(e) { alert($e.relSrc(e)); });    // Retourne l'element survole precedent le mouseover
	$e.add(oEl, 'mouseout', function(e) { alert($e.relSrc(e)); });     // Retourne l'element survole suivant le mouseout
*/

var $e = {
	// Ajout d'un gestionnaire d'evenement sur un element lors d'un evenement donne
	add: function() {
		var a = arguments;
		if(a[0] == 'domready')
			return $e.domready(a[1]);
		return document.addEventListener ?
			a[0].addEventListener(a[1], a[2], a[3] || false):
			a[0].attachEvent ?
				a[0].attachEvent('on' + a[1], a[2]):
				false;
	},
	// Suppression d'un gestionnaire d'evenement sur un element pour un evenement donne
	remove: function(oElem, sEvType, fn, bCapture) {
		return document.addEventListener ?
			oElem.removeEventListener(sEvType, fn, bCapture || false):
			oElem.detachEvent ?
				oElem.detachEvent('on' + sEvType, fn):
				false;
	},
	// Annulation de la propagation d'un evenement et de l'action par defaut d'un element
	stop: 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 false; // Indispensable pour Safari
	},
	// retourne la position de l'evenement
	getPos: function(e) {
		return window.attachEvent ?
			{'x': event.x, 'y': event.y}:
			{'x': e.pageX, 'y': e.pageY};
	},
	// Retourne la source de l'evenement
	getSrc: function(e) {
		return e.target || e.srcElement;
	},
	relSrc: function(e) {
		switch(e.type) {
			case 'mouseover': // Retourne l'element survole precedent l'element source de l'evenement
				return e.relatedTarget || e.fromElement;
			case 'mouseout': // Retourne l'element survole suivant l'element source de l'evenement
				return e.relatedTarget || e.toElement;
		}
	},
	// Detecte le chargement du DOM - http://dean.edwards.name/weblog/2006/06/again/#comment5338
	domready: function(fn) {
		// Internet Explorer 
		if(window.attachEvent) {
			document.write('<script id="ieScriptLoad" defer src="//:"><\/script>');
			document.getElementById('ieScriptLoad').onreadystatechange = function() {
				if(this.readyState == 'complete')
					$e.init(fn);
			};
		}
		// Mozilla/Opera 9 
		if(document.addEventListener)
			document.addEventListener('DOMContentLoaded', function() { $e.init(fn); }, false);
		// Safari 
		if(navigator.userAgent.search(/WebKit/i) != -1){
		    $e.loadTimer = setInterval(function (){
				if(document.readyState.search(/loaded|complete/i) != -1)
					$e.init(fn);
			}, 10);
		}
		// Other web browsers
		if($e)
			$e.add(window, 'load', function() { $e.init(fn); });
	},
	// Initialise le script
	init: function(fn) {
		if (arguments.callee.done) return;
		arguments.callee.done = true;
		if ($e.loadTimer) clearInterval($e.loadTimer);
			fn();
	}
};

/** *********************************************************************************************************
    AJAX
    EXEMPLES :
	$a.getXHR({method: 'get', url: 'index.php', callback: function() {
		document.body.innerHTML += oResponse.text;
	}});
	$a.getXHR({method: 'post', url: 'index.php', param: 'ajax=true', callback: function() {
		document.body.innerHTML += oResponse.text;
	}});
*/

var $a = {
	// Temps accepte pour une requete
	tempoXHR: 2500,
	// Support de l'objet XMLHttpRequest
	bXHRSupport: (typeof XMLHttpRequest != "undefined"),
	// Support de l'objet ActiveXObject
	bActiveXSupport: (window.ActiveXObject),
	// Version de l'ActiveX
	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'],
	// Creation de l'objet XHR
	createXHR: function() {
		if($a.bXHRSupport)
			return new XMLHttpRequest;
		else if($a.bActiveXSupport) {
			var iI;
			iI = $a.aMSXML.length;
			do {
				try {
					return new ActiveXObject($a.aMSXML[--iI]);
				}
				catch(oError) { };
			}
			while(iI > 0);
			throw new Error("L'objet oXHR n'a pas été créé");
		}
	},
	// Lancement de la requete Ajax
	getXHR: function(oReq) {
		var oXHR = $a.createXHR();
		$a.oReq = oReq;
		oXHR.open($a.oReq['method'], $a.oReq['url'], $a.oReq['sync'] && $a.oReq['sync'] == 'true' ? false : true);
		var oTimer = setTimeout(
			function() {
				if(oXHR)
					return oXHR.abort();
			},
			$a['tempoXHR']
		);
		oXHR.onreadystatechange = function() {
			if(oXHR.readyState == 4)
				if(oXHR.status && /200|304/.test(oXHR.status)) {
					clearTimeout(oTimer);
					oResponse = {
						text: oXHR.responseText
					};
					if($a.oReq['callback'])
						($a.oReq['callback'])();
				}
		};
		oXHR.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
		if($a.oReq['method'] == 'post')
			oXHR.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		return $a.oReq['method'] == 'get' ? oXHR.send(null) : oXHR.send($a.oReq['param']);
	}
};

k64 = {
	$: $.get,
	getElements: $.getElements,
	getFirst: $.getFirst,
	getLast: $.getLast,
	getPrevious: $.getPrevious,
	getNext: $.getNext,
	getParent: $.getParent,
	getCtrl: $.getCtrl,
	setElement: $s.setElement,
	setOpacity: $p.setOpacity,
	addClass: $c.add,
	removeClass: $c.remove,
	swapClass: $c.swap,
	hasClass: $c.has,
	addEvent: $e.add,
	removeEvent: $e.remove,
	stopEvent: $e.stop,
	getPos: $e.getPos,
	getSrc: $e.getSrc,
	relSrc: $e.relSrc,
	getXHR: $a.getXHR
};

})();



/** *********************************************************************************************************
    GESTION DES BLOCS TOGGLE ET A ONGLETS
*/
(function() { var Block = function() {}, Bp = Block.prototype = {
	initialize: function(sCont, oProp) {
		if(!sCont) return;
		Bp.cont = sCont || 'div';
		
		Bp.openCss = oProp['open']['css'] || null;
		
		Bp.closeCss = oProp['close']['css'] || null;
		return k64.addEvent('domready',  Bp.maestro);
	},
	maestro: function() {
		if(!Bp.hasCSS()) return;
		Bp.initStyle();
		Bp.tabSelect(Bp.cont, 'blockTab');
		Bp.toggleSelect(Bp.cont, 'toggle');
	},
	hasCSS: function() {
		var oNewDiv = k64.setElement('div');
		document.body.appendChild(oNewDiv);
		oNewDiv.style.visibility = 'hidden';
		oNewDiv.style.width = '20px';
		oNewDiv.style.padding = '10px';
		if(oNewDiv.offsetWidth != 40) {
			document.body.removeChild(oNewDiv);
			return false;
		}
		else {
			document.body.removeChild(oNewDiv);
			return true;
		}
	},
	initStyle: function() {
		return k64.hasClass(document.documentElement, 'hasJS') ? true : k64.addClass(document.documentElement, 'hasJS');
	},
	tabSelect: function(sCont, sClass) {
		var aCt = k64.$(document, sCont);
		if(aCt.length > 0) var iCt = aCt.length; else return;
		var sCl = sClass || 'blockTab';
		while(iCt-- > 0) {
			if(k64.hasClass(aCt[iCt], sCl)) {
				var oUl = k64.setElement('ul', {'class': 'menuTab'});
				var oHeader = false;
				var aTb = k64.getElements(aCt[iCt], {'className': 'tab'});
				var iTb = aTb.length; if(iTb == 0) continue;
				while(iTb-- > 0) {
					oHeader = k64.getFirst(aTb[iTb], {'className': 'header'});
					if(!oHeader) return;
					var oLi = k64.setElement('li');
					var oA = k64.setElement('a', {'href': '#', 'text': oHeader.innerHTML});
					oLi.appendChild(oA);
					oUl.appendChild(oLi);
					k64.addClass(oHeader, 'hidden');
				}
				var oRep = k64.hasClass(aCt[iCt], 'anim') ? k64.getFirst(aCt[iCt], {'className': 'slider'}) : k64.getFirst(aCt[iCt], {'className': 'tab'});
				aCt[iCt].insertBefore(oUl, oRep);
				var aCtrls = k64.getElements(oUl, {'tag': 'a'});
				var iCtrl = aCtrls.length;
				while(iCtrl-- > 0) {
					if(iCtrl == aCtrls.length - 1) k64.addClass(k64.getParent(aCtrls[iCtrl]), 'current');
					k64.addEvent(aCtrls[iCtrl], 'click', Bp.tabCurrent(aCt[iCt], aCtrls, iCtrl));
					if(k64.hasClass(aCt[iCt], 'anim')) k64.addEvent(aCtrls[iCtrl], 'click', Bp.tabRoll(aCt[iCt], aCtrls, iCtrl));
				}
			}
		}
	},
	tabCurrent: function(oCont, aCtrls, iCurrent) {
		var aTabs = k64.getElements(oCont, {'className': 'tab'}), iI = aTabs.length - 1;
		if(iCurrent == iI) k64.addClass(aTabs[iI], 'current');
		return function(e) {
			var iI = aTabs.length;
			while(iI-- > 0)
				if(iI == iCurrent) {
					if(!k64.hasClass(aTabs[iI], 'current')) k64.addClass(aTabs[iI], 'current');
					if(!k64.hasClass(k64.getParent(aCtrls[iI]), 'current')) k64.addClass(k64.getParent(aCtrls[iI]), 'current');
				}
				else {
					if(k64.hasClass(aTabs[iI], 'current')) k64.removeClass(aTabs[iI], 'current');
					if(k64.hasClass(k64.getParent(aCtrls[iI]), 'current')) k64.removeClass(k64.getParent(aCtrls[iI]), 'current');
				}
			return k64.stopEvent(e);
		};
	},
	tabRoll: function(oCont, aCtrls, iCurrent) {
		var iStep =  oCont.scrollWidth;
		if(!Bp.step) Bp.step = iStep;
		if(!Bp.widthSlider) Bp.widthSlider =  Bp.step * aCtrls.length;
		var oSlider = k64.getFirst(oCont, {'className': 'slider'});
		oSlider.style.width = Bp.widthSlider + 'px';
		var iHeightTab = k64.getElements(oSlider, {'className': 'tab'})[iCurrent].scrollHeight;
		var iHeightSlider = oSlider.scrollHeight;
		if(iHeightTab > iHeightSlider) oSlider.style.height = iHeightTab + 'px';
		var iCurrentMargin = Bp.step * iCurrent;
		oSlider.style.marginLeft = -iCurrentMargin + 'px';
		var iReverse = (aCtrls.length - 1) - iCurrent;
		oCont.current = iCurrent;
		return function(e) {
			var stopAnim = function() {
				oCont.current = iReverse;
				oSlider.style.marginLeft = -Bp.finalMargin + 'px';
				oCont.marginLeft = parseInt(oSlider.style.marginLeft );
				if(interval) clearInterval(interval);
				if(Bp.start) Bp.start = Bp.finalMargin = Bp.diff = Bp.transition = null;
			};
			var exeAnim = function() {
				if(!Bp.start) {
					Bp.start = (new Date).getTime();
					Bp.finalMargin = Bp.step * iReverse;
					Bp.diff = Math.abs(Bp.finalMargin - Math.abs(parseInt(oSlider.style.marginLeft )));
					Bp.transition = 250 * Bp.diff / Bp.step;
					if(!oCont.marginLeft) oCont.marginLeft = parseInt(oSlider.style.marginLeft );
				}
				var iNow = (new Date).getTime();
				if(iNow < Bp.start + Bp.transition) {
					var iMargin = -parseInt((iNow - Bp.start) * Bp.diff / Bp.transition);
					oSlider.style.marginLeft = iReverse > oCont.current ? oCont.marginLeft + iMargin + 'px' : oCont.marginLeft - iMargin + 'px';
				}
				else stopAnim();
			};
			var interval = setInterval(exeAnim, 1);
			return k64.stopEvent(e);
		};
	},
	toggleSelect: function(sCont, sClass, oCont) {
		var aCt = oCont ? k64.$(oCont, sCont) : k64.$(document, sCont) || k64.$(document, '*');
		if(aCt.length > 0) var iCt = aCt.length; else return;
		var sCl = sClass || 'toggle';
		while(iCt-- > 0) {
			var aCd = aCt[iCt].childNodes, iCd = aCd.length;
			while(iCd-- > 0) if(k64.hasClass(aCd[iCd], 'blockToggle') && !k64.getParent(aCd[iCd], {'className': 'withToggle'})) Bp.toggleSelect(sCont, sClass, aCd[iCd]);
			if(k64.hasClass(aCt[iCt], sCl)) {
				var oFirst = k64.getFirst(aCt[iCt], {'className': 'header'}); if(!oFirst) return;
				var oNext = k64.getNext(oFirst, {'className': 'body'}); if(!oNext) return;
				var oCtrl = false, oTarget = false;
				if(k64.hasClass(oNext, 'display')) {
					k64.removeClass(oNext, 'display');
					oCtrl = Bp.closeTxt || Bp.closeCss ? k64.getCtrl(oFirst, Bp.closeCss, Bp.closeTxt) : k64.getCtrl(oFirst);
				}
				else {
					k64.addClass(oNext, 'display');
					oCtrl = Bp.openTxt || Bp.openCss ? k64.getCtrl(oFirst, Bp.openCss, Bp.openTxt) : k64.getCtrl(oFirst);
				}
				oTarget = oNext;
				if(oCtrl && oTarget) {
					k64.addEvent(oCtrl, 'click', Bp.toggleBehaviour(aCt[iCt], oCtrl, oTarget));
					continue;
				}
			}
		}
	},
	toggleBehaviour: function(oCont, oCtrl, oTarget) {
		return function(e) {
			k64.hasClass(oCont, 'anim') ? Bp.toggleRoll(oCtrl, oTarget) : Bp.toggleDisplay(oCtrl, oTarget);
			return k64.stopEvent(e);
		}
	},
	toggleDisplay: function(oCtrl, oTarget) {
		if(k64.hasClass(oTarget, 'display')) {
			var oUnique = k64.getParent(oTarget, {'className': 'unique'});
			if(oUnique) Bp.toggleCleanBlock(oUnique, k64.getParent(oTarget, {'className': 'toggle'}));
			if(Bp.closeTxt) {
				var aSpans = k64.$(oCtrl, 'span'), oSpan = aSpans[aSpans.length - 1];
				oSpan.innerHTML = oSpan.title = Bp.closeTxt;
			}
			if(Bp.closeCss) k64.swapClass(oCtrl.parentNode.parentNode, Bp.openCss, Bp.closeCss);
			return k64.removeClass(oTarget, 'display');
		}
		else {
			if(Bp.openTxt) {
				var aSpans = k64.$(oCtrl, 'span'), oSpan = aSpans[aSpans.length - 1];
				oSpan.innerHTML = oSpan.title = Bp.openTxt;
			}
			if(Bp.openCss) k64.swapClass(oCtrl.parentNode.parentNode, Bp.closeCss, Bp.openCss);
			return k64.addClass(oTarget, 'display');
		}
	},
	toggleRoll: function(oCtrl, oTarget) {
		var stopAnim = function() {
			if(interval) clearInterval(interval);
			if(start) start = null;
			if(oTarget.finalHeight != 0)
				oTarget.style.height = 'auto';
		};
	
		oTarget.style.overflow = 'hidden';
		if(!start) var start = (new Date).getTime();
		if(k64.hasClass(oTarget, 'display')) {
			var oUnique = k64.getParent(oTarget, {'className': 'unique'});
			if(oUnique) Bp.toggleCleanBlock(oUnique, k64.getParent(oTarget, {'className': 'toggle'}));
			oTarget.style.height = '0px';
			k64.setOpacity(oTarget, 0);
			k64.removeClass(oTarget, 'display');
			oTarget.finalHeight = oTarget.scrollHeight;
			var transition = 250 * oTarget.scrollHeight / 400;
			var exeAnim = function() {
				var iNow = (new Date).getTime();
				var iHeight = parseInt((iNow - start) * oTarget.scrollHeight / transition);
				var iOpacity = parseInt((iNow - start) * 100 / transition);
				if(iNow < start + transition) {
					oTarget.style.height = iHeight + 'px';
					k64.setOpacity(oTarget, iOpacity);
				}
				else {
					if(Bp.closeTxt) {
						var aSpans = k64.$(oCtrl, 'span'), oSpan = aSpans[aSpans.length - 1];
						oSpan.innerHTML = oSpan.title = Bp.closeTxt;
					}
					if(Bp.closeCss) k64.swapClass(oCtrl.parentNode.parentNode, Bp.openCss, Bp.closeCss);
					k64.setOpacity(oTarget, 100);
					oTarget.style.height = oTarget.finalHeight + 'px';
					stopAnim();
				}
			};
		}
		else {
			var transition = 250 * oTarget.scrollHeight / 400;
			oTarget.style.height = oTarget.scrollHeight + 'px';
			k64.setOpacity(oTarget, 100);
			oTarget.finalHeight = 0;
			var exeAnim = function() {
				var iNow = (new Date).getTime();
				var iHeight = parseInt((iNow - start) * oTarget.scrollHeight / transition);
				var iOpacity = parseInt((iNow - start) * 100 / transition);
				if(iNow < (start + transition) && parseInt(oTarget.style.height) > iHeight) {
					oTarget.style.height = parseInt(parseInt(oTarget.style.height) - iHeight) + 'px';
					k64.setOpacity(oTarget, 100 - iOpacity);
				}
				else {
					if(Bp.openTxt) {
						var aSpans = k64.$(oCtrl, 'span'), oSpan = aSpans[aSpans.length - 1];
						oSpan.innerHTML = oSpan.title = Bp.openTxt;
					}
					if(Bp.openCss) k64.swapClass(oCtrl.parentNode.parentNode, Bp.closeCss, Bp.openCss);
					k64.setOpacity(oTarget, 0);
					oTarget.style.height = oTarget.finalHeight + 'px';
					k64.addClass(oTarget, 'display');
					stopAnim();
				}
			};
		}
		var interval = setInterval(exeAnim, 1);
	},
	toggleCleanBlock: function(oBlock, oExcept) {
		var oOpen = k64.getElements(oBlock, {'className': 'hide'});
		if(oOpen) {
			var oCtrl = k64.$(oOpen, 'a')[0];
			var oTarget = k64.getFirst(oOpen, {'className': 'body'});
			return k64.hasClass(oExcept, 'anim') ? Bp.toggleRoll(oCtrl, oTarget) : Bp.toggleDisplay(oCtrl, oTarget);
		}
		return false;
	}
};

var blocks = new Block; blocks.initialize(
	'div',
	{ // Parametres optionnels pour les Toggles
		'open': {'txt': '(Voir)', 'css': 'show'},
		'close': {'txt': '(Réduire)', 'css': 'hide'}
	}
);

})();