// Fluent Engrish
// (c) 2007 Philip Allison
// http://www.mangobrain.co.uk/

// Empty array for storing language pairs and the current language list
var pairs = new Array();
var list = new Array();

// Current position in the language list, for translation cycles
var position = 0;

// Control status
var controlsenabled = false;

// Preload status images
var errimg = new Image(50, 50);
var readyimg = new Image(50, 50);
var loadingimg = new Image(50, 50);
errimg.src = 'error.png';
readyimg.src = 'ready.png';
loadingimg.src = 'loading.gif';

// Populate the language drop-down menu with pairs going from the given language
function makemenu(from) {
	$('dropdown').innerHTML = '';
	if (from) {
		for (var counter = 0; counter < pairs.length; counter++) {
			var p = pairs[counter].split(':',2);
			if (p[0].substring(0,2) == from) {
				var option = new Option(p[1], counter);
				$('dropdown').options[$('dropdown').options.length] = option;
			}
		}
	} else {
		// Populate list with all entries
		for (var counter = 0; counter < pairs.length; counter++) {
			var p = pairs[counter].split(':',2);
			var option = new Option(p[1], counter);
			$('dropdown').options[counter] = option;
		}
	}
}

// Interpret success, error and unexpected messages from Babel Fish proxy
// - return false on error, or parsed message on success
function interpret(r) {
	// prevent XSS
	r = r.replace(/>/g,'&gt;');
	r = r.replace(/</g,'&lt;');
	if (r.length < 5) {
		$('statusimg').src = 'error.png';
		$('statustext').innerHTML = 'Unexpected response: '+r;
		return false;
	}
	if (r.substring(0,4) == 'ERR ') {
		$('statusimg').src = 'error.png';
		$('statustext').innerHTML = 'Error: '+r.substr(4);
		return false;
	}
	if (r.substring(0,4) == 'RES ') {
		return r.substr(4);
	}
	$('statusimg').src = 'error.png';
	$('statustext').innerHTML = 'Unexpected response: '+r;
	return false;
}

// Called when language list has been retrieved
function gotlangs(r) {
	var q = interpret(r.responseText);
	// Grab the result string, if there is one
	if (q) {
		// Parse it out into an associative array
		// of values & names
		var parts = q.split(':',2);
		var values = parts[0].split(',');
		var names = parts[1].split(',');
		if (values.length != names.length) {
			$('statusimg').src = 'error.png';
			$('statustxt').innerHTML = 'Unmatched lists of language pairs &amp; names';
			return;
		}
		for (var counter = 0; counter < values.length; counter++) {
			pairs[counter] = values[counter]+':'+names[counter];
		}
		// Populate the initial language drop-down menu
		makemenu();
		$('statusimg').src = 'ready.png';
		$('statustext').innerHTML = 'Ready';
		// Enable page controls
		togglecontrols();
	}
}

// OnFailure handler for AJAX requests
function failed(r) {
	$('statusimg').src = 'error.png';
	$('statustext').innerHTML = 'Error: '+r.status+' -- '+r.statusText;
	if (!controlsenabled) {
		togglecontrols();
	}
}

// Exception handler for AJAX requests
function except(e) {
	$('statusimg').src = 'error.png';
	$('statustext').innerHTML = 'Exception: '+e.name+'; '+e.message;
	if (!controlsenabled) {
		togglecontrols();
	}
}

// Called when page loads, to retrieve language pair list from Babel Fish proxy
function getlangs() {
	$('statusimg').src = 'loading.gif';
	$('statustext').innerHTML = 'Getting language pairs...';
	new Ajax.Request('babelfish_proxy.php',
		{
			method: 'post',
			postBody: 'mode=getlangs',
			onSuccess: gotlangs,
			onFailure: failed,
			onException: except
		}
	);
}

// Called when main button is pressed, to start the translation chain
function starttranslation() {
	if (list.length == 0) {
		alert('No language pairs selected!');
		return;
	}
	togglecontrols();
	$('statusimg').src = 'loading.gif';
	$('statustext').innerHTML = 'Working...';
	position = 0;
	translate($F('input'));
}

// Perform the next translation in the chain
function translate(text) {
	// Grab the next language pair in the list
	var p = pairs[list[position]].split(':',2)[0];
	new Ajax.Request('babelfish_proxy.php',
		{
			method: 'post',
			postBody: 'mode=translate&lang='+p+'&text='+encodeURIComponent(text),
			onSuccess: translated,
			onFailure: failed,
			onException: except
		}
	);
}

// OnSuccess handler for AJAX translation requests - trigger the next link
// in the translation chain
function translated(r) {
	position++;
	var q = interpret(r.responseText);
	if (q) {
		// Add this stage's results to the listing
		addtoresults(q);
		if (position == list.length) {
			// No links left
			$('statusimg').src = 'ready.png';
			$('statustext').innerHTML = 'Done';
			togglecontrols();
			togglecollapse(position);
			return;
		}
		translate($('resultpara'+position).innerHTML);
	} else {
		// Re-enable the controls on error
		togglecontrols();
	}
}

// Add a collapsible section of results
function addtoresults(text) {
	// Clear old results at the start of a new run
	if (position == 1) {
		$('results').innerHTML = '';
	}
	var l = pairs[list[position-1]].split(':',2);
	$('results').innerHTML += '<div class="collapse" onclick="javascript:togglecollapse('+position+');"><h5 id="resultheader'+position+'">Step '+position+': '+l[1]+'</h5><p id="resultpara'+position+'" style="display: none;">'+text+'</p></div>';
}

function togglecollapse(p) {
	if ($('resultpara'+p).style.display == 'none') {
		$('resultheader'+p).style.background = "#4ac url('open.png') no-repeat scroll center left";
		$('resultpara'+p).style.display = 'inline';
	} else {
		$('resultheader'+p).style.background = "#4ac url('closed.png') no-repeat scroll center left";
		$('resultpara'+p).style.display = 'none';
	}
}

// Enable/disable page controls
function togglecontrols() {
	$('input').disabled = !$('input').disabled;
	$('dropdown').disabled = !$('dropdown').disabled;
	$('add').disabled = !$('add').disabled;
	$('remove').disabled = !$('remove').disabled;
	$('clear').disabled = !$('clear').disabled;
	$('start').disabled = !$('start').disabled;
	controlsenabled = !controlsenabled;
}

// Add an item to the language list
function pushlist() {
	list.push(parseInt($('dropdown').options[$('dropdown').selectedIndex].value));
	drawlist();
	// Limit the drop-down menu so that only follow-on language pairs can be selected
	var p = pairs[list[list.length-1]].split(':',2);
	makemenu(p[0].substr(3,2));
}

// Remove an item from the language list
function poplist() {
	list.pop();
	drawlist();
	// Limit the drop-down menu so that only follow-on language pairs can be selected
	if (list.length > 0) {
		var p = pairs[list[list.length-1]].split(':',2);
		makemenu(p[0].substr(3,2));
	} else {
		makemenu();
	}
}

// Render the current language list
function drawlist() {
	if (list.length == 0) {
		$('list').innerHTML = '<li class="n"><i>empty</i></li>';
	} else {
		var html = '';
		for (var counter = 0; counter < list.length; counter++) {
			var p = pairs[list[counter]].split(':',2);
			html += '<li class="n">'+p[1]+'</li>';
		}
		$('list').innerHTML = html;
	}
}

// Clear the language list
function emptylist() {
	list = new Array();
	drawlist();
	// Also reset the drop-down to show all languages
	makemenu();
}

