
(function(){

// global registry
if (typeof(gtrans) == 'undefined')
{
	window.gtrans = {};
}

// send debugging output
gtrans.debug = false;

// fake firebug if it's not available
if (!window.console || !console.firebug)
{
	window.console = {};
	var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
	for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {};
}

gtrans.init = function()
{
	google.language.getBranding('google_translate_branding');
	
	switch(gtrans.type)
	{
		case 'detect': 
			//alert('detect');
			gtrans.init_detect();
			break;
		case 'translate':
		default:
			//alert('translate');
			gtrans.init_translate();
			break;
	}
};

// initialization
gtrans.init_translate = function()
{
	// set up to and from options
	gtrans.from_options = [];
	gtrans.to_options = [];
	
	gtrans.from_options.push('<option value="auto" class="gtrans_optsortorder-aa">' + gtrans.phrase['detect_language'] + '</option>');
	gtrans.from_options.push('<option value="separator" class="gtrans_optsortorder-ab" disabled="disabled">—</option>');
	gtrans.from_options.push('<option value="en" class="gtrans_optsortorder-ac">' + gtrans.phrase['lang_en'] + '</option>');
	gtrans.from_options.push('<option value="es" class="gtrans_optsortorder-ad">' + gtrans.phrase['lang_es'] + '</option>');
	gtrans.from_options.push('<option value="separator" class="gtrans_optsortorder-ae" disabled="disabled">—</option>');
	
	gtrans.to_options.push('<option value="en" class="gtrans_optsortorder-af">' + gtrans.phrase['lang_en'] + '</option>');
	gtrans.to_options.push('<option value="es" class="gtrans_optsortorder-ag">' + gtrans.phrase['lang_es'] + '</option>');
	gtrans.to_options.push('<option value="separator" class="gtrans_optsortorder-ah" disabled="disabled">—</option>');

	var stuff = '', lang_code = '', phrase = '', addclass = '';

	for (i in google.language.Languages)
	{
		lang_code = google.language.Languages[i];
		lang_code_ph = gtrans.str_replace('-', '_', lang_code);

		stuff += '\n' + i + ' : ' + lang_code;

		if (lang_code && typeof(gtrans.phrase['lang_' + lang_code_ph]) != 'undefined')
		{
			phrase = gtrans.phrase['lang_' + lang_code_ph];
		}
		else if (gtrans.debug)
		{
			// no phrase
			phrase = i + ' (' + lang_code + ')';
		}
		else
		{
			phrase = '';
		}

		if (phrase)
		{
			addclass = ' class="gtrans_optsortorder-b' + phrase + '"';
			gtrans.to_options.push('<option' + addclass + ' value="' + lang_code + '">' + phrase + '</option>');
			gtrans.from_options.push('<option' + addclass + ' value="' + lang_code + '">' + phrase + '</option>');
		}
	}
	gtrans.dev_debug(stuff);

	// sort function
	function gtrans_sort_options(a, b)
	{
		var start_text = 'class="gtrans_optsortorder-';
		var end_text = '"';
		
		var a_start_pos = a.indexOf(start_text) + start_text.length;
		var a_end_pos = a.indexOf(end_text, a_start_pos);
		var a_lang = a.substr(a_start_pos, a_end_pos - a_start_pos);

		var b_start_pos = b.indexOf(start_text) + start_text.length;
		var b_end_pos = b.indexOf(end_text, b_start_pos);
		var b_lang = b.substr(b_start_pos, b_end_pos - b_start_pos);

		// lowercase
		a_lang = (a_lang + '').toLowerCase();
		b_lang = (b_lang + '').toLowerCase();

		// remove accents
		var accents = ['á', 'é', 'í', 'ó', 'ú', 'ü'];
		var replacements = ['a', 'e', 'i', 'o', 'u', 'u'];
		var i;
		for (i in accents)
		{
			a_lang = gtrans.str_replace(accents[i], replacements[i], a_lang);
			b_lang = gtrans.str_replace(accents[i], replacements[i], b_lang);
		}
		
		var retval = ( (a_lang == b_lang) ? 0 : ((a_lang > b_lang) ? 1 : -1));
		gtrans.dev_debug('A: ' + a_lang + ' B: ' + b_lang + ' RETVAL: ' + retval + ' ORIG: A: ' + a + ' B: ' + b);
		return retval;
	}
	gtrans.from_options.sort(gtrans_sort_options)
	gtrans.to_options.sort(gtrans_sort_options);
	
	gtrans.from_options = gtrans.from_options.join('');
	gtrans.to_options = gtrans.to_options.join('');

	// populate the select lists
	var from_lang = YAHOO.util.Dom.get('gtrans_from_lang_span');
	var to_lang = YAHOO.util.Dom.get('gtrans_to_lang_span');

	from_lang.innerHTML = '<select id="gtrans_from_lang">' + gtrans.from_options + '</select>';
	to_lang.innerHTML = '<select id="gtrans_to_lang">' + gtrans.to_options + '</select>';
	
	//YAHOO.util.Event.on('gtrans_' + postid, 'click', gtrans.trans_start);
	//YAHOO.util.Event.on('gtrans_cancel_' + postid, 'click', gtrans.trans_cancel);
	//YAHOO.util.Event.on('gtrans_trans_' + postid, 'click', gtrans.trans_exec);
	//YAHOO.util.Event.on('gtrans_cancel_trans_' + postid, 'click', gtrans.trans_cancel_exec);

	YAHOO.util.Event.on('gtrans_button_translate', 'click', gtrans.button_translate);
	YAHOO.util.Event.on('gtrans_button_cancel', 'click', gtrans.button_cancel);

};

// initialize detect
gtrans.init_detect = function()
{
	YAHOO.util.Event.on('gtrans_button_detect', 'click', gtrans.button_detect);
};

// cancel the translation
gtrans.button_cancel = function(e)
{
	YAHOO.util.Event.stopEvent(e);
	YAHOO.util.Dom.setStyle('gtrans_translating', 'display', 'none');
};

// do the translation
gtrans.button_translate = function(e)
{
	YAHOO.util.Event.stopEvent(e);
	YAHOO.util.Dom.setStyle('gtrans_translating', 'display', '');

	// clear the translation box
	var trans = YAHOO.util.Dom.get('gtrans_translation');
	trans.innerHTML = '';

	// do translation
	var thetext = YAHOO.util.Dom.get('gtrans_text').value;
	var from_lang = YAHOO.util.Dom.get('gtrans_from_lang').value;
	var to_lang = YAHOO.util.Dom.get('gtrans_to_lang').value;

	if (from_lang == 'auto')
	{
		from_lang = '';
	}

	if (thetext == '')
	{
		YAHOO.util.Dom.setStyle('gtrans_translating', 'display', 'none');
		trans.innerHTML = '<strong style="color:red">' + gtrans.phrase['enter_text_to_translate'] + '</strong>';
	}
	else
	{
		//alert('text: ' + text + ' from_lang: ' + from_lang + ' to_lang: ' + to_lang);
		google.language.translate(thetext, from_lang, to_lang, gtrans.translation_handler);
	}
};

// do detection
gtrans.button_detect = function(e)
{
	YAHOO.util.Event.stopEvent(e);
	YAHOO.util.Dom.setStyle('gtrans_translating', 'display', '');

	// clear the output box
	var output = YAHOO.util.Dom.get('gtrans_output');
	output.innerHTML = '';
	
	var text = YAHOO.util.Dom.get('gtrans_text');
	//alert(text.value);
	
	if (text.value == '')
	{
		YAHOO.util.Dom.setStyle('gtrans_translating', 'display', 'none');
		var output = YAHOO.util.Dom.get('gtrans_output');
		output.innerHTML = '<strong style="color:red">' + gtrans.phrase['enter_text_to_detect'] + '</strong>';
	}
	else
	{
		google.language.detect(text.value, gtrans.lang_detect_handler);
	}
};

// handle detected language
gtrans.lang_detect_handler = function(result)
{
	YAHOO.util.Dom.setStyle('gtrans_translating', 'display', 'none');
	var output = YAHOO.util.Dom.get('gtrans_output');

	if (!result.error && result.language)
	{
		var lang = '';
		var lang_code = result.language;
		var lang_code_ph = gtrans.str_replace('-', '_', lang_code);
		
		if (gtrans.phrase['lang_' + lang_code_ph])
		{
			lang = gtrans.phrase['lang_' + lang_code_ph] + ' (' + lang_code + ')';
		}
		else
		{
			var i;
			for (i in google.language.Languages)
			{
				if (lang_code == google.language.Languages[i])
				{
					// show lang code with google constant
					lang = i + ' (' + lang_code + ')';
				}
			}
			if (lang == '')
			{
				// show the bare language code, since we have nothing else
				lang = lang_code;			
			}
		}
		function round_to(num, dec)
		{
			return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
		}
		output.innerHTML = '<strong>' + gtrans.phrase['result'] + ':</strong><ul>' +
			'<li>' + gtrans.phrase['language'] + ': <strong>' + lang + '</strong></li>' +
			'<li>' + gtrans.phrase['is_reliable'] + ': <strong>' + (result.isReliable ? gtrans.phrase['yes'] : gtrans.phrase['no']) + '</strong></li>' +
			'<li>' + gtrans.phrase['confidence'] + ': <strong>' + (round_to((result.confidence * 100), 2)) + '%' + '</strong></li></ul>';

		//google.language.getBranding('google_translate_branding');
	}
	else
	{
		output.innerHTML = '<strong style="color:red">' + gtrans.phrase['language_detect_problem'] + '</strong>';
	}
};

// show translation returned from google
gtrans.translation_handler = function(result)
{
	// hide the spinner
	YAHOO.util.Dom.setStyle('gtrans_translating', 'display', 'none');

	gtrans.dev_debug('translation_handler()');
	if (result.translation)
	{
		gtrans.dev_debug('TRANSLATION: ' + result.translation);

		// translation
		var trans = YAHOO.util.Dom.get('gtrans_translation');
		trans.innerHTML = gtrans.htmlspecialchars(result.translation);

		// translation title
		var to_lang = YAHOO.util.Dom.get('gtrans_to_lang').value;
		var from_lang = YAHOO.util.Dom.get('gtrans_from_lang').value;
		if (result.detectedSourceLanguage)
		{
			from_lang = result.detectedSourceLanguage;
		}
		to_lang = gtrans.str_replace('-', '_', to_lang);
		from_lang = gtrans.str_replace('-', '_', from_lang);

		var title = YAHOO.util.Dom.get('gtrans_to_title');
		title.innerHTML = construct_phrase(gtrans.phrase['translation_x_to_y'], gtrans.phrase['lang_' + from_lang], gtrans.phrase['lang_' + to_lang]);

		//google.language.getBranding('google_translate_branding');
	}
	else
	{
		trans.innerHTML = '<strong style="color:red">' + gtrans.phrase['language_trans_problem'] + '</strong>';
		//alert(gtrans.phrase['language_trans_problem']);
	}
};

// utility function; works like php's str_replace (kinda)
gtrans.str_replace = function(findtext, replacetext, subject)
{
	var index, len;
	while ((index = subject.indexOf(findtext)) != -1)
	{
		len = findtext.length;
		subject = subject.substr(0, index) + replacetext + subject.substr(index + len);
	}
	return subject;
};

// utility function 
gtrans.htmlspecialchars = function(str)
{
	// .replace(/&/g, '&amp;') // looks like google already does this
	return str.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, "'");
};

// dev debug output
gtrans.dev_debug = function(text)
{
	//gtrans.debug ? alert(text) : false;
	gtrans.debug ? console.log(text) : false;
};

// flag the object as loaded
gtrans.loaded = true;

})();
