var fcki = 0;
var fcks = new Array;
var debugging = 0;

var inputs = new Array;
var queue = new Array;
var head = 0, tail = 0;
var QUEUESIZE = 10000;
var working = 0;
var request, cur;
var wysiwygEnabled = 0;
var wysiwygToSync;

var sessid;
var controller;

var xhrOk = false;

var waitingFor = new Array;

function registerEvent (el, e, handler) {
	if (el.addEventListener)
		el.addEventListener(e, handler, false);
	else if (el.attachEvent)
		el.attachEvent("on" + e, handler);
	else
		eval("el.on" + e + " = handler;");
}

function messageREWAD (url, params) {
	var el;
	
	if (!window.XMLHttpRequest && !window.ActiveXObject) {
		xhrOk = -1;
		return;
	}
	
	for (ind in inputs) {
		el = inputs[ind];
		if (el && el.tmt) {
			clearTimeout(el.tmt);
			el.tmt = '';
			el.lchev = '';
			eval(el.tmtText);
		}
	}
	if (wysiwygEnabled && !wysiwygSyncWorking)
		wysiwygSync(1);
	
	queue[tail] = [url, params];
	if (debugging) {
		var d = new Date()
		queue[tail][2] = d.getTime();
	}
	tail++;
	if (tail == QUEUESIZE)
		tail = 0;
	setTimeout('checkREWAD();', 0);
}

function onResponse () {
	if (request.readyState == 4)
	{
		if (request.status == 200) {
			var last;
			if (debugging) {
				var d = new Date()
				last = d.getTime();
				showdbg('Query complete in ' + (last - cur[2]));
			}
			try {
				if (request.responseText)
					eval(request.responseText);
				if (debugging) {
					var d = new Date()
					showdbg('Eval complete in ' + (d.getTime() - last));
				}
			}
			catch (err) {
				if (debugging) {
					showdbg(err.message+"\n\n"+request.responseText);
					messageREWAD('/jserror', 'url='+encodeURIComponent(window.top.document.location.href)+'&error='+encodeURIComponent(err.message)+'&code='+encodeURIComponent(request.responseText));
				}
			}
			
			request.onreadystatechange = doNothing; //Can't figure out how to unset the handler in IE
			request.abort();
			
			queue[head] = false;
			
			head++;
			if (head == QUEUESIZE)
				head = 0;
			
			working = 0;
			setTimeout('checkWaitingFor(); checkREWAD();', 0);
		}
		else {
			working = 0;
			request.abort();
			setTimeout('checkREWAD();', 500);
		}
	}
}

function checkREWAD () {
	if ((head != tail) && !working && (working = !working)) {
		
		cur = queue[head];
		//console.log(head + " " + tail + " " + cur);
		if (!cur) {
			setTimeout('checkREWAD();', 500);
			return;
		}
		
		if (window.XMLHttpRequest)
			request = new XMLHttpRequest();
		else if (window.ActiveXObject)
			request = new ActiveXObject("Microsoft.XMLHTTP");
		else { //Some strange browser supporting JS but XHR
			xhrOk = -1;
			return;
		}
		request.onreadystatechange = onResponse;
		
		try {
			request.open('POST', cur[0], true); 
			request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
			request.send('REWADSESSID='+sessid+'&'+cur[1]+'&debugging='+debugging);
			setTimeout('xhrTimeout('+head+');', 5000);
		}
		catch (e) {
			request.abort();
			showdbg("Error at "+cur[0]+":<br>&nbsp;&nbsp;&nbsp;" + e.message);
			working = 0;
			setTimeout('checkREWAD();', 0);
		}
	}
}

function xhrTimeout(i) {
	if (i != head) return;
	
	request.abort();
	working = 0;
	setTimeout('checkREWAD();', 0);
}

function noController(id) {
	if (id == controller)
		window.location.reload();
}

function doNothing() {
}

function dgbi(id) {
	return document.getElementById(id);
}

function showdbg(text) {
	if (debugging)
		if (dgbi('debugArea'))
			dgbi('debugArea').innerHTML = text + '<br />' + dgbi('debugArea').innerHTML.substr(0, 8192);
		else
			alert(text);
}

function debug(state) {
	debugging = state;
}

function show(id) {
	if (!dgbi(id))
		return waitFor(id, "show('"+id+"');");
	dgbi(id).style.display = "";
}

function showb(id) {
	if (!dgbi(id))
		return waitFor(id, "showb('"+id+"');");
	dgbi(id).style.display = "block";
}

function hide(id) {
	if (!dgbi(id))
		return waitFor(id, "hide('"+id+"');");
	dgbi(id).style.display = "none";
}

function toggleShow(id) {
	if (dgbi(id).style.display == 'none')
		dgbi(id).style.display = '';
	else
		dgbi(id).style.display = 'none';
}

function hlb(id) {
	dgbi("bracket"+id+"_a").style.background = "yellow";
	dgbi("bracket"+id+"_b").style.background = "yellow";
}

function uhlb(id) {
	dgbi("bracket"+id+"_a").style.background = "";
	dgbi("bracket"+id+"_b").style.background = "";
}

function getbasename(fname) {
	var i;
	i = fname.lastIndexOf('\\');
	if (i < 0)
		i = fname.lastIndexOf('/');
	if (i < 0)
		i = 0;
	return fname.substr(i+1);
}

function getdirname(fname) {
	var i;
	i = fname.lastIndexOf('\\');
	if (i < 0)
		i = fname.lastIndexOf('/');
	if (i < 0)
		i = 0;
	return fname.substr(0, i);
}

function addEvent (el, ev, f) {
	if (window.addEventListener)
		el.addEventListener(ev, f, false);
	else
		el.attachEvent("on" + ev, f);
}

function waitFor(id, code) {
	if (dgbi(id)) {
		eval(code);
	} else
		waitingFor.push([id, code]);
}

function checkWaitingFor() {
	for (i=0; i < waitingFor.length; i++) {
		if (dgbi(waitingFor[i][0])) {
			try {
				eval(waitingFor[i][1]);
			}
			catch (err) {
				if (debugging) {
					showdbg(err.message+"\n\n"+waitingFor[i][1]);
					messageREWAD('/jserror', 'url='+encodeURIComponent(window.top.document.location.href)+'&error='+encodeURIComponent(err.message)+'&code='+encodeURIComponent(waitingFor[i][1]));
				}
			}
			waitingFor.splice(i--, 1);
		}
	}
}

function getOpacityProperty()
{
	if (typeof document.body.style.opacity == 'string') // CSS3 compliant (Moz >= 1.7, Safari >= 1.2, Opera 9)
		return 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string') // Mozilla <= 1.6, Firefox 0.8 
		return 'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
		return 'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) // Internet Exploder >= 5.5
		return 'filter';
	
	return false; // no opacity
}

function setOpacity(elem, nOpacity)
{
	var opacityProp = getOpacityProperty();
	
	if (!elem || !opacityProp)
		return;
	
	if (opacityProp=="filter")  // Internet Exploder >= 5.5
	{
		nOpacity *= 100;
		
		var oAlpha = elem.filters['DXImageTransform.Microsoft.alpha'] || elem.filters.alpha;
		if (oAlpha) oAlpha.opacity = nOpacity;
		else elem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";
	}
	else // Other browsers
		elem.style[opacityProp] = nOpacity;
}

