/*
* GTranslatifier Jetpack feature v0.2.1.2
* Translate pages or selected text using Google Translate.
* 
* By Elijah Grey, http://eligrey.com
* 
* Inspired by "Jetpack: Google Translator" version 0.1 by Florian CROUZAT:
*   http://jetpack.floriancrouzat.net/google-translator/google-translator.html
* 
* License: GNU GPL v3 and the X11/MIT license
*   See http://purl.eligrey.com/license
*/


const prefs = Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefService),

gt = { // GTranslatifier namespace
	name: "GTranslatifier",
	
	translate: function (clickEvent) {
		var tab = jetpack.tabs.focused,
		selection = String(tab.contentWindow.getSelection())
			.replace(/^\s+|\s+$/g, ""), // trim whitespace
		URI = tab.url,
		button = clickEvent.button,
		translatedURI = "http://translate.google.com/translate";
		
		if (tab.contentWindow.location.hostname === "translate.google.com") {
			// un-translate page
			tab.contentWindow.location.assign(decodeURIComponent(
				URI.split("u=")[1].split("&")[0]
			));
			return;
		}
		
		if (selection.length > 0) { // translate selection (open new tab)
			translatedURI +=
				  "_t"
				+ "?text=" + encodeURIComponent(selection)
				+ "&hl=" + gt.userLocale
				+ "&langpair=auto|" + gt.userLocale
				+ "&tbb=1";
			
			gt.open(translatedURI);
			return
		} else { // translate page
			translatedURI +=
				 "?u=" + encodeURIComponent(URI)
				+ "&hl=" + gt.userLocale
				+ "&langpair=auto|" + gt.userLocale
				+ "&tbb=1";
			
			if (button) { // right or middle click, open in new tab
				gt.open(translatedURI);
			} else { // left click, open in same tab
				tab.contentWindow.location.assign(translatedURI);
			}
			return;
		}
	},
	
	open: function (URI) {
		jetpack.tabs.open(URI).focus();
	},
	
	// To get the supported locales:
	// load http://translate.google.com/
	/* Run:
		var opts = document.querySelector(".tllangdropdown").childNodes,
		locales = {}, // object instead of array to remove dupes
		localesArr = [],
		i = opts.length, locale;
		while (i--) {
			if (!opts.item(i).hasAttribute("disabled")) {
	  			locales[opts.item(i).getAttribute("value")] = null;
			}
		}
		for (locale in locales) {
			if (locales.hasOwnProperty(locale)) {
				localesArr.push(locale);
			}
		}
		prompt("Locales", JSON.stringify(localesArr.sort()).replace(/,\s{0,}/g, ", "));
	*/
	
	supportedLocales: [
		"af", "ar", "be", "bg", "ca", "cs", "cy", "da", "de", "el", "en", "es", "et",
		"fa", "fi", "fr", "ga", "gl", "hi", "hr", "hu", "id", "is", "it", "iw", "ja",
		"ko", "lt", "lv", "mk", "ms", "mt", "nl", "no", "pl", "pt", "ro", "ru", "sk",
		"sl", "sq", "sr", "sv", "sw", "th", "tl", "tr", "uk", "vi", "yi", "zh-CN", "zh-TW"
	],
	
	// 17x18 Google Translate icon
	icon: <![CDATA[
		data:image/png;base64,
		iVBORw0KGgoAAAANSUhEUgAAABEAAAASCAYAAAC9+TVUAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/o
		L2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAA7xJREFUOMt1k21olXUYxn///3mec87Ozoubm246NebWws
		Z8QUWSEqZSWjO33ihFV1iRKaQoZl9SWYQtJFSS+hKlVBapSYk0cinaMl2IpjgnnWi6HTen29k5Zzt7nud
		/92GWH8of3F8vLq7rutV3TWde/3TfMYJBG8fx3GRqIKu1Fs8VUAqUBJyse6zpUMNV7sVr63fJP7i93SKZ
		ARER8cSIm7wtyd5bsuzlRhlTvnysiPB/Z+WGQgA4/UmubdxEbMmT6ILRpM+2kr3aTumm9fgCFt3xTnMvI
		5bnuZgzLXTs/JDbBw+SajmNf1IJ1oQJFCyYD/l5pFNpNr61bBTQBwigAA8wABZodFUVYzZuYOhKOwVLa7
		D9fq7FO/jgRoAFFzpZuughYtHQ90eazmaN54iREanBoax3/OeLGctogUAuw4kETtd1rjfuQDJpenSQtlW
		TeXttncycXoaIlAeVkPUEx/MQMeQEA7Seu9yrtVFkT50gXvc0TqKb+344gms8JjX/iMm4AMqnUMGATcGe
		NPXNw4T9CttnYVkWruuJNu4wiS1bsHbt4PTias7PmkPR5jeJTq1CGW8kONvH1+dSxHr66LjYR0dK4dMgY
		kAptPEUvW1X+ST+K9vKz/NVUYSJW7eR2Pc5Rus7+QtfnB1galkYRyn2nhvEthUAPp9Ga7/NbzULSZcmqV
		5dxtE1MRpeqMfX0ADBHABSQx7xG1nqZkdYOSuXlrYMPSmDQvA8g25ru8T2K03kT4/S199HdJrL1l8+46d
		nnsXvOQDsOZkk4WiWT7F5YkqQ+C2X3zuzI0WLiC4pmcg7LzXSduBPum52MebQ/Xy7+yBPrVuLkx0E4Pz1
		YSLGMHd7B3Ufd9M7YLjSYwDBGLF030DWXbT4MbeycKbJJlyOXzgh48dN5sHpFSi3h0Qabg545E/IRYqi2
		CURxo4Psbd1kPYeBxHxWyuem7cjOqpGyiujFQUvFi8ZvTOmpz0+W4of1epS6Es2v1vEX/46DqyKUVFsgT
		KcalfU73dIZkZGq0RkpIA/CM9YXdmYmpt4JTrHrwfbDVaRovPoTZyOtbR+tIGCWAgxhmv9Lq9+k+Hh8hD
		pk/vT+t8vKiW1Lb77jbLLM44MHw6igojT71AYypOtteOkpDBMJOQnEg5QPi7E+7V5VD+QA2jfXSd3WFO7
		LrZw5by9te/V1hSGC8ntmsGUimn4c2xEBMXIPmwfaBgsHl+c+o/IHarmL6o+HbYjjxxu1hcmlYZtxxkSU
		Cjumh8acmTF8/Plb9ryzxIEOhH4AAAAAElFTkSuQmCC
	]]>.toString().replace(/\s/g, ""),
	
	userLocale: prefs.getBranch("general.useragent.").getCharPref("locale")
};

if (gt.supportedLocales.indexOf(gt.userLocale) === -1) {
	// Google Translate doesn't support the language, try non-region-specific
	gt.userLocale = gt.userLocale.split("-")[0];
	if (gt.supportedLocales.indexOf(gt.userLocale) === -1) { // still not supported
		gt.userLocale = "en"; // default to en (English)
	}
}

// GTranslatifier widget
jetpack.statusBar.append({
	html: <img src={gt.icon} alt={gt.name} title={gt.name}/>.toXMLString(),
	onReady: function (widget) {
		widget.addEventListener("click", gt.translate, false);
	}
});

