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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

		observers: false,

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

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

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

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

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

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

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