var mozaiq_xreq = false;
var check_interval = false;
var check_interval_timeout = 5000;
var prev_state = -1;
var prev_queue_position = -1;

var mozaiq = null;

function toggle_advanced(show_advanced) {
	if (show_advanced) {
		document.getElementById('basic_settings').style.display = 'none';
		document.getElementById('advanced_settings').style.display = 'block';
	}
	else {
		document.getElementById('basic_settings').style.display = 'block';
		document.getElementById('advanced_settings').style.display = 'none';
	}
}

function send_mozaiq_analyze() {
	var page_description = document.getElementById('page_description');
	var progress_status = document.getElementById('progress_status');
	var mz_id = document.getElementById('mozaiq_id').value;
	var mz_key = document.getElementById('mozaiq_key').value;
	var bw = document.getElementById('radio_bw').checked;
	var title = document.getElementById('mozaiq_title').value;
	var creator = document.getElementById('mozaiq_creator').value;
	var max_dimension = document.getElementById('max_dimension').value;
	var variance = document.getElementById('variance').value;
	var original_opacity = document.getElementById('original_opacity').value;
	var neighbor_distance = document.getElementById('neighbor_distance').value;

	disable_form(document.body, 'working...');

	page_description.style.display = 'none';
	progress_status.innerHTML = 'working...';

	mozaiq_xreq = create_xml_request();

	if (mozaiq_xreq === false) {
		progress_status.innerHTML = 'Your browser does not appear to be supported.  Please read teh <a href="faq.php">FAQ</a> for more information.';
		enable_form(document.body);
	}
	else {
		mozaiq_xreq.onreadystatechange = receive_mozaiq_analyze;
		mozaiq_xreq.open('POST', WWW + '/xml.mozaiq.php', true);
		mozaiq_xreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		mozaiq_xreq.send('action=analyze&id='+mz_id+'&key='+mz_key+'&title='+escape(title)+'&creator='+escape(creator)+'&bw='+bw+'&max_dimension='+max_dimension+'&variance='+variance + '&original_opacity='+original_opacity+'&neighbor_distance='+neighbor_distance);
	}

//	enable_form(document.body);
}

function send_check_place_in_queue() {
	var progress_status = document.getElementById('progress_status');
	var mz_id = document.getElementById('mozaiq_id').value;
	var mz_key = document.getElementById('mozaiq_key').value;

	mozaiq_xreq = create_xml_request();

	if (mozaiq_xreq === false) {
		progress_status.innerHTML = 'Your browser does not appear to be supported.  Please read the <a href="faq.php">FAQ</a> for more information.';
	}
	else {
		mozaiq_xreq.onreadystatechange = receive_check_place_in_queue;
		mozaiq_xreq.open('POST', WWW + '/xml.mozaiq.php', true);
		mozaiq_xreq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		mozaiq_xreq.send('action=check_place_in_queue&id='+mz_id+'&key='+mz_key);
	}
}

function receive_mozaiq_analyze() {
	if (mozaiq_xreq === false)
		return;

	var progress_status = document.getElementById('progress_status');

	if (mozaiq_xreq.readyState == 4) {
		if (mozaiq_xreq.status == 200) {
			progress_status.innerHTML = '';

			var xml = mozaiq_xreq.responseXML.documentElement;

			mozaiq = null;
			mozaiq = new Mozaiq(xml);
			if (mozaiq.get_errors().num_errors() != 0) {
				for (i = 0; i < mozaiq.get_errors().num_errors(); i++)
					progress_status.innerHTML += ('<div>ERROR #' + mozaiq.get_errors().get_error(i)[0] + ' - ' + mozaiq.get_errors().get_error(i)[1] + '</div>');
			}
			else if (mozaiq.get_state() == 'awaiting_analysis') {
				show_mozaiq_progress();
				document.getElementById('mozaiq_title').value = mozaiq.get_title();
				document.getElementById('mozaiq_creator').value = mozaiq.get_creator();

				if (check_interval === false) {
					check_interval = setInterval(send_check_place_in_queue, check_interval_timeout);
				}
			}
			else if (mozaiq.get_state() == 'analyzing' || mozaiq.get_state() == 'selecting_tiles' || mozaiq.get_state() == 'generating') {
				show_mozaiq_progress();
				document.getElementById('mozaiq_title').value = mozaiq.get_title();
				document.getElementById('mozaiq_creator').value = mozaiq.get_creator();

				if (check_interval === false) {
					check_interval = setInterval(send_check_place_in_queue, 5000);
				}
			}
			
		}
//		enable_form(document.body);
	}
}

function receive_check_place_in_queue() {
	if (mozaiq_xreq === false)
		return;

	var progress_status = document.getElementById('progress_status');

	if (mozaiq_xreq.readyState == 4) {
		if (mozaiq_xreq.status == 200) {
			var xml = mozaiq_xreq.responseXML.documentElement;
			mozaiq = null;
			mozaiq = new Mozaiq(xml);
			if (mozaiq.get_errors().num_errors() != 0) {
//				message_window_queue.style.display = 'block';
//				for (i = 0; i < mozaiq.get_errors().num_errors(); i++)
//					message_window_queue.innerHTML += ('<div>ERROR #' + mozaiq.get_errors().get_error(i)[0] + ' - ' + mozaiq.get_errors().get_error(i)[1] + '</div>');
			}
			else if (mozaiq.get_state() == 'complete')
				window.open(window.location.href, '_top');
			else
				show_mozaiq_progress()
		}
	}
}

function update_progress_status() {
	if (mozaiq == null)
		return;
	var progress_status = document.getElementById('progress_status');
	if (mozaiq.get_state() == 'awaiting_analysis') {
		if (mozaiq.get_place_in_queue() == 0)
			progress_status.innerHTML = "You're next in line!<br />Your mozaiq will be ready soon.";
		else if (mozaiq.get_place_in_queue() == 1)
			progress_status.innerHTML = ("There is 1 mozaiq ahead of you in the queue.");
		else
			progress_status.innerHTML = ("There are " + mozaiq.get_place_in_queue() + " mozaiqs ahead of you in the queue.");
	}
	else if (mozaiq.get_state() == 'analyzing' || mozaiq.get_state() == 'selecting_tiles')
			progress_status.innerHTML = "Workin' on it!";
	else if (mozaiq.get_state() == 'generating')  {
		if (mozaiq.get_percent_complete() > 95)
			progress_status.innerHTML = "Whoah, so close you can taste it!";
		else
			progress_status.innerHTML = "Workin' on it!";
	}
	else
		progress_status.innerHTML = "We apologize, but an error appears to have occured while making your mozaiq.<br />Please try again.";
}

function update_progress_bar(which, target) {
		var obj = document.getElementById('progress_bar' + which);
		var percent = parseFloat(obj.style.width);
		if (percent == target)
			return;
		var adjust = (target - percent) / 8;
		if (Math.abs(adjust) < .01) {
			document.getElementById('progress_bar' + which).style.width = target + '%';
			return;
		}
		if (adjust > 5)
				adjust = 5;
		else if (adjust < -5)
				adjust = -5;
		document.getElementById('progress_bar' + which).style.width = (percent + adjust) + '%';

		if (percent != target)
			setTimeout('update_progress_bar('+which+','+target+');', 33);
}

function show_mozaiq_progress() {
	if (mozaiq == null)
		return;
	var progress_status = document.getElementById('progress_status');
	var page_description = document.getElementById('page_description');
	var progress_bars = document.getElementById('progress_bars');

	if (mozaiq.get_state() == 'awaiting_analysis') {
		disable_form(document.body, 'working...');
		page_description.style.display = 'none';
		if (mozaiq.get_place_in_queue() != prev_queue_position || prev_state != 0) {
			new Effect.Opacity(progress_status, {duration: 0.5, from: 1, to: 0, afterFinish: update_progress_status});
			new Effect.Opacity(progress_status, {duration: 0.5, from: 0, to: 1, queue: 'end'});
			prev_queue_position = mozaiq.get_place_in_queue();
		}
		if (prev_state != 0) {
			new Effect.BlindUp(progress_bars, {duration: 1});
		}
		prev_state = 0;
	}
	else if (mozaiq.get_state() == 'analyzing' || mozaiq.get_state() == 'selecting_tiles' || mozaiq.get_state() == 'generating') {
		var step;
		var i;

		disable_form(document.body, 'working...');
		page_description.style.display = 'none';

		step = 1;
		if (mozaiq.get_state() == 'selecting_tiles')
			step = 2;
		else if (mozaiq.get_state() == 'generating')
			step = 3;

		if (prev_state < 1) {
			new Effect.Opacity(progress_status, {duration: 0.5, from: 1, to: 0, afterFinish: update_progress_status});
			new Effect.Opacity(progress_status, {duration: 0.5, from: 0, to: 1, queue: 'end'});
			new Effect.BlindDown(progress_bars, {duration: 1});
		}

		var obj = document.getElementById('step' + step);
		if (1 - Element.getOpacity(obj) > 0.6)
			new Effect.Opacity(obj, {duration: 0.5, from:0.3, to: 1});
		update_progress_bar(step, mozaiq.get_percent_complete());
		document.getElementById('percent' + step).innerHTML = mozaiq.get_percent_complete();

		for (i = 1; i <= 3; i++) {
			if (i == step)
				continue;
			obj = document.getElementById('step' + i);
			if (1 - Element.getOpacity(obj) < 0.6)
				new Effect.Opacity(obj, {duration: 0.5, from:1, to: 0.3});
			if (i < step) {
				update_progress_bar(i, 100);
				document.getElementById('percent' + i).innerHTML = 100;
			}
			else if (i > step) {
				update_progress_bar(i, 0);
				document.getElementById('percent' + i).innerHTML = 0;
			}
		}
		prev_state = step;
	}
	else if (mozaiq.get_state() == 'complete') {
		disable_form(document.body, 'working...');
		page_description.style.display = 'none';
		progress_bar_container.style.display = 'none';
		progress_status.innerHTML = 'Completed!  Now loading your mozaiq.';
		window.open(window.location.href, '_self');
	} else if (mozaiq.get_state() == 'error_generating') {
		disable_form(document.body, 'working...');
		page_description.style.display = 'none';
		if (prev_state != 0) {
			new Effect.Opacity(progress_status, {duration: 0.5, from: 1, to: 0, afterFinish: update_progress_status});
			new Effect.Opacity(progress_status, {duration: 0.5, from: 0, to: 1, queue: 'end'});
			new Effect.BlindUp(progress_bars, {duration: 1});
		}
		prev_state = 0;
	}
	else {
		page_description.style.display = 'block';
//		document.getElementById('submit_mozaiq').oldcaption = 'go!';
		enable_form(document.body);
		clearInterval(check_interval);
		check_interval = false;
		progress_bars.style.display = 'none';
		progress_status.innerHTML = '';
	}
}

function zoom_tiles(e) {
	e = e ? e : event;
	var x;
	var y;
	var i;
	var j;
	if (e.offsetX || e.offsetY) {
		x = e.offsetX;
		y = e.offsetY;
	}
	else {
		x = e.layerX
		y = e.layerY;
//		x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
//		y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}

	x = Math.floor(x / 9);
	y = Math.floor(y / 9);
	var tl = new Tile();
	var t;
	var src = '';
	for (i = -2; i <= 2; i++) {
		for (j = -2; j <= 2; j++) {
			if (typeof(tiles[x + i]) != 'undefined') {
				t = tiles[x + i][y + j];
				if (typeof(t) != 'undefined') {
					tl.set_id(t[0]);
					tl.set_key(t[1]);
					src += '<a href="' + tl.get_url() + '" style="position: absolute; top: ' +((j + 2) * 60)+ 'px; left: '+((i + 2) * 60)+'px;">';
					src += '<img src="' + tl.get_img_url(60) + '" />';
					src += '</a>';
				}
			}
		}
	}
	document.getElementById('tile').innerHTML = src;
}
	
