 // я тут внёс изменения (AZJIO) http://akelpad.sourceforge.net/forum/viewtopic.php?p=34216&sid=bb535212a0501b1c1f55a0d84b782830#34216
 // Сложение всех целых чисел в выделенном тексте. Имя файла Calculator2.js. Смотрите изменённый Calculator.js, который вызывает Calculator2.js если строка не является правильным выражением
 // Переменные
 var hMainWnd = AkelPad.GetMainWnd();
 var nSelEnd = AkelPad.GetSelEnd();
 var pSelText = AkelPad.GetSelText();
 var nResult = 0;
 var nError;
 var WM_USER = 1024; // ??? кто её запрашивает

 var hEditWnd = AkelPad.GetEditWnd();
 if(!AkelPad.Include("ShowMenu.js")) WScript.Quit();

 var lpItems; // массив пунктов меню
 var nItem; // число пунктов меню

 // Получение координат меню
 var nX, nY;
 var lpRECT = AkelPad.MemAlloc(16 /*sizeof(RECT)*/ );

 AkelPad.SystemFunction().Call("User32::GetWindowRect", AkelPad.GetEditWnd(), lpRECT);

 nX = AkelPad.MemRead(_PtrAdd(lpRECT, 0), 3 /*DT_DWORD*/ );
 nY = AkelPad.MemRead(_PtrAdd(lpRECT, 4), 3 /*DT_DWORD*/ );
 nX += (AkelPad.MemRead(_PtrAdd(lpRECT, 8), 3 /*DT_DWORD*/ ) - nX) / 2;
 nY += (AkelPad.MemRead(_PtrAdd(lpRECT, 12), 3 /*DT_DWORD*/ ) - nY) / 2;

 AkelPad.MemFree(lpRECT);
 // Конец: Получение координат меню

 if(pSelText) // если выделенно
 {

 	var regexp = /\d+/g;
 	var sItem;
 	var sStrNum = "";
 	var nCount = 0;
 	while((sItem = regexp.exec(pSelText)) != null) {
 		sStrNum += sItem + "+";
 		nCount += 1;
 	}
 	sStrNum = sStrNum.slice(0, -1);

 	if(nCount == 0) // если нет чисел
 	{
 		AkelPad.MessageBox(hMainWnd, "Нет чисел", "Ошибка", 16 /*MB_ICONERROR*/ );
 		WScript.Quit(); // выход, ошибка же
 	}

 	var sep = "+";
 	// Название пункта учитывать что при появлении меню можно нажать первую букву пункта, чтобы вызвать пункт (текущая раскладка клавиатуры учитывается)
 	lpItems = [["+ Сложить числа", MF_NORMAL, 101],
             ["* Умножить", MF_NORMAL, 102],
             ["- Минусовать", MF_NORMAL, 103],
             ["/ Разделить", MF_NORMAL, 104]];
 	nItem = ShowMenu(lpItems, POS_CURSOR, POS_CURSOR);
 	// nItem=ShowMenu(lpItems, nX-250, nY-100);
 	if(nItem == -1)
 		WScript.Quit();
 	else
 		switch(lpItems[nItem][2]) {
 			/*
 			case 101:
 			  sep = "+";
 			  break;
 			*/
 			case 102:
 				sep = "*";
 				break;
 			case 103:
 				sep = "-";
 				break;
 			case 104:
 				sep = "/";
 				break;
 		};
 	sStrNum = sStrNum.replace(/\+/g, sep)
 	// AkelPad.MessageBox(hMainWnd, sStrNum, "Ошибка", 16 /*MB_ICONERROR*/);

 	try // конструкция чтобы исключить сбой кода, просто отправив обработку ошибок в блок catch
 	{
 		with(Math) // Выполнить с видимостью объекта Math
 		{
 			nResult = eval(sStrNum); // Выполнить код, то есть вычислить выражение
 		}
 	}
 	catch(nError) {
 		AkelPad.MessageBox(hMainWnd, nError.description, WScript.ScriptName, 16 /*MB_ICONERROR*/ );
 		WScript.Quit(); // выход, ошибка же
 	}
 	Trace(nResult, GetLangString(1));
 }
 else {
 	// мессага типа "выдели текст"
 	AkelPad.MessageBox(hMainWnd, GetLangString(0), WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/ );
 }

 // Функции
 function Trace(nResult, pLabel) {
 	var nValue;

 	if(nValue = AkelPad.InputBox(hMainWnd, WScript.ScriptName, "n=" + nCount + ", " + pLabel, nResult)) // если жмём "ОК"
 	{
 		AkelPad.SetSel(nSelEnd, nSelEnd);
 		AkelPad.ReplaceSel(" = " + nResult);
 		return parseInt(nValue); // Возвращает целое число
 	}
 	AkelPad.SetclipboardText(nResult);
 	return nResult;
 }

 function GetLangString(nStringID) {
 	var nLangID = AkelPad.GetLangId(1 /*LANGID_PRIMARY*/ );

 	if(nLangID == 0x19) //LANG_RUSSIAN
 	{
 		if(nStringID == 0)
 			return "\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0020\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439\u0020\u0442\u0435\u043A\u0441\u0442\u002E";
 		if(nStringID == 1)
 			return "\u0418\u0442\u043E\u0433\u043E\u0432\u044B\u0439\u0020\u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u003A";
 	}
 	else {
 		if(nStringID == 0)
 			return "No text selected.";
 		if(nStringID == 1)
 			return "Final result:";
 	}
 	return "";
 }