function $() {
	// (C) Andrea Giammarchi - alpha release
	if(!window.$_$)
		window.$_$ = {
			elementsList: [],
			eventsList: {
				DOMActivate		:"ondomactivate",
				DOMAttrModified		:"onattrmodified",
				DOMCharacterDataModified:"oncharacterdatamodified",
				DOMFocusIn		:"ondomfocusin",
				DOMFocusOut		:"ondomfocusout",
				DOMMouseScroll		:"onmousewheel",
				DOMNodeInserted		:"onnodeinserted",
				DOMSubtreeModified	:"onsubtreemodified",
				NodeInsertedIntoDocument:"onnodeinsertedintodocument"
			},
			$A: function(obj) {
				var	i = obj.length, result = [];
				while(i)result.push(obj[--i]);
				return result
			},
			elementsManager: function(element, eventName, callback, listener) {
				var	i = 0;
				if(!this.elementsList.some(function(obj, j){var	b = obj.node === element; if(b)i = j; return b}))
					i = this.elementsList.push({node:element,events:{}}) - 1;
				callback(this.elementsList[i], eventName, listener);
			},
			attachEvent: function(element, eventName, listener) {
				if(!element.events[eventName])
					element.events[eventName] = [];
				if(element.events[eventName].indexOf(listener) < 0)
					element.events[eventName].push(listener);
				element.node[eventName] = function(event) {
					element.events[eventName].forEach(function(listener){listener.call(element.node, (event || window.event))})
				}
			},
			detachEvent: function(element, eventName, listener) {
				if(element.events[eventName])
					element.events[eventName] = element.events[eventName].filter(function(lst){return lst!==listener});
			},
			eventsManager: function(addEvent, element, base, eventName, listener, useCapture) {
				var	methodName = addEvent ? ["addEventListener", "attachEvent"] : ["removeEventListener", "detachEvent"];
				if(this.eventsList[eventName]) {
					if(base && !window.opera)
						base.call(element, eventName, listener, useCapture);
					else
						this.elementsManager(element, this.eventsList[eventName], this[methodName[1]], listener);
				}
				else {
					if(base)
						base.call(element, eventName, listener, useCapture);
					else
						this.elementsManager(element, "on".concat(eventName), this[methodName[1]], listener);
				}
			}
		};
	var elements = window.$_$.$A(arguments);
	elements.forEach(function(element, i){
		if(element.constructor === String)
			elements[i] = document.getElementById(element);
		if(window.$_$.elementsList.indexOf(elements[i]) < 0) {
			window.$_$.elementsList.push(elements[i]);
			elements[i].addEventListener = (function(base) {
				return function(eventName, listener, useCapture) {
					window.$_$.eventsManager(true, this, base, eventName, listener, useCapture);
				}
			})(elements[i].addEventListener);
			elements[i].removeEventListener = (function(base) {
				return function(eventName, listener, useCapture) {
					window.$_$.eventsManager(false, this, base, eventName, listener, useCapture);
				}
			})(elements[i].removeEventListener);
		}
	});
	return elements.length === 1 ? elements[0] : elements
};

$FDOM = {
	// (C) Andrea Giammarchi - alpha release
	listener:{},
	window:{
		getSize:
		function() {
			var	result = [0,0];
			if(typeof(window.innerWidth) == 'number')
				result = [window.innerWidth, window.innerHeight];
			else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
				result = [document.documentElement.clientWidth, document.documentElement.clientHeight];
			else if(document.body && (document.body.clientWidth || document.body.clientHeight))
				result = [document.body.clientWidth, document.body.clientHeight];
			return result;
		},
		onmousemove:
		function(callback) {
			$FDOM.listener.mousemove = callback;
			function mousemove(event) {
				if(event.clientX)
					mp = [event.clientX + document.body.scrollLeft, event.clientY + document.body.scrollTop];
				else
					mp = [event.pageX, event.pageY];
				$FDOM.listener.mousemove(mp[0], mp[1]);
			};
			var	mp = [0, 0];
			if(document.captureEvents && Event)
				document.captureEvents(Event.MOUSEMOVE);
			$(document).addEventListener("mousemove", mousemove, false);
		},
		overall:
		function(callback, color, maxOpacity, speed, zIndex) {
			var	div, size = [];
			if(document.createElement) {
				if(!callback)	callback = function(){this.destroy()};
				if(!color)	color = "#FFF";
				if(!maxOpacity)	maxOpacity = 80;
				if(!speed)	speed = 10;
				if(!zIndex)	zIndex = 99;
				div = document.createElement("DIV");
				div.__body__ = document.getElementsByTagName("body").item(0);
				div.style.top = div.style.left = div.style.border = div.style.margin = div.style.padding = "0px";
				div.style.width = div.style.height = "100%";
				div.style.backgroundColor = color;
				div.style.zIndex = zIndex;
				if(!window.opera && ["MSIE 5", "MSIE 6"].some(function(browser){return window.navigator.userAgent.toUpperCase().indexOf(browser) !== -1})) {
					div.__unfixed__ = setInterval(function(){
						div.style.position = "absolute";
						div.style.top = "".concat((div.__body__.scrollTop || document.documentElement.scrollTop), "px");
						div.style.height = "".concat($FDOM.window.getSize()[1], "px");
					}, 5);
				}
				else
					div.style.position = "fixed";
				div.destroy = function() {
					$FDOM.element.fadeOut(div, function(){
						if(div.__unfixed__)
							clearInterval(div.__unfixed__);
						div.__body__.removeChild(div)},
					div.style.opacity * 100, 0, speed);
				};
				div.__body__.appendChild(div);
				$FDOM.element.fadeIn(div, callback, 0, maxOpacity, speed);
				return div;
			};
		},
		showPresentation:
		function(image, delay, backGround, maxOpacity, speed, zIndex) {
			function afterFade() {
				setTimeout(function(){$FDOM.element.fadeOut(img, img.destroy, 100, 0, 5)}, delay);
			};
			function afterOverAll() {
				img = document.createElement("IMG");
				img.id = "presentation-image";
				img.destroy = function() {
					if(this.__unfixed__)
						clearInterval(this.__unfixed__);
					div.__body__.removeChild(this);
					div.destroy();
				};
				img.onload = function() {
					var	isize;
					$FDOM.element.setOpacity.call(this, 0);
					div.__body__.appendChild(this);
					isize = $FDOM.element.getSize(this);
					this.style.zIndex = div.style.zIndex + 1;
					this.style.left = "50%";
					if(div.__unfixed__) {
						this.__unfixed__ = setInterval(function(){
							img.style.position = "absolute";
							img.style.top = "".concat((div.__body__.scrollTop || document.documentElement.scrollTop) + Math.floor($FDOM.window.getSize()[1] / 2), "px");
						}, 5);
					}
					else {
						this.style.position = "fixed";
						this.style.top = "50%";
					}
					this.style.margin = "-".concat(Math.floor(isize[1]/2), "px auto auto -", Math.floor(isize[0]/2), "px");
					$FDOM.element.fadeIn(this, afterFade, 0, 100, 2);
				};
				img.src = image;
			};
			var	div, img;
			if(document.createElement)
				div = this.overall(afterOverAll, backGround, maxOpacity, speed, zIndex);
		}
	},
	element:{
		fadeIn:
		function(obj, callback, start, end, speed) {
			obj.fading = false;
			(function(){
				if(!obj.fading) {
					start += speed;
					if(start < end) {
						$FDOM.element.setOpacity.call(obj, start);
						setTimeout(arguments.callee, 1);
					}
					else {
						$FDOM.element.setOpacity.call(obj, end);
						callback.call(obj);
					}
				}
			})();
		},
		fadeOut:
		function(obj, callback, start, end, speed) {
			obj.fading = true;
			(function(){
				start -= speed;
				if(start > end) {
					$FDOM.element.setOpacity.call(obj, start);
					setTimeout(arguments.callee, 1);
				}
				else {
					$FDOM.element.setOpacity.call(obj, end);
					callback.call(obj);
				}
			})();
		},
		wheelListener:
		function(evt) {
			var	delta = 0;
			if(evt.wheelDelta) {
				delta = evt.wheelDelta / 120;
				if(window.opera)
					delta = -delta;
			}
			else if(evt.detail)
				delta = -evt.detail / 3;
			if(delta)
				this.__onmousewheel__(delta);
			if(evt.preventDefault)
				evt.preventDefault();
			evt.returnValue = false;
			return false;
		},
		onmousewheel:
		function(element, callback) {
			function addWheelEvent(){this.addEventListener("DOMMouseScroll", $FDOM.element.wheelListener, false)};
			function removeWheelEvent(){this.removeEventListener("DOMMouseScroll", $FDOM.element.wheelListener, false)};
			element.__onmousewheel__ = callback;
			$(element).addEventListener("mouseover", addWheelEvent, false);
			element.addEventListener("mouseout", removeWheelEvent, false);
		},
		getSize:
		function(element) {
			var	result = [0,0];
			if(typeof(element.offsetWidth) === "number")
				result = [element.offsetWidth, element.offsetHeight];
			else if(typeof(element.innerWidth) === "number")
				result = [element.innerWidth, element.innerHeight];
			else if(typeof(element.clientWidth) === "number")
				result = [element.clientWidth, element.clientHeight];
			return result;
		},
		setPosition:
		function(element, x, y) {
			element.style.position = "absolute";
			element.style.left = x;
			element.style.top = y;
		},
		setOpacity:
		function(opacity) {
			if(opacity !== null) {
				this.style.opacity = this.style.MozOpacity = this.style.KhtmlOpacity = opacity / 100;
				this.style.filter = "alpha(opacity=".concat(opacity, ")");
			}
			else
				this.style.opacity = this.style.MozOpacity = this.style.KhtmlOpacity = this.style.filter = opacity;
		}
	}
};