var Env = {
	query: function(k) {
		var q = unescape(window.location.search.substr(1)).split("&"), r = {};
		for(var i = 0, l = q.length, p, v; i < l; i++) {
			p = q[i];
			if(p === '') continue;
			p = p.split('=');
			v = p[1];
			r[p[0]] = (v) ? v : null;
		}
		if(k && r[k]) return r[k];
		return r;
	},
	focusFrame: function(o) {
		o = I(o);
		if(o.contentWindow) o.contentWindow.focus();
		else o.focus();
	},
	getScreenSizes : function() {
		var w, h, x, y, a, b, c, d;
		var s = self, e = document.documentElement, o = document.body, n = window;
		w = s.innerWidth;
		if(w || w === 0) h = s.innerHeight;
		else if(e.clientWidth || e.clientHeight) { // Explorer 6 Strict Mode
			w = e.clientWidth;
			h = e.clientHeight;
		} else if(o) {
			w = o.clientWidth;
			h = o.clientHeight;
		}
		// all except Explorer
		x = s.pageXOffset;
		if(x || x === 0) y = s.pageYOffset;
		else if(e.scrollLeft || e.scrollTop) { // Explorer 6 Strict Mode
			x = e.scrollLeft;
			y = e.scrollTop;
		} else if(o) { // all other Explorers
			x = o.scrollLeft;
			y = o.scrollTop;
		}
		if(n.innerHeight && n.scrollMaxY) {
			a = n.innerWidth + n.scrollMaxX;
			b = n.innerHeight + n.scrollMaxY;
		// all but Explorer Mac
		} else if(o.scrollHeight > o.offsetHeight) {
			a = o.scrollWidth;
			b = o.scrollHeight;
		// Explorer Mac;
		//would also work in Explorer 6 Strict, Mozilla and Safari
		} else {
			a = o.offsetWidth;
			b = o.offsetHeight;
		}
		if(a < w) c = w; else c = a;
		if(b < h) d = h; else d = b;
		return [w, h, x, y, a, b, c, d];
	},
	getPosition: function(o) {
		var l = 0, t = 0;
		o = I(o);
		if(o.offsetParent) {
			l = o.offsetLeft;
			t = o.offsetTop;
			while(o = o.offsetParent) {
				l += o.offsetLeft;
				t += o.offsetTop;
			}
		}
		return [l, t];
	},
	getSize: function(o) {
		o = I(o);
		return [o.offsetWidth, o.offsetHeight];
	},

	setCookie : function(o) {
		var n = o.name, v = o.value, e = o.expire, p = o.path, d = o.domain, s = o.secure;
		e = (e) ? e : 0;
		e = new Date((new Date().getTime()) + (e * 1000)).toGMTString();
		document.cookie = n + "=" + escape(v) + ((e) ? "; expires=" + e : "") +
		((p) ? "; path=" + p : "") + ((d) ? "; domain=" + d : "") + ((s) ? "; secure" : "");
	},
	getCookie : function(n) {
		var e = new RegExp('(^|;)\\s*' + n + '=([^;]*)'), m = document.cookie.match(e);
		if(m && m[1]) return unescape(m[1]);
		return null;
	},
	deleteCookie : function(o) {
		var n = o.name, p = o.path, d = o.domain;
		document.cookie = n + "=" +
			((p) ? "; path=" + p : "") +
			((d) ? "; domain=" + d : "") +
			"; expires=Thu, 01-Jan-70 00:00:01 GMT";
	},
	pause: function(t) {
		var n = new Date();
		t = n.getTime() + (t * 1000);
		while(true) {
			n = new Date();
			if(n.getTime() > t) return;
		}
	},
	execute: function(c) {
		var g = this;
		if(window.execScript) {
			window.execScript(c);
			return null;
		}
		return g.eval ? g.eval(c) : eval(c);
	},

	insertHTML: function(h, n) {
		var d = Dom.getDocument(n);
		if(Agent.MSIE) d.selection.createRange().pasteHTML(h);
		else {
			var v = d.createElement("div");
			v.innerHTML = h;
			Env.insertNodeAtSelection(v, n);
		}
	},
	insertNodeAtSelection: function(i, n) {
		// get current selection

		var s = Dom.getWindow(n).getSelection();

		// get the first range of the selection
		// (there's almost always only one range)
		var r = s.getRangeAt(0);

		// deselect everything
		s.removeAllRanges();

		// remove content of current selection from document
		r.deleteContents();

		// get location of current selection
		var c = r.startContainer, p = r.startOffset, d = Tools.toArray(i.childNodes);

		// make a new range for the new selection
		r = Dom.getDocument(n).createRange();

		if(c.nodeType == 3 && i.nodeType == 3) {
			// if we insert text in a textnode, do optimized insertion
			c.insertData(p, i.nodeValue);

			// put cursor after inserted text
			var l = i.length;
			r.setEnd(c, p + l);
			r.setStart(c, p + l);
		} else {
			var a;
			if(c.nodeType == 3) {
				// when inserting into a textnode
				// we create 2 new textnodes
				// and put the insertNode in between

				// text before the split and after
				var t = c, x = t.nodeValue, l = x.length, b = x.substr(0, p);
				a = x.substr(p);
				c = t.parentNode;

				if(l > 0) {
					b = Dom.create(b);
					a = Dom.create(a);

					// insert the 3 new nodes before the old one
					d = [t].concat(b, d, a);
					//alert(t + ' \n ' +  d + ' \n ' + a)
					Dom.insertBefore.apply(null, d);

					// remove the old node
					c.removeChild(t);
				} else {
					d = [c].concat(d);
					Dom.appendChilds.apply(null, d);
				}
			} else {
				// else simply insert the node
				a = c.childNodes[p];
				if(a) {
					d = [a].concat(d);
					Dom.insertBefore.apply(null, d);
				} else {
					d = [c].concat(d);
					Dom.appendChilds.apply(null, d);
				}
			}
			if(!a) a = d[d.length - 1];
			r.setEnd(a, 0);
			r.setStart(a, 0);
		}
		s.addRange(r);
	},





	// Selections and replaces
	getSelection: function() {
		var s;
		if(window.getSelection) {
			s = window.getSelection();
		}
		else if(document.selection) { // should come last; Opera!
			s = document.selection.createRange();
		}
		alert(s);
		var t = s.text;
		if(!t) t = s;
		var r = Env.getRange(s);
		alert(r);
	},
	getRange: function(s) {
		if(s.getRangeAt) return s.getRangeAt(0);
		else { // Safari!
			var r = document.createRange();
			r.setStart(s.anchorNode, s.anchorOffset);
			r.setEnd(s.focusNode, s.focusOffset);
			return r;
		}
	},
	insertAtCursor: function(f, v) {
		f = I(f);
		//IE support
		if(document.selection) {
			f.focus();
			r = document.selection.createRange();
			if(r.parentElement() != f) return false;
			var o = f.value.replace(/\r\n/g, '\n');
			r.text = v;

			var a = t = f.value.replace(/\r\n/g, '\n');

			// Trova la posizione del primo carattere differente
			for(var d = 0, l = o.length; d < l; d++) if(o.charAt(d) != a.charAt(d)) break;

			l = v.length;
			for(var i = 0, s = 0; t.match(v) && (t = t.replace(v, "")) && i <= d; i = s + l) {
				s = a.indexOf(v, i);
			}
		}
		//MOZILLA/NETSCAPE support
		else if(f.selectionStart || f.selectionStart == '0') {
			var s = f.selectionStart, e = f.selectionEnd, w = f.value;
			f.value = w.substring(0, s) + v + w.substring(e, w.length);
		} else {
			f.value += v;
		}
	},
	setCursorAt: function(f, p) {
		if(f.createTextRange) {
		/* Create a TextRange, set the internal pointer to
			a specified position and show the cursor at this
			position
		*/
			var r = f.createTextRange();
			r.move("character", p);
			r.select();
		} else if(f.selectionStart) {
		/* Gecko is a little bit shorter on that. Simply
			focus the element and set the selection to a
			specified position
		*/
			f.focus();
			f.setSelectionRange(p, p);
		}
	}
};
var _GET = Env.query();



var Event = {
	mouse : {
		x : 0,
		y : 0
	},
	getMousePosition : function(e) {
		if(!e) e = window.event;
		var x = 0, y = 0, a = e.pageX, b = e.clientX;
		if(a) {
			x = a;
			y = e.pageY;
		} else if(b) {
			var c = document.body, d = document.documentElement;
			if(c && d) {
				x = b + c.scrollLeft + d.scrollLeft;
				y = e.clientY + c.scrollTop + d.scrollTop;
			}
		}
		if(this === document) { var m = Event.mouse; m.x = x; m.y = y; }
		return [x, y];
	},
	fromElement: function(e) {
		if(!e) e = window.event;
		var r = e.relatedTarget || e.fromElement;
		return r;
	},
	toElement: function(e) {
		if(!e) e = window.event;
		var r = e.relatedTarget || e.toElement;
		return r;
	},
	exitElement: function(e, o) {
		if(!e) e = window.event;
		var t = e.target || e.srcElement;
		var r = Event.toElement(e);
		while(r != t && r.nodeName != 'BODY') r = r.parentNode;
		if(r == t) return false;
		return true;
	},
	cancelBubble: function(e) {
		if(!e) e = window.event;
		e.cancelBubble=true;
	},
	getKey: function(e) {
		if(!e) e = window.event;
		var n = e.keyCode || e.which, k = String.fromCharCode(n),
		s = (e.shiftKey) ? true : false,
		c = (e.ctrlKey) ? true : false,
		a = (e.altKey) ? true : false;
		return {code: n, key: k, shift: s, ctrl: c, alt: a};
	},
	checkKey: function(k) {
		var v = 0, n = k.code, m = Event.keysMap;
		if(n >= 13 && n <= 20) return false;
		v = ((k.shift) ? 4 : 0) + ((k.ctrl) ? 2 : 0) + ((k.alt) ? 1 : 0);
		for(var i = m.length - 1; i >= 0; i--) {
			var c = m[i];
			if(c[0] === n && c[1] == v) return c[2];
		}
		return false;
	},
	keysMap: [
		[8, 0, "BackSpace"],
		[9, 0, "Tab"],
		[9, 4, "Btab"],
		[12, 0, "CursorCenter"],
		[13, 0, "Enter"],
		[19, 0, "Pause"],
		[20, 0, "CapsLock"],
		[27, 0, "Escape"],
		[33, 0, "PageUp"],
		[34, 0, "PageDown"],
		[35, 0, "End"],
		[35, 2, "GoToBottom"],
		[36, 0, "CursorHome"],
		[36, 2, "ControlHome"],
		[37, 0, "CursorLeft"],
		[38, 0, "CursorUp"],
		[39, 0, "CursorRight"],
		[40, 0, "CursorDown"],
		[44, 0, "Print"],
		[45, 0, "Insert"],
		[46, 0, "Delete"],
		[46, 4, "EraseField"],
		[46, 2, "EraseEOP"],
		[46, 1, "ClearScreen"],
		[91, 0, "LeftWin"],
		[92, 0, "RightWin"],
		[144, 0, "NumLock"],
		[145, 0, "ScrollLock"]
	],
	getButton: function(e) {
		if(!e) e = window.event;
		var n = e.button, l = false, m = false, r = false;
		if(n) {
			if(n & 1) l = true;
			if(n & 2) r = true;
			if(n & 4) m = true;
		} else {
			n = e.which;
			if(n == 1) l = true;
			if(n == 2) r = true;
			if(n == 3) m = true;
		}
		var s = (e.shiftKey) ? true : false,
		c = (e.ctrlKey) ? true : false,
		a = (e.altKey) ? true : false;
		return {button: n, left: l, middle: m, right: r, shift: s, ctrl: c, alt: a};
	},
	getWheel: function(e) {
		if(!e) e = window.event;
		var d = e.detail;
		if(d) d = -d / 3;
		else {
			d = e.wheelDelta / 120;
			if(window.opera) d = -d;
		}
		var s = (e.shiftKey) ? true : false,
		c = (e.ctrlKey) ? true : false,
		a = (e.altKey) ? true : false;
		return {wheel: d, shift: s, ctrl: c, alt: a};
	},
	preventDefault: function(e) {
		if(!e) e = window.event;
		if(e.preventDefault) e.preventDefault();
		else e.returnValue = false;
	},
	stopPropagation: function(e){
		if(e.stopPropagation) e.stopPropagation();
		else e.cancelBubble = true;
	},
	stop: function(e) {
		if(!e) e = window.event;
		Event.stopPropagation(e);
		Event.preventDefault(e);
	},
	getTarget : function(e) {
		return e.target || e.srcElement;
	},
	add : function(o, t, f) {
		o = I(o);
		//if(t.substr(0, 2) == 'on') t = t.substr(2);
		t = t.toLowerCase().replace(/^on/, '');
		if(t == 'domloaded') {
			if(o == window) Event.onDomLoaded(f);
		} else {
			if(!o.events) o.events = {};
			var e = o.events;
			if(!e[t]) e[t] = [];
			e[t].push(f);
			if(o.attachEvent) {
				o['e'+t+f] = f;
				o[t+f] = function(){o['e'+t+f](window.event);};
				o.attachEvent('on'+t, o[t+f]);
			} else {
				if(t == 'mousewheel') t = 'DOMMouseScroll';
				o.addEventListener(t, f, false);
			}
		}
	},
	remove: function(o, t, f) {
		o = I(o);
		t = t.toLowerCase().replace(/^on/, '');
		var e = o.events;
		if(e && e[t]) {
			e = e[t];
			for(var i = e.length - 1, a; i >= 0; i--) {
				a = e[i];
				if(a === f) {
					e[i] = e[e.length - 1];
					e.length--;
				}
			}
		}
		if(o.detachEvent) {
			o.detachEvent('on'+t, o[t+f]);
			o[t+f] = null;
		} else {
			if(t == 'mousewheel') t = 'DOMMouseScroll';
			o.removeEventListener(t, f, false);
		}
	},
	get: function(o, t) {
		o = I(o);
		t = t.toLowerCase().replace(/^on/, '');
		var e = o.events;
		return (e && e[t]) ? e[t] : [];
	},
	clone: function(o, u) {
		o = I(o);
		var e = o.events;
		if(e) {
			for(var t in e) {
				var a = e[t];
				for(var i = 0, l = a.length; i < l; i++) {
					Event.addEvent(u, t, a[i]);
				}
			}
		}
	},
	/* onDomLoaded */
	onDomLoaded: function(e) {
		var m = Event._domEvents;
		if(m.cache.length === 0) m.executer();
		if(typeof e == 'string') e = new Function(e);
		m.cache.push(e);
	},
	_domEvents: {
		cache: [],
		run: function() {
			var m = Event._domEvents, e = m.cache;
			m.cache = [];
			for(var i = 0, l = e.length; i < l; i++) e[i]();
		},
		executer: function() {
			var m = this, o = window.opera;
			onload = m.run;
			if(/WebKit|Konqueror/i.test(navigator.userAgent))
				(function() { (/loaded|complete/.test(document.readyState)) ? m.callback(): setTimeout(arguments.callee, 1); })();
			else if((!o || parseInt(o.version(), 10) >= 9) && document.addEventListener)
				document.addEventListener('DOMContentLoaded', Event._domEvents.callback, false);
			else document.write('<scr' + 'ipt src="void(0)" defer="defer" onreadystatechange="if(this.readyState === \'complete\') Event._domEvents.callback()"></scr'+'ipt>');
		},
		callback: function() { window.onload = null; Event._domEvents.run(); }
	}
};

// if(document.layers) { document.captureEvents(Event.MOUSEMOVE); }
Event.add(document, 'mousemove', Event.getMousePosition);
