var __console__check_keys = new Array();
var browser = new Browser();
var dragObj = new Object();
dragObj.zIndex = 1000;
var setFunction = "function __console__set_attributes(startNode) {\n"
		+ "	var toset = new Array();\n"
		+ "	toset.push('onchange');\n"
		+ "	var nodes = startNode.childNodes;\n"
		+ "	for (var i = 0; i < nodes.length; i++) {\n"
		+ "		if (nodes[i].getAttribute) {\n"
		+ "			for (var x = 0; x < toset.length; x++) {\n"
		+ "				var val = nodes[i].getAttribute(toset[x]);\n"
		+ "				if (val != null && val != '') {\n"
		+ "					eval('nodes[i].'+toset[x]+'=function (event){ eval(\\\''+val+'\\\'); };');\n"
		+ "				}\n"
		+ "			}\n"
		+ "		}\n"
		+ "		if (nodes[i].childNodes.length > 0)\n"
		+ "			__console__set_attributes(nodes[i]);\n"
		+ "	}\n"
		+ "}\n"
		+ "__console__set_attributes(document);";

if(document.addEventListener) { //code for Moz
	document.addEventListener("keydown",getKey,false);
	document.addEventListener("keyup",clearKey,false);
	document.addEventListener("scroll",__console__set_position,false);
}
else { //code for IE
	document.attachEvent("onkeydown",getKey);
	document.attachEvent("onkeyup",clearKey);
	document.attachEvent("onscroll",__console__set_position);
}

function __min(a, b) {
	return a-b
}

function getKey(e) {
	if(typeof window.event!="undefined") {
		e=window.event; //code for IE
	}
	__console__check_keys.push(e.keyCode);
	__console__check_keys.sort(__min);
	if (__console__check_keys.join('_') == '17_18_67' || __console__check_keys.join('_') == '17_18_99') {
		__console__check_keys = new Array();
		if (document.getElementById('__console__').style.display == 'none')
			__console__show();
		else
			__console__hide();
	}
}

function clearKey(e) {
	if(typeof window.event!="undefined") {
		e=window.event; //code for IE
	}
	var tmp = new Array();
	var key = (e.keyCode == 0) ? 18 : e.keyCode;
	for (var i = 0; i < __console__check_keys.length; i++) {
		if (__console__check_keys[i] != key)
			tmp.push(__console__check_keys[i]);
	}
	__console__check_keys = tmp;
}

function __console__check_down_keys(e) {
	if(typeof window.event!="undefined") {
		e=window.event; //code for IE
	}
	switch (e.keyCode) {
		case 9:
		case 13:
			return false;
		break;
	}
}

function __console__check_up_keys(e) {
	if(typeof window.event!="undefined") {
		e=window.event; //code for IE
	}
	switch (e.keyCode) {
	}
}

function __console__check_press_keys(e) {
	if(typeof window.event!="undefined") {
		e=window.event; //code for IE
	}
	switch (e.keyCode) {
		case 9:
			var input = document.getElementById('__console__code');
			var selectionStart = input.selectionStart;
			var selectionEnd = input.selectionEnd;
			var scrollTop = input.scrollTop;
			input.value = input.value.substring(0, selectionStart)
				    + '\t'
				    + input.value.substring(selectionEnd);
			input.scrollTop = scrollTop;
			input.selectionStart = selectionEnd + 1;
			input.selectionEnd = selectionEnd + 1;
			setTimeout("document.getElementById('__console__code').focus();", 0);
		break;
		case 13:
			var input = document.getElementById('__console__code');
			var selectionStart = input.selectionStart;
			var selectionEnd = input.selectionEnd;
			var scrollTop = input.scrollTop;
			var lines = input.value.match(/\n/g);
			if (lines != null) {
				lines = lines.length + 1;
				var lh = Math.floor(input.scrollHeight / lines);
			}
			var first = input.value.substring(0, selectionStart);
			var index = first.lastIndexOf('\n');
			var second = input.value.substring(selectionEnd);
			var tbnum = 0;
			for (var i = index + 1; i < first.length; i++) {
				if (first[i] == '\t') tbnum ++;
				else break;
			}
			var tabs = '\n';
			for (var i = 0; i < tbnum; i++)
				tabs += '\t';
			input.value = first + tabs + second;
			input.scrollTop = scrollTop + lh;
			input.selectionStart = selectionEnd + 1 + tbnum;
			input.selectionEnd = selectionEnd + 1 + tbnum;
		break;
	}
}

function __console__init() {
	document.getElementById('__console__code').value = '';
	document.getElementById('__console__errors').value = '';
	__console__set_scripts();
	__console__set_position();
}

function __console__clear_cache() {
	document.getElementById('__console__cache').value = '';
	eval(setFunction);
	document.getElementById('__console__errors').innerHTML = '['+__console__get_time()+']&nbsp;<span>Cache eliminata</span><br>'
							       + document.getElementById('__console__errors').innerHTML;
}

function __console__get_time() {
	var date = new Date();
	var time = ((date.getHours() < 10) ? '0' + date.getHours() : date.getHours())
		 + ':' + ((date.getMinutes() < 10) ? '0' + date.getMinutes() : date.getMinutes())
		 + ':' + ((date.getSeconds() < 10) ? '0' + date.getSeconds() : date.getSeconds());
	return time;
}

function __console__execute() {
	var code = document.getElementById('__console__code').value;
	var tocache = code;
	code += setFunction;
	try {
		eval(document.getElementById('__console__cache').value);
		eval(code);
		__console__cache_functions(tocache);
	}
	catch(ex) {
		if (ex.number) {
			var err = ex.message;
		}
		else {
			var err = ex;
		}
		document.getElementById('__console__errors').innerHTML = '['+__console__get_time()+']&nbsp;<span style="color: #f00;">'+err+'</span><br>'
								       + document.getElementById('__console__errors').innerHTML;
		return false;
	}
	document.getElementById('__console__errors').innerHTML = '['+__console__get_time()+']&nbsp;<span style="color: #0f0;">Codice corretto</span><br>'
							       + document.getElementById('__console__errors').innerHTML;
}

function __console__cache_functions(code) {
	var start = code.search(/function[\s]+[\w]+[\s]*\(/i);
	if (start != -1) {
		var opened = 0;
		for  (var i = start; i < code.length; i++) {
			if (code[i] == '{')
				opened ++;
			else if (code[i] == '}') {
				opened --;
				if (opened == 0) break;
			}
		}
		if (code[i] == '}') {
			var end = i + 1;
			var newfunc = '\n' + code.slice(start, end);
			document.getElementById('__console__cache').value += newfunc;
			__console__cache_functions(code.slice(end));
		}
	}
}

function __console__show() {
	document.getElementById('__console__').style.display = 'block';
	document.getElementById('__console__outer_div').style.display = 'block';
}

function __console__hide() {
	document.getElementById('__console__').style.display = 'none';
	document.getElementById('__console__outer_div').style.display = 'none';
}

function __console__set_scripts() {
	var html = document.getElementsByTagName('html')[0];
	var scripts = html.getElementsByTagName('script');
	for (var i = 0; i < scripts.length; i++) {
		var src = scripts[i].getAttribute('src');
		if (src != null) {
			var index = document.getElementById('__console__scripts').options.length;
			document.getElementById('__console__scripts').options[index] = new Option(src, src);
		}
	}
}

function __console__import_script(script) {
	if (script == '') {
		document.getElementById('__console__code').value = '';
		document.getElementById('__console__functions_select').options.length = 0;
	}
	else {
		var html = document.getElementsByTagName('html')[0];
		var scripts = html.getElementsByTagName('script');
		for (var i = 0; i < scripts.length; i++) {
			var src = scripts[i].getAttribute('src');
			if (src != null && src == script) {
				__console__get_external(script);
				break;
			}
		}
	}
}

function __console__get_external(link) {
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.onreadystatechange = __console__processReqChange;
		req.open("GET", link, true);
		req.send(null);
	}
	else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
		if (req) {
			req.onreadystatechange = __console__processReqChange;
			req.open("GET", link, true);
			req.send();
		}
	}
}

function __iorder(a, b) {
	a = a.toLowerCase();
	b = b.toLowerCase();
	if (a < b) return -1;
	if (a > b) return 1;
	return 0;
}

function __console__processReqChange() {
	if (req.readyState == 4) {
		if (req.status == 200) {
			document.getElementById('__console__code').value = req.responseText;
			document.getElementById('__console__functions_select').options.length = 0;
			document.getElementById('__console__functions_select').options[0] = new Option('Funzioni...', '');
			var funcs = req.responseText.match(/function[\s]+[\w]+[\s]*\(/ig);
			if (funcs != null) {
				var options = new Array();
				for (var i = 0; i < funcs.length; i++) {
					funcs[i] = funcs[i].replace('function', '');
					funcs[i] = funcs[i].replace(/\s/, '');
					funcs[i] = funcs[i].replace('(', '');
					options.push(funcs[i]);
				}
				options = options.sort(__iorder);
				for (var i = 0; i < options.length; i++)
					document.getElementById('__console__functions_select').options[i + 1] = new Option(options[i], options[i]);
			}
		}
	}
}

function __console__reach_function(func) {
	if (func == '') return false;
	var code = document.getElementById('__console__code').value;
	var regExp = new RegExp('function[\\s]+('+func+')+[\\s]*\\(', 'i');
	var index = code.search(regExp);
	var input = document.getElementById('__console__code');
	var lines = code.match(/\n/g).length;
	var rlines = code.slice(0, index).match(/\n/g).length;
	var scrollHeight = document.getElementById('__console__code').scrollHeight;
	var lh = Math.floor(scrollHeight / lines);
	var scrollTop = lh * rlines;
	setTimeout("document.getElementById('__console__code').focus();", 0);
	input.selectionStart = index;
	input.selectionEnd = index;
	var lines = code.match(/\n/g);
	if (lines != null) {
		lines = lines.length + 1;
		var rlines = code.slice(0, index).match(/\n/g).length;
		var scrollHeight = document.getElementById('__console__code').scrollHeight;
		var lh = Math.floor(scrollHeight / lines);
		input.scrollTop = lh * rlines;
	}
}


function Browser() {
	var ua, s, i;
	this.isIE    = false;
	this.isNS    = false;
	this.version = null;
	ua = navigator.userAgent;
	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}
	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}
	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0) {
		this.isNS = true;
		this.version = 6.1;
		return;
	}
}

function dragStart(event, id) {
	var el;
	var x, y;
	dragObj.elNode = document.getElementById(id);
	if (browser.isIE) {
		x = window.event.clientX + document.documentElement.scrollLeft
		  + document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
		  + document.body.scrollTop;
	}
	if (browser.isNS) {
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}
	dragObj.cursorStartX = x;
	dragObj.cursorStartY = y;
	dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
	dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);
	if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
	if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;
	dragObj.elNode.style.zIndex = ++dragObj.zIndex;
	if (browser.isIE) {
		document.attachEvent("onmousemove", dragGo);
		document.attachEvent("onmouseup",   dragStop);
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS) {
		document.addEventListener("mousemove", dragGo,   true);
		document.addEventListener("mouseup",   dragStop, true);
		event.preventDefault();
	}
}

function dragGo(event) {
	var x, y;
	if (browser.isIE) {
		x = window.event.clientX + document.documentElement.scrollLeft
		  + document.body.scrollLeft;
		y = window.event.clientY + document.documentElement.scrollTop
		  + document.body.scrollTop;
	}
	if (browser.isNS) {
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	}
	dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
	dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";
	if (browser.isIE) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS)
		event.preventDefault();
}

function dragStop(event) {
	if (browser.isIE) {
		document.detachEvent("onmousemove", dragGo);
		document.detachEvent("onmouseup",   dragStop);
	}
	if (browser.isNS) {
		document.removeEventListener("mousemove", dragGo,   true);
		document.removeEventListener("mouseup",   dragStop, true);
	}
}

function __console__get_size() {
	var width = 0, height = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		width = window.innerWidth;
		height = window.innerHeight;
	} 
	else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		width = document.documentElement.clientWidth;
		height = document.documentElement.clientHeight;
	} 
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		width = document.body.clientWidth;
		height = document.body.clientHeight;
	}
	return [width, height];
}

function __console__get_scroll() {
	var scrOfX = 0, scrOfY = 0;
	if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} 
	else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} 
	else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [scrOfX, scrOfY];
}

function __console__set_position() {
	var size = __console__get_size();
	var scroll = __console__get_scroll();
	var hgt = Number(document.getElementById('__console__inner_div').style.height.replace('px', ''));
	document.getElementById('__console__').style.top = size[1] + scroll[1] - 2 - hgt;
}
