function createRequestObject(){
	var request_o; 
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer"){
		request_o = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		request_o = new XMLHttpRequest();
	}
	return request_o;
}

var http = createRequestObject(); 
var vhttp = createRequestObject(); 
var rhttp = createRequestObject();
var bot = 0;

function getRequestData(data) {
	document.getElementById('contents').innerHTML = '<center>' + localized_loading + '<br><br><img src="' + backend_baseurl + 'loading.gif" alt="Loading"></center>';
	http.open('post', backend_location);
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.onreadystatechange = handleResponse; 
	http.send(data);
}

/* Handle the response from the request code */
function handleResponse() {
	// 0: united, 1: loading, 2: loaded, 3: interactive, 4: finished
	if (http.readyState == 4) {
		var response = http.responseText;
		document.getElementById('contents').innerHTML = response;
		trigger_update();
		trigger_request();

	}
	http_status(http);

}

function checkAgree() {
	if (document.getElementById('cbAgree').checked != true) {
		getRequestData("state=9&reason=didnotreadrules");
		return false;
	}

	if (bot > 0)
	{
		getRequestData("state=1&bot=" + bot);
	}
	else
	{
		getRequestData("state=1");
	}
	return false;
}

function setBot(id)
{
	bot = id;
}

function checkRequest() {
	var nick  = document.getElementById('nick').value;
	var email = document.getElementById('email').value;
	var chan  = document.getElementById('channel').value;
	var bot   = document.getElementById('bot').value;

	document.getElementById('request').value = 'Checking..';
	document.getElementById('request').disabled = true;
	verifyRequest(nick, email, chan, bot);
}	

function verifyRequest(nick,email,chan,bot) {
	vhttp.open('post', backend_location);
	vhttp.onreadystatechange = verifyHandler; 
	vhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	vhttp.send("action=verify&nick=" + escape(escape(nick)) + "&email=" + escape(escape(email)) + "&chan=" + escape(escape(chan)) + "&bot=" + escape(escape(bot)));	
}

var errorState = new Array();

function add_error(target, msg) {
	f = find_error(target);
	
	if (f > 0) {
		errorState[f][1] += "- " + msg + "<br>";
	} else {
		f = errorState.length;
		errorState[f] = new Array(target, "- " + msg + "<br>");
	}
	return;
}

function find_error(target) {
	for (e = 0; e < errorState.length; e++)	{
		if (errorState[e][0] == target)	{
			return e;
		}
	}
	return -1;
}

function show_errors(error_notify) {
	for (j = 0; j < errorState.length; j++)	{
		
		if (eobject = document.getElementById(errorState[j][0] + "_error")) {
			eobject.innerHTML = "&nbsp;<img onmousemove='infobox_error(" + j + ")' onmouseout='infobox(\"\")' src='" + backend_baseurl + "error.gif'>";
		}
	}

	if (error_notify && errorState.length > 0) {
		alert(localized_missingdata);
	}
}

function clear_errors() {
	for (j = 0; j < errorState.length; j++)	{
		if (eobject = document.getElementById(errorState[j][0] + "_error")) {
			eobject.innerHTML = "";
		}
	}	
	errorState = new Array();
}

function verifyHandler() {
	clear_errors();
	if (vhttp.readyState == 4) {
		var big_respone = new Array();
		var response = vhttp.responseText;

		big_response = response.split("\n");
		for (i = 0; i < big_response.length; i++) {
			
			var current_response = new Array();
			current_response = big_response[i].split(",");
			
			if (current_response.length > 1) {
				switch (current_response[0].charAt(0))
				{
					case 'E':
						add_error(current_response[1], current_response[2]);
						break;			
					case 'R':
						getRequestData(current_response[1]);
						return;
					default:
						alert('Received an unknown response from the request service: ' + current_response[0]);
						break;
				}
			}
		}
		show_errors(true);
		if (document.getElementById('request'))	{
			document.getElementById('request').value = localized_continue;
			document.getElementById('request').disabled = false;
		}
	}
	http_status(vhttp);
}


var already_updating;

function trigger_update() {
	if (!document.getElementById('nick')) return; /* Not on the correct page */
	if (already_updating) return;
	already_updating = true;
	

	var nick  = document.getElementById('nick').value;
	var email = document.getElementById('email').value;
	var chan  = document.getElementById('channel').value;
	var bot   = document.getElementById('bot').value;

	http.open('post', backend_location);
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.onreadystatechange = triggeredUpdateHandler; 
	http.send("action=verify&nick=" + escape(escape(nick)) + "&email=" + escape(escape(email)) + "&chan=" + escape(escape(chan)) + "&bot=" + escape(escape(bot)) + "&triggered=auto");		
}

function request_next(id) {
	
	update_step(id, 'ok', "");
	id++;
	update_step(id, 'checking', "");

}

function request_accepted(id, queue) {
	getRequestData('state=4&req_id=' + id + '&queue=' + queue);
}

function request_error(id, err) {
	update_step(id, 'error', err);
	for (wq = (id+1); document.getElementById('step_' + wq + '_icon'); wq++) {
		update_step(wq, 'clean');
	}
	document.getElementById('msgwindow').innerHTML = localized_reqfailed + '<br><br><input type="button" onclick="getRequestData(\'state=1\')" value="' + localized_back + '">&nbsp;<input type="button" onclick="getRequestData(\'state=9&reason=aborted\')" value="' + localized_finish + '">';
}

function trigger_request() {
	
	if (!document.getElementById('check_page_stub')) return; /* Not on the correct page */
	if (!document.getElementById('cookie')) {
		alert("Internal error. Can't find request data.");
		return;
	} else {
		jumjum = document.getElementById('cookie').value;
		jumjum2 = document.getElementById('cookie_auth').value;
	}

	update_step(0, 'checking');
	ttarget = document.getElementById('requestframe');
	if (!ttarget) {
		alert("Bummer.");
		return;
	}
	ttarget.src = backend_location + "?action=request&cache=" + (Math.round((Math.random()*99999)+1)) + "&cookie=" + jumjum + "&cookie_auth=" + jumjum2;

}

function update_step(num, type, extra) {
	ipos = document.getElementById('step_' + num + '_icon');
	tpos = document.getElementById('step_' + num + '_text');
	if (ipos && tpos) {
		switch (type)
		{
			case '':
				ipos.innerHTML = "<img src='" + backend_baseurl + "stub.gif'>";
				tpos.style.fontWeight = 'normal';
				break;
			case 'checking':
				ipos.innerHTML = "<img src='" + backend_baseurl + "checking.gif'>";
				tpos.style.fontWeight = 'bold';
				break;
			case 'ok':
				ipos.innerHTML = "<img src='" + backend_baseurl + "ok.gif'>";
				tpos.style.fontWeight = 'normal';
				break;
			case 'error':
				ipos.innerHTML = "<img src='" + backend_baseurl + "failed.gif'>";
				tpos.style.fontWeight = 'normal';
				tpos.innerHTML = "<strong>" + tpos.innerHTML + "</strong><br><br>" + extra;
				break;
			case 'clean':
				ipos.innerHTML = "";
				tpos.innerHTML = "";
				break
		}
	}
}

function triggeredUpdateHandler() {
	if (http.readyState == 4) {
		clear_errors();
 		var big_respone = new Array();
		var response = http.responseText;

		big_response = response.split("\n");
		for (i = 0; i < big_response.length; i++) {
			
			var current_response = new Array();
			current_response = big_response[i].split(",");
			
			if (current_response.length > 1) {
				switch (current_response[0].charAt(0))
				{
					case 'E':
						add_error(current_response[1], current_response[2]);
						break;			
					case 'K':
						if (document.getElementById('request'))	{
							document.getElementById('request').value = localized_continue;
							document.getElementById('request').disabled = false;
						}
						http_status(http);
						break;
					default:
						alert('Received an unknown response from the request service: ' + current_response[0]);
						return;
				}
			}
		}
		already_updating = false;
		show_errors(false);
	}
	http_status(http);
}



function http_status(http) {
	def= '#NordicBots - A QuakeNet IRC Service';
	switch(http.readyState) {
		case 0:
			window.defaultStatus = "[0%] Initialising..";
			break;
		case 1:
			window.defaultStatus = "[25%] Loading..";
			break;
		case 2:
			window.defaultStatus = "[50%] Loaded..";
			break;
		case 3:
			window.defaultStatus = "[75%] Processing..";
			break;
		case 4:
			window.defaultStatus = def;
			break;
	}
}

function infobox_error(err_id) {
	if (error = errorState[err_id]) {
		txt = "<b>" + localized_error + "</b><br><br>";
		txt += errorState[err_id][1];
		document.getElementById('infobox').style.visibility = 'visible';
		document.getElementById('infobox').innerHTML = txt;

//		alert(errorState[err_id][1]);
	}
	
}

function infobox(obj) {
	
	txt = "";

	switch (obj)
	{
		case "nick":
			txt = localized_nick;
			break;
		case "email":
			txt = localized_email + "<br><br>" + localized_spam;
			break;
		case "chan":
			txt = localized_chan;
			break;
		case "bot":
			txt = localized_bot;
			break;
		case "request":
			txt = "<span style='color: red'>" + localized_identify + "</span>";
			break;
		default:
			txt = "";
	}

	if (txt == "") {
		document.getElementById('infobox').style.visibility = 'hidden';
		trigger_update();
	} else {
		document.getElementById('infobox').style.visibility = 'visible';
		document.getElementById('infobox').innerHTML = txt;
	}

}