// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12612#12612
// Description(1033): Translates selected text using the Google API
// Description(1049): Перевод текста используя Google-API
// Version: 3.5 (2024.09.11)
// Author: VladSh
// 
// Arguments:
// 	-lngS (<lng> / [auto]) - source language; auto - for autodetect
// 	-lngT (<lng> / [ru])   - target language
// 	-dict ([0] / 1)        - prefer to output variants of translations of selected word
// 	-msg ([0] / 1)         - show the result in MessageBox
// 	-resType values in arguments (does not make sense with msg=1):
//			0 - selected text is replaced by the translation
//			1 - copy to clipboard
//			2 - display the result in new tab
//			3 - output to Log-plugin console
// 
// Usage:
// 	-"Translate: Auto -> Ru (Google)" Call("Scripts::Main", 1, "TranslateWithGoogleAPI.js", `-lngT="ru" -msg=1`)		- autodetect source language + display the result in MessageBox
// 	-"Перевести: Ru -> En (Google)" Call("Scripts::Main", 1, "TranslateWithGoogleAPI.js", `-lngS="ru" -lngT="en"`)		- translate ru -> en + source text is replaced by the translation

var langSource = AkelPad.GetArgValue("lngS", "auto");
var langTarget = AkelPad.GetArgValue("lngT", "ru");
var nDict = AkelPad.GetArgValue("dict", 0);
var nMsgBox = AkelPad.GetArgValue("msg", 0);
var nResultType = AkelPad.GetArgValue("resType", 0);

var req = createRequestObject();
if (req) {
	var newline = AkelPad.GetEditNewLine(0);
	var selection = AkelPad.GetSelText(newline);
	if (selection) {
		var resultText;		//в эту переменную возвращается результат в виде текста, иначе undefined
		selection = encodeURIComponent(selection);
		
		var url = "http://translate.google.com/translate_a/single";
		
		var params = "client=gtx&dt=bd&dt=t&dj=1&sl=" + langSource + "&tl=" + langTarget + "&q=" + selection;
		
		try {
			req.open("POST", url, false);
			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			req.onreadystatechange = function() {
				if (req.readyState == 4) {   //только при состоянии "complete"
					if (req.status == 200) {  //только для статуса "OK"
						//обработка ответа
						try {
							resultText = req.responseText;
//							WScript.Echo(resultText);
							eval("var resultObject = " + resultText);
							
							var trns = "";
							if (resultObject['sentences']){
								for (var i = 0; i < resultObject['sentences'].length; i++) {
									trns += resultObject['sentences'][i]['trans'];
								}
							}
							
							var dct = "";
							if (nDict == 1) {
								if (resultObject['dict']) {
									for (var i = 0; i < resultObject['dict'].length; i++) {
										var str = "";
										for (var j = 0; j < resultObject['dict'][i]['terms'].length; j++) {
											str += resultObject['dict'][i]['terms'][j] + "; ";
										}
										dct = dct + '\n' + resultObject['dict'][i]['pos'] + " :: " + str;
									}
								}
							}
							
							resultText = (dct) ? dct : trns;
							
							resultText = resultText.replace(/&amp;/gm, '&');
							resultText = resultText.replace(/&lt;/gm, '<');
							resultText = resultText.replace(/&gt;/gm, '>');
							resultText = resultText.replace(/&quot;/gm, '"');
						}
						catch (e) {
							showErrorMessage('Ошибка ' + e.name + ": " + e.message + ((e.stack) ? "\n" + e.stack : ""));
						}
					}
					else {
						showErrorMessage("Невозможно получить данные" + (req.statusText ? " (" + req.statusText + ")" : "") + "!", true);
					}
				}
			};
			req.send(params);
		}
		catch(e)
			{ showErrorMessage(e, true); }
		
		if (resultText) {
			var nResultAction;
			
			if (nMsgBox == 1) {
				if (resultText != selection) {
					nResultAction = AkelPad.MessageBox(AkelPad.GetEditWnd(), "Результат текста:" + "\r\r" + resultText + "\r\r" + "Да - заменить выбранный (исходный) текст" + "\r" + "Нет - копировать в буфер обмена", WScript.ScriptName, 32 + 3);
					if (nResultAction == 2) WScript.Quit();
				}
				else {
					AkelPad.MessageBox(AkelPad.GetEditWnd(), "Перевод для '" + selection + "' отсутствует.", WScript.ScriptName, 64);
					WScript.Quit();
				}
			}
			else {
				switch (nResultType) {
					case 2:
						AkelPad.SendMessage(AkelPad.GetMainWnd(), 273 /*WM_COMMAND*/, 4101 /*wParam=MAKEWAPARAM(0,IDM_FILE_NEW)*/, 1 /*lParam=TRUE*/);
						AkelPad.SendMessage(AkelPad.GetMainWnd(), 1230 /*AKD_SETNEWLINE*/, 0, newline);		//выставление такого же формата новой строки, как и в исходном файле
						break;
					case 3:
						AkelPad.Call("Log::Output", 4, resultText, -1, 2);
						WScript.Quit();
				}
			}
			if (nResultAction == 7 || nResultType == 1)
				AkelPad.SetClipboardText(resultText);
			else
				AkelPad.ReplaceSel(resultText, -1);
		}
	}
}

function createRequestObject() {
	if (typeof(XMLHttpRequest) === 'undefined') {
		XMLHttpRequest = function() {
			try { return new ActiveXObject("Msxml2.XMLHTTP"); }
			catch(e) {
				try { return new ActiveXObject("Microsoft.XMLHTTP"); }
				catch(e) {
					throw new Error("Ваша система не поддерживает XMLHttpRequest.");
				}
			}
		};
	}
	return new XMLHttpRequest();
}

function showErrorMessage(pText, bQuit) {
	AkelPad.MessageBox(AkelPad.GetEditWnd(), pText, WScript.ScriptName, 16);
	if (bQuit) WScript.Quit();
}