Scripts collection

Discuss and announce AkelPad plugins
  • Author
  • Message
KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Inserts date/time from calendar.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12211#p12211
// Version: 2019-09-27
// Author: KDJ
//
// *** Insert date/time from calendar ***
//
// Usage:
//   Call("Scripts::Main", 1, "InsertDateFromCalendar.js")

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0419) //Russian translation by AZJIO
{
  var sHelp = "	Клавиши быстрого доступа в календаре:\n\n" +
              " Left/Right		- предыдущий/следующий день\n" +
              " Up/Down		- предыдущая/следующая неделя\n" +
              " PgUp/PgDn		- предыдущий/следующий месяц\n" +
              " Ctrl+PgUp/Ctrl+PgDn	- предыдущий/следующий год\n" +
              " Home/End		- первый/последний день месяца\n" +
              " Ctrl+Home/Ctrl+End	- первый/последний видимый день\n" +
              " BackSpace		- перейти к сегодняшнему дню\n" +
              "\n" +
              " Shift+Alt+Left/Right	- сдвинуть календарь влево/вправо\n" +
              " Shift+Alt+Up/Down	- сдвинуть календарь вверх/вниз\n" +
              " Shift+Alt+Home/End	- сдвинуть влево/вправо к краю окна\n" +
              " Shift+Alt+PgUp/PgDn	- сдвинуть вверх/вниз к краю окна\n" +
              " Shift+Alt+C		- центрировать календарь\n" +
              "\n" +
              " +/-			- добавить/удалить месяц из календаря\n" +
              " O (S)			- опции\n" +
              "\n" +
              " Enter\n" +
              " Shift+Enter\n" +
              " Ctrl+Enter\n" +
              " Ctrl+Shift+Enter		- вставить дату/время (см опции)";

  var sHelpDF = " d	- день месяца без предшествующего нуля\n" +
                " dd	- день месяца с предшествующим нулём\n" +
                " ddd	- день недели, трёхбукв. аббревиатура\n" +
                " dddd	- день недели, полное название\n" +
                " M	- месяц без предшествующего нуля\n" +
                " MM	- месяц с предшествующим нулём\n" +
                " MMM	- месяц, трёхбуквенная аббревиатура\n" +
                " MMMM	- месяц, полное название\n" +
                " y	- год, две цифры без предшеств. нуля\n" +
                " yy	- год, две цифры с предшеств. нулём\n" +
                " yyyy	- год, четыре цифры";

  var sHelpTF = " h	- часы без предшествующего нуля (12)\n" +
                " hh	- час с предшествующим нулём (12)\n" +
                " H	- часы без предшествующего нуля (24)\n" +
                " HH	- час с предшествующим нулём (24)\n" +
                " m	- минуты без предшествующего нуля\n" +
                " mm	- минуты с предшествующим нулём\n" +
                " s	- секунды без предшествующего нуля\n" +
                " ss	- секунды с предшествующим нулём\n" +
                " t	- метка времени с 1 символом, (A/P)\n" +
                " tt	- метка времени с 2 символами, (AM/PM)";

  var sTxtOK       = "OK";
  var sTxtOptions  = "Опции";
  var sTxtHelp     = "Справка";
  var sTxtSettings = "Опции";
  var sTxtFormat   = "Формат вставки даты/времени";
  var sTxtSystem   = "Системный";
  var sTxtLongDate = "Длинная дата";
  var sTxtDateForm = "Дата";
  var sTxtTimeForm = "Время";
  var sTxtKeyAssig = "Вставка - горячая клавиша";
  var sTxtDate     = "Дата";
  var sTxtTime     = "Время";
  var sTxtOkBut    = "Кнопка OK";
  var sTxtCalendar = "Календарь";
  var sTxtMonths   = "Количество видимых месяцев";
  var sTxtColor1   = "Фон календаря";
  var sTxtColor2   = "Текст дней месяца";
  var sTxtColor3   = "Фон заголовка месяца";
  var sTxtColor4   = "Текст заголовка месяца";
  var sTxtColor5   = "Начальные и конечные дни";
  var sTxtReset    = "С\n" +
                     "б\n" +
                     "р\n" +
                     "о\n" +
                     "с";
}
else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0415) //Polish
{
  var sHelp = "	Klawisze skrótów dostępne w kalendarzu:\n\n" +
              " Left/Right		- poprzedni/następny dzień\n" +
              " Up/Down		- poprzedni/następny tydzień\n" +
              " PgUp/PgDn		- poprzedni/następny miesiąc\n" +
              " Ctrl+PgUp/Ctrl+PgDn	- poprzedni/następny rok\n" +
              " Home/End		- pierwszy/ostatni dzień miesiąca\n" +
              " Ctrl+Home/Ctrl+End	- pierwszy/ostatni widoczny dzień\n" +
              " BackSpace		- przejdź do dnia dzisiejszego\n" +
              "\n" +
              " Shift+Alt+Left/Right	- przesuń kalendarz w lewo/prawo\n" +
              " Shift+Alt+Up/Down	- przesuń kalendarz w górę/dół\n" +
              " Shift+Alt+Home/End	- przesuń do lewej/prawej krawędzi okna\n" +
              " Shift+Alt+PgUp/PgDn	- przesuń do górnej/dolnej krawędzi okna\n" +
              " Shift+Alt+C		- wyśrodkuj kalendarz\n" +
              "\n" +
              " +/-			- dodaj/usun miesiąc z kalendarza\n" +
              " O (S)			- opcje (ustawnienia)\n" +
              "\n" +
              " Enter\n" +
              " Shift+Enter\n" +
              " Ctrl+Enter\n" +
              " Ctrl+Shift+Enter		- wstaw datę/czas do tekstu (patrz opcje)";

  var sHelpDF = " d	- dzień miesiąca, cyfry bez wiodącego zera\n" +
                " dd	- dzień miesiąca, cyfry z wiodącym zerem\n" +
                " ddd	- dzień tygodnia, trzy-literowy skrót\n" +
                " dddd	- dzień tygodnia, pełna nazwa\n" +
                " M	- miesiąc, cyfry bez wiodącego zera\n" +
                " MM	- miesiąc, cyfry z wiodącym zerem\n" +
                " MMM	- miesiąc, trzy-literowy skrót\n" +
                " MMMM	- miesiąc, pełna nazwa\n" +
                " y	- rok, dwie cyfry bez wiodącego zera\n" +
                " yy	- rok, dwie cyfry z wiodącym zerem\n" +
                " yyyy	- rok, cztery cyfry";

  var sHelpTF = " h	- godziny bez wiodącego zera, zegar 12h\n" +
                " hh	- godziny z wiodącym zerem, zegar 12h\n" +
                " H	- godziny bez wiodącego zera, zegar 24h\n" +
                " HH	- godziny z wiodącym zerem, zegar 24h\n" +
                " m	- minuty bez wiodącego zera\n" +
                " mm	- minuty z wiodącym zerem\n" +
                " s	- sekundy bez wiodącego zera\n" +
                " ss	- sekundy z wiodącym zerem\n" +
                " t	- znacznik czasu jednoznakowy, (A/P)\n" +
                " tt	- znacznik czasu wieloznakowy, (AM/PM)";

  var sTxtOK       = "OK";
  var sTxtOptions  = "Opcje";
  var sTxtHelp     = "Pomoc";
  var sTxtSettings = "Opcje - ustawienia";
  var sTxtFormat   = "Wstaw - format daty/czasu";
  var sTxtSystem   = "System";
  var sTxtLongDate = "Data długa";
  var sTxtDateForm = "Format daty";
  var sTxtTimeForm = "Format czasu";
  var sTxtKeyAssig = "Wstaw - przydzielone klawisze";
  var sTxtDate     = "Data";
  var sTxtTime     = "Czas";
  var sTxtOkBut    = "Przycisk OK";
  var sTxtCalendar = "Kalendarz";
  var sTxtMonths   = "Liczba widocznych miesięcy";
  var sTxtColor1   = "Tło kalendarza";
  var sTxtColor2   = "Tekst dni miesiąca";
  var sTxtColor3   = "Tło nagłówka miesiąca";
  var sTxtColor4   = "Tekst nagłówka miesiąca";
  var sTxtColor5   = "Początkowe i końcowe dni";
  var sTxtReset    = "R\n" +
                     "e\n" +
                     "s\n" +
                     "e\n" +
                     "t";
}
else
{
  var sHelp = "	Shortcut keys in calendar:\n\n" +
              " Left/Right		- previous/next day\n" +
              " Up/Down		- previous/next week\n" +
              " PgUp/PgDn		- previous/next month\n" +
              " Ctrl+PgUp/Ctrl+PgDn	- previous/next year\n" +
              " Home/End		- first/last day of month\n" +
              " Ctrl+Home/Ctrl+End	- first/last day visible in calendar\n" +
              " BackSpace		- go to today\n" +
              "\n" +
              " Shift+Alt+Left/Right	- move calendar left/right\n" +
              " Shift+Alt+Up/Down	- move calendar up/down\n" +
              " Shift+Alt+Home/End	- move to left/right window edge\n" +
              " Shift+Alt+PgUp/PgDn	- move to top/bottom window edge\n" +
              " Shift+Alt+C		- center calendar\n" +
              "\n" +
              " +/-			- add/remove month from calendar\n" +
              " O (S)			- options (settings)\n" +
              "\n" +
              " Enter\n" +
              " Shift+Enter\n" +
              " Ctrl+Enter\n" +
              " Ctrl+Shift+Enter		- insert date/time in text (see options)";

  var sHelpDF = " d	- day of month, digits without leading zero\n" +
                " dd	- day of month, digits with leading zero\n" +
                " ddd	- day of week, three-letter abbreviation\n" +
                " dddd	- day of week, full name\n" +
                " M	- month, digits without leading zero\n" +
                " MM	- month, digits with leading zero\n" +
                " MMM	- month, three-letter abbreviation\n" +
                " MMMM	- month, full name\n" +
                " y	- year, two digits without leading zero\n" +
                " yy	- year, two digits with leading zero\n" +
                " yyyy	- year, four digits";

  var sHelpTF = " h	- hours without leading zero, 12-hour clock\n" +
                " hh	- hours with leading zero, 12-hour clock\n" +
                " H	- hours without leading zero, 24-hour clock\n" +
                " HH	- hours with leading zero, 24-hour clock\n" +
                " m	- minutes without leading zero\n" +
                " mm	- minutes with leading zero\n" +
                " s	- seconds without leading zero\n" +
                " ss	- seconds with leading zero\n" +
                " t	- one char time-marker, such as A or P\n" +
                " tt	- multichar time-marker, such as AM or PM";

  var sTxtOK       = "OK";
  var sTxtOptions  = "Options";
  var sTxtHelp     = "Help";
  var sTxtSettings = "Options - settings";
  var sTxtFormat   = "Insert - date/time format";
  var sTxtSystem   = "System";
  var sTxtLongDate = "Long date";
  var sTxtDateForm = "Date format";
  var sTxtTimeForm = "Time format";
  var sTxtKeyAssig = "Insert - key assignment";
  var sTxtDate     = "Date";
  var sTxtTime     = "Time";
  var sTxtOkBut    = "OK button";
  var sTxtCalendar = "Calendar";
  var sTxtMonths   = "Count of visible months";
  var sTxtColor1   = "Background within a month";
  var sTxtColor2   = "Text within a month";
  var sTxtColor3   = "Background calendar title";
  var sTxtColor4   = "Text calendar title";
  var sTxtColor5   = "Header day and trailing day";
  var sTxtReset    = "R\n" +
                     "e\n" +
                     "s\n" +
                     "e\n" +
                     "t";
}

var DT_QWORD = 2;
var DT_DWORD = 3;
var DT_WORD  = 4;

var oSys        = AkelPad.SystemFunction();
var hMainWnd    = AkelPad.GetMainWnd();
var hEditWnd    = AkelPad.GetEditWnd();
var hInstDLL    = AkelPad.GetInstanceDll();
var sClassName  = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var hGuiFont    = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var nOsVer      = GetOsVersion();
var lpSysTime   = AkelPad.MemAlloc(16); //SYSTEMTIME
var bSystem     = 1;
var bLongDate   = 0;
var sDateForm   = "yyyy-MM-dd";
var sTimeForm   = "HH:mm:ss";
var aKeyAssign  = [["Enter", 1], ["Shift+Enter", 0], ["Ctrl+Enter", 2], ["Ctrt+Shift+Enter", 3], [sTxtOkBut, 1]];
var nMonthCount = 1;
var nMonthMax   = 7;
var aColor;
var hDlgCal;
var hWndCal;
var hWndOK;
var hWndOpt;
var hWndF1;
var hBrushColor;
var bResetColors;
var aCalPos;
var aSetPos;

ReadWriteIni(0);

var aWnd         = [];
var IDFORMAT     = 1000;
var IDDATE       = 1001;
var IDTIME       = 1002;
var IDSYSTEM     = 1003;
var IDLONGDATE   = 1004;
var IDDF         = 1005;
var IDDFHLP      = 1006;
var IDDFDESCR    = 1007;
var IDTF         = 1008;
var IDTFHLP      = 1009;
var IDTFDESCR    = 1010;
var IDKEYASSIG   = 1011;
var IDASSIG0     = 1012;
var IDASSIG1     = 1013;
var IDASSIG2     = 1014;
var IDASSIG3     = 1015;
var IDASSIG4     = 1016;
var IDENTER      = 1017;
var IDSHENTER    = 1018;
var IDCTENTER    = 1019;
var IDCTSHENTER  = 1020;
var IDOKBUT      = 1021;
var IDCALENDAR   = 1022;
var IDMONTHCOUNT = 1023;
var IDMONTHDESCR = 1024;
var IDCOLOR1     = 1025;
var IDCOLOR2     = 1026;
var IDCOLOR3     = 1027;
var IDCOLOR4     = 1028;
var IDCOLOR5     = 1029;
var IDCOLOR1BUTT = 1030;
var IDCOLOR2BUTT = 1031;
var IDCOLOR3BUTT = 1032;
var IDCOLOR4BUTT = 1033;
var IDCOLOR5BUTT = 1034;
var IDRESET      = 1035;
var IDDFHLPTXT   = 1036;
var IDTFHLPTXT   = 1037;

var CLASS   = 0;
var WND     = 1;
var EXSTYLE = 2;
var STYLE   = 3;
var X       = 4;
var Y       = 5;
var W       = 6;
var H       = 7;
var TXT     = 8;

AkelPad.WindowRegisterClass(sClassName);

do
{
  hDlgCal = oSys.Call("User32::CreateWindowEx" + _TCHAR,
              0,               //dwExStyle
              sClassName,      //lpClassName
              sTxtCalendar,    //lpWindowName
              0x90C80000,      //dwStyle=WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
              0,               //x
              0,               //y
              0,               //nWidth
              0,               //nHeight
              hMainWnd,        //hWndParent
              0,               //ID
              hInstDLL,        //hInstance
              DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

  //Disable main window, to make dialog modal
  oSys.Call("User32::EnableWindow", hMainWnd, false);

  //Message loop
  AkelPad.WindowGetMessage();
}
while (bResetColors);

AkelPad.MemFree(lpSysTime);
AkelPad.WindowUnregisterClass(sClassName);

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    hWndCal = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                0,               //dwExStyle
                "SysMonthCal32", //lpClassName
                0,               //lpWindowName
                0x50800004,      //WS_VISIBLE|WS_CHILD|WS_BORDER|MCS_WEEKNUMBERS
                0,               //x
                0,               //y
                0,               //nWidth
                0,               //nHeight
                hWnd,            //hWndParent
                0,               //ID
                hInstDLL,        //hInstance
                0);              //lpParam
    AkelPad.SendMessage(hWndCal, 0x1014 /*MCM_SETMONTHDELTA*/, 1, 0);

    hWndOK = oSys.Call("User32::CreateWindowEx" + _TCHAR,
               0,          //dwExStyle
               "BUTTON",   //lpClassName
               sTxtOK,     //lpWindowName
               0x50000001, //WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON
               0,          //x
               0,          //y
               0,          //nWidth
               0,          //nHeight
               hWnd,       //hWndParent
               0,          //ID
               hInstDLL,   //hInstance
               0);         //lpParam

    hWndOpt = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                0,           //dwExStyle
                "BUTTON",    //lpClassName
                sTxtOptions, //lpWindowName
                0x50000000,  //WS_VISIBLE|WS_CHILD
                0,           //x
                0,           //y
                0,           //nWidth
                0,           //nHeight
                hWnd,        //hWndParent
                0,           //ID
                hInstDLL,    //hInstance
                0);          //lpParam

    hWndF1 = oSys.Call("User32::CreateWindowEx" + _TCHAR,
               0,           //dwExStyle
               "BUTTON",    //lpClassName
               "? (F1)",    //lpWindowName
               0x50000000,  //WS_VISIBLE|WS_CHILD
               0,           //x
               0,           //y
               0,           //nWidth
               0,           //nHeight
               hWnd,        //hWndParent
               0,           //ID
               hInstDLL,    //hInstance
               0);          //lpParam

    SetWindowFont(hWndOK,  hGuiFont);
    SetWindowFont(hWndOpt, hGuiFont);
    SetWindowFont(hWndF1,  hGuiFont);

    SetWindowSize(hWnd);
    MoveWindow(hMainWnd, hWnd, (bResetColors ? aCalPos : ""));

    if (aColor)
    {
      for (var i = 1; i < 6; ++i)
        AkelPad.SendMessage(hWndCal, 0x100A /*MCM_SETCOLOR*/, i, aColor[i]);
    }
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hWndCal);

  else if (uMsg == 0x0F) //WM_PAINT
  {
    if (bResetColors)
    {
      AkelPad.SendMessage(hWndCal, 0x1002 /*MCM_SETCURSEL*/, 0, lpSysTime);
      AkelPad.SendMessage(hWnd, 256 /*WM_KEYDOWN*/, 0x4F /*O*/, 0);
    }
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 0x25 /*VK_LEFT*/) && (nOsVer < 6 /*Vista*/))
      SetDate(-1);
    else if ((wParam == 0x27 /*VK_RIGHT*/) && (nOsVer < 6))
      SetDate(1);
    else if ((wParam == 0x26 /*VK_UP*/) && (nOsVer < 6))
      SetDate(-7);
    else if ((wParam == 0x28 /*VK_DOWN*/) && (nOsVer < 6))
      SetDate(7);
    else if (wParam == 0x08 /*VK_BACK*/)
      SetDate(0); //today
    else if (wParam == 13) //VK_RETURN
    {
      if ((oSys.Call("User32::GetAsyncKeyState", 0x10 /*VK_SHIFT*/)) && (oSys.Call("User32::GetAsyncKeyState", 0x11 /*VK_CONTROL*/)))
        InsertDateTime(aKeyAssign[3][1]);
      else if (oSys.Call("User32::GetAsyncKeyState", 0x10 /*VK_SHIFT*/))
        InsertDateTime(aKeyAssign[1][1]);
      else if (oSys.Call("User32::GetAsyncKeyState", 0x11 /*VK_CONTROL*/))
        InsertDateTime(aKeyAssign[2][1]);
      else
        InsertDateTime(aKeyAssign[0][1]);
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    else if ((wParam == 109) || (wParam == 189))  //Num- or -
    {
      if (nMonthCount > 1)
      {
        --nMonthCount;
        SetWindowSize(hWnd);
        MoveWindow(hMainWnd, hWnd, "CV");
      }
    }
    else if ((wParam == 107) || (wParam == 187)) //Num+ or +
    {
      if (nMonthCount < nMonthMax)
      {
        ++nMonthCount;
        SetWindowSize(hWnd);
        MoveWindow(hMainWnd, hWnd, "CV");
      }
    }
    else if (wParam == 112) //VK_F1
      Help();
    else if ((wParam == 0x4F) || (wParam == 0x53)) //O or S
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, 0, hWndOpt);

    oSys.Call("User32::SetFocus", hWndCal);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if (oSys.Call("User32::GetAsyncKeyState", 0x10 /*VK_SHIFT*/))
    {
      if (wParam == 0x27) //VK_RIGHT
        MoveWindow(0, hWnd, "R");
      else if (wParam == 0x25) //VK_LEFT
        MoveWindow(0, hWnd, "L");
      else if (wParam == 0x28) //VK_DOWN
        MoveWindow(0, hWnd, "D");
      else if (wParam == 0x26) //VK_UP
        MoveWindow(0, hWnd, "U");
      else if (wParam == 0x23) //VK_END
        MoveWindow(0, hWnd, "E");
      else if (wParam == 0x24) //VK_HOME
        MoveWindow(0, hWnd, "H");
      else if (wParam == 0x22) //VK_NEXT
        MoveWindow(0, hWnd, "B");
      else if (wParam == 0x21) //VK_PRIOR
        MoveWindow(0, hWnd, "T");
      else if (wParam == 0x43) //C
        MoveWindow(hEditWnd, hWnd, "C");
    }
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    if (lParam == hWndOK)
    {
      InsertDateTime(aKeyAssign[4][1]);
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (lParam == hWndOpt)
    {
      AkelPad.SendMessage(hWndOpt, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
      AkelPad.SendMessage(hWndOK,  0x00F4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);

      Settings();
      if (bResetColors)
        oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (lParam == hWndF1)
    {
      AkelPad.SendMessage(hWndF1, 0x00F4 /*BM_SETSTYLE*/, 0 /*BS_PUSHBUTTON*/, 1);
      AkelPad.SendMessage(hWndOK, 0x00F4 /*BM_SETSTYLE*/, 1 /*BS_DEFPUSHBUTTON*/, 1);
      Help();
    }
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    ReadWriteIni(1);

    oSys.Call("User32::EnableWindow", hMainWnd, true);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("User32::PostQuitMessage", 0);

  return 0;
}

function GetOsVersion()
{
  var nVerLen = 4 * 5 + 128 * _TSIZE; //sizeof(OSVERSIONINFO)
  var lpOsVer = AkelPad.MemAlloc(nVerLen);
  var nMajorVer;

  AkelPad.MemCopy(lpOsVer, nVerLen, 3 /*DT_DWORD*/);
  oSys.Call("Kernel32::GetVersionEx" + _TCHAR, lpOsVer);
  nMajorVer = AkelPad.MemRead(_PtrAdd(lpOsVer, 4), 3 /*DT_DWORD*/);
  AkelPad.MemFree(lpOsVer);

  return nMajorVer;
}

function GetWindowText(hWnd)
{
  var lpBuffer = AkelPad.MemAlloc(256 * _TSIZE);
  var sText;

  oSys.Call("User32::GetWindowText" + _TCHAR, hWnd, lpBuffer, 256);
  sText = AkelPad.MemRead(lpBuffer, _TSTR);
  AkelPad.MemFree(lpBuffer);
  return sText;
}

function SetWindowText(hWnd, sText)
{
  oSys.Call("User32::SetWindowText" + _TCHAR, hWnd, sText);
}

function SetWindowFont(hWnd, hFont)
{
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
}

function SetWindowSize(hDlg)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  var nCY    = oSys.Call("User32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);
  var nFX    = oSys.Call("User32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/);
  var nFY    = oSys.Call("User32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/);
  var nW, nH, nBW;

  AkelPad.SendMessage(hWndCal, 0x1009 /*MCM_GETMINREQRECT*/, 0, lpRect);

  nW  = Math.max(AkelPad.MemRead(_PtrAdd(lpRect, 8), DT_DWORD), AkelPad.SendMessage(hWndCal, 0x1015 /*MCM_GETMAXTODAYWIDTH*/, 0, 0));
  nH  = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) * nMonthCount - ((nOsVer < 6) ? 13 : 27) * (nMonthCount - 1);
  nBW = Math.round((nW - 20) / 3);

  oSys.Call("User32::SetWindowPos", hDlg,    0, 0, 0, nW + 2 * nFX, nH + 2 * nFY + nCY + 30, 0x16 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE*/);

  oSys.Call("User32::SetWindowPos", hWndCal, 0, 0, 0, nW, nH, 0x16 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE*/);

  oSys.Call("User32::SetWindowPos", hWndOK,  0, 5,            nH + 5, nBW, 21, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", hWndOpt, 0, nBW + 10,     nH + 5, nBW, 21, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);
  oSys.Call("User32::SetWindowPos", hWndF1,  0, nW - nBW - 5, nH + 5, nBW, 21, 0x14 /*SWP_NOZORDER|SWP_NOACTIVATE*/);

  AkelPad.MemFree(lpRect);
}

function MoveWindow(hWndParent, hWnd, sAction)
{
  var aRectParent;
  var aRect;
  var lpPoint;
  var nX;
  var nY;
  var nWndWidth;
  var nWndHeight;
  var nCharHeight;

  if (! hWndParent)
    hWndParent = oSys.Call("User32::GetDesktopWindow");

  aRectParent = GetWindowPos(hWndParent);
  aRect       = GetWindowPos(hWnd);

  nX = aRect.left;
  nY = aRect.top;

  if (! sAction) //to caret
  {
    if (lpPoint = AkelPad.MemAlloc(8)) //sizeof(POINT)
    {
      AkelPad.SendMessage(hEditWnd, 3190 /*AEM_GETCARETPOS*/, lpPoint, 0);
      oSys.Call("User32::ClientToScreen", hEditWnd, lpPoint);
      nX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), DT_DWORD);
      nY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), DT_DWORD);

      nWndWidth   = aRect.right - aRect.left;
      nWndHeight  = aRect.bottom - aRect.top;
      nCharHeight = AkelPad.SendMessage(hEditWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);

      if ((nX + nWndWidth) > aRectParent.right)
        nX = aRectParent.right - nWndWidth - 10;

      if ((nY + nCharHeight + nWndHeight) < aRectParent.bottom)
        nY = nY + nCharHeight;
      else if ((nY - nWndHeight) > aRectParent.top)
        nY = nY - nWndHeight;
      else
        nY = aRectParent.top  + ((aRectParent.bottom - aRectParent.top) / 2 - (aRect.bottom - aRect.top) / 2);

      AkelPad.MemFree(lpPoint);
    }
  }
  else if (sAction == "R") //Move right
    nX = aRect.left + ((aRect.right < aRectParent.right) ? 10: 0);
  else if (sAction == "L") //Move left
    nX = aRect.left - ((aRect.left > aRectParent.left) ? 10: 0);
  else if (sAction == "D") //Move down
    nY = aRect.top + ((aRect.bottom < aRectParent.bottom) ? 10: 0);
  else if (sAction == "U") //Move up
    nY = aRect.top - ((aRect.top > aRectParent.top) ? 10: 0);
  else if (sAction == "E") //Move end (right)
    nX = aRect.left + (aRectParent.right - aRect.right);
  else if (sAction == "H") //Move home (left)
    nX = aRect.left + (aRectParent.left - aRect.left);
  else if (sAction == "B") //Move bottom
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  else if (sAction == "T") //Move top
    nY = aRect.top + (aRectParent.top - aRect.top);
  else if (sAction == "C") //Center window
  {
    nX = aRectParent.left + ((aRectParent.right  - aRectParent.left) / 2 - (aRect.right  - aRect.left) / 2);
    nY = aRectParent.top  + ((aRectParent.bottom - aRectParent.top)  / 2 - (aRect.bottom - aRect.top)  / 2);
  }
  else if (sAction == "CV") //Center vertically
  {
    nY = aRectParent.top  + ((aRectParent.bottom - aRectParent.top)  / 2 - (aRect.bottom - aRect.top)  / 2);
  }
  else if (sAction == "LT") //Move left top
  {
    nX = aRectParent.left;
    nY = aRectParent.top;
  }
  else if (sAction == "RT") //Move right top
  {
    nX = aRect.left + (aRectParent.right - aRect.right);
    nY = aRectParent.top;
  }
  else if (sAction == "LB") //Move left bottom
  {
    nX = aRectParent.left;
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  }
  else if (sAction == "RB") //Move right bottom
  {
    nX = aRect.left + (aRectParent.right - aRect.right);
    nY = aRect.top + (aRectParent.bottom - aRect.bottom);
  }
  else
  {
    nX = sAction.left;
    nY = sAction.top;
  }

  oSys.Call("User32::SetWindowPos", hWnd, 0, nX, nY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}

function GetWindowPos(hWnd)
{
  var lpRect = AkelPad.MemAlloc(16) //sizeof(RECT);
  var aRect  = [];

  oSys.Call("User32::GetWindowRect", hWnd, lpRect);

  aRect.left   = AkelPad.MemRead(_PtrAdd(lpRect,  0), DT_DWORD);
  aRect.top    = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  aRect.right  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  aRect.bottom = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD);
  AkelPad.MemFree(lpRect);

  return aRect;
}

function LoWord(nParam)
{
  return (nParam & 0xFFFF);
}

function HiWord(nParam)
{
  return ((nParam >> 16) & 0xFFFF);
}

function ReadWriteIni(bWrite)
{
  var sIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
  var oFile;
  var sIniTxt;

  if (bWrite)
  {
    sIniTxt = 'bSystem='          + bSystem     + ';\r\n' +
              'bLongDate='        + bLongDate   + ';\r\n' +
              'sDateForm="'       + sDateForm.replace(/[\\"]/g, "\\$&") + '";\r\n' +
              'sTimeForm="'       + sTimeForm.replace(/[\\"]/g, "\\$&") + '";\r\n' +
              'aKeyAssign[0][1]=' + aKeyAssign[0][1] + ';\r\n' +
              'aKeyAssign[1][1]=' + aKeyAssign[1][1] + ';\r\n' +
              'aKeyAssign[2][1]=' + aKeyAssign[2][1] + ';\r\n' +
              'aKeyAssign[3][1]=' + aKeyAssign[3][1] + ';\r\n' +
              'aKeyAssign[4][1]=' + aKeyAssign[4][1] + ';\r\n' +
              'nMonthCount='      + nMonthCount + ';\r\n' +
              'aColor='

    if (aColor)
      sIniTxt += '[' + aColor + ']';
    else
      sIniTxt += aColor;

    sIniTxt += ';';

    oFile = oFSO.OpenTextFile(sIniName, 2, true, -1);
    oFile.Write(sIniTxt);
    oFile.Close();
  }

  else if (oFSO.FileExists(sIniName))
  {
    try
    {
      eval(AkelPad.ReadFile(sIniName));
    }
    catch (oError)
    {
    }
  }
}

function SetDate(nShift)
{
  var nYear, nMonth, nDay, dDate;

  if (nShift)
  {
    AkelPad.SendMessage(hWndCal, 0x1001 /*MCM_GETCURSEL*/, 0, lpSysTime);

    nYear  = AkelPad.MemRead(_PtrAdd(lpSysTime, 0), DT_WORD);
    nMonth = AkelPad.MemRead(_PtrAdd(lpSysTime, 2), DT_WORD) - 1;
    nDay   = AkelPad.MemRead(_PtrAdd(lpSysTime, 6), DT_WORD);
    dDate  = new Date(nYear, nMonth, nDay);

    dDate.setDate(nDay + nShift);

    nYear  = dDate.getFullYear();
    nMonth = dDate.getMonth() + 1;
    nDay   = dDate.getDate();

    AkelPad.MemCopy(_PtrAdd(lpSysTime, 0), nYear,  DT_WORD);
    AkelPad.MemCopy(_PtrAdd(lpSysTime, 2), nMonth, DT_WORD);
    AkelPad.MemCopy(_PtrAdd(lpSysTime, 6), nDay,   DT_WORD);
  }
  else
    AkelPad.SendMessage(hWndCal, 0x100D /*MCM_GETTODAY*/, 0, lpSysTime);

  AkelPad.SendMessage(hWndCal, 0x1002 /*MCM_SETCURSEL*/, 0, lpSysTime);
}

function GetDate()
{
  var lpString = AkelPad.MemAlloc(256 * _TSIZE);
  var lpFormat = AkelPad.MemAlloc(256 * _TSIZE);
  var nFlag    = 0;
  var sDate;

  AkelPad.SendMessage(hWndCal, 0x1001 /*MCM_GETCURSEL*/, 0, lpSysTime);

  if (bSystem)
    nFlag = bLongDate ? 0x2 /*DATE_LONGDATE*/ : 0x1 /*DATE_SHORTDATE*/;
  else
    AkelPad.MemCopy(lpFormat, sDateForm, _TSTR);

  oSys.Call("Kernel32::GetDateFormat" + _TCHAR,
            0x400, //LOCALE_USER_DEFAULT
            nFlag,
            lpSysTime,
            (bSystem ? 0 : lpFormat),
            lpString,
            256);
  sDate = AkelPad.MemRead(lpString, _TSTR);

  AkelPad.MemFree(lpString);
  AkelPad.MemFree(lpFormat);

  return sDate;
}

function GetTime()
{
  var lpString = AkelPad.MemAlloc(256 * _TSIZE);
  var lpFormat = AkelPad.MemAlloc(256 * _TSIZE);
  var dDate    = new Date();
  var sTime;

  AkelPad.MemCopy(_PtrAdd(lpSysTime,  8), dDate.getHours(),        DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 10), dDate.getMinutes(),      DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 12), dDate.getSeconds(),      DT_WORD);
  AkelPad.MemCopy(_PtrAdd(lpSysTime, 14), dDate.getMilliseconds(), DT_WORD);

  if (! bSystem)
    AkelPad.MemCopy(lpFormat, sTimeForm, _TSTR);

  oSys.Call("Kernel32::GetTimeFormat" + _TCHAR,
            0x007F, //LOCALE_INVARIANT
            0,
            lpSysTime,
            (bSystem ? 0 : lpFormat),
            lpString,
            256);
  sTime = AkelPad.MemRead(lpString, _TSTR);

  AkelPad.MemFree(lpString);
  AkelPad.MemFree(lpFormat);

  return sTime;
}

function InsertDateTime(nWhat)
{
  var bColSel = AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
  var sDateTime;
  var nLines;
  var aTxt;
  var i;

  if (nWhat == 0)
    sDateTime = GetDate();
  else if (nWhat == 1)
    sDateTime = GetDate() + " " + GetTime();
  else if (nWhat == 2)
    sDateTime = GetTime();
  else
    sDateTime = GetTime() + " " + GetDate();

  if (bColSel)
  {
    nLines = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 2 /*AEGL_LASTSELLINE*/, 0) - AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 1 /*AEGL_FIRSTSELLINE*/, 0) + 1;
    aTxt   = [];

    for (i = 0; i < nLines; ++i)
      aTxt[i] = sDateTime;

    sDateTime = aTxt.join("\r");
  }

  AkelPad.ReplaceSel(sDateTime, (AkelPad.GetSelStart() == AkelPad.GetSelEnd()) ? 0 : -1);
  AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, bColSel, 0);
}

function Help()
{
  var aRectDesk = GetWindowPos(oSys.Call("User32::GetDesktopWindow"));
  var aRect     = GetWindowPos(hDlgCal);
  var nWidth    = 360;
  var nHeight   = 355;
  var nX        = aRect.right;
  var nY        = aRect.top;
  var hDlgHlp;

  if ((nX + nWidth) > aRectDesk.right)
    nX = aRect.left - nWidth;
  if ((nY + nHeight) > aRectDesk.bottom)
    nY = aRect.bottom - nHeight;

  hDlgHlp = oSys.Call("User32::CreateWindowEx" + _TCHAR,
              0,          //dwExStyle
              sClassName, //lpClassName
              sTxtHelp,   //lpWindowName
              0x90C80000, //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
              nX,         //x
              nY,         //y
              nWidth,     //nWidth
              nHeight,    //nHeight
              hDlgCal,    //hWndParent
              0,          //ID
              hInstDLL,   //hInstance
              DialogCallbackHlp); //Script function callback

  oSys.Call("User32::EnableWindow", hDlgCal, 0);
}

function DialogCallbackHlp(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    hWndHlp = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                0x000,      //dwExStyle
                "STATIC",   //lpClassName
                sHelp,      //lpWindowName
                0x50800000, //WS_VISIBLE|WS_CHILD|WS_BORDER
                10,         //x
                10,         //y
                335,        //nWidth
                305,        //nHeight
                hWnd,       //hWndParent
                0,          //ID
                hInstDLL,   //hInstance
                0);         //lpParam
    SetWindowFont(hWndHlp, hGuiFont);
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 112 /*VK_F1*/)
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    if (LoWord(wParam) == 2 /*IDCANCEL*/)
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    oSys.Call("User32::EnableWindow", hDlgCal, 1);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  return 0;
}

function Settings()
{
  var nWidth  = 270
  var nHeight = 490;
  var aRectDesk;
  var aRect;
  var nX;
  var nY;
  var hDlgSet;
  var i;

  if (bResetColors)
  {
    nX = aSetPos.left;
    nY = aSetPos.top;
  }
  else
  {
    aRectDesk = GetWindowPos(oSys.Call("User32::GetDesktopWindow"));
    aRect     = GetWindowPos(hDlgCal);
    nX        = aRect.right;
    nY        = aRect.top;

    if ((nX + nWidth) > aRectDesk.right)
      nX = aRect.left - nWidth;
    if ((nY + nHeight) > aRectDesk.bottom)
      nY = aRect.bottom - nHeight;
  }

  if (! aColor)
  {
    //i=0 - MCSC_BACKGROUND (not used)
    //i=4 - MCSC_MONTHBK
    //i=1 - MCSC_TEXT
    //i=2 - MCSC_TITLEBK
    //i=3 - MCSC_TITLETEXT
    //i=5 - MCSC_TRAILINGTEXT
    aColor = [];
    for (i = 1; i < 6; ++i)
      aColor[i] = AkelPad.SendMessage(hWndCal, 0x100B /*MCM_GETCOLOR*/, i, 0);
  }

  //0x40400000 - WS_CHILD|WS_DLGFRAME (no visible)
  //0x50000000 - WS_VISIBLE|WS_CHILD
  //0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
  //0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
  //0x50012000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_MULTILINE
  //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
  //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|CBS_DROPDOWNLIST
  //0x50010080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
  //0x50800000 - WS_VISIBLE|WS_CHILD|WS_BORDER
  //Windows                CLASS, WND, EXSTYLE,      STYLE,   X,   Y,   W,   H, TXT
  aWnd[IDFORMAT    ] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 245, 130, sTxtFormat];
  aWnd[IDDATE      ] = ["STATIC",   0,       0, 0x50000000,  20,  30, 220,  13, ""];
  aWnd[IDTIME      ] = ["STATIC",   0,       0, 0x50000000,  20,  50, 220,  13, ""];
  aWnd[IDSYSTEM    ] = ["BUTTON",   0,       0, 0x50010003,  20,  70,  80,  16, sTxtSystem];
  aWnd[IDLONGDATE  ] = ["BUTTON",   0,       0, 0x50010003, 120,  70,  90,  16, sTxtLongDate];
  aWnd[IDDF        ] = ["EDIT",     0,   0x200, 0x50010080,  20,  90, 135,  20, sDateForm];
  aWnd[IDDFHLP     ] = ["BUTTON",   0,       0, 0x50010000, 155,  90,  15,  20, "?"];
  aWnd[IDDFDESCR   ] = ["STATIC",   0,       0, 0x50000000, 175,  93,  70,  13, sTxtDateForm];
  aWnd[IDTF        ] = ["EDIT",     0,   0x200, 0x50010080,  20, 110, 135,  20, sTimeForm];
  aWnd[IDTFHLP     ] = ["BUTTON",   0,       0, 0x50010000, 155, 110,  15,  20, "?"];
  aWnd[IDTFDESCR   ] = ["STATIC",   0,       0, 0x50000000, 175, 113,  70,  13, sTxtTimeForm];
  aWnd[IDKEYASSIG  ] = ["BUTTON",   0,       0, 0x50000007,  10, 150, 245, 130, sTxtKeyAssig];
  aWnd[IDASSIG0    ] = ["COMBOBOX", 0,       0, 0x50010003,  20, 170, 100,  20, ""];
  aWnd[IDASSIG1    ] = ["COMBOBOX", 0,       0, 0x50010003,  20, 190, 100,  20, ""];
  aWnd[IDASSIG2    ] = ["COMBOBOX", 0,       0, 0x50010003,  20, 210, 100,  20, ""];
  aWnd[IDASSIG3    ] = ["COMBOBOX", 0,       0, 0x50010003,  20, 230, 100,  20, ""];
  aWnd[IDASSIG4    ] = ["COMBOBOX", 0,       0, 0x50010003,  20, 250, 100,  20, ""];
  aWnd[IDENTER     ] = ["STATIC",   0,       0, 0x50000000, 125, 173,  80,  13, aKeyAssign[0][0]];
  aWnd[IDSHENTER   ] = ["STATIC",   0,       0, 0x50000000, 125, 193,  80,  13, aKeyAssign[1][0]];
  aWnd[IDCTENTER   ] = ["STATIC",   0,       0, 0x50000000, 125, 213,  80,  13, aKeyAssign[2][0]];
  aWnd[IDCTSHENTER ] = ["STATIC",   0,       0, 0x50000000, 125, 233,  80,  13, aKeyAssign[3][0]];
  aWnd[IDOKBUT     ] = ["STATIC",   0,       0, 0x50000000, 125, 253,  80,  13, aKeyAssign[4][0]];
  aWnd[IDCALENDAR  ] = ["BUTTON",   0,       0, 0x50000007,  10, 290, 245, 160, sTxtCalendar];
  aWnd[IDMONTHCOUNT] = ["COMBOBOX", 0,       0, 0x50010003,  20, 310,  40,  20, ""];
  aWnd[IDMONTHDESCR] = ["STATIC",   0,       0, 0x50000000,  65, 313, 180,  13, sTxtMonths];
  aWnd[IDCOLOR1    ] = ["STATIC",   0,       0, 0x50800000,  20, 340,  18,  18, ""];
  aWnd[IDCOLOR2    ] = ["STATIC",   0,       0, 0x50800000,  20, 360,  18,  18, ""];
  aWnd[IDCOLOR3    ] = ["STATIC",   0,       0, 0x50800000,  20, 380,  18,  18, ""];
  aWnd[IDCOLOR4    ] = ["STATIC",   0,       0, 0x50800000,  20, 400,  18,  18, ""];
  aWnd[IDCOLOR5    ] = ["STATIC",   0,       0, 0x50800000,  20, 420,  18,  18, ""];
  aWnd[IDCOLOR1BUTT] = ["BUTTON",   0,       0, 0x50010000,  45, 340, 175,  20, sTxtColor1];
  aWnd[IDCOLOR2BUTT] = ["BUTTON",   0,       0, 0x50010000,  45, 360, 175,  20, sTxtColor2];
  aWnd[IDCOLOR3BUTT] = ["BUTTON",   0,       0, 0x50010000,  45, 380, 175,  20, sTxtColor3];
  aWnd[IDCOLOR4BUTT] = ["BUTTON",   0,       0, 0x50010000,  45, 400, 175,  20, sTxtColor4];
  aWnd[IDCOLOR5BUTT] = ["BUTTON",   0,       0, 0x50010000,  45, 420, 175,  20, sTxtColor5];
  aWnd[IDRESET     ] = ["BUTTON",   0,       0, 0x50012000, 225, 340,  20, 100, sTxtReset];
  aWnd[IDDFHLPTXT  ] = ["STATIC",   0,       0, 0x40400000,   0, 110, 265, 155, sHelpDF];
  aWnd[IDTFHLPTXT  ] = ["STATIC",   0,       0, 0x40400000,   0, 130, 265, 140, sHelpTF];

  hDlgSet = oSys.Call("User32::CreateWindowEx" + _TCHAR,
              0,            //dwExStyle
              sClassName,   //lpClassName
              sTxtSettings, //lpWindowName
              0x90C80000,   //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
              nX,           //x
              nY,           //y
              nWidth,       //nWidth
              nHeight,      //nHeight
              hDlgCal,      //hWndParent
              0,            //ID
              hInstDLL,     //hInstance
              DialogCallbackSet); //Script function callback

  oSys.Call("User32::EnableWindow", hDlgCal, 0);
  AkelPad.WindowGetMessage(0x4 /*WGM_KEYDOWNUP*/);
}

function DialogCallbackSet(hWnd, uMsg, wParam, lParam)
{
  var i, nID, nCode;

  if (uMsg == 1) //WM_CREATE
  {
    for (i = 1000; i < aWnd.length; ++i)
    {
      aWnd[i][WND] = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                       aWnd[i][EXSTYLE],//dwExStyle
                       aWnd[i][CLASS],  //lpClassName
                       0,               //lpWindowName
                       aWnd[i][STYLE],  //dwStyle
                       aWnd[i][X],      //x
                       aWnd[i][Y],      //y
                       aWnd[i][W],      //nWidth
                       aWnd[i][H],      //nHeight
                       hWnd,            //hWndParent
                       i,               //ID
                       hInstDLL,        //hInstance
                       0);              //lpParam
      SetWindowFont(aWnd[i][WND], hGuiFont);
      SetWindowText(aWnd[i][WND], aWnd[i][TXT]);
    }

    //Set limit edit text
    AkelPad.SendMessage(aWnd[IDDF][WND], 197 /*EM_SETLIMITTEXT*/, 24, 0);
    AkelPad.SendMessage(aWnd[IDTF][WND], 197 /*EM_SETLIMITTEXT*/, 24, 0);

    //Fill comboboxes
    for (i = 0; i < aKeyAssign.length; ++i)
    {
      AkelPad.SendMessage(aWnd[IDASSIG0 + i][WND], 0x143 /*CB_ADDSTRING*/, 0, sTxtDate);
      AkelPad.SendMessage(aWnd[IDASSIG0 + i][WND], 0x143 /*CB_ADDSTRING*/, 0, sTxtDate + " " + sTxtTime);
      AkelPad.SendMessage(aWnd[IDASSIG0 + i][WND], 0x143 /*CB_ADDSTRING*/, 0, sTxtTime);
      AkelPad.SendMessage(aWnd[IDASSIG0 + i][WND], 0x143 /*CB_ADDSTRING*/, 0, sTxtTime + " " + sTxtDate);
      AkelPad.SendMessage(aWnd[IDASSIG0 + i][WND], 0x14E /*CB_SETCURSEL*/, aKeyAssign[i][1], 0);
    }
    for (i = 1; i < nMonthMax + 1; ++i)
      AkelPad.SendMessage(aWnd[IDMONTHCOUNT][WND], 0x143 /*CB_ADDSTRING*/, 0, " " + i + " ");
    AkelPad.SendMessage(aWnd[IDMONTHCOUNT][WND], 0x14E /*CB_SETCURSEL*/, nMonthCount - 1, 0);

    CheckButtons();
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    if (bResetColors)
    {
      bResetColors = false;
      oSys.Call("User32::SetFocus", aWnd[IDRESET][WND]);
      oSys.Call("User32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, IDRESET, 0);
    }
    else
      oSys.Call("User32::SetFocus", aWnd[IDSYSTEM][WND]);
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 112) //VK_F1
    {
      if (oSys.Call("User32::GetFocus") == aWnd[IDDF][WND])
        oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDDFHLP, 0);
      else if (oSys.Call("User32::GetFocus") == aWnd[IDTF][WND])
        oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDTFHLP, 0);
    }
    else if ((wParam == 9 /*VK_TAB*/) || (wParam == 27 /*VK_ESCAPE*/))
    {
      if (oSys.Call("User32::IsWindowVisible", aWnd[IDDFHLPTXT][WND]))
        ShowFormatHelp(hWnd, aWnd[IDDFHLPTXT][WND], 0);
      else if (oSys.Call("User32::IsWindowVisible", aWnd[IDTFHLPTXT][WND]))
        ShowFormatHelp(hWnd, aWnd[IDTFHLPTXT][WND], 0);
    }
  }

  else if ((uMsg == 0x0201 /*WM_LBUTTONDOWN*/) || (uMsg == 0x0204 /*WM_RBUTTONDOWN*/) ||
           (uMsg == 0x0207 /*WM_MBUTTONDOWN*/) || (uMsg == 0x020b /*WM_XBUTTONDOWN*/))
  {
    if (oSys.Call("User32::IsWindowVisible", aWnd[IDDFHLPTXT][WND]))
      ShowFormatHelp(hWnd, aWnd[IDDFHLPTXT][WND], 0);
    else if (oSys.Call("User32::IsWindowVisible", aWnd[IDTFHLPTXT][WND]))
      ShowFormatHelp(hWnd, aWnd[IDTFHLPTXT][WND], 0);
  }

  else if (uMsg == 0x0138) //WM_CTLCOLORSTATIC
  {
    if ((lParam == aWnd[IDDFHLPTXT][WND]) || (lParam == aWnd[IDTFHLPTXT][WND]))
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      oSys.Call("Gdi32::SetTextColor", wParam, 0x006000);
      oSys.Call("Gdi32::SetBkColor", wParam, 0xFFFFFF);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", 0xFFFFFF);
      return hBrushColor;
    }
    if (lParam == aWnd[IDCOLOR1][WND])
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", aColor[4]);
      return hBrushColor;
    }
    if (lParam == aWnd[IDCOLOR2][WND])
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", aColor[1]);
      return hBrushColor;
    }
    if (lParam == aWnd[IDCOLOR3][WND])
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", aColor[2]);
      return hBrushColor;
    }
    if (lParam == aWnd[IDCOLOR4][WND])
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", aColor[3]);
      return hBrushColor;
    }
    if (lParam == aWnd[IDCOLOR5][WND])
    {
      oSys.Call("Gdi32::DeleteObject", hBrushColor);
      hBrushColor = oSys.Call("Gdi32::CreateSolidBrush", aColor[5]);
      return hBrushColor;
    }
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    nID   = LoWord(wParam);
    nCode = HiWord(wParam);

    if ((nID == IDSYSTEM) || (nID == IDLONGDATE))
    {
      CheckButtons(nID);
    }
    else if ((nID == IDDF) && (nCode == 0x300 /*EN_CHANGE*/))
    {
      sDateForm = GetWindowText(aWnd[IDDF][WND]);
      SetWindowText(aWnd[IDDATE][WND], GetDate());
    }
    else if ((nID == IDTF) && (nCode == 0x300 /*EN_CHANGE*/))
    {
      sTimeForm = GetWindowText(aWnd[IDTF][WND]);
      SetWindowText(aWnd[IDTIME][WND], GetTime());
    }
    else if (nID == IDDFHLP)
      ShowFormatHelp(hWnd, aWnd[IDDFHLPTXT][WND], ! oSys.Call("User32::IsWindowVisible", aWnd[IDDFHLPTXT][WND]));
    else if (nID == IDTFHLP)
      ShowFormatHelp(hWnd, aWnd[IDTFHLPTXT][WND], ! oSys.Call("User32::IsWindowVisible", aWnd[IDTFHLPTXT][WND]));
    else if ((nID >= IDASSIG0) && (nID <= IDASSIG4) && (nCode == 1 /*CBN_SELCHANGE*/))
      aKeyAssign[nID - IDASSIG0][1] = AkelPad.SendMessage(aWnd[nID][WND], 0x147 /*CB_GETCURSEL*/, 0, 0);
    else if ((nID == IDMONTHCOUNT) && (nCode == 1 /*CBN_SELCHANGE*/))
    {
      nMonthCount = AkelPad.SendMessage(aWnd[IDMONTHCOUNT][WND], 0x147 /*CB_GETCURSEL*/, 0, 0) + 1;
      SetWindowSize(hDlgCal);
      MoveWindow(hMainWnd, hDlgCal, "CV");
    }
    else if ((nID >= IDCOLOR1BUTT) && (nID <= IDCOLOR5BUTT))
      ChangeColor(hWnd, nID);
    else if (nID == IDRESET)
    {
      bResetColors = true;
      aColor       = undefined;
      aCalPos      = GetWindowPos(hDlgCal);
      aSetPos      = GetWindowPos(hWnd);
      AkelPad.SendMessage(hWndCal, 0x1001 /*MCM_GETCURSEL*/, 0, lpSysTime);
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if (nID == 2 /*IDCANCEL*/)
    {
      if ((! oSys.Call("User32::IsWindowVisible", aWnd[IDDFHLPTXT][WND])) && (! oSys.Call("User32::IsWindowVisible", aWnd[IDTFHLPTXT][WND])))
        oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    oSys.Call("Gdi32::DeleteObject", hBrushColor);
    oSys.Call("User32::EnableWindow", hDlgCal, 1);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2) //WM_DESTROY
    oSys.Call("user32::PostQuitMessage", 0);

  return 0;
}

function CheckButtons(nButton)
{
  if (nButton == IDSYSTEM)
    bSystem = ! bSystem;
  else if (nButton == IDLONGDATE)
    bLongDate = ! bLongDate;

  AkelPad.SendMessage(aWnd[IDSYSTEM][WND],   241 /*BM_SETCHECK*/, bSystem,   0);
  AkelPad.SendMessage(aWnd[IDLONGDATE][WND], 241 /*BM_SETCHECK*/, bLongDate, 0);

  oSys.Call("User32::EnableWindow", aWnd[IDLONGDATE][WND], bSystem);
  oSys.Call("User32::EnableWindow", aWnd[IDDF][WND], ! bSystem);
  oSys.Call("User32::EnableWindow", aWnd[IDTF][WND], ! bSystem);
  oSys.Call("User32::EnableWindow", aWnd[IDDFHLP][WND], ! bSystem);
  oSys.Call("User32::EnableWindow", aWnd[IDTFHLP][WND], ! bSystem);

  SetWindowText(aWnd[IDDATE][WND], GetDate());
  SetWindowText(aWnd[IDTIME][WND], GetTime());
}

function ShowFormatHelp(hDlg, hWndHlp, bShow)
{
  if (bShow)
    oSys.Call("User32::SetCapture", hDlg);
  else
    oSys.Call("User32::ReleaseCapture");

  oSys.Call("User32::ShowWindow", hWndHlp, bShow);
}

function ChangeColor(hWnd, nButton)
{
  var nCo        = nButton - IDCOLOR1BUTT;
  var nChoCoSize = _X64 ? 72 : 36; //sizeof(CHOOSECOLOR)
  var lpChoCo    = AkelPad.MemAlloc(nChoCoSize); //CHOOSECOLOR
  var lpCusCo    = AkelPad.MemAlloc(4 * 16); //sizeof(COLORREF) * 16
  var hFocus     = oSys.Call("User32::GetFocus");

  if (nButton == IDCOLOR1BUTT)
    nCo = 4;
  else if (nButton == IDCOLOR5BUTT)
    nCo = 5;

  AkelPad.MemCopy(_PtrAdd(lpChoCo,              0), nChoCoSize,  DT_DWORD); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ?  8 :  4), hWnd,        DT_QWORD); //hWndOwner
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 24 : 12), aColor[nCo], DT_DWORD); //rgbResult
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 32 : 16), lpCusCo,     DT_QWORD); //lpCustColors
  AkelPad.MemCopy(_PtrAdd(lpChoCo, _X64 ? 40 : 20), 0x103,       DT_DWORD); //Flags - CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT

  if (oSys.Call("Comdlg32::ChooseColor" + _TCHAR, lpChoCo))
  {
    aColor[nCo] = AkelPad.MemRead(_PtrAdd(lpChoCo, _X64 ? 24 : 12), DT_DWORD);
    SetWindowText(aWnd[nButton - 5][WND], aWnd[nButton - 5][TXT]);
    AkelPad.SendMessage(hWndCal, 0x100A /*MCM_SETCOLOR*/, nCo, aColor[nCo]);
  }

  AkelPad.MemFree(lpChoCo);
  AkelPad.MemFree(lpCusCo);
  oSys.Call("User32::SetFocus", hFocus);
}

Last edited by KDJ on Fri Sep 27, 2019 7:04 pm, edited 12 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Code: Select all

// Description(1033): Select textblock by borders
// Description(1049): Выделяет блок по заданным границам
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12241#12241
// Version: 1.1 (2011.07.21)
// Author: VladSh
// 
// Примеры:
// -"ScriptBlock select" Call("Scripts::Main", 1, "BlockSelect.js")		- по умолчанию (без агрументов) выделяется текстовый блок, который находится в {}
// -"SelCompleteLine" Call("Scripts::Main", 1, "BlockSelect.js", `-tagStart="\r" -tagEnd="\r" -inclTags=0`)		- полное выделение всех затронутых строк
// -"CommentBlock select" Call("Scripts::Main", 1, "BlockSelect.js", `-tagStart="/*" -tagEnd="*/"`)		- выделение блока комментариев
// -"[code]{...}[/code]" Call("Scripts::Main", 1, "BlockSelect.js", `-tagStart="[code]" -tagEnd="[/code]" -inclTags=0`) - выделение текста, находящегося между определёнными тэгами


if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();

sbOpen = escSequencesProcessing(AkelPad.GetArgValue("tagStart", sbOpen));		//тэг, с которого начинать выделение
sbClose = escSequencesProcessing(AkelPad.GetArgValue("tagEnd", sbClose));			//тэг, на котором заканчивать выделение
var bIncludeTags = AkelPad.GetArgValue("inclTags", 1);					//захватывать тэги в выделение или нет

var Range;

if (sbOpen != pBreak)
	Range = getRangebyBordersEx(AkelPad.GetSelStart(), sbOpen, sbClose, bIncludeTags);
else
	Range = getRangebyBorders(AkelPad.GetSelStart(), AkelPad.GetSelEnd(), pBreak, pBreak, bIncludeTags)

if (Range != null)
	AkelPad.SetSel(Range[0], Range[1]);


Code: Select all

// Description(1033): Declose scriptblock
// Description(1049): Убирает блочность (скобки { текст }) выделенного скрипта
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12241#12241
// Version: 1.1 (2011.03.30)
// Author: VladSh


if (! AkelPad.Include("selCompleteLine.js")) WScript.Quit();

var iSelStart = AkelPad.GetSelStart();
var iSelEnd = AkelPad.GetSelEnd();
var Range;

if (iSelStart == iSelEnd) {
	Range = getRangebyBordersEx(iSelStart, sbOpen, sbClose, true);
	if (Range == null) WScript.Quit();
	iSelStart = Range[0];
	iSelEnd = Range[1] - 1;		//без конечного перевода строки
}
Range = getRangeCompleteLine(iSelStart, iSelEnd);
if (Range == null) WScript.Quit();

var pText = getTextbyRange(Range);

getShift();		//определение содержимого сдвига из настроек

pText = pText.replace(new RegExp(pBreak + sShift, "g"), pBreak);		//удаляем лишние сдвиги по всему блоку
pText = pText.replace(new RegExp(sbOpen), "");		//удаляем открывающий тэг
pText = oStr.leftback(pText, sbClose);		//удаляем закрывающий тэг

if (pText.indexOf(pBreak) != 0)
	pText += sShift;		//восстанавливаем излишне удалённый сдвиг внизу-справа

AkelPad.SetSel(Range[0], Range[1]);
AkelPad.ReplaceSel(pText);
p.s.: Instructor, благодарю за идею!


N.B.: Оба скрипта используют selCompleteLine.js.
Last edited by VladSh on Wed Jan 14, 2015 5:49 pm, edited 2 times in total.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Microsoft Data Access - ActiveX Data Objects - constants and helpers set
<<DOWNLOAD>>

Code: Select all

/*******************************************************************************
 * Microsoft Data Access - ActiveX Data Objects - constants and helpers set
 * v1.2
 *
 * Based on ADO Import Type Library v2.81
 * Author: Panych Y.W. panych.y (bark) gmail.com
 * Forum thread: http://akelpad.sourceforge.net/forum/viewtopic.php?p=12315#p12315
 * Download: http://outstanding.hmarka.net/akelpad/scripts/ADODB.js
 ******************************************************************************/
ADODB =
{
	CursorTypeEnum: {
		adOpenUnspecified:					-1,
		adOpenForwardOnly:					0,
		adOpenKeyset:						1,
		adOpenDynamic:						2,
		adOpenStatic:						3
	},
	CursorOptionEnum: {
		adHoldRecords:						256,
		adMovePrevious:						512,
		adAddNew:							16778240,
		adDelete:							16779264,
		adUpdate:							16809984,
		adBookmark:							8192,
		adApproxPosition:					16384,
		adUpdateBatch:						65536,
		adResync:							131072,
		adNotify:							262144,
		adFind:								524288,
		adSeek:								4194304,
		adIndex:							8388608
	},
	LockTypeEnum: {
		adLockUnspecified:					-1,
		adLockReadOnly:						1,
		adLockPessimistic:					2,
		adLockOptimistic:					3,
		adLockBatchOptimistic:				4
	},
	ExecuteOptionEnum: {
		adOptionUnspecified:				-1,
		adAsyncExecute:						16,
		adAsyncFetch:						32,
		adAsyncFetchNonBlocking:			64,
		adExecuteNoRecords:					128,
		adExecuteStream:					1024,
		adExecuteRecord:					2048
	},
	ConnectOptionEnum: {
		adConnectUnspecified:				-1,
		adAsyncConnect:						16
	},
	ObjectStateEnum: {
		adStateClosed:						0,
		adStateOpen:						1,
		adStateConnecting:					2,
		adStateExecuting:					4,
		adStateFetching:					8
	},
	CursorLocationEnum: {
		adUseNone:							1,
		adUseServer:						2,
		adUseClient:						3,
		adUseClientBatch:					3
	},
	DataTypeEnum: {
		adEmpty:							0,
		adTinyInt:							16,
		adSmallInt:							2,
		adInteger:							3,
		adBigInt:							20,
		adUnsignedTinyInt:					17,
		adUnsignedSmallInt:					18,
		adUnsignedInt:						19,
		adUnsignedBigInt:					21,
		adSingle:							4,
		adDouble:							5,
		adCurrency:							6,
		adDecimal:							14,
		adNumeric:							131,
		adBoolean:							11,
		adError:							10,
		adUserDefined:						132,
		adVariant:							12,
		adIDispatch:						9,
		adIUnknown:							13,
		adGUID:								72,
		adDate:								7,
		adDBDate:							133,
		adDBTime:							134,
		adDBTimeStamp:						135,
		adBSTR:								8,
		adChar:								129,
		adVarChar:							200,
		adLongVarChar:						201,
		adWChar:							130,
		adVarWChar:							202,
		adLongVarWChar:						203,
		adBinary:							128,
		adVarBinary:						204,
		adLongVarBinary:					205,
		adChapter:							136,
		adFileTime:							64,
		adPropVariant:						138,
		adVarNumeric:						139,
		adArray:							8192
	},
	FieldAttributeEnum: {
		adFldUnspecified:					-1,
		adFldMayDefer:						2,
		adFldUpdatable:						4,
		adFldUnknownUpdatable:				8,
		adFldFixed:							16,
		adFldIsNullable:					32,
		adFldMayBeNull:						64,
		adFldLong:							128,
		adFldRowID:							256,
		adFldRowVersion:					512,
		adFldCacheDeferred:					4096,
		adFldIsChapter:						8192,
		adFldNegativeScale:					16384,
		adFldKeyColumn:						32768,
		adFldIsRowURL:						65536,
		adFldIsDefaultStream:				131072,
		adFldIsCollection:					262144
	},
	EditModeEnum: {
		adEditNone:							0,
		adEditInProgress:					1,
		adEditAdd:							2,
		adEditDelete:						4
	},
	RecordStatusEnum: {
		adRecOK:							0,
		adRecNew:							1,
		adRecModified:						2,
		adRecDeleted:						4,
		adRecUnmodified:					8,
		adRecInvalid:						16,
		adRecMultipleChanges:				64,
		adRecPendingChanges:				128,
		adRecCanceled:						256,
		adRecCantRelease:					1024,
		adRecConcurrencyViolation:			2048,
		adRecIntegrityViolation:			4096,
		adRecMaxChangesExceeded:			8192,
		adRecObjectOpen:					16384,
		adRecOutOfMemory:					32768,
		adRecPermissionDenied:				65536,
		adRecSchemaViolation:				131072,
		adRecDBDeleted:						262144
	},
	GetRowsOptionEnum: {
		adGetRowsRest:						-1
	},
	PositionEnum: {
		adPosUnknown:						-1,
		adPosBOF:							-2,
		adPosEOF:							-3
	},
	PositionEnum_Param: { //! Fully equal PositionEnum(typedef-ed in typelib)
		adPosUnknown:						-1,
		adPosBOF:							-2,
		adPosEOF:							-3
	},
	BookmarkEnum: {
		adBookmarkCurrent:					0,
		adBookmarkFirst:					1,
		adBookmarkLast:						2
	},
	MarshalOptionsEnum: {
		adMarshalAll:						0,
		adMarshalModifiedOnly:				1
	},
	AffectEnum: {
		adAffectCurrent:					1,
		adAffectGroup:						2,
		adAffectAll:						3,
		adAffectAllChapters:				4
	},
	ResyncEnum: {
		adResyncUnderlyingValues:			1,
		adResyncAllValues:					2
	},
	CompareEnum: {
		adCompareLessThan:					0,
		adCompareEqual:						1,
		adCompareGreaterThan:				2,
		adCompareNotEqual:					3,
		adCompareNotComparable:				4
	},
	FilterGroupEnum: {
		adFilterNone:						0,
		adFilterPendingRecords:				1,
		adFilterAffectedRecords:			2,
		adFilterFetchedRecords:				3,
		adFilterPredicate:					4,
		adFilterConflictingRecords:			5
	},
	SearchDirectionEnum: {
		adSearchForward:					1,
		adSearchBackward:					-1
	},
	SearchDirection: {
		adSearchForward:					1,
		adSearchBackward:					-1
	},
	PersistFormatEnum: {
		adPersistADTG:						0,
		adPersistXML:						1
	},
	StringFormatEnum: {
		adClipString:						2
	},
	ConnectPromptEnum: {
		adPromptAlways:						1,
		adPromptComplete:					2,
		adPromptCompleteRequired:			3,
		adPromptNever:						4
	},
	ConnectModeEnum: {
		adModeUnknown:						0,
		adModeRead:							1,
		adModeWrite:						2,
		adModeReadWrite:					3,
		adModeShareDenyRead:				4,
		adModeShareDenyWrite:				8,
		adModeShareExclusive:				12,
		adModeShareDenyNone:				16,
		adModeRecursive:					4194304
	},
	RecordCreateOptionsEnum: {
		adCreateCollection:					8192,
		adCreateStructDoc:					-2147483648,
		adCreateNonCollection:				0,
		adOpenIfExists:						33554432,
		adCreateOverwrite:					67108864,
		adFailIfNotExists:					-1
	},
	RecordOpenOptionsEnum: {
		adOpenRecordUnspecified:			-1,
		adOpenSource:						8388608,
		adOpenOutput:						8388608,
		adOpenAsync:						4096,
		adDelayFetchStream:					16384,
		adDelayFetchFields:					32768,
		adOpenExecuteCommand:				65536
	},
	IsolationLevelEnum: {
		adXactUnspecified:					-1,
		adXactChaos:						16,
		adXactReadUncommitted:				256,
		adXactBrowse:						256,
		adXactCursorStability:				4096,
		adXactReadCommitted:				4096,
		adXactRepeatableRead:				65536,
		adXactSerializable:					1048576,
		adXactIsolated:						1048576
	},
	XactAttributeEnum: {
		adXactCommitRetaining:				131072,
		adXactAbortRetaining:				262144,
		adXactAsyncPhaseOne:				524288,
		adXactSyncPhaseOne:					1048576
	},
	PropertyAttributesEnum: {
		adPropNotSupported:					0,
		adPropRequired:						1,
		adPropOptional:						2,
		adPropRead:							512,
		adPropWrite:						1024
	},
	ErrorValueEnum: {
		adErrProviderFailed:				3000,
		adErrInvalidArgument:				3001,
		adErrOpeningFile:					3002,
		adErrReadFile:						3003,
		adErrWriteFile:						3004,
		adErrNoCurrentRecord:				3021,
		adErrIllegalOperation:				3219,
		adErrCantChangeProvider:			3220,
		adErrInTransaction:					3246,
		adErrFeatureNotAvailable:			3251,
		adErrItemNotFound:					3265,
		adErrObjectInCollection:			3367,
		adErrObjectNotSet:					3420,
		adErrDataConversion:				3421,
		adErrObjectClosed:					3704,
		adErrObjectOpen:					3705,
		adErrProviderNotFound:				3706,
		adErrBoundToCommand:				3707,
		adErrInvalidParamInfo:				3708,
		adErrInvalidConnection:				3709,
		adErrNotReentrant:					3710,
		adErrStillExecuting:				3711,
		adErrOperationCancelled:			3712,
		adErrStillConnecting:				3713,
		adErrInvalidTransaction:			3714,
		adErrNotExecuting:					3715,
		adErrUnsafeOperation:				3716,
		adwrnSecurityDialog:				3717,
		adwrnSecurityDialogHeader:			3718,
		adErrIntegrityViolation:			3719,
		adErrPermissionDenied:				3720,
		adErrDataOverflow:					3721,
		adErrSchemaViolation:				3722,
		adErrSignMismatch:					3723,
		adErrCantConvertvalue:				3724,
		adErrCantCreate:					3725,
		adErrColumnNotOnThisRow:			3726,
		adErrURLDoesNotExist:				3727,
		adErrTreePermissionDenied:			3728,
		adErrInvalidURL:					3729,
		adErrResourceLocked:				3730,
		adErrResourceExists:				3731,
		adErrCannotComplete:				3732,
		adErrVolumeNotFound:				3733,
		adErrOutOfSpace:					3734,
		adErrResourceOutOfScope:			3735,
		adErrUnavailable:					3736,
		adErrURLNamedRowDoesNotExist:		3737,
		adErrDelResOutOfScope:				3738,
		adErrPropInvalidColumn:				3739,
		adErrPropInvalidOption:				3740,
		adErrPropInvalidValue:				3741,
		adErrPropConflicting:				3742,
		adErrPropNotAllSettable:			3743,
		adErrPropNotSet:					3744,
		adErrPropNotSettable:				3745,
		adErrPropNotSupported:				3746,
		adErrCatalogNotSet:					3747,
		adErrCantChangeConnection:			3748,
		adErrFieldsUpdateFailed:			3749,
		adErrDenyNotSupported:				3750,
		adErrDenyTypeNotSupported:			3751,
		adErrProviderNotSpecified:			3753,
		adErrConnectionStringTooLong:		3754
	},
	ParameterAttributesEnum: {
		adParamSigned:						16,
		adParamNullable:					64,
		adParamLong:						128
	},
	ParameterDirectionEnum: {
		adParamUnknown:						0,
		adParamInput:						1,
		adParamOutput:						2,
		adParamInputOutput:					3,
		adParamReturnValue:					4
	},
	CommandTypeEnum: {
		adCmdUnspecified:					-1,
		adCmdUnknown:						8,
		adCmdText:							1,
		adCmdTable:							2,
		adCmdStoredProc:					4,
		adCmdFile:							256,
		adCmdTableDirect:					512
	},
	EventStatusEnum: {
		adStatusOK:							1,
		adStatusErrorsOccurred:				2,
		adStatusCantDeny:					3,
		adStatusCancel:						4,
		adStatusUnwantedEvent:				5
	},
	EventReasonEnum: {
		adRsnAddNew:						1,
		adRsnDelete:						2,
		adRsnUpdate:						3,
		adRsnUndoUpdate:					4,
		adRsnUndoAddNew:					5,
		adRsnUndoDelete:					6,
		adRsnRequery:						7,
		adRsnResynch:						8,
		adRsnClose:							9,
		adRsnMove:							10,
		adRsnFirstChange:					11,
		adRsnMoveFirst:						12,
		adRsnMoveNext:						13,
		adRsnMovePrevious:					14,
		adRsnMoveLast:						15
	},
	SchemaEnum: {
		adSchemaProviderSpecific:			-1,
		adSchemaAsserts:					0,
		adSchemaCatalogs:					1,
		adSchemaCharacterSets:				2,
		adSchemaCollations:					3,
		adSchemaColumns:					4,
		adSchemaCheckConstraints:			5,
		adSchemaConstraintColumnUsage:		6,
		adSchemaConstraintTableUsage:		7,
		adSchemaKeyColumnUsage:				8,
		adSchemaReferentialContraints:		9,
		adSchemaReferentialConstraints:		9,
		adSchemaTableConstraints:			10,
		adSchemaColumnsDomainUsage:			11,
		adSchemaIndexes:					12,
		adSchemaColumnPrivileges:			13,
		adSchemaTablePrivileges:			14,
		adSchemaUsagePrivileges:			15,
		adSchemaProcedures:					16,
		adSchemaSchemata:					17,
		adSchemaSQLLanguages:				18,
		adSchemaStatistics:					19,
		adSchemaTables:						20,
		adSchemaTranslations:				21,
		adSchemaProviderTypes:				22,
		adSchemaViews:						23,
		adSchemaViewColumnUsage:			24,
		adSchemaViewTableUsage:				25,
		adSchemaProcedureParameters:		26,
		adSchemaForeignKeys:				27,
		adSchemaPrimaryKeys:				28,
		adSchemaProcedureColumns:			29,
		adSchemaDBInfoKeywords:				30,
		adSchemaDBInfoLiterals:				31,
		adSchemaCubes:						32,
		adSchemaDimensions:					33,
		adSchemaHierarchies:				34,
		adSchemaLevels:						35,
		adSchemaMeasures:					36,
		adSchemaProperties:					37,
		adSchemaMembers:					38,
		adSchemaTrustees:					39,
		adSchemaFunctions:					40,
		adSchemaActions:					41,
		adSchemaCommands:					42,
		adSchemaSets:						43
	},
	FieldStatusEnum: {
		adFieldOK:							0,
		adFieldCantConvertValue:			2,
		adFieldIsNull:						3,
		adFieldTruncated:					4,
		adFieldSignMismatch:				5,
		adFieldDataOverflow:				6,
		adFieldCantCreate:					7,
		adFieldUnavailable:					8,
		adFieldPermissionDenied:			9,
		adFieldIntegrityViolation:			10,
		adFieldSchemaViolation:				11,
		adFieldBadStatus:					12,
		adFieldDefault:						13,
		adFieldIgnore:						15,
		adFieldDoesNotExist:				16,
		adFieldInvalidURL:					17,
		adFieldResourceLocked:				18,
		adFieldResourceExists:				19,
		adFieldCannotComplete:				20,
		adFieldVolumeNotFound:				21,
		adFieldOutOfSpace:					22,
		adFieldCannotDeleteSource:			23,
		adFieldReadOnly:					24,
		adFieldResourceOutOfScope:			25,
		adFieldAlreadyExists:				26,
		adFieldPendingInsert:				65536,
		adFieldPendingDelete:				131072,
		adFieldPendingChange:				262144,
		adFieldPendingUnknown:				524288,
		adFieldPendingUnknownDelete:		1048576
	},
	SeekEnum: {
		adSeekFirstEQ:						1,
		adSeekLastEQ:						2,
		adSeekAfterEQ:						4,
		adSeekAfter:						8,
		adSeekBeforeEQ:						16,
		adSeekBefore:						32
	},
	ADCPROP_UPDATECRITERIA_ENUM: {
		adCriteriaKey:						0,
		adCriteriaAllCols:					1,
		adCriteriaUpdCols:					2,
		adCriteriaTimeStamp:				3
	},
	ADCPROP_ASYNCTHREADPRIORITY_ENUM: {
		adPriorityLowest:					1,
		adPriorityBelowNormal:				2,
		adPriorityNormal:					3,
		adPriorityAboveNormal:				4,
		adPriorityHighest:					5
	},
	ADCPROP_AUTORECALC_ENUM: {
		adRecalcUpFront:					0,
		adRecalcAlways:						1
	},
	ADCPROP_UPDATERESYNC_ENUM: {
		adResyncNone:						0,
		adResyncAutoIncrement:				1,
		adResyncConflicts:					2,
		adResyncUpdates:					4,
		adResyncInserts:					8,
		adResyncAll:						15
	},
	MoveRecordOptionsEnum: {
		adMoveUnspecified:					-1,
		adMoveOverWrite:					1,
		adMoveDontUpdateLinks:				2,
		adMoveAllowEmulation:				4
	},
	CopyRecordOptionsEnum: {
		adCopyUnspecified:					-1,
		adCopyOverWrite:					1,
		adCopyAllowEmulation:				4,
		adCopyNonRecursive:					2
	},
	StreamTypeEnum: {
		adTypeBinary:						1,
		adTypeText:							2
	},
	LineSeparatorEnum: {
		adLF:								10,
		adCR:								13,
		adCRLF:								-1
	},
	StreamOpenOptionsEnum: {
		adOpenStreamUnspecified:			-1,
		adOpenStreamAsync:					1,
		adOpenStreamFromRecord:				4
	},
	StreamWriteEnum: {
		adWriteChar:						0,
		adWriteLine:						1,
		stWriteChar:						0,
		stWriteLine:						1
	},
	SaveOptionsEnum: {
		adSaveCreateNotExist:				1,
		adSaveCreateOverWrite:				2
	},
	FieldEnum: {
		adDefaultStream:					-1,
		adRecordURL:						-2
	},
	StreamReadEnum: {
		adReadAll:							-1,
		adReadLine:							-2
	},
	RecordTypeEnum: {
		adSimpleRecord:						0,
		adCollectionRecord:					1,
		adStructDoc:						2
	},
	Connection:			function(){return new ActiveXObject("ADODB.Connection");},
	Record:				function(){return new ActiveXObject("ADODB.Record");},
	Stream:				function(){return new ActiveXObject("ADODB.Stream");},
	Command:			function(){return new ActiveXObject("ADODB.Command");},
	Recordset:			function(){return new ActiveXObject("ADODB.Recordset");},
	Parameter:			function(){return new ActiveXObject("ADODB.Parameter");}
};

DOWNLOAD

Code: Select all

//! ADODB.js usage sample
//! TEST.MBD countains table populaed with some data
//! CREATE TABLE tab1 (data VARCHAR(32), param INTEGER );

AkelPad.Include("ADODB.js");
var conn = ADODB.Connection();
conn.Open("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\TEST.MDB;","","");
var comm = ADODB.Command();
comm.CommandText = "SELECT data, param * FROM tab1 WHERE param = @prm";
comm.ActiveConnection = conn;
comm.NamedParameters = true;
comm.CommandType = ADODB.CommandTypeEnum.adCmdText;
comm.Parameters.Append(comm.CreateParameter("@prm", ADODB.DataTypeEnum.adInteger, ADODB.ParameterDirectionEnum.adParamInput, 4/*sozeof(adInteger)*/, 1));
var res = comm.Execute();
var result = "";
while(res && !res.EOF)
{
	var cnt = res.Fields.Count;
	var i =0;
	while(i<cnt)
	{
		result += " " +res.Fields.Item(parseInt(i)).Name+": " + res.Fields.Item(parseInt(i));
		i++;
	}
	WScript.Echo(result);
	result = "";
	res.MoveNext();
}
if(res) res.Close();
conn.Close();
res = null;
comm = null;
conn = null;
Last edited by FeyFre on Mon Dec 28, 2015 12:22 pm, edited 4 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Code: Select all

// Description(1033): Change registry of the text: mixed -> UPPER <-> lower
// Description(1049): Изменяет регистр текста по кругу: смешанный -> ВЕРХНИЙ -> нижний
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12318#p12318
// Version: 1.4 (2012.08.23)
// Author: VladSh

var pText = AkelPad.GetSelText();
if (!pText) {
	if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();
	WordCaretSelect();
	pText = AkelPad.GetSelText();
}

if (pText) {
	var tmpText = pText.toUpperCase();
	if (pText == tmpText)
		AkelPad.Command(4176);		//переводим в нижний регистр
	else
		AkelPad.Command(4175);		//переводим в ВЕРХНИЙ регистр
}

Code: Select all

// Description(1033): Change registry of the text: mixed -> UPPER -> lower -> Proper, by analogy with Shift+F3 in MS Word
// Description(1049): Изменяет регистр текста по кругу: смешанный -> ВЕРХНИЙ -> нижний -> Начинать С Прописных по аналогии, как это делает MS Word
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12318#p12318
// Version: 1.1 (2012.08.23)
// Author: VladSh

var pText = AkelPad.GetSelText();
if (!pText) {
	if (! AkelPad.Include("CaretSelect.js")) WScript.Quit();
	WordCaretSelect();
	pText = AkelPad.GetSelText();
}

if (pText) {
	var tmpText = pText.toUpperCase();
	if (pText == tmpText)
		AkelPad.Command(4176);		//переводим в нижний регистр
	else {
		tmpText = pText.toLowerCase();
		if (pText == tmpText)
			AkelPad.Command(4178);		//Начинать С Прописных
		else
			AkelPad.Command(4175);		//переводим в ВЕРХНИЙ регистр
	}
}


N.B. В коде используется CaretSelect.js.
Last edited by VladSh on Wed Jan 14, 2015 5:51 pm, edited 4 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Open/Convert files.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12548#p12548
// Version: 1.9
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Open/Convert files.
// Description(1049): Открыть/Конвертировать файлы.
//
// Arguments:
// -OpenMask="C:\MyFolder\*.*" -Search any files in "C:\MyFolder".
// -OpenList="C:\files.lst"    -Open files specified in "files.lst".
// -SubDir=true                -Search recursively (default is false).
// -OpenCodepage=-1            -Open codepage, if -1 it will be autodetected (default is -1).
// -OpenBOM=-1                 -File byte order mark (one of the following):
//                                1  exist.
//                                0  doesn't exist.
//                               -1  autodetect BOM (default).
// -OpenBinary=-1              -Open binary file (one of the following):
//                                1  open if binary.
//                                0  don't open if binary (default).
//                               -1  prompt every.
//                               -2  prompt once.
// -SaveDir=""                 -Save directory, if "" files will be saved in place.
// -SaveCodepage=65001         -Save codepage, if -1 current codepage will be used (default is -1).
// -SaveBOM=1                  -File byte order mark (one of the following):
//                                1  exist.
//                                0  doesn't exist.
//                               -1  current BOM will be used (default).
// -Silent=true                -Display no messages (default is false).
// -CloseNoFiles=false         -Don't close program, if after script ending no files are opened (default is true).
//
// Remark:
// If SaveCodepage and SaveBOM not specified when no convertion operation will occur and files will be just opened.
//
// Usage:
// -"Open" Call("Scripts::Main", 1, "OpenSaveMask.js", `-OpenMask="C:\MyFolder\*.txt" -SubDir=true`)
// -"Convert" Call("Scripts::Main", 1, "OpenSaveMask.js", `-OpenMask="C:\MyFolder\*.txt" -SubDir=true -SaveCodepage=65001 -SaveBOM=1`)

//Arguments
var pOpenMask=AkelPad.GetArgValue("OpenMask", "");
var pOpenList=AkelPad.GetArgValue("OpenList", "");
var bSubDir=AkelPad.GetArgValue("SubDir", false);
var nOpenCodepage=AkelPad.GetArgValue("OpenCodepage", -1);
var nOpenBOM=AkelPad.GetArgValue("OpenBOM", -1);
var nOpenBinary=AkelPad.GetArgValue("OpenBinary", 0);
var pSaveDir=AkelPad.GetArgValue("SaveDir", "");
var nSaveCodepage=AkelPad.GetArgValue("SaveCodepage", -1);
var nSaveBOM=AkelPad.GetArgValue("SaveBOM", -1);
var bSilent=AkelPad.GetArgValue("Silent", false);
var bCloseNoFiles=AkelPad.GetArgValue("CloseNoFiles", true);

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hSubClass=0;
var pFileList="";
var dwCmdOptions;
var nAllFiles=0;
var nDoneFiles=0;
var nErrors=0;

if (pOpenMask || pOpenList)
{
  SetBinary();
  if (nOpenBinary == -2)
    hSubClass=AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x43E /*AKDN_MESSAGEBOXEND*/);

  if (pOpenMask)
  {
    Locate(pOpenMask, bSubDir);
  }
  if (pOpenList)
  {
    var pFilesText;
    var pLinesArray;
    var nIndex;

    if (pFilesText=AkelPad.ReadFile(pOpenList))
    {
      pFilesText=pFilesText.replace(/\r\r\n|\r\n|\r|\n/g, "\n");
      if (pLinesArray=pFilesText.split("\n"))
      {
        for (nIndex=0; nIndex < pLinesArray.length; ++nIndex)
        {
          if (pLinesArray[nIndex])
          {
            if (DoFile(pLinesArray[nIndex], pSaveDir))
              break;
          }
        }
      }
    }
  }
  if (hSubClass)
    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  AkelPad.SendMessage(hMainWnd, 1146 /*AKD_SETCMDLINEOPTIONS*/, dwCmdOptions, 0);

  if (nSaveCodepage != -1 || nSaveBOM != -1)
  {
    if (nAllFiles && AkelPad.IsMDI())
      AkelPad.Command(4325 /*IDM_WINDOW_FILEEXIT*/);
    if (!bSilent)
      WScript.Echo("Converted: " + nDoneFiles + " of " + nAllFiles + " files (" + nErrors + " errors)");
  }
  if (bCloseNoFiles)
  {
    if (AkelPad.SendMessage(hMainWnd, 1292 /*AKD_FRAMENOWINDOWS*/, 0, 0) ||
        (AkelPad.IsMDI() == 1 && AkelPad.SendMessage(hMainWnd, 1291 /*AKD_FRAMESTATS*/, 0 /*FWS_COUNTALL*/, 0) == 1 &&
         !AkelPad.GetEditFile(0) && !AkelPad.GetEditModified(0)))
    {
      AkelPad.Command(4109 /*IDM_FILE_EXIT*/);
    }
  }
}

function Locate(pSearchFor, bSubDir)
{
  var lpFindData=AkelPad.MemAlloc(592 /*sizeof(WIN32_FIND_DATAW)*/);
  var hSearch;
  var pDir;
  var pWildcard;
  var pFileName;
  var dwAttributes;
  var nOffset;
  var bStop=false;

  if ((nOffset=pSearchFor.lastIndexOf("\\")) != -1)
  {
    pDir=pSearchFor.substr(0, nOffset);
    pWildcard=pSearchFor.substr(nOffset + 1);

    //Enumerate directory
    if ((hSearch=oSys.Call("kernel32::FindFirstFile" + _TCHAR, pSearchFor, lpFindData)) != -1 /*INVALID_HANDLE_VALUE*/)
    {
      do
      {
        pFileName=AkelPad.MemRead(_PtrAdd(lpFindData, 44) /*offsetof(WIN32_FIND_DATAW, cFileName)*/, _TSTR);
        if (pFileName == "." || pFileName == "..") continue;
        dwAttributes=AkelPad.MemRead(_PtrAdd(lpFindData, 0) /*offsetof(WIN32_FIND_DATAW, dwAttributes)*/, 3 /*DT_DWORD*/);

        if (!(dwAttributes & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/))
        {
          if (bStop=LocateCallback(pDir, pFileName, dwAttributes, lpFindData))
            break;
        }
      }
      while (oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));

      oSys.Call("kernel32::FindClose", hSearch);
    }

    //Go to subdirectory
    if (!bStop && bSubDir)
    {
      if ((hSearch=oSys.Call("kernel32::FindFirstFile" + _TCHAR, pDir + "\\" + "*.*", lpFindData)) != -1 /*INVALID_HANDLE_VALUE*/)
      {
        do
        {
          pFileName=AkelPad.MemRead(_PtrAdd(lpFindData, 44) /*offsetof(WIN32_FIND_DATAW, cFileName)*/, _TSTR);
          if (pFileName == "." || pFileName == "..") continue;
          dwAttributes=AkelPad.MemRead(_PtrAdd(lpFindData, 0) /*offsetof(WIN32_FIND_DATAW, dwAttributes)*/, 3 /*DT_DWORD*/);

          if (dwAttributes & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/)
          {
            if (bSubDir)
            {
              //Recursive call
              if (bStop=Locate(pDir + "\\" + pFileName + "\\" + pWildcard, true))
                break;
            }
          }
        }
        while (oSys.Call("kernel32::FindNextFile" + _TCHAR, hSearch, lpFindData));

        oSys.Call("kernel32::FindClose", hSearch);
      }
    }
  }

  AkelPad.MemFree(lpFindData);
  return bStop;
}

function LocateCallback(pDir, pFileName, dwAttributes, lpFindData)
{
  //var lpWriteTime=[];
  //var nSize;
  //var nFileSizeHigh;
  //var nFileSizeLow;
  //var lpLocalFileTime=AkelPad.MemAlloc(8 /*sizeof(FILETIME)*/);
  //var lpSystemTime=AkelPad.MemAlloc(16 /*sizeof(SYSTEMTIME)*/);
  //
  ////File size
  //nFileSizeHigh=AkelPad.MemRead(lpFindData + 28 /*offsetof(WIN32_FIND_DATAW, nFileSizeHigh)*/, 3 /*DT_DWORD*/);
  //nFileSizeLow=AkelPad.MemRead(lpFindData + 32 /*offsetof(WIN32_FIND_DATAW, nFileSizeLow)*/, 3 /*DT_DWORD*/);
  //nSize=(nFileSizeHigh * (0xFFFFFFFF + 1)) + nFileSizeLow;
  //
  ////Get write time
  //oSys.Call("kernel32::FileTimeToLocalFileTime", lpFindData + 20 /*offsetof(WIN32_FIND_DATAW, ftLastWriteTime)*/, lpLocalFileTime);
  //oSys.Call("kernel32::FileTimeToSystemTime", lpLocalFileTime, lpSystemTime);
  //lpWriteTime.wYear=AkelPad.MemRead(lpSystemTime /*offsetof(SYSTEMTIME, wYear)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wMonth=AkelPad.MemRead(lpSystemTime + 2 /*offsetof(SYSTEMTIME, wMonth)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wDayOfWeek=AkelPad.MemRead(lpSystemTime + 4 /*offsetof(SYSTEMTIME, wDayOfWeek)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wDay=AkelPad.MemRead(lpSystemTime + 6 /*offsetof(SYSTEMTIME, wDay)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wHour=AkelPad.MemRead(lpSystemTime + 8 /*offsetof(SYSTEMTIME, wHour)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wMinute=AkelPad.MemRead(lpSystemTime + 10 /*offsetof(SYSTEMTIME, wMinute)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wSecond=AkelPad.MemRead(lpSystemTime + 12 /*offsetof(SYSTEMTIME, wSecond)*/, 4 /*DT_WORD*/);
  //lpWriteTime.wMilliseconds=AkelPad.MemRead(lpSystemTime + 14 /*offsetof(SYSTEMTIME, wMilliseconds)*/, 4 /*DT_WORD*/);
  //
  //AkelPad.MemFree(lpLocalFileTime);
  //AkelPad.MemFree(lpSystemTime);

  //Return true to stop
  return DoFile(pDir + "\\" + pFileName, pSaveDir);
}

function DoFile(pOpenFile, pSaveFile)
{
  var nOpenResult;
  var dwOpenFlags=0x1|0x400 /*OD_ADT_BINARY_ERROR|OD_MULTIFILE*/;
  var bStop=false;

  if (nOpenCodepage == -1)
    dwOpenFlags|=0x4 /*OD_ADT_DETECT_CODEPAGE*/;
  if (nOpenBOM == -1)
    dwOpenFlags|=0x8 /*OD_ADT_DETECT_BOM*/;

  if (!(nOpenResult=AkelPad.OpenFile(pOpenFile, dwOpenFlags, nOpenCodepage, nOpenBOM)))
  {
    if (nSaveCodepage != -1 || nSaveBOM != -1)
    {
      if ((nSaveCodepage != -1 && AkelPad.GetEditCodePage(0) != nSaveCodepage) ||
          (nSaveBOM != -1 && AkelPad.GetEditBOM(0) != nSaveBOM))
      {
        if (!pSaveFile)
          pSaveFile=pOpenFile;
        else if (oSys.Call("kernel32::GetFileAttributes" + _TCHAR, pSaveFile) & 0x10 /*FILE_ATTRIBUTE_DIRECTORY*/)
          pSaveFile=pSaveFile + "\\" + AkelPad.GetFilePath(pOpenFile, 2 /*CPF_FILENAME*/);

        if (!AkelPad.SaveFile(0, pSaveFile, nSaveCodepage, nSaveBOM))
          ++nDoneFiles;
        else
          ++nErrors;
      }
      AkelPad.Command(4324 /*IDM_WINDOW_FILECLOSE*/);
    }
  }
  else
  {
    if (nOpenResult == -21 /*EOD_MSGCANCELCREATE*/ || nOpenResult == -22 /*EOD_MSGCANCELBINARY*/)
      bStop=true;
    if (nOpenResult != -23 /*EOD_MSGNOCREATE*/ && nOpenResult != -24 /*EOD_MSGNOBINARY*/)
      ++nErrors;
  }
  ++nAllFiles;
  return bStop;
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x43E /*AKDN_MESSAGEBOXEND*/)
  {
    if (nOpenBinary == -2)
    {
      var nLoadStringID=AkelPad.MemRead(_PtrAdd(lParam, _X64?36:20) /*offsetof(NMESSAGEBOX, dwLoadStringID)*/, 3 /*DT_DWORD*/);

      if (nLoadStringID == 5 /*MSG_ERROR_BINARY*/)
      {
        var nResult=AkelPad.MemRead(_PtrAdd(lParam, _X64?40:24) /*offsetof(NMESSAGEBOX, nResult)*/, 3 /*DT_DWORD*/);

        if (nResult == 6 /*IDYES*/)
          nOpenBinary=1;
        else if (nResult == 7 /*IDNO*/)
          nOpenBinary=0;
        if (nOpenBinary != -2)
          SetBinary();
      }
    }
  }
}

function SetBinary()
{
  dwCmdOptions=AkelPad.SendMessage(hMainWnd, 1145 /*AKD_GETCMDLINEOPTIONS*/, 0, 0);
  if (nOpenBinary == 1)
    AkelPad.SendMessage(hMainWnd, 1146 /*AKD_SETCMDLINEOPTIONS*/, (dwCmdOptions | 0x10 /*CLO_MSGOPENBINARYYES*/) & ~0x20 /*CLO_MSGOPENBINARYNO*/, 0);
  else if (nOpenBinary == 0)
    AkelPad.SendMessage(hMainWnd, 1146 /*AKD_SETCMDLINEOPTIONS*/, (dwCmdOptions & ~0x10 /*CLO_MSGOPENBINARYYES*/) | 0x20 /*CLO_MSGOPENBINARYNO*/, 0);
  else if (nOpenBinary == -1 || nOpenBinary == -2)
    AkelPad.SendMessage(hMainWnd, 1146 /*AKD_SETCMDLINEOPTIONS*/, (dwCmdOptions & ~0x10 /*CLO_MSGOPENBINARYYES*/) & ~0x20 /*CLO_MSGOPENBINARYNO*/, 0);
}
Last edited by Instructor on Mon Jul 18, 2016 6:33 pm, edited 7 times in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12600#p12600
// http://infocatcher.ucoz.net/js/akelpad_scripts/unixTime.js

// (c) Infocatcher 2011-2012
// version 0.1.3 - 2012-12-03

var TU_AUTO = 0;
var TU_S    = 1;
var TU_MS   = 2;

var treatAsUTC = getArg("treatAsUTC", true);
var timeUnit = getArg("timeUnit", TU_AUTO);

var date = AkelPad.GetSelText().replace(/^\s+|\s+$/g, "");
if(/^(\d+|0x[0-9a-f]+)$/i.test(date)) {
	date = Number(date);
	if(timeUnit == TU_S || timeUnit == TU_AUTO && date < 3e9)
		date *= 1000;
}
else if(/^([0-3]?\d)\D([01]?\d)\D(\d{4})(\s+([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?)?$/.test(date)) {
	// dd.MM.yyyy[ HH:mm[:ss]]
	with(RegExp)
		date = new Date($3, $2 - 1, $1, $5, $6, $8);
}
else if(/^(\d{4})\D([01]?\d)\D([0-3]?\d)(\s+([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?)?$/.test(date)) {
	// yyyy.MM.dd[ HH:mm[:ss]]
	with(RegExp)
		date = new Date($1, $2 - 1, $3, $5, $6, $8);
}
else if(/^([0-2]?\d)\D([0-6]?\d)(\D([0-6]?\d))?\s+([0-3]?\d)\D([01]?\d)\D(\d{4})$/.test(date)) {
	// HH:mm[:ss] dd.MM.yyyy
	with(RegExp)
		date = new Date($7, $6 - 1, $5, $1, $2, $4);
}
if(!(date instanceof Date))
	date = new Date(date);
else if(treatAsUTC) {
	var tzo = date.getTimezoneOffset();
	date.setMinutes(date.getMinutes() - tzo);
}
var tzo = date.getTimezoneOffset();
var ms = date.getTime();
var s = Math.round(ms/1000);
var tf = function(funcName) {
	if(treatAsUTC)
		return funcName.substr(0, 3) + "UTC" + funcName.substr(3);
	return funcName;
};
var dates = [
	date.toLocaleString(),
	date[tf("getFullYear")]() + "-" + padLeft(date[tf("getMonth")]() + 1) + "-" + padLeft(date[tf("getDate")]()) + " "
		+ padLeft(date[tf("getHours")]()) + ":" + padLeft(date[tf("getMinutes")]()) + ":" + padLeft(date[tf("getSeconds")]())
		+ " UTC" + (treatAsUTC ? "" : getTimezone(tzo)),
	date.toUTCString(),
	date.toString(),
	ms,
	s,
	(s < 0 ? "-" : "") + "0x" + Math.abs(s).toString(16)
].join("\n");
AkelPad.MessageBox(AkelPad.GetMainWnd(), dates, WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);

function padLeft(n) {
	var chr = "0";
	var cnt = 2;
	n = String(n);
	var l = n.length;
	return l < cnt
		? new Array(cnt - n.length + 1).join(chr) + n
		: n;
}
function getTimezone(tzo) {
	var m = Math.abs(tzo);
	var h = Math.floor(m/60);
	m = Math.floor(m - h*60);
	return (tzo > 0 ? "-" : "+") + padLeft(h) + padLeft(m);
}
function getArg(argName, defaultVal) {
	var args = {};
	for(var i = 0, argsCount = WScript.Arguments.length; i < argsCount; i++)
		if(/^[-\/](\w+)(=(.+))?$/i.test(WScript.Arguments(i)))
			args[RegExp.$1.toLowerCase()] = RegExp.$3 ? eval(RegExp.$3) : true;
	getArg = function(argName, defaultVal) {
		argName = argName.toLowerCase();
		return typeof args[argName] == "undefined" // argName in args
			? defaultVal
			: args[argName];
	};
	return getArg(argName, defaultVal);
}
<download>
Convert Unix time.


Image
Last edited by Infocatcher on Mon Dec 03, 2012 7:06 am, edited 2 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12612#p12612
// Description(1033): Translates selected text using the Google API
// Description(1049): Перевод текста используя Google-API
// Version: 3.3 (2020.01.06)
// 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=qlt&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'])
								trns = trns + resultObject['sentences'][0]['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(/&/gm, '&');
							resultText = resultText.replace(/</gm, '<');
							resultText = resultText.replace(/>/gm, '>');
							resultText = resultText.replace(/"/gm, '"');
						}
						catch (e) {
							showErrorMessage('Error ' + e.name + ": " + e.message + ((e.stack) ? "\n" + e.stack : ""));
						}
					}
					else {
						showErrorMessage("Unable to retrieve data" + (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(), "Result text:" + "\r\r" + resultText + "\r\r" + "Yes - replace selected (source) text" + "\r" + "No - copy to clipboard", WScript.ScriptName, 32 + 3);
					if (nResultAction == 2) WScript.Quit();
				}
				else {
					AkelPad.MessageBox(AkelPad.GetEditWnd(), "Translation for '" + selection + "' is missing.", 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("Your system does not support XMLHttpRequest.");
				}
			}
		};
	}
	return new XMLHttpRequest();
}

function showErrorMessage(pText, bQuit) {
	AkelPad.MessageBox(AkelPad.GetEditWnd(), pText, WScript.ScriptName, 16);
	if (bQuit) WScript.Quit();
}
Благодарности: KDJ, Otto_Romwel, Kley, Krtec.
Last edited by VladSh on Mon Jan 06, 2020 10:45 am, edited 25 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Translates text via Google and MS Bing.
Script moved to another location.
Translator.js
Last edited by KDJ on Sun Jan 08, 2012 3:42 pm, edited 6 times in total.

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

crypt.js <download | mirror | development version>
Improved version of AESCrypt.js.
Encrypt/decrypt text using AES-256 or/and Blowfish.
It can be very slow, be careful.


Image Image


Post size limit, here is packed file:

Code: Select all

begin 644 crypt.7z
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
B<`!T`"X`:@!S````%`H!```_`X'C:<\!%08!`"``````````
`
end
sum -r/size 13836/25279

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip.
Last edited by Infocatcher on Wed May 07, 2014 11:28 am, edited 4 times in total.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Code: Select all

// Description(1033): Opens the directory where the files are stored sessions
// Description(1049): Открывает папку, в которой сохраняются файлы сессий
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=12937#p12937
// Version: 1.3 (2015.01.14)
// Author: VladSh
// 
// Usage:
// 	-"Directory of sessions" Call("Scripts::Main", 1, "OpenSessionsDir.js")

var pAkelPlugsDir = AkelPad.GetAkelDir(4 /*ADTYPE_PLUGS*/) + "\\";

var pPluginFileName = "Sessions";
var pParameterName = "SaveSessions";
var nParameterValue;

var oSet = AkelPad.ScriptSettings();
if (oSet.Begin(pPluginFileName, 0x21 /* POB_PLUGS + POB_READ */)) {
	nParameterValue = oSet.Read(pParameterName, 3 /*PO_STRING*/);
	oSet.End();
}

var WshShell = new ActiveXObject("WScript.Shell");
var pPluginDataDir;		//папка, которую мы собственно и будем открывать

switch (nParameterValue) {
	case "1":		//Дирректория программы
		pPluginDataDir = pAkelPlugsDir + pPluginFileName;
		break;
	case "2":		//Дирректория пользователя
		pPluginDataDir = WshShell.ExpandEnvironmentStrings("%APPDATA%\\AkelPad\\" + pPluginFileName);
		break;
	default:
		AkelPad.MessageBox(AkelPad.GetEditWnd(), "Unhandled value of parameter " + pParameterName + "=" + nParameterValue + "!", WScript.ScriptName, 48);
		WScript.Quit();
}

var fso = new ActiveXObject("Scripting.FileSystemObject");

if (fso.FolderExists(pPluginDataDir) == false) {
	AkelPad.MessageBox(AkelPad.GetEditWnd(), "Directory of sessions '" + pPluginDataDir + "' not found!'", WScript.ScriptName, 48);
	WScript.Quit();
}

var nResult = -1;

if (fso.FileExists(pAkelPlugsDir + "Explorer.dll") == true)		//пытаемся сначала открыть в Explorer-плагине
	nResult = AkelPad.Call("Explorer::Main", 1, pPluginDataDir);

if (nResult == -1)
	WshShell.Exec('explorer.exe "' + pPluginDataDir + '"');
Last edited by VladSh on Wed Jan 14, 2015 8:29 pm, edited 4 times in total.

Offline
Posts: 15
Joined: Sun Oct 11, 2009 10:51 am

Post by oyaebu »

Заменяет выделение его хешем.

Code: Select all

function utf8_encode ( str_data ) {	// Encodes an ISO-8859-1 string to UTF-8
	// 
	// +   original by: Webtoolkit.info (http://www.webtoolkit.info/)

	str_data = str_data.replace(/\r\n/g,"\n");
	var utftext = "";

	for (var n = 0; n < str_data.length; n++) {
		var c = str_data.charCodeAt(n);
		if (c < 128) {
			utftext += String.fromCharCode(c);
		} else if((c > 127) && (c < 2048)) {
			utftext += String.fromCharCode((c >> 6) | 192);
			utftext += String.fromCharCode((c & 63) | 128);
		} else {
			utftext += String.fromCharCode((c >> 12) | 224);
			utftext += String.fromCharCode(((c >> 6) & 63) | 128);
			utftext += String.fromCharCode((c & 63) | 128);
		}
	}

	return utftext;
}

function md5 ( str ) {	// Calculate the md5 hash of a string
	// 
	// +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
	// + namespaced by: Michael White (http://crestidg.com)

	var RotateLeft = function(lValue, iShiftBits) {
			return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
		};

	var AddUnsigned = function(lX,lY) {
			var lX4,lY4,lX8,lY8,lResult;
			lX8 = (lX & 0x80000000);
			lY8 = (lY & 0x80000000);
			lX4 = (lX & 0x40000000);
			lY4 = (lY & 0x40000000);
			lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
			if (lX4 & lY4) {
				return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
			}
			if (lX4 | lY4) {
				if (lResult & 0x40000000) {
					return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
				} else {
					return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
				}
			} else {
				return (lResult ^ lX8 ^ lY8);
			}
		};

	var F = function(x,y,z) { return (x & y) | ((~x) & z); };
	var G = function(x,y,z) { return (x & z) | (y & (~z)); };
	var H = function(x,y,z) { return (x ^ y ^ z); };
	var I = function(x,y,z) { return (y ^ (x | (~z))); };

	var FF = function(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};

	var GG = function(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};

	var HH = function(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};

	var II = function(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};

	var ConvertToWordArray = function(str) {
			var lWordCount;
			var lMessageLength = str.length;
			var lNumberOfWords_temp1=lMessageLength + 8;
			var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
			var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
			var lWordArray=Array(lNumberOfWords-1);
			var lBytePosition = 0;
			var lByteCount = 0;
			while ( lByteCount < lMessageLength ) {
				lWordCount = (lByteCount-(lByteCount % 4))/4;
				lBytePosition = (lByteCount % 4)*8;
				lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
				lByteCount++;
			}
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
			lWordArray[lNumberOfWords-2] = lMessageLength<<3;
			lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
			return lWordArray;
		};

	var WordToHex = function(lValue) {
			var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
			for (lCount = 0;lCount<=3;lCount++) {
				lByte = (lValue>>>(lCount*8)) & 255;
				WordToHexValue_temp = "0" + lByte.toString(16);
				WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
			}
			return WordToHexValue;
		};

	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;

	str = utf8_encode(str);
	x = ConvertToWordArray(str);
	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

	for (k=0;k<x.length;k+=16) {
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
		a=AddUnsigned(a,AA);
		b=AddUnsigned(b,BB);
		c=AddUnsigned(c,CC);
		d=AddUnsigned(d,DD);
	}

	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

	return temp.toLowerCase();
}

AkelPad.ReplaceSel(md5(AkelPad.GetSelText()));

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Суровый скрипт на тему того, как я вижу запуск файлов из AkelPad (включая компиляцию).
My vision of running a file from within AkelPad (including compiling).

Code: Select all

/**********************************************************************
 *  RunMe.js  v.2.2                                                   *
 *  (C) DV, Dec 2015                                                  *
 **********************************************************************/
/*
 *  Simple usage:
 *    Call("Scripts::Main", 1, "RunMe.js")
 *  To specify command line manually:
 *    Call("Scripts::Main", 1, "RunMe.js", "1")
 *
 *  Version 2.1 adds new ability to run a file specified by the selected
 *  text. First it tries to extract a file extension from the selected 
 *  text - and if this succeeds, searches for a matching item in the
 *  oCommands. If such item exists, the specified file is run. Otherwise
 *  it calls isSupportedFileExtFromSelectedText - and if this function
 *  returns false, the physical file itself is processed.
 *
 *  Format of 'oCommands':
 *  var oCommands = {
 *    "extensions-1" :
 *      "command-1" ,
 *    "extensions-2" :
 *      "command-2" ,
 *    ...
 *  };
 *  where 'extensions' are space-separated extensions e.g. "cpp cxx hxx"
 *  and 'command' is a command to be executed.
 *  You can use empty command ("") to do nothing.
 *  You can use empty extension ("") in the end of 'oCommands' to match
 *  any file extension which was not matched by previous items.
 *
 *  The command may include:
 *  %a - AkelPad directory: "C:\Program Files\AkelPad"
 *  %d - file directory: "C:", "C:\Program Files"
 *  %e - file extension: "txt", "js"
 *  %f - file full pathname: "C:\File.txt"
 *  %n - file name: "File"
 *
 *  If a command is started with ':', this command should contain a name
 *  of internal function to be executed. For example:
 *    var oCommands = {
 *      ...
 *      "js" :
 *        ":run_js(\"%n.%e\")" ,
 *      ...
 *    };
 *    function run_js(fileName)
 *    {
 *      AkelPad.Call("Scripts::Main", 1, fileName);
 *    }
 *
 *  Note:
 *  When using a compiler or an interpreter, you can specify a command
 *  in a form of "cmd /c your-command-here || pause".
 *  This makes the console window remain in case of error from the
 *  compiler/interpreter.
 *
 **********************************************************************/


// user-defined set of file extensions and commands
var oCommands = {
  "ini txt nfo coder" :
    "" /* do nothing */ ,
  "bat cmd" :
    "cmd /c \"%f\" || pause" ,
  "js" :
    ":run_js(\"%d\", \"%n.%e\")" ,
  "c" :
    "cmd /c C:\\tools\\tcc\\tcc.exe -luser32 -run \"%f\" || pause" ,
  "cpp cc cxx hxx hpp hh h" :
    ":run_cpp(\"%f\")" ,
  "awk" :
    "cmd /c C:\\tools\\gawk\\gawk.exe -f \"%f\" || pause" ,
  "nsi nsis" :
    ":run_nsis(\"%f\")" ,
  "py" :
    ":run_py(\"%f\")" ,
  "pas pp" :
    ":run_pas(\"%f\")" ,
  "xml" :
    "cmd /c C:\\tools\\libxml\\xmllint.exe --format \"%f\" || pause" ,

  // this item should be always the last one!
  "" /* apply to any remained extension */ :
    ":run_anyfile(\"%f\")"
  /* Do not add anything after this !!! */
};


// user-defined functions...
function run_js(fileDir, fileName, args) // 'args' is optional
{
  if (fileDir.toUpperCase() == getAkelPadDir(5).toUpperCase())
  {
    // script is under AkelPad's Scripts directory
    if (args == undefined || args == "")
      AkelPad.Call("Scripts::Main", 1, fileName);
    else
      AkelPad.Call("Scripts::Main", 1, fileName, args);
  }
  else
  {
    // call default js interpreter
    var cmd = (fileDir == "") ? fileName : fileDir + "\\" + fileName;
    cmd = buildCommandWithOptionalArgs("\"" + cmd + "\"", args);
    runCommand(cmd, "", 0); // do not capture output
  }
}

function run_pas(filePathName, args) // 'args' is optional
{
  var sPath = envGetVar("PATH");
  var sPathNew = sPath + ";C:\\FPC\\2.6.0\\bin\\i386-win32";
  envSetVar("PATH", sPathNew); // adding path to fpc.exe
  var cmd1 = "fpc.exe \"%f\""; // compile
  var cmd2 = buildCommandWithOptionalArgs("\"%n.exe\"", args); // run the .exe in Log::Output
//  var cmd2 = "rundll32.exe shell32,ShellExec_RunDLL \"%n.exe\""; // run the .exe
  var cmd = "cmd /c " + cmd1 + " && " + cmd2;
  cmd = substituteVars(cmd, filePathName); // pre-process %f, %n etc.
  setCurrentDir(getFileDir(filePathName));
  runCommand(cmd); // run
  envSetVar("PATH", sPath); // restoring original PATH
}

function run_py(filePathName, args) // 'args' is optional
{
  var dir = getFileDir(filePathName);
  var fileNameExt = getFileNameExt(filePathName);
  var cmd = buildCommandWithOptionalArgs("python \"" + fileNameExt + "\"", args);
  runCommand(cmd, dir);
}

function run_cpp(filePathName, args) // 'args' is optional
{
  var useMinGW = false;
  if (useMinGW)
  {
    /*  MinGW G++  */
    var compilerExe = "C:\\MinGW\\bin\\g++.exe";
    var compilerDir = getFileDir(compilerExe);
    // cmd1: compile the source file (object file is created)
    var cmd1 = compilerExe + " -c \"%f\" -o \"%d\\%n.o\"";
    // cmd2: create the executable (from the object file)
    var cmd2 = compilerExe + " \"%d\\%n.o\" -o \"%d\\%n.exe\"";
    // cmd3: run the executable
    var cmd3 = buildCommandWithOptionalArgs("\"%d\\%n.exe\"", args);
    // cmd: the whole command line
    var cmd = "cmd /c " + cmd1 + " && " + cmd2 + " && " + cmd3 + " || pause";
    cmd = substituteVars(cmd, filePathName);
    //WScript.Echo(cmd);
    runCommand(cmd, compilerDir);
  }
  else
  {
    /*  Visual Studio 9 (2008)  */
    var sProgramFiles = envGetVar("ProgramFiles");
    var sProgramFilesx86 = envGetVar("ProgramFiles(x86)");
    if (sProgramFilesx86.length == 0)
      sProgramFilesx86 = sProgramFiles;
    else
      sProgramFiles = sProgramFilesx86.substr(0, sProgramFilesx86.length - 6);
    var sVcDir = sProgramFilesx86 + "\\Microsoft Visual Studio 9.0\\VC";
    var sVsCommon = sProgramFilesx86 + "\\Microsoft Visual Studio 9.0\\Common7\\IDE";
    var sMsSDK = sProgramFiles + "\\Microsoft SDKs\\Windows\\v6.0A";
    // update PATH environment variable...
    var sPath = envGetVar("PATH");
    var sPathNew = sVcDir + "\\bin;" + sMsSDK + "\\bin;" + sVsCommon + ";" + sPath;
    envSetVar("PATH", sPathNew); //WScript.Echo(envGetVar("PATH"));
    // update INLUDE environment variable...
    var sInclude = envGetVar("INCLUDE");
    var sIncludeNew = sMsSDK + "\\include;" + sVcDir + "\\include;" + sInclude;
    envSetVar("INCLUDE", sIncludeNew); //WScript.Echo(envGetVar("INCLUDE"));
    // update LIB environment variable...
    var sLib = envGetVar("LIB");
    var sLibNew = sMsSDK + "\\lib;" + sVcDir + "\\lib;" + sLib;
    envSetVar("LIB", sLibNew); //WScript.Echo(envGetVar("LIB"));
    // compile...
    var fileDir = getFileDir(filePathName);
    var cmd1 = "cl /O1 \"%f\" /link kernel32.lib user32.lib comctl32.lib gdi32.lib Advapi32.lib ole32.lib Oleaut32.lib";
    var cmd2 = buildCommandWithOptionalArgs("\"%d\\%n.exe\"", args);
    var cmd = "cmd /c " + cmd1 + " && " + cmd2 + " || pause";
    cmd = substituteVars(cmd, filePathName);
    //WScript.Echo(cmd);
    runCommand(cmd, fileDir);
    // restore original environment variables...
    envSetVar("PATH", sPath);
    envSetVar("INCLUDE", sInclude);
    envSetVar("LIB", sLib);
  }
}

function run_nsis(filePathName, args) // 'args' is optional
{
  var sProgramFiles = getProgramFilesDir("x86");
  var cmd = "\"" + sProgramFiles + "\\NSIS\\makensisw.exe\" \"" + filePathName + "\"";
  cmd = buildCommandWithOptionalArgs(cmd, args);
  runCommand(cmd, "", 0); // do not capture output
}

function run_anyfile(filePathName, args) // 'args' is optional
{
  var cmd = "rundll32.exe shell32,ShellExec_RunDLL \"" + filePathName + "\"";
  cmd = buildCommandWithOptionalArgs(cmd, args);
  runCommand(cmd, "", 0); // do not capture output
}

/* Explicitly defined extensions to recognize supported file types
   that may be extracted from the selected text.
   This function applies to any remaining extension that was not
   handled by any item from 'oCommands' prior to the last one.
   It's needed to filter strings like "some text.other text" that
   do not look like a valid file name.
*/
function isSupportedFileExtFromSelectedText(fileExt)
{
  var supportedExts = "bat bmp cmd doc docx exe gif htm html ico ini jpg msi nfo png reg rtf shtm shtml txt xls xlsx xml";
  return isOneOf(fileExt, supportedExts);
}

/* Helper function: when the optional argument 'args' exists, 
   it is appended to the command 'cmd'.
*/
function buildCommandWithOptionalArgs(cmd, args)
{
  if (args != undefined)
  {
    if (args != "")
    {
      cmd = cmd + " " + args;
    }
  }
  return cmd;
}


///////////////////////////////////////////////////////////////////////
// script engine, do not modify...

AkelPad.ScriptNoMutex(4 /*ULT_LOCKMULTICOPY*/ );

if (!selfTest())
{
  WScript.Quit();
}

var oSys = undefined;
RunFile(GetCurrentFileInfo());

function GetCurrentFileInfo()
{
  var currentFile = {};
  currentFile.pathName = AkelPad.GetEditFile(0);
  currentFile.isModified = AkelPad.GetEditModified(0);

  // check if the selected text specifies a file
  var s = AkelPad.GetSelText();
  if (s != undefined)
  {
    if (s.length > 0)
    {
      // not empty
      if ((s.indexOf("\n") < 0) && (s.indexOf("\r") < 0))
      {
        // not multi-line
        var sExt = getFileExt(s);
        if ((sExt.length > 0) && (sExt.length < 10))
        {
          var ext = getCommandItemExt(sExt); // extension(s) from 'oCommands'
          if ((ext != undefined) && 
              (ext != "" || isSupportedFileExtFromSelectedText(sExt)))
          {
            // strings like "some text.other text" are filtered above
            s = s.replace(/\//g, "\\"); // all '/' to '\'
            currentFile.pathName = substituteVars(s, currentFile.pathName);
            currentFile.isModified = false;
          }
        }
      }
    }
    delete s;
  }

  if (currentFile.pathName.toUpperCase() == WScript.ScriptFullName.toUpperCase())
  {
    WScript.Echo("Don\'t want to execute self :)");
    WScript.Quit();
  }
  
  return currentFile;
}

function RunFile(currentFile)
{
  var fileExt = getFileExt(currentFile.pathName);
  if (fileExt.length > 0)
  {
    var ext = getCommandItemExt(fileExt);
    if (ext != undefined)
    {
      var cmd = oCommands[ext];
      if (cmd.length > 0)
      {
        if (currentFile.isModified)
          AkelPad.Command(4105); // save file

        if (WScript.Arguments.length > 0)
        {
          if (WScript.Arguments(0) == "1") // Command line...
          {
            var oSettings;
            var cmd1;
            var cmd2;

            cmd1 = undefined;
            oSettings = AkelPad.ScriptSettings();
            if (oSettings.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
            {
              cmd1 = oSettings.Read(ext, 3 /*PO_STRING*/);
              oSettings.End();
            }
            if ((cmd1 == undefined) || (cmd1 == ""))
            {
              cmd1 = cmd;
            }
            cmd2 = AkelPad.InputBox(AkelPad.GetMainWnd(), WScript.ScriptName, "command:", cmd1);
            if (cmd2 == undefined)
              WScript.Quit(); // 'Cancel' pressed

            if (cmd2 != cmd1)
            {
              // This may save an empty cmd2 - such case has the special
              // meaning: it allows to use (restore) the default cmd.
              if (oSettings.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
              {
                oSettings.Write(ext, 3 /*PO_STRING*/, cmd2);
                oSettings.End();
              }
            }
            if (cmd2 == "")
              WScript.Quit(); // Empty command line, nothing to do

            cmd = cmd2;
          }
        }

        cmd = substituteVars(cmd, currentFile.pathName);
        if (cmd.charAt(0) == ':')
        {
          cmd = cmd.replace(/\\/g, "\\\\");
          eval(cmd.substr(1));
        }
        else
        {
          runCommand(cmd, "");
        }
      }
    }
    else
      WScript.Echo("No matched extension found!");
  }
  else
    WScript.Echo("File extension is empty!");
}

function getCommandItemExt(fileExt)
{
  fileExt = fileExt.toLowerCase();
  for (var ext in oCommands)
  {
    ext = ext.toLowerCase();
    if ((ext.length == 0) || isOneOf(fileExt, ext))
      return ext;
  }
  return undefined;
}

function envGetVar(varName)
{
  var varValue = "";
  var lpBuffer;
  if (lpBuffer = AkelPad.MemAlloc(8192*_TSIZE))
  {
    if (oSys == undefined)
      oSys = AkelPad.SystemFunction();
    oSys.Call("kernel32::GetEnvironmentVariable" + _TCHAR, varName, lpBuffer, 8192);
    varValue = AkelPad.MemRead(lpBuffer, _TSTR);
    AkelPad.MemFree(lpBuffer);
  }
  return varValue;
}

function envSetVar(varName, varValue)
{
  if (oSys == undefined)
    oSys = AkelPad.SystemFunction();
  oSys.Call("kernel32::SetEnvironmentVariable" + _TCHAR, varName, varValue);
}

function getCurrentDir()
{
  var dir = "";
  var lpBuffer;
  if (lpBuffer = AkelPad.MemAlloc(8192*_TSIZE))
  {
    if (oSys == undefined)
      oSys = AkelPad.SystemFunction();
    oSys.Call("kernel32::GetCurrentDirectory" + _TCHAR, 8192, lpBuffer);
    dir = AkelPad.MemRead(lpBuffer, _TSTR);
    AkelPad.MemFree(lpBuffer);
  }
  return dir;
}

function setCurrentDir(dir)
{
  if (oSys == undefined)
    oSys = AkelPad.SystemFunction();
  oSys.Call("kernel32::SetCurrentDirectory" + _TCHAR, dir);
}

function getProgramFilesDir(bits)
{
  var sProgramFiles = envGetVar("ProgramFiles");
  var sProgramFilesx86 = envGetVar("ProgramFiles(x86)");
  if (sProgramFilesx86.length == 0)
    sProgramFilesx86 = sProgramFiles;
  else if (sProgramFiles.length == 0)
    sProgramFiles = sProgramFilesx86.substr(0, sProgramFilesx86.length - 6);

  if (bits == undefined || bits != 32 || bits != "x86")
    return sProgramFiles;
  else
    return sProgramFilesx86;
}

function getAkelPadDir(adtype)
{
  var s = AkelPad.GetAkelDir(adtype);
  return s;
}

function getFileExt(filePathName) // file extension w/o leading '.'
{
  var n = filePathName.lastIndexOf(".");
  return (n >= 0) ? filePathName.substr(n + 1) : "";
}

function getFileName(filePathName) // file name w/o extension
{
  var n2 = filePathName.lastIndexOf(".");
  var n1 = filePathName.lastIndexOf("\\");
  var nn = filePathName.lastIndexOf("/");
  if (nn > n1)  n1 = nn;
  var s = "";
  if (n1 < 0 && n2 < 0)
    s = filePathName;
  else if (n1 < 0)
    s = filePathName.substr(0, n2);
  else if (n2 < 0)
    s = filePathName.substr(n1 + 1);
  else if (n2 > n1)
    s = filePathName.substr(n1 + 1, n2 - n1 - 1);
  return s;
}

function getFileNameExt(filePathName) // file name with extension
{
  var n = filePathName.lastIndexOf("\\");
  var nn = filePathName.lastIndexOf("/");
  if (nn > n)  n = nn;
  return (n >= 0) ? filePathName.substr(n + 1) : filePathName;
}

function getFileDir(filePathName) // file directory w/o trailing '\'
{
  var n = filePathName.lastIndexOf("\\");
  var nn = filePathName.lastIndexOf("/");
  if (nn > n)  n = nn;
  var s = "";
  if (n >= 0)
    s = filePathName.substr(0, n);
  else if (isFullPath(filePathName))
    s = filePathName;
  return s;
}

function isFullPath(filePathName)
{
  return /^([A-Za-z]\:)|(\\\\)/.test(filePathName);
}

function isOneOf(s, t) // t includes s
{
  var s1 = " " + s + " ";
  var t1 = " " + t + " ";
  return (t1.indexOf(s1) >= 0);
}

function substituteVars(cmd, filePathName)
{
  if (cmd.indexOf("%a") >= 0)
  {
    cmd = cmd.replace(/%a/g, getAkelPadDir(0));
  }
  if (cmd.indexOf("%d") >= 0)
  {
    cmd = cmd.replace(/%d/g, getFileDir(filePathName));
  }
  if (cmd.indexOf("%e") >= 0)
  {
    cmd = cmd.replace(/%e/g, getFileExt(filePathName));
  }
  if (cmd.indexOf("%f") >= 0)
  {
    cmd = cmd.replace(/%f/g, filePathName);
  }
  if (cmd.indexOf("%n") >= 0)
  {
    cmd = cmd.replace(/%n/g, getFileName(filePathName));
  }
  return cmd;
}

function runCommand(cmd, dir, captureOutput)
{
  if (captureOutput == undefined || captureOutput != 0)
  {
    // by default, capture output
    if (/[ ]*\|\|[ ]*pause[ ]*$/.test(cmd))
    {
      // exclude trailing "|| pause" from 'cmd' if present
      var n = cmd.lastIndexOf("||");
      cmd = cmd.substr(0, n);
    }
    runLogOutputCmd(cmd, dir);
  }
  else
  {
    if (dir == undefined || dir == "")
    {
      var WshShell = new ActiveXObject("WScript.Shell");
      try
      {
        WshShell.Run(cmd, 1, false);
      }
      catch (error)
      {
        var hMainWnd = AkelPad.GetMainWnd();
        var s = "Failed to execute:\n  " + cmd;
        AkelPad.MessageBox(hMainWnd, s, WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
      }
    }
    else
    {
      AkelPad.Exec(cmd, dir);
    }
  }
}

function runLogOutputCmd(cmd, dir)
{
  var lpState;

  // the command (child process) is about to be run...
  AkelPad.Call("Log::Output", 1, cmd, dir);

  // wait until the child process will actually be started...
  lpState = AkelPad.MemAlloc(4 /*sizeof(DWORD)*/);
  if (lpState)
  {
    var nState = -1;

    while (nState != 0 && nState < 4)
    {
      AkelPad.Call("Log::Output", 3, lpState);
      nState = AkelPad.MemRead(lpState, 3 /*DT_DWORD*/);
      //AkelPad.Call("Log::Output", 5, "State: " + dwState + "\n");
      WScript.Sleep(200);
    }

    AkelPad.MemFree(lpState);
  }
  else
  {
    // wait to be sure the process has been started
    WScript.Sleep(2000);
  }
}

function selfTest()
{
  if (oCommands == undefined)
  {
    WScript.Echo("\'oCommands\' is undefined.\nNothing to do.");
    return false;
  }

  var isEmpty = true;
  var hasEmptyExt = false;
  for (var ext in oCommands)
  {
    if (ext == undefined)
    {
      WScript.Echo("Undefined extension found.\nCan not proceed.");
      return false;
    }
    if (oCommands[ext] == undefined)
    {
      WScript.Echo("oCommands[\"" + ext + "\"]: command is undefined.\nCan not proceed.");
      return false;
    }
    if (hasEmptyExt)
    {
      WScript.Echo("Empty extension found while there are more items below.\nEmpty extension matches any remaining file extension, so such item\nshould be the last (otherwise all the further items will be ignored).");
      return false;
    }
    if (ext.length == 0)
    {
      hasEmptyExt = true;
    }
    isEmpty = false;
  }

  if (isEmpty)
  {
    WScript.Echo("\'oCommands\' is empty.\nNothing to do.");
    return false;
  }

  return true;
}


Code: Select all

1. Скрипт RunMe.js предназначен для компиляции и запуска различных исходных
файлов прямо из AkelPad.
При этом непосредственно компиляция или интерпретация исходного файла
производится внешним компилятором/интерпретатором.
Какой именно компилятор/интерпретатор вызывать для текущего файла,
определяется расширением этого файла и соответствующей этому расширению
командой, прописанной в наборе 'oCommands' (подробности ниже).
2. Также RunMe.js позволяет выполнять запуск файла, имя которого указано в
выделенном тексте (подробности ниже).
3. Вызов RunMe.js с параметром "1" позволяет модифицировать командную строку,
которая будет выполнена для запуска или компиляции файла. Это, в частности, 
позволяет указать дополнительные аргументы командной строки (подробности ниже).

1. Компиляция и запуск текущего файла
Скрипт RunMe.js состоит из двух логических частей: 
1) верхняя, пользовательская, часть - это набор 'oCommands', описывающий 
известные скрипту расширения файлов и что с ними делать. Сюда же относятся
пользовательские функции 'run_js', 'run_pas' и т.д. Предполагается, что
эту часть будет менять сам пользователь в зависимости от своих нужд, добавляя
новые расширения файлов и обработчики для них или же редактируя существующие.
2) нижняя, внутренняя, часть - это "движок" скрипта. Эту часть лучше не 
трогать. Изменения здесь могут понадобиться только в том случае, если вы 
хорошо разобрались, как скрипт работает в целом, и вам не хватает какого-то
вспомогательного функционала.
За компиляцию и запуск конкретных файлов отвечает пользовательская часть.
Для поддержки новых расширений файлов просто добавьте новый элемент в
набор 'oCommands' по аналогии с имеющимися.
Каждый элемент представляет собой пару "расширения" : "команда", где
расширения файлов перечисляются через пробел, а команда представляет собой
либо непосредственно командную строку, либо имя функции внутри RunMe.js,
которая будет вызвана для запуска/компиляции файлов с соответствующим
расширением. Вариант с функцией предусмотрен на тот случай, когда для запуска
файла нужно выполнить достаточно много действий - как пример, см. 'run_cpp'.
При добавлении новых элементов в 'oCommands' всегда оставляйте элемент
"" : ":run_anyfile(\"%f\")" самым последним в наборе.
При анализе расширения файла элементы в 'oCommands' просматриваются по
порядку, сверху вниз. Срабатывает первый из элементов, соответствующий
указанному расширению файла.

2. Запуск файла, указанного в выделенном тексте
Пример: набираем в редакторе "calc.exe", выделяем "calc.exe", запускаем
RunMe.js - и, вуаля, калькулятор перед нами.
Точно так же мы можем выделить и запустить .bat, .reg и прочие файлы по
их полному пути и расширению, например: "C:\Tools\SomeCommands.bat".
В выделенном тексте также поддерживаются %a, %d, %e, %f и %n, соответствующие
текущему файлу (если он сохранён).
Если выделенный текст не может быть распознан как имя файла, который можно
запустить, то RunMe.js работает в обычном режиме - пытается найти подходящую
команду для расширения физического файла.
Распознавание имени файла в выделенном тексте сделано очень просто:
1) выделенный текст не должен включать больше одной строки;
2) выделенный текст должен оканчиваться расширением файла, перечисленным
либо в 'oCommands', либо в 'isSupportedFileExtFromSelectedText'.
Фильтр по расширениям добавлен из соображений того, чтобы отсеять текст
общего вида, например "some text.other text" - который хотя и содержит
точку, но явно не представляет собой имя файла. (Возможно, в функции
'isSupportedFileExtFromSelectedText' вместо проверки конкретных расширений
следует сделать проверку на некоторое регулярное выражение.)

3. Запуск с модификацией командной строки
Иногда нам не достаточно просто запустить файл, как есть, - в особенности
если это скрипт, принимающий некоторые входные аргументы. Для этой цели в
RunMe.js предусмотрен режим модификации командной строки.
У себя я это настроил с помощью плагина Hotkeys:
1) Run  | Call("Scripts::Main", 1, "RunMe.js")      | Ctrl + F9
2) Run2 | Call("Scripts::Main", 1, "RunMe.js", "1") | Ctrl + Shift + F9
При нажатии Ctrl+Shift+F9 я вижу что-то вроде:
  Command:
  cmd /c python "%f" || pause
Когда мне нужны дополнительные аргументы, я их просто вписываю в эту строку.
Например:
  Command:
  cmd /c python "%f" 1 2 "Hello world!" || pause
При этом RunMe.js запоминает изменённую команду - и показывает её при
следующем нажатии Ctrl+Shift+F9.
При этом обычный запуск (Ctrl+F9) ориентируется сугубо на содержимое самого
RunMe.js, не подставляя изменённую команду.
В случае команд, выполняющихся путём вызова функции из RunMe.js, мы видим
несколько другое:
  Command:
  :run_js("%d", "%n.%e")
Для поддержки аргументов в пользовательские функции был специально добавлен
необязательный параметр 'args'. По умолчанию он не указан, но мы можем его
добавить:
  Command:
  :run_js("%d", "%n.%e", '1 2 "Hello world!" ')
Обратите внимание на использование одинарных кавычек для возможности передачи
двойных кавычек как части аргументов.


Чтобы выяснить пути к Visual C++:

Code: Select all

@echo off

set PathToProgramFiles=%ProgramFiles%

set PathToProgramFilesx86=%ProgramFiles%
if "%ProgramFiles(x86)%" == "" goto programfiles_ok
set PathToProgramFilesx86=%ProgramFiles(x86)%
:programfiles_ok

set PathToMicrosoftSDKs=%PathToProgramFiles%\Microsoft SDKs
if exist "%PathToMicrosoftSDKs%" goto microsoftsdks_ok
set PathToMicrosoftSDKs=%PathToProgramFilesx86%\Microsoft SDKs
:microsoftsdks_ok

set PathToWindowsKits=%PathToProgramFiles%\Windows Kits
if exist "%PathToWindowsKits%" goto windowskits_ok
set PathToWindowsKits=%PathToProgramFilesx86%\Windows Kits
:windowskits_ok

echo.
echo Detecting VC...
for /D %%c in (
               "%PathToProgramFilesx86%\Microsoft Visual Studio\VC98",
               "%PathToProgramFilesx86%\Microsoft Visual Studio .NET\Vc7",
               "%PathToProgramFilesx86%\Microsoft Visual Studio .NET 2003\Vc7",
               "%PathToProgramFilesx86%\Microsoft Visual C++ Toolkit 2003",
               "%PathToProgramFilesx86%\Microsoft Visual Studio 8\VC",
               "%PathToProgramFilesx86%\Microsoft Visual Studio 9.0\VC",
               "%PathToProgramFilesx86%\Microsoft Visual Studio 10.0\VC",
               "%PathToProgramFilesx86%\Microsoft Visual Studio 11.0\VC",
               "%PathToProgramFilesx86%\Microsoft Visual Studio 12.0\VC"
              ) do (
    if exist "%%~c" (
        if exist "%%~c\bin" (
            call :DetectDetails "%%~c"
        )
    )
)
goto End

:DetectDetails
if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio\VC98" (
    if exist "%~1\..\Common\MSDev98" (
        echo.
        echo * VC6 /1998/ detected:
        call :EchoUnquotedString "set VCDIR=%~1"
        echo set VSCOMMON=%%VCDIR%%\..\Common\MSDev98
        echo set PATH=%%VCDIR%%\Bin;%%VSCOMMON%%\Bin;%%PATH%%
        echo set INCLUDE=%%VCDIR%%\include;%%INCLUDE%%
        echo set LIB=%%VCDIR%%\lib;%%LIB%%
    )
    goto End
)
if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio .NET\Vc7" (
    if exist "%~1\PlatformSDK" (
        if exist "%~1\atlmfc" (
            echo.
            echo * VC7.0 /2002/ detected:
            call :EchoUnquotedString "set VCDIR=%~1"
            echo set MSSDK=%%VCDIR%%\PlatformSDK
            echo set ATLMFC=%%VCDIR%%\atlmfc
            echo set PATH=%%VCDIR%%\bin;%%MSSDK%%\bin;%%PATH%%
            echo set INCLUDE=%%MSSDK%%\include;%%VCDIR%%\include;%%ATLMFC%%\include;%%INCLUDE%%
            echo set LIB=%%MSSDK%%\lib;%%VCDIR%%\lib;%%LIB%%
        )
    )
    goto End
)
if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio .NET 2003\Vc7" (
    if exist "%~1\PlatformSDK" (
        if exist "%~1\atlmfc" (
            echo.
            echo * VC7.1 /2003/ detected:
            call :EchoUnquotedString "set VCDIR=%~1"
            echo set MSSDK=%%VCDIR%%\PlatformSDK
            echo set ATLMFC=%%VCDIR%%\atlmfc
            echo set PATH=%%VCDIR%%\bin;%%MSSDK%%\bin;%%PATH%%
            echo set INCLUDE=%%MSSDK%%\include;%%VCDIR%%\include;%%ATLMFC%%\include;%%INCLUDE%%
            echo set LIB=%%MSSDK%%\lib;%%VCDIR%%\lib;%%LIB%%
        )
    )
    goto End
)
if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual C++ Toolkit 2003" (
    echo Microsoft Visual C++ Toolkit 2003 - no info yet...
    goto End
)

if exist "%~1\..\Common7\IDE" (
    echo.
    if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio 8\VC" (
        echo * VC8 /2005/ detected:
        goto DetectDetails_Proceed
    )
    if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio 9.0\VC" (
        echo * VC9 /2008/ detected:
        goto DetectDetails_Proceed
    )
    if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio 10.0\VC" (
        echo * VC10 /2010/ detected:
        goto DetectDetails_Proceed
    )
    if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio 11.0\VC" (
        echo * VC11 /2012/ detected:
        goto DetectDetails_Proceed
    )
    if "%~1" == "%PathToProgramFilesx86%\Microsoft Visual Studio 12.0\VC" (
        echo * VC12 /2013/ detected:
        goto DetectDetails_Proceed
    )
:DetectDetails_Proceed   
    call :EchoUnquotedString "set VCDIR=%~1"
    echo set VSCOMMON=%%VCDIR%%\..\Common7\IDE
    if exist "%~1\PlatformSDK" (
        echo set MSSDK=%%VCDIR%%\PlatformSDK
    )
    for /D %%s in (
                   "%PathToProgramFiles%\Microsoft Platform SDK for Windows Server 2003 R2",
                   "%PathToProgramFiles%\Microsoft Platform SDK",
                   "%PathToMicrosoftSDKs%\Windows\v6.0A",
                   "%PathToMicrosoftSDKs%\Windows\v7.0",
                   "%PathToMicrosoftSDKs%\Windows\v7.0A",
                   "%PathToMicrosoftSDKs%\Windows\v7.1",
                   "%PathToMicrosoftSDKs%\Windows\v7.1A",
                   "%PathToMicrosoftSDKs%\Windows\v8.0",
                   "%PathToMicrosoftSDKs%\Windows\v8.0A",
                   "%PathToMicrosoftSDKs%\Windows\v8.1",
                   "%PathToMicrosoftSDKs%\Windows\v8.1A",
                   "%PathToMicrosoftSDKs%\Windows\v9.0",
                   "%PathToMicrosoftSDKs%\Windows\v9.0A",
                   "%PathToMicrosoftSDKs%\Windows\v9.1",
                   "%PathToMicrosoftSDKs%\Windows\v9.1A",
                   "%PathToWindowsKits%\8.0",
                   "%PathToWindowsKits%\8.0A",
                   "%PathToWindowsKits%\8.1",
                   "%PathToWindowsKits%\8.1A",
                   "%PathToWindowsKits%\9.0",
                   "%PathToWindowsKits%\9.0A",
                   "%PathToWindowsKits%\9.1",
                   "%PathToWindowsKits%\9.1A"
                  ) do (
        if exist "%%~s" (
            if exist "%%~s\bin" (
                if exist "%%~s\lib" (
                    if exist "%%~s\include" (
                        call :EchoUnquotedString "set MSSDK=%%~s"
                    )
                )
            )
        )
    )
    echo set PATH=%%VCDIR%%\bin;%%MSSDK%%\bin;%%VSCOMMON%%;%%PATH%%
    echo set INCLUDE=%%MSSDK%%\include;%%VCDIR%%\include;%%INCLUDE%%
    echo set LIB=%%MSSDK%%\lib;%%VCDIR%%\lib;%%LIB%%
)
goto End

:EchoUnquotedString
    echo %~1
goto End

:End
Last edited by DV on Sun Dec 13, 2015 5:16 pm, edited 20 times in total.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Export highlighted text to HTML or BBCode.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=13021#13021
// Version: 2.6
// Author: Shengalts Aleksander aka Instructor
//
//
// Description(1033): Export highlighted text to HTML or BBCode.
// Description(1049): Экспортировать подсвеченный текст в HTML или BBCode.
//
// Arguments:
// -Format="BBCode"                   -Output highlighting in BBCode format (default is "HTML").
// -Enclose="[code]${result}[/code]"  -Enclose result string (default is "<pre>${result}</pre>").
// -BR="<br>"                         -HTML new line string (default is "").
// -Strict=true                       -use "<span style=" instead of "<font" (default is false).
// -Info=false                        -Don't add link to CodePoster.js script (default is true).
// -InfoSize="10"                     -Information font size (default is 1).
//
// Usage:
// Call("Scripts::Main", 1, "CodePoster.js", `-Format="BBCode" -Enclose="[quote]${result}[/quote]" -InfoSize="10"`)
// Call("Scripts::Main", 1, "CodePoster.js", `-Format="BBCode" -Enclose="[code]${result}[/code]"`)
// Call("Scripts::Main", 1, "CodePoster.js", `-Format="HTML" -Strict=true -Info=false`)

//Arguments
var pFormat=AkelPad.GetArgValue("Format", "HTML");
var pEnclose=AkelPad.GetArgValue("Enclose", "<pre>${result}</pre>");
var pBR=AkelPad.GetArgValue("BR", "");
var bStrict=AkelPad.GetArgValue("Strict", false);
var bInfo=AkelPad.GetArgValue("Info", true);
var pInfoSize=AkelPad.GetArgValue("InfoSize", "1");

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var dwSystemTextColor=oSys.Call("user32::GetSysColor", 8 /*COLOR_WINDOWTEXT*/);
var dwSystemBkColor=oSys.Call("user32::GetSysColor", 5 /*COLOR_WINDOW*/);
var lpGH;
var lpCallback;
var pText="";
var lpMemText=0;
var dwMemTextBytes;
var dwPrevColorCloseStart;
var dwPrevColorCloseEnd;
var dwPrevActiveTextColor;
var dwPrevActiveBkColor;
var bBBCode;
var pScriptURL="";

if (hWndEdit)
{
  if (pFormat.toLowerCase() == "html")
    bBBCode=false;
  else
    bBBCode=true;

  if (bInfo)
    pScriptURL="http://akelpad.sourceforge.net/forum/viewtopic.php?p=13021#13021";

  if (lpGH=AkelPad.MemAlloc(_X64?80:40 /*sizeof(AEGETHIGHLIGHT)*/))
  {
    if (lpCallback=oSys.RegisterCallback(GetHighLightCallback))
    {
      AkelPad.MemCopy(_PtrAdd(lpGH, _X64?16:8) /*offsetof(AEGETHIGHLIGHT, lpCallback)*/, lpCallback, 2 /*DT_QWORD*/);
      AkelPad.MemCopy(_PtrAdd(lpGH, _X64?72:36) /*offsetof(AEGETHIGHLIGHT, dwFlags)*/, 0x7 /*AEGHF_NOSELECTION|AEGHF_NOACTIVELINETEXT|AEGHF_NOACTIVELINEBK*/, 3 /*DT_DWORD*/);

      if (!AkelPad.SendMessage(hWndEdit, 3123 /*AEM_EXGETSEL*/, _PtrAdd(lpGH, _X64?24:12) /*offsetof(AEGETHIGHLIGHT, crText.ciMin)*/, _PtrAdd(lpGH, _X64?48:24) /*offsetof(AEGETHIGHLIGHT, crText.ciMax)*/))
      {
        AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 1 /*AEGI_FIRSTCHAR*/, _PtrAdd(lpGH, _X64?24:12) /*offsetof(AEGETHIGHLIGHT, crText.ciMin)*/);
        AkelPad.SendMessage(hWndEdit, 3130 /*AEM_GETINDEX*/, 2 /*AEGI_LASTCHAR*/, _PtrAdd(lpGH, _X64?48:24) /*offsetof(AEGETHIGHLIGHT, crText.ciMax)*/);
      }

      //Calculate dwMemTextBytes
      dwMemTextBytes=0;
      dwPrevColorCloseStart=-1;
      dwPrevColorCloseEnd=-1;
      dwPrevActiveTextColor=-1;
      dwPrevActiveBkColor=-1;
      AkelPad.SendMessage(hWndEdit, 3595 /*AEM_HLGETHIGHLIGHT*/, 0, lpGH);

      if (lpMemText=AkelPad.MemAlloc(dwMemTextBytes + _TSIZE))
      {
        //Fill lpMemText
        dwMemTextBytes=0;
        dwPrevColorCloseStart=-1;
        dwPrevColorCloseEnd=-1;
        dwPrevActiveTextColor=-1;
        dwPrevActiveBkColor=-1;
        AkelPad.SendMessage(hWndEdit, 3595 /*AEM_HLGETHIGHLIGHT*/, 0, lpGH);

        pText=AkelPad.MemRead(lpMemText, _TSTR);
        AkelPad.MemFree(lpMemText);
      }
      oSys.UnregisterCallback(lpCallback);
    }
    AkelPad.MemFree(lpGH);
  }

  if (pText)
  {
    if (pEnclose)
    {
      pText=pText.replace(/\$/g, "$$$$");
      pText=pEnclose.replace(/\$\{result\}/, pText);
    }
    if (bInfo)
    {
      if (bBBCode)
        pText+="[color=Purple][size=" + pInfoSize + "]* " + GetLangString(0) + " [URL=" + pScriptURL + "]CodePoster.js[/URL] " + GetLangString(1) + "[/size]" + "[/color]\r";
      else
      {
        if (bStrict)
          pText+="\r<span style=\"color:Purple; font-size:" + pInfoSize + ";\">* " + GetLangString(0) + " <a href=\"" + pScriptURL + "\">CodePoster.js</a> " + GetLangString(1) + "</span>\r";
        else
          pText+="\r<font color=\"Purple\" size=\"" + pInfoSize + "\">* " + GetLangString(0) + " <a href=\"" + pScriptURL + "\">CodePoster.js</a> " + GetLangString(1) + "</font>\r";
      }
    }
    AkelPad.SetClipboardText(pText);
    AkelPad.MessageBox(hMainWnd, GetLangString(2), WScript.ScriptName, 64 /*MB_ICONINFORMATION*/);
  }
}

function GetHighLightCallback(dwCookie, crAkelRange, crRichRange, hlp)
{
  var nRangeStart=AkelPad.MemRead(_PtrAdd(crRichRange, 0) /*offsetof(CHARRANGE64, crRichRange.cpMin)*/, 2 /*DT_QWORD*/);
  var nRangeEnd=AkelPad.MemRead(_PtrAdd(crRichRange, _X64?8:4) /*offsetof(CHARRANGE64, crRichRange.cpMax)*/, 2 /*DT_QWORD*/);
  var pRangeText;
  var dwFontStyle=AkelPad.MemRead(_PtrAdd(hlp, _X64?20:20) /*offsetof(AEHLPAINT, dwFontStyle)*/, 3 /*DT_DWORD*/);
  var dwActiveTextColor=AkelPad.MemRead(_PtrAdd(hlp, _X64?12:12) /*offsetof(AEHLPAINT, dwActiveText)*/, 3 /*DT_DWORD*/);
  var dwActiveBkColor=AkelPad.MemRead(_PtrAdd(hlp, _X64?16:16) /*offsetof(AEHLPAINT, dwActiveBk)*/, 3 /*DT_DWORD*/);
  var dwPaintType=AkelPad.MemRead(_PtrAdd(hlp, _X64?24:24) /*offsetof(AEHLPAINT, dwPaintType)*/, 3 /*DT_DWORD*/);
  var pColorOpen="";
  var pColorClose="";

  if (pRangeText=AkelPad.GetTextRange(nRangeStart, nRangeEnd))
  {
    if (!bBBCode)
    {
      //pRangeText=pRangeText.replace(/[ ]{2,}/g, " ");
      pRangeText=pRangeText.replace(/&/g, "&");
      pRangeText=pRangeText.replace(/</g, "<");
      pRangeText=pRangeText.replace(/>/g, ">");
      pRangeText=pRangeText.replace(/"/g, """);
    }

    if (dwPaintType & 0x80 /*AEHPT_LINK*/)
    {
      if (bBBCode)
        pRangeText="[url=" + pRangeText + "]" + pRangeText + "[/url]";
      else
        pRangeText="<a href=\"" + pRangeText + "\">" + pRangeText + "</a>";
    }
    if (dwFontStyle == 2 /*AEHLS_FONTBOLD*/)
    {
      if (bBBCode)
        pRangeText="[b]" + pRangeText + "[/b]";
      else
        pRangeText="<b>" + pRangeText + "</b>";
    }
    else if (dwFontStyle == 3 /*AEHLS_FONTITALIC*/)
    {
      if (bBBCode)
        pRangeText="[i]" + pRangeText + "[/i]";
      else
        pRangeText="<i>" + pRangeText + "</i>";
    }
    else if (dwFontStyle == 4 /*AEHLS_FONTBOLDITALIC*/)
    {
      if (bBBCode)
        pRangeText="[b][i]" + pRangeText + "[/i][/b]";
      else
        pRangeText="<b><i>" + pRangeText + "</i></b>";
    }

    if (dwSystemTextColor != dwActiveTextColor || (!bBBCode && bStrict && dwSystemBkColor != dwActiveBkColor))
    {
      if (dwMemTextBytes == dwPrevColorCloseEnd &&
          dwPrevActiveTextColor == dwActiveTextColor && (bBBCode || !bStrict || dwPrevActiveBkColor == dwActiveBkColor))
        dwMemTextBytes=dwPrevColorCloseStart;

      if (bBBCode)
      {
        if (dwMemTextBytes != dwPrevColorCloseStart)
          pColorOpen="[color=#" + rgb2hex(dwActiveTextColor) + "]";
        pColorClose="[/color]";
        dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, pColorOpen + pRangeText + pColorClose, _TSTR) - _TSIZE;
      }
      else
      {
        if (bStrict)
        {
          if (dwMemTextBytes != dwPrevColorCloseStart)
            pColorOpen="<span style=\"" + (dwSystemTextColor != dwActiveTextColor?"color:#" + rgb2hex(dwActiveTextColor) + ";":"") + (dwSystemBkColor != dwActiveBkColor?"background:#" + rgb2hex(dwActiveBkColor) + ";":"") + "\">";
          pColorClose="</span>";
          dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, pColorOpen + pRangeText + pColorClose, _TSTR) - _TSIZE;
        }
        else
        {
          if (dwMemTextBytes != dwPrevColorCloseStart)
            pColorOpen="<font color=\"#" + rgb2hex(dwActiveTextColor) + "\">";
          pColorClose="</font>";
          dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, pColorOpen + pRangeText + pColorClose, _TSTR) - _TSIZE;
        }
      }
    }
    else dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, pRangeText, _TSTR) - _TSIZE;

    if (pColorClose)
    {
      dwPrevColorCloseStart=dwMemTextBytes - pColorClose.length * _TSIZE;
      dwPrevColorCloseEnd=dwMemTextBytes;
    }
    dwPrevActiveTextColor=dwActiveTextColor;
    dwPrevActiveBkColor=dwActiveBkColor;
  }

  if (IsLastCharInLine(_PtrAdd(crAkelRange, _X64?24:12) /*offsetof(AECHARRANGE, ciMax)*/) && IndexCompare(_PtrAdd(crAkelRange, _X64?24:12) /*offsetof(AECHARRANGE, ciMax)*/, _PtrAdd(lpGH, _X64?48:24) /*offsetof(AEGETHIGHLIGHT, crText.ciMax)*/))
  {
    if (bBBCode)
      dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, "\r", _TSTR) - _TSIZE;
    else
      dwMemTextBytes+=AkelPad.MemCopy(lpMemText?_PtrAdd(lpMemText, dwMemTextBytes):0, "\r" + pBR, _TSTR) - _TSIZE;
  }
  return 0;
}

function rgb2hex(dwColor)
{
  var pHexColor;

  pHexColor=dwColor.toString(16);
  pHexColor="000000".substr(pHexColor.length) + pHexColor;
  return pHexColor.substr(4, 2) + pHexColor.substr(2, 2) + pHexColor.substr(0, 2);
}

function IsLastCharInLine(lpCharIndex)
{
  var nCharInLine=AkelPad.MemRead(_PtrAdd(lpCharIndex, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, 3 /*DT_DWORD*/);
  var lpLine=AkelPad.MemRead(_PtrAdd(lpCharIndex, _X64?8:4) /*offsetof(AECHARINDEX, lpLine)*/, 2 /*DT_QWORD*/);
  var nLineLen=AkelPad.MemRead(_PtrAdd(lpLine, _X64?24:12) /*offsetof(AELINEDATA, nLineLen)*/, 3 /*DT_DWORD*/);
  var nLineBreak=AkelPad.MemRead(_PtrAdd(lpLine, _X64?28:16) /*offsetof(AELINEDATA, nLineBreak)*/, 3 /*DT_DWORD*/);

  if (nCharInLine == nLineLen && nLineBreak != 9 /*AELB_WRAP*/)
    return true;
  return false;
}

function IndexCompare(lpCharIndex1, lpCharIndex2)
{
  var nCharInLine1=AkelPad.MemRead(_PtrAdd(lpCharIndex1, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, 3 /*DT_DWORD*/);
  var nLine1=AkelPad.MemRead(_PtrAdd(lpCharIndex1, 0) /*offsetof(AECHARINDEX, nLine)*/, 3 /*DT_DWORD*/);
  var nCharInLine2=AkelPad.MemRead(_PtrAdd(lpCharIndex2, _X64?16:8) /*offsetof(AECHARINDEX, nCharInLine)*/, 3 /*DT_DWORD*/);
  var nLine2=AkelPad.MemRead(_PtrAdd(lpCharIndex2, 0) /*offsetof(AECHARINDEX, nLine)*/, 3 /*DT_DWORD*/);

  if (nLine1 == nLine2 && nCharInLine1 == nCharInLine2)
    return 0;
  if (nLine1 < nLine2 || (nLine1 == nLine2 && nCharInLine1 < nCharInLine2))
    return -1;
  return 1;
}

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

  if (nLangID == 0x19) //LANG_RUSSIAN
  {
    if (nStringID == 0)
      return "\u041F\u043E\u0434\u0441\u0432\u0435\u0447\u0435\u043D\u043E\u0020\u0441\u0020\u043F\u043E\u043C\u043E\u0449\u044C\u044E\u0020\u0441\u043A\u0440\u0438\u043F\u0442\u0430";
    if (nStringID == 1)
      return "\u0434\u043B\u044F AkelPad";
    if (nStringID == 2)
      return "\u041A\u043E\u0434\u0020\u043F\u043E\u043C\u0435\u0449\u0435\u043D\u0020\u0432\u0020\u0431\u0443\u0444\u0435\u0440\u0020\u043E\u0431\u043C\u0435\u043D\u0430\u002E";
  }
  else
  {
    if (nStringID == 0)
      return "Highlighted with script";
    if (nStringID == 1)
      return "for AkelPad";
    if (nStringID == 2)
      return "Code has been placed in clipboard.";
  }
  return "";
}



//Arguments
var pFormat=AkelPad.GetArgValue("Format", "HTML");
var pEnclose=AkelPad.GetArgValue("Enclose", "<pre>${result}</pre>");
var pBR=AkelPad.GetArgValue("BR", "");
var bStrict=AkelPad.GetArgValue("Strict", false);
var bInfo=AkelPad.GetArgValue("Info", true);
var pInfoSize=AkelPad.GetArgValue("InfoSize", "1");
* Подсвечено с помощью скрипта CodePoster.js для AkelPad
Last edited by Instructor on Sun Dec 13, 2015 11:32 am, edited 22 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Translates text via Google, MS Bing and Yandex - Part One.
Part Two is in the next post. Both parts should be placed in one file.
In one file is here: KDJ.zip

I used some code from the script TranslateWithGoogleAPI.js, written by VladSh, thanks for translator idea.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=13024#p13024
// Version: 2018-11-06
// Author: KDJ
//
// *** On line translator via Google, MS Bing and Yandex ***
//
// Usage in AkelPad window:
//   Call("Scripts::Main", 1, "Translator.js")
//   Call("Scripts::Main", 1, "Translator.js", "en ru") - translates from English to Russian
//   Call("Scripts::Main", 1, "Translator.js", "auto pl 1") - autodetect source language, translates to Polish, source text from Clipboard
//
// Usage in command line (required AkelEdit.dll and registration: regsvr32.exe Scripts.dll):
//   Wscript.exe Translator.js
//
// Shortcut keys in dialog box:
//   Tab          - change edit panel focus source <-> target (double-panel mode)
//   Ctrl+Enter,  - double-panel mode - translates entire text from source panel
//                - single-panel mode - translates selected text from AkelPad window or text from Clipboard
//   Alt+Enter    - works as Ctrl+Enter, but translated text will be added at the end in target panel
//   Shift+Enter  - double-window mode - translates selected text from source panel;
//                  if is not selection - translates entire text
//                - single-panel mode - translates selected text from AkelPad window or text from Clipboard
//   Ctrl+L       - listen entire text from active edit panel
//   Ctrl+Shift+L - listen selected text from active edit panel
//   Alt+U        - switch languages
//   Shift+Alt+U  - switch languages and texts (double-panel mode only)
//   Alt+F1       - choose translator
//   Alt+1        - choose from language
//   Alt+2        - choose to language
//   Ctrl+F       - switch font AkelPad/GUI/other
//   Ctrl+U       - switch wordwrap
//   Ctrl+W       - source panel on/off
//   Alt+S        - settings
//   Alt+-+       - change opaque/transparency level of dialog box
//   F4           - maximize/restore window
//   Right click  - context menu in edit panels

var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var sIniFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";

var aAPIs = [{Name:       "Google",
              APIkey:     "",
              APIkeyP:    "",
              RegistrURL: "",
              AutoDetect: 1,
              TextLen:    48000},
             {Name:       "Bing",
              APIkey:     "49F91281913BE5C04C18F184C4A14ED6097F6AD3",
              APIkeyP:    "",
              RegistrURL: "http://www.bing.com/developers",
              AutoDetect: 1,
              TextLen:    10000}, //POST method
              //TextLen:    3500}, //GET method
             {Name:       "Yandex",
              APIkey:     "trnsl.1.1.20150807T192740Z.72c8c075fd5be56d.b561c35c498a78c9a3b6e7f866ae97f6e13d38ac",
              APIkeyP:    "",
              RegistrURL: "https://translate.yandex.com/developers",
              AutoDetect: 1,
              TextLen:    10000,
              Foot:       "\n\n-----\nPowered by Yandex.Translate: http://translate.yandex.com/"}];
var oSelect = {API:      0,
               FromLang: 0,
               ToLang  : 0,
               Source1 : 0,
               Source2 : 0,
               Target1 : 0,
               Target2 : 0};
var oWndMin = {W: 656,
               H: 200};
var oWndPos = {X: 100,
               Y: 120,
               W: oWndMin.W,
               H: oWndMin.H,
               Max: 0};

var nOpacity    = 255;
var bSourceInCB = 0;
var bSourceWnd  = 1;
var bLoadText   = 1;
var bImmediate  = 0;
var bFontAP     = 0;
var bFontGUI    = 0;
var bWordWrap   = 1;
var bSortCode   = 0;
var nDetectLang = -1;
var sSource     = "";
var sTarget     = "";
var sLanguage   = "";
var aLangs      = [];
var aFont;

ReadIni();
ReadInterfaceLang();

if (typeof AkelPad == "undefined")
{
  try
  {
    AkelPad = new ActiveXObject("AkelPad.Document");
    _PtrAdd = function(n1, n2) {return AkelPad.Global._PtrAdd(n1, n2);};
    _X64    = AkelPad.Constants._X64;
  }
  catch (oError)
  {
    WScript.Echo(sTxtRegScripts);
    WScript.Quit();
  }
}

var oSys         = AkelPad.SystemFunction();
var hInstanceDLL = AkelPad.GetInstanceDll();
var sClassName   = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstanceDLL;
var hWndDlg;

if (hWndDlg = oSys.Call("User32::FindWindowExW", 0, 0, sClassName, 0))
{
  if (! oSys.Call("User32::IsWindowVisible", hWndDlg))
    oSys.Call("User32::ShowWindow", hWndDlg, 8 /*SW_SHOWNA*/);
  if (oSys.Call("User32::IsIconic", hWndDlg))
    oSys.Call("User32::ShowWindow", hWndDlg, 9 /*SW_RESTORE*/);

  oSys.Call("User32::SetForegroundWindow", hWndDlg);
}
else
{
  var DT_UNICODE = 1;
  var DT_QWORD   = 2;
  var DT_DWORD   = 3;
  var DT_BYTE    = 5;

  var CB_ADDSTRING    = 0x143;
  var CB_GETCOUNT     = 0x146;
  var CB_GETCURSEL    = 0x147;
  var CB_SETCURSEL    = 0x14E;
  var CB_SHOWDROPDOWN = 0x14F;
  var CB_GETITEMDATA  = 0x150;
  var CB_SETITEMDATA  = 0x151;
  var CB_RESETCONTENT = 0x14B;
  var CBN_SELCHANGE   = 1;
  var CBN_SETFOCUS    = 3;
  var CBN_CLOSEUP     = 8;

  var hMainWnd = AkelPad.GetMainWnd();
  var hEditWnd = AkelPad.GetEditWnd();
  var hGuiFont = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
  var sAELib;
  var hAELib;
  var hFocus;
  var hFocusSet;
  var bCloseCB;
  var nTimerCount;
  var nSpeechLang;
  var sSpeechText;
  var sSpeechPart;
  var uSpeechBody;

  if (oWndPos.H < oWndMin.H)
    oWndPos.H = oWndMin.H;
  if (oWndPos.W < oWndMin.W)
    oWndPos.W = oWndMin.W;
  if (hEditWnd && bFontAP && bFontGUI)
    bFontGUI = 0;
  if (! aFont)
    aFont = ConvertFontFormat(hGuiFont, 2, 3);

  //Main dialog
  var aSubClassHand = [];
  var aWnd          = [];
  var IDUSE         = 1000;
  var IDAPICB       = 1001;
  var IDDETECTLANG  = 1002;
  var IDFROMLANG    = 1003;
  var IDTOLANG      = 1004;
  var IDFROMLANGCB  = 1005;
  var IDTOLANGCB    = 1006;
  var IDSWITCHLANG  = 1007;
  var IDSWITCHALL   = 1008;
  var IDLISTEN1     = 1009;
  var IDLISTEN2     = 1010;
  var IDOPACMINUS   = 1011;
  var IDOPACPLUS    = 1012;
  var IDTRANSLATE   = 1013;
  var IDOPTIONS     = 1014;
  var IDTXTSOURCE   = 1015;
  var IDTXTTARGET   = 1016;
  var IDTIMER       = 1017;
  var nListenID     = IDLISTEN1;

  //Settings dialog
  var aWndSet       = [];
  var IDINTERFACECB = 1100;
  var IDINTERFACE   = 1101;
  var IDEDITOPTIONS = 1102;
  var IDSOURCEINCB  = 1103;
  var IDSOURCEWND   = 1104;
  var IDLOADTEXT    = 1105;
  var IDIMMEDIATE   = 1106;
  var IDWORDWRAP    = 1107;
  var IDFONTAP      = 1108;
  var IDFONTGUI     = 1109;
  var IDFONT        = 1110;
  var IDSORTLANG    = 1111;
  var IDSORTCODE    = 1112;
  var IDSORTNAME    = 1113;
  var IDAPINAME1    = 1114;
  var IDAPIKEYS1    = 1115;
  var IDAPIKEY1     = 1116;
  var IDREGIST1     = 1117;
  var IDREGURL1     = 1118;
  var IDAPINAME2    = 1119;
  var IDAPIKEYS2    = 1120;
  var IDAPIKEY2     = 1121;
  var IDREGIST2     = 1122;
  var IDREGURL2     = 1123;
  var IDOKB         = 1124;
  var IDCANCELB     = 1125;

  //0x50000000 - WS_VISIBLE|WS_CHILD
  //0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
  //0x50000009 - WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
  //0x50010000 - WS_VISIBLE|WS_CHILD|WS_TABSTOP
  //0x50010001 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
  //0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
  //0x50200003 - WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_DROPDOWNLIST
  //0x50200103 - WS_VISIBLE|WS_CHILD|WS_VSCROLL|CBS_SORT|CBS_DROPDOWNLIST
  //0x50210103 - WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_TABSTOP|CBS_SORT|CBS_DROPDOWNLIST
  //0x50810080 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL
  //0x50810880 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|ES_READONLY|ES_AUTOHSCROLL
  //0x50311104 - WS_VISIBLE|WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_TABSTOP|ES_WANTRETURN|ES_NOHIDESEL|ES_MULTILINE
  //0x50B11104 - WS_VISIBLE|WS_CHILD|WS_BORDER|WS_HSCROLL|WS_VSCROLL|WS_TABSTOP|ES_WANTRETURN|ES_NOHIDESEL|ES_MULTILINE
  aWnd[IDUSE       ] = {Class: "STATIC",    Style: 0x50000000};
  aWnd[IDAPICB     ] = {Class: "COMBOBOX",  Style: 0x50200003, T: ""};
  aWnd[IDDETECTLANG] = {Class: "STATIC",    Style: 0x50000000, T: ""};
  aWnd[IDFROMLANG  ] = {Class: "STATIC",    Style: 0x50000000};
  aWnd[IDTOLANG    ] = {Class: "STATIC",    Style: 0x50000000};
  aWnd[IDFROMLANGCB] = {Class: "COMBOBOX",  Style: 0x50200103, T: ""};
  aWnd[IDTOLANGCB  ] = {Class: "COMBOBOX",  Style: 0x50200103, T: ""};
  aWnd[IDSWITCHLANG] = {Class: "BUTTON",    Style: 0x50000000, T: "<->"};
  aWnd[IDSWITCHALL ] = {Class: "BUTTON",    Style: 0x50000000, T: "<=>"};
  aWnd[IDLISTEN1   ] = {Class: "BUTTON",    Style: 0x50000000, T: sTxtListen};
  aWnd[IDLISTEN2   ] = {Class: "BUTTON",    Style: 0x50000000, T: sTxtListen};
  aWnd[IDOPACMINUS ] = {Class: "BUTTON",    Style: 0x50000000, T: "-"};
  aWnd[IDOPACPLUS  ] = {Class: "BUTTON",    Style: 0x50000000, T: "+"};
  aWnd[IDTRANSLATE ] = {Class: "BUTTON",    Style: 0x50000000};
  aWnd[IDOPTIONS   ] = {Class: "BUTTON",    Style: 0x50000000};
  aWnd[IDTXTSOURCE ] = {Class: "AkelEditW", Style: 0x50311104, T: sSource};
  aWnd[IDTXTTARGET ] = {Class: "AkelEditW", Style: 0x50311104, T: sTarget};

  aWndSet[IDINTERFACECB] = {Class: "COMBOBOX", Style: 0x50210103, X:  10, Y:  10, W: 150, H: 150, T: ""};
  aWndSet[IDINTERFACE  ] = {Class: "STATIC",   Style: 0x50000000, X: 165, Y:  13, W: 120, H:  13};
  aWndSet[IDEDITOPTIONS] = {Class: "BUTTON",   Style: 0x50000007, X:  10, Y:  40, W: 285, H: 185, T: ""};
  aWndSet[IDSOURCEINCB ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y:  55, W: 270, H:  16};
  aWndSet[IDSOURCEWND  ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y:  75, W: 270, H:  16};
  aWndSet[IDLOADTEXT   ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y:  95, W: 270, H:  16};
  aWndSet[IDIMMEDIATE  ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y: 115, W: 270, H:  16};
  aWndSet[IDWORDWRAP   ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y: 135, W: 270, H:  16};
  aWndSet[IDFONTAP     ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y: 155, W: 270, H:  16};
  aWndSet[IDFONTGUI    ] = {Class: "BUTTON",   Style: 0x50010003, X:  20, Y: 175, W: 270, H:  16};
  aWndSet[IDFONT       ] = {Class: "BUTTON",   Style: 0x50010000, X:  20, Y: 195, W: 170, H:  20, T: aFont.toString()};
  aWndSet[IDSORTLANG   ] = {Class: "BUTTON",   Style: 0x50000007, X: 305, Y: 160, W: 120, H:  65};
  aWndSet[IDSORTCODE   ] = {Class: "BUTTON",   Style: 0x50000009, X: 315, Y: 180, W:  90, H:  16};
  aWndSet[IDSORTNAME   ] = {Class: "BUTTON",   Style: 0x50000009, X: 315, Y: 200, W:  90, H:  16};
  aWndSet[IDAPINAME1   ] = {Class: "BUTTON",   Style: 0x50000007, X:  10, Y: 235, W: 415, H:  75};
  aWndSet[IDAPIKEYS1   ] = {Class: "STATIC",   Style: 0x50000000, X:  20, Y: 255, W:  70, H:  13, T: "AppID:"};
  aWndSet[IDAPIKEY1    ] = {Class: "EDIT",     Style: 0x50810080, X:  90, Y: 255, W: 325, H:  20, T: ""};
  aWndSet[IDREGIST1    ] = {Class: "STATIC",   Style: 0x50000000, X:  20, Y: 280, W:  70, H:  13};
  aWndSet[IDREGURL1    ] = {Class: "EDIT",     Style: 0x50810880, X:  90, Y: 280, W: 325, H:  20, T: aAPIs[1].RegistrURL};
  aWndSet[IDAPINAME2   ] = {Class: "BUTTON",   Style: 0x50000007, X:  10, Y: 320, W: 415, H:  75};
  aWndSet[IDAPIKEYS2   ] = {Class: "STATIC",   Style: 0x50000000, X:  20, Y: 340, W:  70, H:  13, T: "APIkey:"};
  aWndSet[IDAPIKEY2    ] = {Class: "EDIT",     Style: 0x50810080, X:  90, Y: 340, W: 325, H:  20, T: ""};
  aWndSet[IDREGIST2    ] = {Class: "STATIC",   Style: 0x50000000, X:  20, Y: 365, W:  70, H:  13};
  aWndSet[IDREGURL2    ] = {Class: "EDIT",     Style: 0x50810880, X:  90, Y: 365, W: 325, H:  20, T: aAPIs[2].RegistrURL};
  aWndSet[IDOKB        ] = {Class: "BUTTON",   Style: 0x50010001, X: 345, Y:  10, W:  80, H:  23};
  aWndSet[IDCANCELB    ] = {Class: "BUTTON",   Style: 0x50010000, X: 345, Y:  35, W:  80, H:  23};

  SetInterfaceLangToWndDef();

  if (! hMainWnd)
  {
    sAELib = "AkelEdit.dll";
    if (! (hAELib = oSys.Call("Kernel32::LoadLibraryW", AkelPad.GetFilePath(WScript.ScriptFullName, 1 /*CPF_DIR*/) + "\\AkelEdit_" + (_X64 ? "x64\\" : "x86\\") + sAELib)))
    {
      if (! (hAELib = oSys.Call("Kernel32::LoadLibraryW", sAELib)))
      {
        WScript.Echo(sTxtNoLibrary + sAELib);
        WScript.Quit();
      }
    }
  }

  var hIconSmall = oSys.Call("User32::LoadImageW",
                     hInstanceDLL, //hinst
                     101,          //lpszName
                     1,            //uType=IMAGE_ICON
                     16,           //cxDesired
                     16,           //cyDesired
                     0);           //fuLoad
  var hIconBig = oSys.Call("User32::LoadImageW",
                   hInstanceDLL, //hinst
                   101,          //lpszName
                   1,            //uType=IMAGE_ICON
                   32,           //cxDesired
                   32,           //cyDesired
                   0);           //fuLoad

  var nBufSize = 0xFFFF;
  var lpBuffer = AkelPad.MemAlloc(nBufSize * 2);

  AkelPad.ScriptNoMutex(0x11 /*ULT_LOCKSENDMESSAGE|ULT_UNLOCKSCRIPTSQUEUE*/);
  AkelPad.WindowRegisterClass(sClassName);

  hWndDlg =
    oSys.Call("User32::CreateWindowExW",
      0,               //dwExStyle
      sClassName,      //lpClassName
      sTxtCaption,     //lpWindowName
      0x80CF0000,      //dwStyle=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_THICKFRAME
      oWndPos.X,       //x
      oWndPos.Y,       //y
      oWndPos.W,       //nWidth
      oWndPos.H,       //nHeight
      hMainWnd,        //hWndParent
      0,               //ID
      hInstanceDLL,    //hInstance
      DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.

  oSys.Call("User32::ShowWindow", hWndDlg, oWndPos.Max ? 3 /*SW_MAXIMIZE*/ : 1 /*SW_SHOWNORMAL*/);

  AkelPad.WindowGetMessage();
  AkelPad.WindowUnregisterClass(sClassName);
  AkelPad.MemFree(lpBuffer);
  oSys.Call("User32::DestroyIcon", hIconSmall);
  oSys.Call("User32::DestroyIcon", hIconBig);
  if (hAELib)
    oSys.Call("Kernel32::FreeLibrary", hAELib);
}

function SetInterfaceLangToWndDef()
{
  aWnd[IDUSE      ].T = sTxtUse;
  aWnd[IDFROMLANG ].T = sTxtFromLang;
  aWnd[IDTOLANG   ].T = sTxtToLang;
  aWnd[IDLISTEN1  ].T = sTxtListen;
  aWnd[IDLISTEN2  ].T = sTxtListen;
  aWnd[IDTRANSLATE].T = sTxtTranslate;
  aWnd[IDOPTIONS  ].T = sTxtOptions;

  aWndSet[IDINTERFACE ].T = sTxtInterface;
  aWndSet[IDSOURCEINCB].T = sTxtSourceInCB;
  aWndSet[IDSOURCEWND ].T = sTxtSourceWnd + " (Ctrl+W)";
  aWndSet[IDLOADTEXT  ].T = sTxtLoadText;
  aWndSet[IDIMMEDIATE ].T = sTxtImmediate;
  aWndSet[IDWORDWRAP  ].T = sTxtWordWrap + " (Ctrl+U)";
  aWndSet[IDFONTAP    ].T = sTxtFontAP + " (Ctrl+F)";
  aWndSet[IDFONTGUI   ].T = sTxtFontGUI + " (Ctrl+F)";
  aWndSet[IDSORTLANG  ].T = sTxtSortLang;
  aWndSet[IDSORTCODE  ].T = sTxtSortCode;
  aWndSet[IDSORTNAME  ].T = sTxtSortName;
  aWndSet[IDAPINAME1  ].T = aAPIs[1].Name + " - " + sTxtOwnKey;
  aWndSet[IDREGIST1   ].T = sTxtRegister;
  aWndSet[IDAPINAME2  ].T = aAPIs[2].Name + " - " + sTxtOwnKey;
  aWndSet[IDREGIST2   ].T = sTxtRegister;
  aWndSet[IDOKB       ].T = sTxtOK;
  aWndSet[IDCANCELB   ].T = sTxtCancel;
}

function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 1) //WM_CREATE
  {
    var i;

    for (i = IDUSE; i < aWnd.length; ++i)
    {
      aWnd[i].HWND =
        oSys.Call("User32::CreateWindowExW",
          0,             //dwExStyle
          aWnd[i].Class, //lpClassName
          0,             //lpWindowName
          aWnd[i].Style, //dwStyle
          aWnd[i].X,     //x
          aWnd[i].Y,     //y
          aWnd[i].W,     //nWidth
          aWnd[i].H,     //nHeight
          hWnd,          //hWndParent
          i,             //ID
          hInstanceDLL,  //hInstance
          0);            //lpParam
      SetWindowFont(aWnd[i].HWND, hGuiFont);
      SetWindowText(aWnd[i].HWND, aWnd[i].T);
    }

    SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);
    SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 1 /*ICON_BIG*/,   hIconBig);

    if (bSourceWnd && bLoadText)
    {
      if (bSourceInCB || (! hEditWnd) || ((WScript.Arguments.length > 2) && (WScript.Arguments(2) == "1")))
      {
        if (oSys.Call("User32::IsClipboardFormatAvailable", 13 /*CF_UNICODETEXT*/))
        {
          sSource = AkelPad.GetClipboardText().substr(0, aAPIs[oSelect.API].TextLen);
          oSelect.Source1 = oSelect.Source2 = 0;
          SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B1 /*EM_SETSEL*/, 0, -1);
          SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00C2 /*EM_REPLACESEL*/, 1, sSource);
        }
      }
      else if (SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, 0, 0))
      {
        sSource = AkelPad.GetSelText(3 /*"\r\n"*/).substr(0, aAPIs[oSelect.API].TextLen);
        oSelect.Source1 = oSelect.Source2 = 0;
        SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B1 /*EM_SETSEL*/, 0, -1);
        SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00C2 /*EM_REPLACESEL*/, 1, sSource);
      }
    }

    SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B1 /*EM_SETSEL*/, oSelect.Source1, oSelect.Source2);
    SendMessage(aWnd[IDTXTTARGET].HWND, 0x00B1 /*EM_SETSEL*/, oSelect.Target1, oSelect.Target2);

    SendMessage(aWnd[IDTXTSOURCE].HWND, 197 /*EM_SETLIMITTEXT*/, aAPIs[oSelect.API].TextLen, 0);
    SendMessage(aWnd[IDTXTTARGET].HWND, 197 /*EM_SETLIMITTEXT*/, nBufSize - 1, 0);

    SetEditWordWrap();
    SetEditFont();

    for (i = IDTXTSOURCE; i <= IDTXTTARGET; ++i)
    {
      SendMessage(aWnd[i].HWND, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x10000000 /*AECO_DISABLEBEEP*/);
      SendMessage(aWnd[i].HWND, 3234 /*AEM_EXSETOPTIONS*/, 2 /*AECOOP_OR*/, 0x00000001 /*AECOE_DETECTURL*/);
      SendMessage(aWnd[i].HWND, 3226 /*AEM_SETEVENTMASK*/, 0, 0x00040000 /*AENM_LINK*/);
      SendMessage(aWnd[i].HWND, 1093 /*EM_SETEVENTMASK*/, 0, 0x00080001 /*ENM_CHANGE|ENM_SELCHANGE*/);
      aSubClassHand[i] = AkelPad.WindowSubClass(aWnd[i].HWND, EditCallback, 256 /*WM_KEYDOWN*/, 258 /*WM_CHAR*/);
    }

    //Fill combobox APIs
    for (i = 0; i < aAPIs.length; ++i)
      SendMessage(aWnd[IDAPICB].HWND, CB_ADDSTRING, 0, aAPIs[i].Name);
    SendMessage(aWnd[IDAPICB].HWND, CB_SETCURSEL, oSelect.API, 0);

    FillComboFromLang();
    FillComboToLang();
    ShowDetectLang(true);
    EnableListenWindows();

    if (nOpacity < 255)
      SetOpacityLevel(hWnd, nOpacity);

    ShowSourceWindow();

    if (((! bSourceWnd) || (bSourceWnd && bLoadText)) && (bImmediate))
      PostMessage(hWnd, 0x8000 /*WM_APP*/, 0, 0);
  }

  else if (uMsg == 0x8000 /*WM_APP*/)
  {
    oSys.Call("User32::UpdateWindow", hWnd);
    PostMessage(hWnd, 273 /*WM_COMMAND*/, IDTRANSLATE, 0);
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    hEditWnd = AkelPad.GetEditWnd();
    oSys.Call("User32::SetFocus", hFocus);
  }

  else if (uMsg == 36) //WM_GETMINMAXINFO
  {
    AkelPad.MemCopy(_PtrAdd(lParam, 24), oWndMin.W, DT_DWORD); //ptMinTrackSize_x
    AkelPad.MemCopy(_PtrAdd(lParam, 28), oWndMin.H, DT_DWORD); //ptMinTrackSize_y
  }

  else if (uMsg == 3) //WM_MOVE
  {
    if (! oSys.Call("User32::IsZoomed", hWnd))
      GetWindowPos(hWnd, oWndPos);
  }

  else if (uMsg == 5) //WM_SIZE
  {
    if (wParam != 2) //SIZE_MAXIMIZED
      GetWindowPos(hWnd, oWndPos);

    ResizeWindow(hWnd);
  }

  else if (uMsg == 15) //WM_PAINT
    PaintSizeGrip(hWnd);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 13 /*VK_RETURN*/)
    {
      if ((Ctrl() || Shift()) && ((oSys.Call("User32::GetFocus") == aWnd[IDTXTSOURCE].HWND) || (oSys.Call("User32::GetFocus") == aWnd[IDTXTTARGET].HWND)))
      {
        if (Alt())
        {
          if (bSourceWnd)
            OpenInBrowser(Shift());
        }
        else
          Translate(Shift());
      }
    }
    else if ((wParam == 0x4C /*L key*/) && Ctrl() && (! Alt()))
      Listen(hFocus, Number(Shift()));
    else if ((wParam == 0x43 /*C key*/) && Ctrl() && Shift())
      InsertTextToAP(hFocus, 0);
    else if ((wParam == 0x56 /*V key*/) && Ctrl() && Shift())
      PasteTextFromAP(hFocus, 0);
    else if ((wParam == 0x46 /*F key*/) && Ctrl())
    {
      if (hEditWnd)
      {
        if (bFontAP)
        {
          bFontAP  = 0;
          bFontGUI = 1;
        }
        else if (bFontGUI)
          bFontGUI = 0;
        else
          bFontAP  = 1;
      }
      else
        bFontGUI = ! bFontGUI;

      SetEditFont();
      oSys.Call("User32::InvalidateRect", hWnd, 0, 0);
    }
    else if ((wParam == 0x55 /*U key*/) && Ctrl())
    {
      bWordWrap = ! bWordWrap;
      SetEditWordWrap();
    }
    else if ((wParam == 0x57 /*W key*/) && Ctrl())
    {
      bSourceWnd = ! bSourceWnd;
      ShowSourceWindow();
    }
    else if (wParam == 0x73 /*VK_F4*/)
      oSys.Call("User32::ShowWindow", hWnd, oSys.Call("User32::IsZoomed", hWnd) ? 9 /*SW_RESTORE*/ : 3 /*SW_MAXIMIZE*/);
  }

  else if (uMsg == 260) //WM_SYSKEYDOWN
  {
    if (wParam == 13) //VK_RETURN
    {
      oSys.Call("User32::SetFocus", hFocus);
      Translate(Shift(), 1);
    }
    else if (wParam == 0x58) //X key
    {
      CopyEntireTextToCB(hFocus);
      DeleteEntireText(hFocus);
    }
    else if (wParam == 0x43) //C key
    {
      if (Shift())
        InsertTextToAP(hFocus, 1);
      else
        CopyEntireTextToCB(hFocus);
    }
    else if (wParam == 0x56) //V key
    {
      if (Shift())
        PasteTextFromAP(hFocus, 1);
      else
        PasteEntireTextFromCB(hFocus);
    }
    else if (wParam == 0x2E) //VK_DELETE
      DeleteEntireText(hFocus);
    else if (wParam == 0x55) //U key
    {
      if (Shift())
      {
        if (bSourceWnd)
          PostMessage(hWnd, 273 /*WM_COMMAND*/, IDSWITCHALL, 0);
      }
      else
        PostMessage(hWnd, 273 /*WM_COMMAND*/, IDSWITCHLANG, 0);
    }
    else if (wParam == 0x70) //VK_F1
      oSys.Call("User32::SetFocus", aWnd[IDAPICB].HWND);
    else if (wParam == 0x31) //1 key
      oSys.Call("User32::SetFocus", aWnd[IDFROMLANGCB].HWND);
    else if (wParam == 0x32) //2 key
      oSys.Call("User32::SetFocus", aWnd[IDTOLANGCB].HWND);
    else if ((wParam == 109) || (wParam == 189)) //Num- or -
      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOPACMINUS, 0);
    else if ((wParam == 107) || (wParam == 187)) //Num+ or +
      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOPACPLUS, 0);
    else if (wParam == 0x53) //S key
      Settings();
  }

  else if (uMsg == 123) //WM_CONTEXTMENU
  {
    if ((wParam == aWnd[IDTXTSOURCE].HWND) || (wParam == aWnd[IDTXTTARGET].HWND))
      ContextMenu(wParam, lParam);
  }

  else if (uMsg == 0x004E) //WM_NOTIFY
  {
    if ((wParam == IDTXTSOURCE) || (wParam == IDTXTTARGET))
    {
      switch (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 16 : 8), DT_DWORD))
      {
        case 1794 : //EN_SELCHANGE
          if (wParam == IDTXTSOURCE)
          {
            oSelect.Source1 = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_DWORD);
            oSelect.Source2 = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 28 : 16), DT_DWORD);
          }
          else
          {
            oSelect.Target1 = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 24 : 12), DT_DWORD);
            oSelect.Target2 = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 28 : 16), DT_DWORD);
          }
          break;
        case 2103 : //AEN_LINK
          if (AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 32 : 16) /*AENLINK.uMsg*/, DT_DWORD) == 515 /*WM_LBUTTONDBLCLK*/)
          {
            OpenLinkAE(wParam, lParam);
            return 1;
          }
      }
    }
  }

  else if (uMsg == 0x3B9) //MM_MCINOTIFY
  {
    if (wParam == 1 /*MCI_NOTIFY_SUCCESSFUL*/)
    {
      oSys.Call("Winmm::mciSendStringW", "close TTS wait", 0, 0, 0);
      PlayTextToSpeech();
    }
  }

  else if (uMsg == 0x0113) //WM_TIMER
    SetWindowText(aWnd[nListenID].HWND, (nTimerCount++ % 2) ? sTxtListen : "");

  else if (uMsg == 273) //WM_COMMAND
  {
    var nLowParam = LoWord(wParam);
    var nHiwParam = HiWord(wParam);

    if (nLowParam == IDAPICB)
    {
      if (nHiwParam == CBN_SETFOCUS)
        PostMessage(lParam, CB_SHOWDROPDOWN, 1, 0);
      if (nHiwParam == CBN_SELCHANGE)
      {
        var nSel1 = oSelect.Source1;
        var nSel2 = oSelect.Source2;

        oSelect.API = SendMessage(aWnd[IDAPICB].HWND, CB_GETCURSEL, 0, 0);
        SendMessage(aWnd[IDTXTSOURCE].HWND, 197 /*EM_SETLIMITTEXT*/, aAPIs[oSelect.API].TextLen, 0);

        SetWindowText(aWnd[IDTXTSOURCE].HWND, GetWindowText(aWnd[IDTXTSOURCE].HWND).substr(0, aAPIs[oSelect.API].TextLen));
        SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B1 /*EM_SETSEL*/, nSel1, nSel2);

        FillComboFromLang(SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0));
        FillComboToLang(SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0));

        ShowDetectLang(false);
        EnableListenWindows();
      }
      else if (nHiwParam == CBN_CLOSEUP)
      {
        if (oSys.Call("User32::GetFocus") == lParam)
          oSys.Call("User32::SetFocus", hFocus);
      }
    }
    else if ((nLowParam == IDFROMLANGCB) || (nLowParam == IDTOLANGCB))
    {
      if (nHiwParam == CBN_SETFOCUS)
        PostMessage(lParam, CB_SHOWDROPDOWN, 1, 0);
      else if (nHiwParam == CBN_SELCHANGE)
      {
        if (nLowParam == IDFROMLANGCB)
        {
          oSelect.FromLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETCURSEL, 0, 0);
          FillComboToLang(SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0));
        }
        else
          oSelect.ToLang = SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETCURSEL, 0, 0);

        ShowDetectLang(false);
        EnableListenWindows();
      }
      else if (nHiwParam == CBN_CLOSEUP)
      {
        if (oSys.Call("User32::GetFocus") == lParam)
          oSys.Call("User32::SetFocus", hFocus);
      }
    }
    else if (nLowParam == IDTXTSOURCE)
    {
      if (nHiwParam == 0x0100) //EN_SETFOCUS
      {
        hFocus = lParam;
        SetEditStyle(lParam, aWnd[IDTXTTARGET].HWND);
      }
      else if (nHiwParam == 0x0300) //EN_CHANGE
      {
        ShowDetectLang(false);
        EnableListenWindows();
      }
    }
    else if (nLowParam == IDTXTTARGET)
    {
      if (nHiwParam == 0x0100) //EN_SETFOCUS
      {
        hFocus = lParam;
        SetEditStyle(lParam, aWnd[IDTXTSOURCE].HWND);
      }
    }
    else if ((nLowParam >= IDSWITCHLANG) && (nLowParam <= IDOPTIONS))
    {
      oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nLowParam, 0);
      oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, IDUSE, 0);

      if (nLowParam == IDSWITCHLANG)
        SwitchLang();
      else if (nLowParam == IDSWITCHALL)
        SwitchLang(1);
      else if (nLowParam == IDLISTEN1)
        Listen(aWnd[IDTXTSOURCE].HWND, -1);
      else if (nLowParam == IDLISTEN2)
        Listen(aWnd[IDTXTTARGET].HWND, -1);
      else if (nLowParam == IDOPACMINUS)
      {
        if (nOpacity > 55)
          SetOpacityLevel(hWnd, -2);
      }
      else if (nLowParam == IDOPACPLUS)
      {
        if (nOpacity < 255)
          SetOpacityLevel(hWnd, -1);
      }
      else if (nLowParam == IDTRANSLATE)
        Translate();
      else if (nLowParam == IDOPTIONS)
        ContextMenu(lParam, -2);

      oSys.Call("User32::SetFocus", hFocus);
    }
    else if (nLowParam == 2 /*IDCANCEL*/)
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    oSys.Call("Winmm::mciSendStringW", "close TTS", 0, 0, 0);
    KillTimer();
    AkelPad.WindowUnsubClass(aWnd[IDTXTSOURCE].HWND);
    AkelPad.WindowUnsubClass(aWnd[IDTXTTARGET].HWND);
    WriteIni();
    //Destroy dialog
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  else if (uMsg == 2) //WM_DESTROY
  {
    //Exit message loop
    oSys.Call("User32::PostQuitMessage", 0);
  }

  return 0;
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 0x56 /*V key*/) && Ctrl() && Shift())
    {
      AkelPad.WindowNoNextProc(aSubClassHand[oSys.Call("User32::GetDlgCtrlID", hWnd)]);
      return 1;
    }
  }
  else if (uMsg == 258) //WM_CHAR 
  {
    if ((wParam == 13 /*VK_RETURN*/) && (Ctrl() || Shift()))
    {
      AkelPad.WindowNoNextProc(aSubClassHand[oSys.Call("User32::GetDlgCtrlID", hWnd)]);
      return 1;
    }
  }

  return 0;
}

function LoWord(nParam)
{
  return (nParam & 0xFFFF);
}

function HiWord(nParam)
{
  return ((nParam >> 16) & 0xFFFF);
}

function Shift()
{
  return oSys.Call("User32::GetKeyState", 0x10 /*VK_SHIFT*/) & 0x8000;
}

function Ctrl()
{
  return oSys.Call("User32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000;
}

function Alt()
{
  return oSys.Call("User32::GetKeyState", 0x12 /*VK_MENU*/) & 0x8000;
}

function SendMessage(hWnd, uMsg, wParam, lParam)
{
  return AkelPad.SendMessage(hWnd, uMsg, wParam, lParam);
}

function PostMessage(hWnd, uMsg, wParam, lParam)
{
  return oSys.Call("User32::PostMessageW", hWnd, uMsg, wParam, lParam);
}

function SetWindowFont(hWnd, hFont)
{
  SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
}

function GetWindowText(hWnd)
{
  oSys.Call("User32::GetWindowTextW", hWnd, lpBuffer, nBufSize);
  return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}

function SetWindowText(hWnd, sText)
{
  oSys.Call("User32::SetWindowTextW", hWnd, sText.substr(0, nBufSize - 1).replace(/\r$/, ""));
}

function SetEditFont()
{
  var hFont;

  if (hEditWnd && bFontAP)
    hFont = SendMessage(hEditWnd, 49 /*WM_GETFONT*/, 0, 0);
  else if (bFontGUI)
    hFont = hGuiFont;
  else
    hFont = ConvertFontFormat(aFont, 3, 2);

  SetWindowFont(aWnd[IDTXTSOURCE].HWND, hFont)
  SetWindowFont(aWnd[IDTXTTARGET].HWND, hFont)
}

function GetEditSelText(hWnd)
{
  SendMessage(hWnd, 1086 /*EM_GETSELTEXT*/, 0, lpBuffer);
  return AkelPad.MemRead(lpBuffer, DT_UNICODE);
}

function SetEditWordWrap()
{
  SendMessage(aWnd[IDTXTSOURCE].HWND, 0x0CAA /*AEM_SETWORDWRAP*/, bWordWrap ? 1 /*AEWW_WORD*/ : 0 /*AEWW_NONE*/, 0);
  SendMessage(aWnd[IDTXTTARGET].HWND, 0x0CAA /*AEM_SETWORDWRAP*/, bWordWrap ? 1 /*AEWW_WORD*/ : 0 /*AEWW_NONE*/, 0);
}

function SetEditStyle(hWnd1, hWnd2)
{
  SendMessage(hWndDlg, 11 /*WM_SETREDRAW*/, 0, 0);

  oSys.Call("User32::SetWindowLongW", hWnd1, -20 /*GWL_EXSTYLE*/, 0);
  oSys.Call("User32::SetWindowLongW", hWnd1, -16 /*GWL_STYLE*/, 0x50B11104);
  oSys.Call("User32::SetWindowPos", hWnd1, 0, 0, 0, 0, 0, 0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);

  if (bSourceWnd)
  {
    oSys.Call("User32::SetWindowLongW", hWnd2, -20 /*GWL_EXSTYLE*/, 0x20000 /*WS_EX_STATICEDGE*/);
    oSys.Call("User32::SetWindowLongW", hWnd2, -16 /*GWL_STYLE*/, 0x50311104);
    oSys.Call("User32::SetWindowPos", hWnd2, 0, 0, 0, 0, 0, 0x37 /*SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE*/);
  }

  SendMessage(hWndDlg, 11 /*WM_SETREDRAW*/, 1, 0);
  oSys.Call("User32::InvalidateRect", hWndDlg, 0, 0);
}

function OpenLinkAE(nID, lpAENLINK)
{
  var nOffset1 = SendMessage(aWnd[nID].HWND, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpAENLINK, _X64 ? 56 : 28));
  var nOffset2 = SendMessage(aWnd[nID].HWND, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, _PtrAdd(lpAENLINK, _X64 ? 80 : 40));
  var sLink;

  AkelPad.SetEditWnd(aWnd[nID].HWND);
  sLink = AkelPad.GetTextRange(nOffset1, nOffset2);
  AkelPad.SetEditWnd(0);

  oSys.Call("Shell32::ShellExecuteW", 0, "open", sLink, 0, 0, 1 /*SW_SHOWNORMAL*/);
}

function GetWindowPos(hWnd, oRect)
{
  var lpRect = AkelPad.MemAlloc(16) //sizeof(RECT);

  oSys.Call("User32::GetWindowRect", hWnd, lpRect);

  oRect.X = AkelPad.MemRead(_PtrAdd(lpRect,  0),  DT_DWORD);
  oRect.Y = AkelPad.MemRead(_PtrAdd(lpRect,  4), DT_DWORD);
  oRect.W = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oRect.X;
  oRect.H = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oRect.Y;

  AkelPad.MemFree(lpRect);
}

function ResizeWindow(hWnd)
{
  var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
  var nW, nH, nW2;

  oSys.Call("User32::GetClientRect", hWnd, lpRect);
  nW  = AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD);
  nH  = AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD);
  nW2 = Math.round(nW / 2);
  AkelPad.MemFree(lpRect);

  oSys.Call("User32::SetWindowPos", aWnd[IDUSE].HWND, 0,
    10,
    10,
    80,
    13,
    0x14 /*SWP_NOACTIVATE|SWP_NOZORDER*/);
  oSys.Call("User32::SetWindowPos", aWnd[IDAPICB].HWND, 0,
    10,
    25,
    80,
    100,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDDETECTLANG].HWND, 0,
    10,
    60,
    210,
    13,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDFROMLANG].HWND, 0,
    nW2 - 215,
    10,
    200,
    13,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDTOLANG].HWND, 0,
    nW2 + 15,
    10,
    200,
    13,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDFROMLANGCB].HWND, 0,
    nW2 - 215,
    25,
    200,
    420,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDTOLANGCB].HWND, 0,
    nW2 + 15,
    25,
    200,
    420,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDSWITCHLANG].HWND, 0,
    nW2 - 15,
    25,
    30,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDSWITCHALL].HWND, 0,
    nW2 - 15,
    50,
    30,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDLISTEN1].HWND, 0,
    nW2 - 100,
    50,
    80,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDLISTEN2].HWND, 0,
    nW2 + 20,
    50,
    80,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDOPACMINUS].HWND, 0,
    nW - 32,
    0,
    16,
    16,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDOPACPLUS].HWND, 0,
    nW - 16,
    0,
    16,
    16,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDTRANSLATE].HWND, 0,
    nW - 90,
    25,
    80,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDOPTIONS].HWND, 0,
    nW - 90,
    50,
    80,
    21,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDTXTSOURCE].HWND, 0,
    10,
    75,
    nW2 - 15,
    nH - 85,
    0x14);
  oSys.Call("User32::SetWindowPos", aWnd[IDTXTTARGET].HWND, 0,
    bSourceWnd ? nW2 + 5 : 10,
    75,
    bSourceWnd ? nW - nW2 - 15 : nW - 20,
    nH - 85,
    0x14);
  oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

function PaintSizeGrip(hWnd)
{
  var lpPaint = AkelPad.MemAlloc(_X64 ? 72 : 64); //sizeof(PAINTSTRUCT)
  var lpRect  = AkelPad.MemAlloc(16); //sizeof(RECT)
  var hDC;

  if (hDC = oSys.Call("User32::BeginPaint", hWnd, lpPaint))
  {
    oSys.Call("User32::GetClientRect", hWnd, lpRect);

    AkelPad.MemCopy(_PtrAdd(lpRect, 0), AkelPad.MemRead(_PtrAdd(lpRect,  8), DT_DWORD) - oSys.Call("User32::GetSystemMetrics",  2 /*SM_CXVSCROLL*/), DT_DWORD);
    AkelPad.MemCopy(_PtrAdd(lpRect, 4), AkelPad.MemRead(_PtrAdd(lpRect, 12), DT_DWORD) - oSys.Call("User32::GetSystemMetrics", 20 /*SM_CYVSCROLL*/), DT_DWORD);

    oSys.Call("User32::DrawFrameControl", hDC, lpRect, 3 /*DFC_SCROLL*/, 0x8 /*DFCS_SCROLLSIZEGRIP*/);
    oSys.Call("User32::EndPaint", hWnd, lpPaint);
  }

  AkelPad.MemFree(lpPaint);
  AkelPad.MemFree(lpRect);
}

function FillComboFromLang(nFromLang)
{
  var nPos;
  var i;

  SendMessage(aWnd[IDFROMLANGCB].HWND, CB_RESETCONTENT, 0, 0);

  if (aAPIs[oSelect.API].AutoDetect)
  {
    nPos = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_ADDSTRING, 0, "   " + sTxtAutoDetect);
    SendMessage(aWnd[IDFROMLANGCB].HWND, CB_SETITEMDATA, nPos, -1);
  }

  for (i = 0; i < aLangs.length; ++i)
  {
    if (aLangs[i][oSelect.API + 3])
    {
      nPos = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_ADDSTRING, 0, aLangs[i][Number(! bSortCode)] + " - "  + aLangs[i][Number(bSortCode)]);
      SendMessage(aWnd[IDFROMLANGCB].HWND, CB_SETITEMDATA, nPos, i);
    }
  }

  if (typeof nFromLang == "undefined")
  {
    if (WScript.Arguments.length > 0)
    {
      if (WScript.Arguments(0).toLowerCase() == "auto")
      {
        if (aAPIs[oSelect.API].AutoDetect)
          oSelect.FromLang = 0;
      }
      else
      {
        for (i = aAPIs[oSelect.API].AutoDetect; i < SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
        {
          if (WScript.Arguments(0) == aLangs[SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, i, 0)][0])
          {
            oSelect.FromLang = i;
            break;
          }
        }
      }
    }
  }
  else
  {
    oSelect.FromLang = 0;
    for (i = 0; i < SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
    {
      if (nFromLang == SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, i, 0))
      {
        oSelect.FromLang = i;
        break;
      }
    }
  }

  SendMessage(aWnd[IDFROMLANGCB].HWND, CB_SETCURSEL, oSelect.FromLang, 0);
}

function FillComboToLang(nToLang)
{
  var nFromLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
  var nPos;
  var i;

  SendMessage(aWnd[IDTOLANGCB].HWND, CB_RESETCONTENT, 0, 0);

  if ((nFromLang > -1) && (aLangs[nFromLang][oSelect.API + 3]) instanceof Array)
  {
    for (i = 0; i < aLangs[nFromLang][oSelect.API + 3].length; ++i)
    {
      nPos = SendMessage(aWnd[IDTOLANGCB].HWND, CB_ADDSTRING, 0, aLangs[aLangs[nFromLang][oSelect.API + 3][i]][Number(! bSortCode)] + " - "  + aLangs[aLangs[nFromLang][oSelect.API + 3][i]][Number(bSortCode)]);
      SendMessage(aWnd[IDTOLANGCB].HWND, CB_SETITEMDATA, nPos, aLangs[nFromLang][oSelect.API + 3][i]);
    }
  }
  else
  {
    for (i = 0; i < aLangs.length; ++i)
    {
      if (aLangs[i][oSelect.API + 3])
      {
        nPos = SendMessage(aWnd[IDTOLANGCB].HWND, CB_ADDSTRING, 0, aLangs[i][Number(! bSortCode)] + " - "  + aLangs[i][Number(bSortCode)]);
        SendMessage(aWnd[IDTOLANGCB].HWND, CB_SETITEMDATA, nPos, i);
      }
    }
  }

  if (typeof nToLang == "undefined")
  {
    if (WScript.Arguments.length > 1)
    {
      for (i = 0; i < SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
      {
        if (WScript.Arguments(1) == aLangs[SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, i, 0)][0])
        {
          oSelect.ToLang = i;
          break;
        }
      }
    }
  }
  else
  {
    oSelect.ToLang = 0;
    for (i = 0; i < SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
    {
      if (nToLang == SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, i, 0))
      {
        oSelect.ToLang = i;
        break;
      }
    }
  }

  SendMessage(aWnd[IDTOLANGCB].HWND, CB_SETCURSEL, oSelect.ToLang, 0);
}

function SwitchLang(bSwitchText)
{
  var nFromLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
  var nToLang   = SendMessage(aWnd[IDTOLANGCB  ].HWND, CB_GETITEMDATA, oSelect.ToLang,   0);
  var nSelTarget;
  var nSelSource;
  var i;

  for (i = 0; i < SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
  {
    if (nToLang == SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, i, 0))
    {
      oSelect.FromLang = i;
      break;
    }
  }

  FillComboToLang(0);
  oSelect.ToLang = 0;

  if (nFromLang == -1) //Auto detect
  {
    if (nDetectLang >= 0)
    {
      for (i = 0; i < SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
      {
        if (nDetectLang == SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, i, 0))
        {
          oSelect.ToLang = i;
          break;
        }
      }
    }
  }
  else
  {
    for (i = 0; i < SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETCOUNT, 0, 0); ++i)
    {
      if (nFromLang == SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, i, 0))
      {
        oSelect.ToLang = i;
        break;
      }
    }
  }

  SendMessage(aWnd[IDFROMLANGCB].HWND, CB_SETCURSEL, oSelect.FromLang, 0);
  SendMessage(aWnd[IDTOLANGCB  ].HWND, CB_SETCURSEL, oSelect.ToLang,   0);

  if (bSwitchText)
  {
    sTarget = GetWindowText(aWnd[IDTXTSOURCE].HWND);
    sSource = GetWindowText(aWnd[IDTXTTARGET].HWND).substr(0, aAPIs[oSelect.API].TextLen);

    if (aAPIs[oSelect.API].Foot)
      sSource = sSource.replace(new RegExp(aAPIs[oSelect.API].Foot + "$"), "");

    nSelTarget = SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B0 /*EM_GETSEL*/, 0, 0);
    nSelSource = SendMessage(aWnd[IDTXTTARGET].HWND, 0x00B0 /*EM_GETSEL*/, 0, 0);

    SetWindowText(aWnd[IDTXTSOURCE].HWND, sSource);
    SetWindowText(aWnd[IDTXTTARGET].HWND, sTarget);

    SendMessage(aWnd[IDTXTSOURCE].HWND, 0x00B1 /*EM_SETSEL*/, LoWord(nSelSource), HiWord(nSelSource));
    SendMessage(aWnd[IDTXTTARGET].HWND, 0x00B1 /*EM_SETSEL*/, LoWord(nSelTarget), HiWord(nSelTarget));
  }

  ShowDetectLang(false);
  EnableListenWindows();
}

function ShowDetectLang(bShow)
{
 if (bShow)
  {
    if (nDetectLang >= 0)
      SetWindowText(aWnd[IDDETECTLANG].HWND, sTxtAutoDetect + ": " + aLangs[nDetectLang][1]);
  }
  else
  {
    nDetectLang = -1;
    SetWindowText(aWnd[IDDETECTLANG].HWND, "");
  }
}

function EnableListenWindows()
{
  var nFromLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
  var nToLang   = SendMessage(aWnd[IDTOLANGCB  ].HWND, CB_GETITEMDATA, oSelect.ToLang, 0);

  if (nFromLang < 0)
    nFromLang = nDetectLang;

  if (nFromLang < 0)
    oSys.Call("User32::EnableWindow", aWnd[IDLISTEN1].HWND, 0);
  else
    oSys.Call("User32::EnableWindow", aWnd[IDLISTEN1].HWND, aLangs[nFromLang][2]);

  oSys.Call("User32::EnableWindow", aWnd[IDLISTEN2].HWND, aLangs[nToLang][2]);
}

function ShowSourceWindow()
{
  if (bSourceWnd)
  {
    aWnd[IDTXTTARGET].X = aWnd[IDTXTTARGET].X + aWnd[IDTXTTARGET].W - aWnd[IDTXTSOURCE].W;
    aWnd[IDTXTTARGET].W = aWnd[IDTXTSOURCE].W;
    hFocus = aWnd[IDTXTSOURCE].HWND;
  }
  else
  {
    aWnd[IDTXTTARGET].W = aWnd[IDTXTTARGET].X + aWnd[IDTXTTARGET].W - aWnd[IDTXTSOURCE].X;
    aWnd[IDTXTTARGET].X = aWnd[IDTXTSOURCE].X;
    hFocus = aWnd[IDTXTTARGET].HWND;
  }

  oSys.Call("User32::ShowWindow", aWnd[IDSWITCHALL].HWND, bSourceWnd);
  oSys.Call("User32::ShowWindow", aWnd[IDLISTEN1  ].HWND, bSourceWnd);
  oSys.Call("User32::ShowWindow", aWnd[IDTXTSOURCE].HWND, bSourceWnd);
  oSys.Call("User32::SetFocus", hFocus);
  ResizeWindow(hWndDlg)
}

function SetOpacityLevel(hWnd, nLevel)
{
  var nStyle = oSys.Call("User32::GetWindowLongW", hWnd, -20 /*GWL_EXSTYLE*/);
  var lpAlpha;

  if (! (nStyle & 0x00080000 /*WS_EX_LAYERED*/))
    oSys.Call("User32::SetWindowLongW", hWnd, -20 /*GWL_EXSTYLE*/, nStyle |= 0x00080000 /*WS_EX_LAYERED*/);

  if (nLevel < 0)
  {
    lpAlpha = AkelPad.MemAlloc(1);
    if (oSys.Call("User32::GetLayeredWindowAttributes", hWnd, 0, lpAlpha, 0))
      nOpacity = AkelPad.MemRead(lpAlpha, DT_BYTE);
    else
      nOpacity = 255;
    nOpacity += (nLevel == -1) ? 20 : -20;
    AkelPad.MemFree(lpAlpha);
  }

  if (nOpacity > 255)
    nOpacity = 255;
  else if (nOpacity < 55)
    nOpacity = 55;

  oSys.Call("User32::SetLayeredWindowAttributes", hWnd, 0, nOpacity, 2 /*LWA_ALPHA*/);
}

function InsertTextToAP(hWnd, bEntireText)
{
  var sText;

  if (hEditWnd)
  {
    if (bEntireText)
    {
      sText = GetWindowText(hWnd);

      if ((hWnd == aWnd[IDTXTTARGET].HWND) && aAPIs[oSelect.API].Foot)
        sText = sText.replace(new RegExp(aAPIs[oSelect.API].Foot + "$"), "");
    }
    else
      sText = GetEditSelText(hWnd);

    if (sText) AkelPad.ReplaceSel(sText, -1);
  }
}

function PasteTextFromAP(hWnd, bEntireText)
{
  var sText;

  if (hEditWnd && (AkelPad.GetSelStart() != AkelPad.GetSelEnd()))
  {
    sText = AkelPad.GetSelText(3 /*"\r\n"*/);

    if (bEntireText) SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, 0, -1);

    SendMessage(hWnd, 0x00C2 /*EM_REPLACESEL*/, 1, sText);
  }
}

function CopyEntireTextToCB(hWnd)
{
  var sText = GetWindowText(hWnd);

  if ((hWnd == aWnd[IDTXTTARGET].HWND) && aAPIs[oSelect.API].Foot)
    sText = sText.replace(new RegExp(aAPIs[oSelect.API].Foot + "$"), "");

  if (sText) AkelPad.SetClipboardText(sText);
}

function PasteEntireTextFromCB(hWnd)
{
  if (AkelPad.GetClipboardText())
  {
    SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, 0, -1);
    SendMessage(hWnd, 0x0302 /*WM_PASTE*/, 0, 0);
  }
}

function DeleteEntireText(hWnd)
{
  SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, 0, -1);
  SendMessage(hWnd, 0x0303 /*WM_CLEAR*/, 0, 0);
}

Last edited by KDJ on Tue Nov 06, 2018 7:36 pm, edited 52 times in total.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Translates text via Google, MS Bing and Yandex - Part Two.
In the next post are the files with the translated interface.

Code: Select all

function ContextMenu(hWnd, nPosParam)
{
  var MF_STRING    = 0x0;
  var MF_GRAYED    = 0x1;
  var MF_POPUP     = 0x10;
  var MF_SEPARATOR = 0x800;
  var hMenu  = oSys.Call("User32::CreatePopupMenu");
  var hMenu1 = oSys.Call("User32::CreatePopupMenu");
  var hMenu2 = oSys.Call("User32::CreatePopupMenu");
  var oRect;
  var lpPoint;
  var nPosX;
  var nPosY;
  var nWnd;
  var nCmd;

  //Sub menu source text (Entire text)
  oSys.Call("User32::AppendMenuW", hMenu1, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 21, sTxtCut + "\tAlt+X");
  oSys.Call("User32::AppendMenuW", hMenu1, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 22, sTxtCopyCB + "\tAlt+C");
  oSys.Call("User32::AppendMenuW", hMenu1, SendMessage(aWnd[IDTXTSOURCE].HWND, 0x0432 /*EM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 23, sTxtPasteCB + "\tAlt+V");
  oSys.Call("User32::AppendMenuW", hMenu1, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 24, sTxtDelete + "\tAlt+Del");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu1, (hEditWnd && oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND)) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 25, sTxtInsertAP + "\tShift+Alt+C");
  oSys.Call("User32::AppendMenuW", hMenu1, SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 26, sTxtPasteAP + "\tShift+Alt+V");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu1, (oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) && oSys.Call("User32::IsWindowEnabled", aWnd[IDLISTEN1].HWND)) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 27, sTxtListen + "\tCtrl+L");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu1, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 28, sTxtTranslate + "\tCtrl+Enter");
  oSys.Call("User32::AppendMenuW", hMenu1, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTSOURCE].HWND) ? MF_STRING : MF_GRAYED,
            (1 << 8) | 29, sTxtTranslateP + "\tAlt+Enter");
  oSys.Call("User32::AppendMenuW", hMenu1, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu1, MF_STRING,
            (1 << 8) | 30, aAPIs[oSelect.API].Name + ".com" + "\tCtrl+Alt+Enter");

  //Sub menu target text (Entire text)
  oSys.Call("User32::AppendMenuW", hMenu2, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 21, sTxtCut + "\tAlt+X");
  oSys.Call("User32::AppendMenuW", hMenu2, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 22, sTxtCopyCB + "\tAlt+C");
  oSys.Call("User32::AppendMenuW", hMenu2, SendMessage(aWnd[IDTXTTARGET].HWND, 0x0432 /*EM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 23, sTxtPasteCB + "\tAlt+V");
  oSys.Call("User32::AppendMenuW", hMenu2, oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 24, sTxtDelete + "\tAlt+Del");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu2, (hEditWnd && oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND)) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 25, sTxtInsertAP + "\tShift+Alt+C");
  oSys.Call("User32::AppendMenuW", hMenu2, SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 26, sTxtPasteAP + "\tShift+Alt+V");
  oSys.Call("User32::AppendMenuW", hMenu2, MF_SEPARATOR, 0, 0);
  oSys.Call("User32::AppendMenuW", hMenu2, (oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND) && oSys.Call("User32::IsWindowEnabled", aWnd[IDLISTEN2].HWND)) ? MF_STRING : MF_GRAYED,
            (2 << 8) | 27, sTxtListen + "\tCtrl+L");

  if (nPosParam == -2) //Context menu for Options button
  {
    oRect = new Object();
    GetWindowPos(hWnd, oRect);
    nPosX = oRect.X + oRect.W;
    nPosY = oRect.Y + oRect.H;

    if (bSourceWnd)
      oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu1, sTxtSource);

    oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, hMenu2, sTxtTarget);
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
    oSys.Call("User32::AppendMenuW", hMenu, MF_STRING, (1 << 8) | 41, sTxtSettings + "\tAlt+S");
  }
  else
  {
    if (nPosParam == -1) //Context menu from keyboard
    {
      lpPoint = AkelPad.MemAlloc(8); //sizeof(POINT)
      oSys.Call("User32::GetCaretPos", lpPoint);
      oSys.Call("User32::ClientToScreen", hWnd, lpPoint);
      nPosX = AkelPad.MemRead(_PtrAdd(lpPoint, 0), DT_DWORD);
      nPosY = AkelPad.MemRead(_PtrAdd(lpPoint, 4), DT_DWORD) + SendMessage(hWnd, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, 0);
      AkelPad.MemFree(lpPoint);
    }
    else //Right click
    {
      nPosX = LoWord(nPosParam);
      nPosY = HiWord(nPosParam);
    }

    nWnd = (hWnd == aWnd[IDTXTSOURCE].HWND) ? 1 : 2;

    oSys.Call("User32::IsWindowEnabled", aWnd[IDLISTEN1 + nWnd - 1].HWND)

    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 0x00C6 /*EM_CANUNDO*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 1, sTxtUndo + "\tCtrl+Z");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 0x0455 /*EM_CANREDO*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 2, sTxtRedo + "\tCtrl+Shift+Z");
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 3, sTxtCut + "\tCtrl+X");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 4, sTxtCopyCB + "\tCtrl+C");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 0x0432 /*EM_CANPASTE*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 5, sTxtPasteCB + "\tCtrl+V");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 6, sTxtDelete + "\tDel");
    oSys.Call("User32::AppendMenuW", hMenu, oSys.Call("User32::GetWindowTextLengthW", hWnd) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 7, sTxtSelectAll + "\tCtrl+A");
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
    oSys.Call("User32::AppendMenuW", hMenu, (hEditWnd && SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0)) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 8, sTxtInsertAP + "\tCtrl+Shift+C");
    oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hEditWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 9, sTxtPasteAP + "\tCtrl+Shift+V");
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
    oSys.Call("User32::AppendMenuW", hMenu, (SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) && oSys.Call("User32::IsWindowEnabled", aWnd[IDLISTEN1 + nWnd - 1].HWND)) ? MF_STRING : MF_GRAYED,
              (nWnd << 8) | 10, sTxtListen + "\tCtrl+Shift+L");
    if (nWnd == 1)
    {
      oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
      oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
                (nWnd << 8) | 11, sTxtTranslate + "\tShift+Enter");
      oSys.Call("User32::AppendMenuW", hMenu, SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0) ? MF_STRING : MF_GRAYED,
                (nWnd << 8) | 12, sTxtTranslateP + "\tShift+Alt+Enter");
      oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
      oSys.Call("User32::AppendMenuW", hMenu, MF_STRING,
                (nWnd << 8) | 13, aAPIs[oSelect.API].Name + ".com" + "\tCtrl+Shift+Alt+Enter");
    }
    oSys.Call("User32::AppendMenuW", hMenu, MF_SEPARATOR, 0, 0);
    oSys.Call("User32::AppendMenuW", hMenu, MF_POPUP, (nWnd == 1) ? hMenu1 : hMenu2, sTxtEntireText);
  }

  nCmd = oSys.Call("User32::TrackPopupMenu", hMenu, (nPosParam > -2) ? 0x180 /*TPM_NONOTIFY|TPM_RETURNCMD*/ : 0x188 /*TPM_RIGHTALIGN|TPM_NONOTIFY|TPM_RETURNCMD*/, nPosX, nPosY, 0, hWndDlg, 0);

  oSys.Call("User32::DestroyMenu", hMenu);
  oSys.Call("User32::DestroyMenu", hMenu1);
  oSys.Call("User32::DestroyMenu", hMenu2);

  nWnd = nCmd >> 8;
  nCmd = nCmd & 0xFF;
  hWnd = (nWnd == 1) ? aWnd[IDTXTSOURCE].HWND : aWnd[IDTXTTARGET].HWND;

  //Selected text
  if (nCmd == 1)
    SendMessage(hWnd, 0x00C7 /*EM_UNDO*/, 0, 0);
  else if (nCmd == 2)
    SendMessage(hWnd, 0x0454 /*EM_REDO*/, 0, 0);
  else if (nCmd == 3)
    SendMessage(hWnd, 0x0300 /*WM_CUT*/, 0, 0);
  else if (nCmd == 4)
    SendMessage(hWnd, 0x0301 /*WM_COPY*/, 0, 0);
  else if (nCmd == 5)
    SendMessage(hWnd, 0x0302 /*WM_PASTE*/, 0, 0);
  else if (nCmd == 6)
    SendMessage(hWnd, 0x0303 /*WM_CLEAR*/, 0, 0);
  else if (nCmd == 7)
    SendMessage(hWnd, 0x00B1 /*EM_SETSEL*/, 0, -1);
  else if (nCmd == 8)
    InsertTextToAP(hWnd, 0);
  else if (nCmd == 9)
    PasteTextFromAP(hWnd, 0);
  else if (nCmd == 10)
    Listen(hWnd, 1);
  else if (nCmd == 11)
    Translate(1);
  else if (nCmd == 12)
    Translate(1, 1);
  else if (nCmd == 13)
    OpenInBrowser(1);

  //Entire text
  else if (nCmd == 21)
  {
    CopyEntireTextToCB(hWnd);
    DeleteEntireText(hWnd);
  }
  else if (nCmd == 22)
    CopyEntireTextToCB(hWnd);
  else if (nCmd == 23)
    PasteEntireTextFromCB(hWnd);
  else if (nCmd == 24)
    DeleteEntireText(hWnd);
  else if (nCmd == 25)
    InsertTextToAP(hWnd, 1);
  else if (nCmd == 26)
    PasteTextFromAP(hWnd, 1);
  else if (nCmd == 27)
    Listen(hWnd, 0);
  else if (nCmd == 28)
    Translate();
  else if (nCmd == 29)
    Translate(0, 1);
  else if (nCmd == 30)
    OpenInBrowser();

  else if (nCmd == 41)
    Settings();
}

function Settings()
{
  var oRect = {};
  var nW    = 440;
  var nH    = 435;
  var nX, nY;
  var hWndSet;

  GetWindowPos(hWndDlg, oRect);
  nX = oRect.X + (oRect.W - nW) / 2;
  nY = oRect.Y + (oRect.H - nH) / 2;

  hWndSet =
     oSys.Call("User32::CreateWindowExW",
       0,            //dwExStyle
       sClassName,   //lpClassName
       sTxtSettings, //lpWindowName
       0x90C80000,   //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU
       nX,           //x
       nY,           //y
       nW,           //nWidth
       nH,           //nHeight
       hWndDlg,      //hWndParent
       0,            //ID
       hInstanceDLL, //hInstance
       SettingsCallback); //lpParam

  if (hWndSet)
  {
    oSys.Call("User32::EnableWindow", hMainWnd, 0);
    oSys.Call("User32::EnableWindow", hWndDlg, 0);
  }
}

function SettingsCallback(hWnd, uMsg, wParam, lParam)
{
  var i;

  if (uMsg == 1) //WM_CREATE
  {
    for (i = 1100; i < aWndSet.length; ++i)
    {
      aWndSet[i].HWND =
        oSys.Call("User32::CreateWindowExW",
          0,                //dwExStyle
          aWndSet[i].Class, //lpClassName
          0,                //lpWindowName
          aWndSet[i].Style, //dwStyle
          aWndSet[i].X,     //x
          aWndSet[i].Y,     //y
          aWndSet[i].W,     //nWidth
          aWndSet[i].H,     //nHeight
          hWnd,             //hWndParent
          i,                //ID
          hInstanceDLL,     //hInstance
          0);               //lpParam
      SetWindowFont(aWndSet[i].HWND, hGuiFont);
      SetWindowText(aWndSet[i].HWND, aWndSet[i].T);
    }

    SendMessage(hWnd, 0x0080 /*WM_SETICON*/, 0 /*ICON_SMALL*/, hIconSmall);

    SendMessage(aWndSet[IDAPIKEY1].HWND, 197 /*EM_SETLIMITTEXT*/, 128, 0);
    SendMessage(aWndSet[IDAPIKEY2].HWND, 197 /*EM_SETLIMITTEXT*/, 128, 0);
    SetWindowText(aWndSet[IDAPIKEY1].HWND, aAPIs[1].APIkeyP);
    SetWindowText(aWndSet[IDAPIKEY2].HWND, aAPIs[2].APIkeyP);

    FillComboInterface();

    //Check buttons
    SendMessage(aWndSet[IDSOURCEINCB].HWND, 241 /*BM_SETCHECK*/, bSourceInCB || (! hEditWnd), 0);
    SendMessage(aWndSet[IDSOURCEWND ].HWND, 241 /*BM_SETCHECK*/, bSourceWnd, 0);
    SendMessage(aWndSet[IDLOADTEXT  ].HWND, 241 /*BM_SETCHECK*/, bLoadText,  0);
    SendMessage(aWndSet[IDIMMEDIATE ].HWND, 241 /*BM_SETCHECK*/, bImmediate, 0);
    SendMessage(aWndSet[IDWORDWRAP  ].HWND, 241 /*BM_SETCHECK*/, bWordWrap,  0);
    SendMessage(aWndSet[IDFONTAP    ].HWND, 241 /*BM_SETCHECK*/, bFontAP && hEditWnd, 0);
    SendMessage(aWndSet[IDFONTGUI   ].HWND, 241 /*BM_SETCHECK*/, bFontGUI,   0);
    SendMessage(aWndSet[IDSORTNAME - bSortCode].HWND, 241 /*BM_SETCHECK*/, 1, 0);
    oSys.Call("User32::EnableWindow", aWndSet[IDSOURCEINCB].HWND, hEditWnd);
    oSys.Call("User32::EnableWindow", aWndSet[IDLOADTEXT  ].HWND, bSourceWnd);
    oSys.Call("User32::EnableWindow", aWndSet[IDIMMEDIATE ].HWND, (! bSourceWnd) || (bSourceWnd && bLoadText));
    oSys.Call("User32::EnableWindow", aWndSet[IDFONTAP    ].HWND, hEditWnd);
    oSys.Call("User32::EnableWindow", aWndSet[IDFONT      ].HWND, ((! bFontAP) || (! hEditWnd)) && (! bFontGUI));

    hFocusSet = aWndSet[IDINTERFACECB].HWND;
  }

  else if ((uMsg == 6 /*WM_ACTIVATE*/) && (! wParam))
    hFocusSet = oSys.Call("User32::GetFocus");

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("User32::SetFocus", hFocusSet);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if ((wParam == 13 /*VK_RETURN*/) && (oSys.Call("User32::GetFocus") != aWndSet[IDFONT].HWND) && bCloseCB)
      PostMessage(hWnd, 273 /*WM_COMMAND*/, IDOKB, 0);
  }

  else if (uMsg == 273) //WM_COMMAND
  {
    var nLowParam = LoWord(wParam);
    var nHiwParam = HiWord(wParam);
    bCloseCB = 1;

    if (nLowParam == IDINTERFACECB)
    {
      if (nHiwParam == CBN_CLOSEUP)
        bCloseCB = 0;
    }
    else if ((nLowParam == IDSOURCEWND) || (nLowParam == IDLOADTEXT))
    {
      oSys.Call("User32::EnableWindow", aWndSet[IDLOADTEXT].HWND,
                SendMessage(aWndSet[IDSOURCEWND].HWND, 240 /*BM_GETCHECK*/, 0, 0));
      oSys.Call("User32::EnableWindow", aWndSet[IDIMMEDIATE].HWND,
                (! SendMessage(aWndSet[IDSOURCEWND].HWND, 240 /*BM_GETCHECK*/, 0, 0)) ||
                (SendMessage(aWndSet[IDSOURCEWND].HWND, 240 /*BM_GETCHECK*/, 0, 0) &&
                 SendMessage(aWndSet[IDLOADTEXT].HWND, 240 /*BM_GETCHECK*/, 0, 0)));
    }
    else if (nLowParam == IDFONTAP)
    {
      if (SendMessage(aWndSet[IDFONTAP].HWND, 240 /*BM_GETCHECK*/, 0, 0))
        SendMessage(aWndSet[IDFONTGUI].HWND, 241 /*BM_SETCHECK*/, 0, 0);

      oSys.Call("User32::EnableWindow", aWndSet[IDFONT].HWND,
                (! SendMessage(aWndSet[IDFONTAP].HWND, 240 /*BM_GETCHECK*/, 0, 0)) &&
                (! SendMessage(aWndSet[IDFONTGUI].HWND, 240 /*BM_GETCHECK*/, 0, 0)));
    }
    else if (nLowParam == IDFONTGUI)
    {
      if (SendMessage(aWndSet[IDFONTGUI].HWND, 240 /*BM_GETCHECK*/, 0, 0) && hEditWnd)
        SendMessage(aWndSet[IDFONTAP].HWND, 241 /*BM_SETCHECK*/, 0, 0);

      oSys.Call("User32::EnableWindow", aWndSet[IDFONT].HWND,
                ((! SendMessage(aWndSet[IDFONTAP].HWND, 240 /*BM_GETCHECK*/, 0, 0)) || (! hEditWnd)) &&
                 (! SendMessage(aWndSet[IDFONTGUI].HWND, 240 /*BM_GETCHECK*/, 0, 0)));
    }
    else if (nLowParam == IDFONT)
    {
      var vCF;
      if (vCF = ChooseFont(hWnd, aFont))
      {
        aFont = vCF;
        oSys.Call("User32::SetWindowTextW", aWndSet[IDFONT].HWND, aWndSet[IDFONT].T = aFont.toString());
      }
      oSys.Call("User32::SetFocus", aWndSet[IDFONT].HWND);
    }
    else if (nLowParam == IDOKB)
    {
      //Change interface language
      var nCurSel   = SendMessage(aWndSet[IDINTERFACECB].HWND, CB_GETCURSEL, 0, 0);
      var sLangName = "";
      if (SendMessage(aWndSet[IDINTERFACECB].HWND, CB_GETITEMDATA, nCurSel, 0) != -1)
      {
        SendMessage(aWndSet[IDINTERFACECB].HWND, 0x0148 /*CB_GETLBTEXT*/, nCurSel, lpBuffer);
        sLangName = AkelPad.MemRead(lpBuffer, DT_UNICODE);
      }
      if (sLangName.toUpperCase() != sLanguage.toUpperCase())
      {
        sLanguage = sLangName;
        ReadInterfaceLang();
        SetInterfaceLangToWndDef();
        SetWindowText(hWndDlg, sTxtCaption);
        for (i = IDUSE; i <= IDOPTIONS; ++i)
          SetWindowText(aWnd[i].HWND, aWnd[i].T);

        ShowDetectLang(true);
      }

      if (hEditWnd)
      {
        bSourceInCB = SendMessage(aWndSet[IDSOURCEINCB].HWND, 240 /*BM_GETCHECK*/, 0, 0);
        bFontAP     = SendMessage(aWndSet[IDFONTAP    ].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      }

      bSourceWnd = SendMessage(aWndSet[IDSOURCEWND].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      bLoadText  = SendMessage(aWndSet[IDLOADTEXT ].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      bImmediate = SendMessage(aWndSet[IDIMMEDIATE].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      bWordWrap  = SendMessage(aWndSet[IDWORDWRAP ].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      bFontGUI   = SendMessage(aWndSet[IDFONTGUI  ].HWND, 240 /*BM_GETCHECK*/, 0, 0);
      bSortCode  = SendMessage(aWndSet[IDSORTCODE ].HWND, 240 /*BM_GETCHECK*/, 0, 0);

      SetEditWordWrap();
      SetEditFont();
      ShowSourceWindow();
      FillComboFromLang(SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0));
      FillComboToLang(SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0));

      aAPIs[1].APIkeyP = GetWindowText(aWndSet[IDAPIKEY1].HWND);
      aAPIs[2].APIkeyP = GetWindowText(aWndSet[IDAPIKEY2].HWND);

      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
    }
    else if ((nLowParam == IDCANCELB) || (nLowParam == 2 /*IDCANCEL*/))
      PostMessage(hWnd, 16 /*WM_CLOSE*/, 0, 0);
  }

  else if (uMsg == 16) //WM_CLOSE
  {
    oSys.Call("User32::EnableWindow", hMainWnd, 1);
    oSys.Call("User32::EnableWindow", hWndDlg, 1);
    oSys.Call("User32::DestroyWindow", hWnd);
  }

  return 0;
}

function FillComboInterface()
{
  var sScriptName = WScript.ScriptName.substring(0, WScript.ScriptName.lastIndexOf(".")) + "_";
  var sTemplate   = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_*.lng";
  var hFindFile   = oSys.Call("Kernel32::FindFirstFileW", sTemplate, lpBuffer);
  var sLangFile;
  var sLangName;
  var nPos;

  nPos = SendMessage(aWndSet[IDINTERFACECB].HWND, CB_ADDSTRING, 0, "English (built-in)");
  SendMessage(aWndSet[IDINTERFACECB].HWND, CB_SETITEMDATA, nPos, -1);
  SendMessage(aWndSet[IDINTERFACECB].HWND, CB_SETCURSEL, nPos, 0);

  if (hFindFile != -1) //INVALID_HANDLE_VALUE
  {
    do
    {
      sLangFile = AkelPad.MemRead(_PtrAdd(lpBuffer, 44 /*WIN32_FIND_DATAW,cFileName*/), DT_UNICODE);
      sLangName = sLangFile.substring(sScriptName.length, sLangFile.lastIndexOf("."));

      if (sLangName)
      {
        nPos = SendMessage(aWndSet[IDINTERFACECB].HWND, CB_ADDSTRING, 0, sLangName);

        if (sLangName.toUpperCase() == sLanguage.toUpperCase())
          SendMessage(aWndSet[IDINTERFACECB].HWND, CB_SETCURSEL, nPos, 0);
      }
    }
    while(oSys.Call("Kernel32::FindNextFileW", hFindFile, lpBuffer));
  }
  oSys.Call("Kernel32::FindClose", hFindFile);
}

function ChooseFont(hWndOwn, aFontIni)
{
  var nCFSize    = _X64 ? 104 : 60; //sizeof(CHOOSEFONT)
  var lpCF       = AkelPad.MemAlloc(nCFSize);
  var lpLF       = ConvertFontFormat(aFontIni, 3, 1);
  var lpCallback = oSys.RegisterCallback(CFHookProcCallback);
  var vResult    = 0;

  AkelPad.MemCopy(_PtrAdd(lpCF,              0),    nCFSize, DT_DWORD); //lStructSize
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ?  8 :  4),    hWndOwn, DT_QWORD); //hwndOwner
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 24 : 12),       lpLF, DT_QWORD); //lpLogFont
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 36 : 20), 0x00010049, DT_DWORD); //Flags=CF_ENABLEHOOK|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS
  AkelPad.MemCopy(_PtrAdd(lpCF, _X64 ? 56 : 32), lpCallback, DT_QWORD); //lpfnHook

  if (oSys.Call("Comdlg32::ChooseFontW", lpCF))
    vResult = ConvertFontFormat(lpLF, 1, 3);

  oSys.UnregisterCallback(lpCallback);
  AkelPad.MemFree(lpCF);
  AkelPad.MemFree(lpLF);

  return vResult;
}

function CFHookProcCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 272 /*WM_INITDIALOG*/)
  {
    var hWndOwn   = AkelPad.MemRead(_PtrAdd(lParam, _X64 ? 8 : 4), DT_QWORD);
    var oRectWnd  = {};
    var oRectOwn  = {};
    var oRectDesk = {};

    //center dialog
    GetWindowPos(hWnd, oRectWnd);
    GetWindowPos(hWndOwn, oRectOwn);
    GetWindowPos(oSys.Call("User32::GetDesktopWindow"), oRectDesk);

    oRectWnd.X = oRectOwn.X + (oRectOwn.W - oRectWnd.W) / 2;
    oRectWnd.Y = oRectOwn.Y + (oRectOwn.H - oRectWnd.H) / 2;

    if ((oRectWnd.X + oRectWnd.W) > oRectDesk.W)
      oRectWnd.X = oRectDesk.W - oRectWnd.W;
    if (oRectWnd.X < 0)
      oRectWnd.X = 0;
    if ((oRectWnd.Y + oRectWnd.H) > oRectDesk.H)
      oRectWnd.Y = oRectDesk.H - oRectWnd.H;
    if (oRectWnd.Y < 0)
      oRectWnd.Y = 0;

    oSys.Call("User32::MoveWindow", hWnd, oRectWnd.X, oRectWnd.Y, oRectWnd.W, oRectWnd.H, 0);
  }

  return 0;
}

//---------------------------------------------------
// vFont - pointer to LOGFONTW, font handle, or array
// nInType - vFont type,
// nRetType - vResult type:
//   1 - pointer to LOGFONTW structure
//   2 - handle to font
//   3 - array [sFontName, nFontStyle, nFontSize]
//---------------------------------------------------
function ConvertFontFormat(vFont, nInType, nRetType)
{
  var nLFSize = 28 + 32 * 2; //sizeof(LOGFONTW)
  var lpLF    = AkelPad.MemAlloc(nLFSize);
  var hFont;
  var hDC;
  var nHeight;
  var nWeight;
  var bItalic;
  var vRetVal;
  var i;

  if (nInType == 1)
  {
    for (i = 0; i < nLFSize; ++i)
      AkelPad.MemCopy(_PtrAdd(lpLF, i), AkelPad.MemRead(_PtrAdd(vFont, i), DT_BYTE), DT_BYTE);
  }
  else if (nInType == 2)
  {
    if (! vFont)
      vFont = oSys.Call("Gdi32::GetStockObject", 13 /*SYSTEM_FONT*/);

    oSys.Call("Gdi32::GetObjectW", vFont, nLFSize, lpLF);
  }
  else if (nInType == 3)
  {
    hDC     = oSys.Call("User32::GetDC", hMainWnd);
    nHeight = -oSys.Call("Kernel32::MulDiv", vFont[2], oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/), 72);
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC);

    nWeight = 400;
    bItalic = 0;
    if ((vFont[1] == 2) || (vFont[1] == 4))
      nWeight = 700;
    if (vFont[1] > 2)
      bItalic = 1;

    AkelPad.MemCopy(_PtrAdd(lpLF,  0), nHeight,  DT_DWORD); //lfHeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 16), nWeight,  DT_DWORD); //lfWeight
    AkelPad.MemCopy(_PtrAdd(lpLF, 20), bItalic,  DT_BYTE);  //lfItalic
    AkelPad.MemCopy(_PtrAdd(lpLF, 28), vFont[0], DT_UNICODE); //lfFaceName
  }

  if (nRetType == 1)
    vRetVal = lpLF;
  else if (nRetType == 2)
  {
    vRetVal = oSys.Call("Gdi32::CreateFontIndirectW", lpLF);
    AkelPad.MemFree(lpLF);
  }
  else if (nRetType == 3)
  {
    vRetVal    = [];
    vRetVal[0] = AkelPad.MemRead(_PtrAdd(lpLF, 28), DT_UNICODE); //lfFaceName

    nWeight = AkelPad.MemRead(_PtrAdd(lpLF, 16), DT_DWORD); //lfWeight
    bItalic = AkelPad.MemRead(_PtrAdd(lpLF, 20), DT_BYTE);  //lfItalic

    if (nWeight < 600)
      vRetVal[1] = 1;
    else
      vRetVal[1] = 2;

    if (bItalic)
      vRetVal[1] += 2;

    hDC        = oSys.Call("User32::GetDC", hMainWnd);
    nHeight    = AkelPad.MemRead(lpLF, DT_DWORD); //lfHeight
    vRetVal[2] = -oSys.Call("Kernel32::MulDiv", nHeight, 72, oSys.Call("Gdi32::GetDeviceCaps", hDC, 90 /*LOGPIXELSY*/));
    oSys.Call("User32::ReleaseDC", hMainWnd, hDC); 
    AkelPad.MemFree(lpLF);
  }

  return vRetVal;
}

function Translate(bSelection, bAddToTarget)
{
  var sMethod    = "POST";
  var sAPIkey    = aAPIs[oSelect.API].APIkeyP ? aAPIs[oSelect.API].APIkeyP : aAPIs[oSelect.API].APIkey;
  var nFromLang  = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
  var sFromLang  = (nFromLang < 0) ? "" : aLangs[nFromLang][0];
  var sToLang    = aLangs[SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0)][0];
  var nTargetLen = oSys.Call("User32::GetWindowTextLengthW", aWnd[IDTXTTARGET].HWND)
  var nTargetSel = 0;
  var sLangName;
  var sURL;
  var sSend;
  var oRequest;
  var oResponse;
  var i, k, n;

  SetWindowText(aWnd[IDDETECTLANG].HWND, sTxtWait);
  nDetectLang = -1;

  try
  {
    oRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }
  catch (oError)
  {
    ErrorBox(sTxtNoSupport);
    return;
  }

  if (bSourceWnd)
  {
    if (bSelection && SendMessage(aWnd[IDTXTSOURCE].HWND, 3125 /*AEM_GETSEL*/, 0, 0))
      sSource = GetEditSelText(aWnd[IDTXTSOURCE].HWND);
    else
      sSource = GetWindowText(aWnd[IDTXTSOURCE].HWND);
  }
  else
  {
    if (bSourceInCB || (! hEditWnd) || ((WScript.Arguments.length > 2) && (WScript.Arguments(2) == "1")))
      sSource = AkelPad.GetClipboardText().substr(0, aAPIs[oSelect.API].TextLen);
    else
      sSource = AkelPad.GetSelText(3 /*"\r\n"*/).substr(0, aAPIs[oSelect.API].TextLen);
  }

  sSource = sSource.replace(/^[ \t\r\n]+|[ \t\r\n]+$/, "");

  if (! sSource)
  {
    ErrorBox(sTxtNoText);
    return;
  }

  if (oSelect.API == 0) //Google
  {
    sURL  = "https://translate.google.com/translate_a/single";
    sSend = "client=qlt&dt=bd&dt=t&sl=" + (sFromLang || "auto") + "&tl=" + sToLang + "&q=" + encodeURIComponent(sSource);
  }
  else if (oSelect.API == 1) //Bing
  {
//    //Bing GET method
//    sMethod = "GET";
//    if (nFromLang < 0) //Auto detect
//    {
//      OpenRequest(oRequest, sMethod, "http://api.microsofttranslator.com/V2/Http.svc/Detect?appId=" + sAPIkey + "&text=" + encodeURIComponent(sSource));
//      if (! SendRequest(oRequest, null))
//        return;
//      if (oRequest.status != 200)
//      {
//        ErrorBox(oRequest.status + " : " + oRequest.statusText);
//        return;
//      }
//      sFromLang = oRequest.responseText.substring(oRequest.responseText.indexOf(">") + 1, oRequest.responseText.lastIndexOf("<"));
//    }
//    sURL  = "http://api.microsofttranslator.com/V2/Http.svc/Translate?appId=" + sAPIkey + "&from=" + sFromLang + "&to=" + sToLang + "&text=" + encodeURIComponent(sSource);
//    sSend = null;

    //Bing POST method
    if (nFromLang < 0) //Auto detect
    {
      OpenRequest(oRequest, sMethod, "http://api.microsofttranslator.com/V2/Http.svc/Detect?appId=" + sAPIkey);

      if (! SendRequest(oRequest, sSource))
        return;

      if (oRequest.status != 200)
      {
        ErrorBox(oRequest.status + " : " + oRequest.statusText);
        return;
      }
      sFromLang = oRequest.responseText.substring(oRequest.responseText.indexOf(">") + 1, oRequest.responseText.lastIndexOf("<"));
    }

    sURL  = "http://api.microsofttranslator.com/V2/Http.svc/Translate?appId=" + sAPIkey + "&from=" + sFromLang + "&to=" + sToLang;
    sSend = sSource;
  }
  else //Yandex
  {
    if (nFromLang < 0) //Auto detect
    {
      OpenRequest(oRequest, sMethod, "https://translate.yandex.net/api/v1.5/tr.json/detect");

      if (! SendRequest(oRequest, "key=" + sAPIkey + "&text=" + encodeURIComponent(sSource)))
        return;

      if (oRequest.status != 200)
      {
        ErrorBox(oRequest.status + " : " + oRequest.statusText);
        return;
      }

      try
      {
        eval("oResponse=" + oRequest.responseText + ";");
        sFromLang = oResponse.lang;
      }
      catch (oError)
      {
        sFromLang = "en";
      }
    }

    sURL  = "https://translate.yandex.net/api/v1.5/tr.json/translate";
    sSend = "key=" + sAPIkey + "&lang=" + sFromLang + "-" + sToLang + "&text=" + encodeURIComponent(sSource);
  }

  OpenRequest(oRequest, sMethod, sURL);

  if (! SendRequest(oRequest, sSend))
    return;

  if (oRequest.status != 200)
  {
    ErrorBox(oRequest.status + " : " + oRequest.statusText);
    return;
  }

  if (oSelect.API == 0) //Google
  {
    try
    {
      eval("oResponse=" + oRequest.responseText + ";");

      if (nFromLang < 0)
        sFromLang = oResponse[2];

      for (i = 0, sTarget = ""; i < oResponse[0].length; ++i)
        sTarget += oResponse[0][i][0];

      if (oResponse[1])
      {
        for (i = 0; i < oResponse[1].length; ++i)
        {
          sTarget += "\n\n" + oResponse[1][i][0] + ":";

          for (k = 0; k < oResponse[1][i][2].length; ++k)
          {
            sTarget += "\n" + (k + 1) + ". " + oResponse[1][i][2][k][0];

            if (oResponse[1][i][2][k][1])
            {
              for (n = 0, sTarget += " ("; n < oResponse[1][i][2][k][1].length; ++n)
                sTarget += oResponse[1][i][2][k][1][n] + ((n < oResponse[1][i][2][k][1].length - 1) ? ", " : ")");
            }
          }
        }

      }
    }
    catch (oError)
    {
      sTarget = oRequest.responseText;
    }
  }
  else if (oSelect.API == 1) //Bing
  {
    sTarget = oRequest.responseText.substring(oRequest.responseText.indexOf(">") + 1, oRequest.responseText.lastIndexOf("<"));
    sTarget = sTarget.replace(/
/g, "\r").replace(/&/g, "&").replace(/</g,  "<").replace(/>/g,  ">");
  }
  else //Yandex
  {
    try
    {
      eval("oResponse=" + oRequest.responseText + ";");

      for (i = 0, sTarget = ""; i < oResponse.text.length; ++i)
        sTarget += oResponse.text[i] + "\n";

      if (sTarget.slice(-1) == "\n")
        sTarget = sTarget.slice(0, -1);

      sTarget += aAPIs[oSelect.API].Foot;
    }
    catch (oError)
    {
      sTarget = oRequest.responseText;
    }
  }

  if (bAddToTarget && nTargetLen)
    sTarget = "\n\n" + sTarget;

  SendMessage(aWnd[IDTXTTARGET].HWND, 0x00B1 /*EM_SETSEL*/, bAddToTarget ? -1 : 0, -1);

  if (bAddToTarget && nTargetLen)
    nTargetSel = oSelect.Target1 + 2;

  SendMessage(aWnd[IDTXTTARGET].HWND, 0x00C2 /*EM_REPLACESEL*/, 1, sTarget);
  SendMessage(aWnd[IDTXTTARGET].HWND, 0x00B1 /*EM_SETSEL*/, nTargetSel, nTargetSel);

  if (nFromLang < 0)
  {
    for (i = 0; i < aLangs.length; ++i)
    {
      if (aLangs[i][0] == sFromLang)
      {
        nDetectLang = i;
        sLangName   = aLangs[i][1];
        break;
      }
    }
    if (! sLangName)
      sLangName = sFromLang + " - "  + sTxtUndefined;

    SetWindowText(aWnd[IDDETECTLANG].HWND, sTxtAutoDetect + ": " + sLangName);
  }
  else
    SetWindowText(aWnd[IDDETECTLANG].HWND, "");

  EnableListenWindows();
}

function OpenRequest(oRequest, sMethod, sURL)
{
  oRequest.open(sMethod, sURL, false);
  oRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}

function SendRequest(oRequest, sSend)
{
  try
  {
    oRequest.send(sSend);
  }
  catch (oError)
  {
    ErrorBox(sTxtNoInternet);
    return false;
  }
  return true;
}

function ErrorBox(sError)
{
  SetWindowText(aWnd[IDDETECTLANG].HWND, "");
  AkelPad.MessageBox(hWndDlg, sError, sTxtError, 48);
}

function Listen(hWnd, nSelection)
{
  var lpReturn = AkelPad.MemAlloc(64 * 2);
  var sMode;

  oSys.Call("Winmm::mciSendStringW", "status TTS mode", lpReturn, 64, 0);
  sMode = AkelPad.MemRead(lpReturn, DT_UNICODE);
  AkelPad.MemFree(lpReturn);

  if (sMode == "playing")
  {
    oSys.Call("Winmm::mciSendStringW", "close TTS", 0, 0, 0);
    KillTimer();
  }
  else
  {
    if (nSelection < 0)
      nSelection = SendMessage(hWnd, 3125 /*AEM_GETSEL*/, 0, 0);

    if (nSelection)
      sSpeechText = GetEditSelText(hWnd);
    else
    {
      sSpeechText = GetWindowText(hWnd);

      if ((hWnd == aWnd[IDTXTTARGET].HWND) && aAPIs[oSelect.API].Foot)
        sSpeechText = sSpeechText.replace(new RegExp(aAPIs[oSelect.API].Foot + "$"), "");
    }

    sSpeechText = sSpeechText.replace(/([\$\+\*=_#&~])\1{2,}/g, "$1$1").replace(/([\,;.:\?!'])\1+/g, "$1").replace(/\[\(\)\[\]\{\}\^\/\|\\<>%"`-]+/g, " ").replace(/\s+/g, " ").replace(/^ | $/g, "");

    if (hWnd == aWnd[IDTXTSOURCE].HWND)
    {
      nSpeechLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
      nListenID   = IDLISTEN1;

      if (nSpeechLang < 0)
      {
        nSpeechLang = nDetectLang;
        if (nSpeechLang < 0)
        {
          AkelPad.MessageBox(hWndDlg, sTxtChooseLang, sTxtListen, 48);
          return;
        }
      }
    }
    else
    {
      nSpeechLang = SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0);
      nListenID   = IDLISTEN2;
    }

    if (! aLangs[nSpeechLang][2])
    {
      AkelPad.MessageBox(hWndDlg, aLangs[nSpeechLang][1] + "\n\n" + sTxtNoSpeech, sTxtListen, 48);
      return;
    }

    GetTextToSpeech();
    nTimerCount = 0;
    oSys.Call("User32::SetTimer", hWndDlg, IDTIMER, 250, 0);
    PlayTextToSpeech();
  }
}

function GetTextToSpeech()
{
  var nPartLen = 100; //Google TTS limit text length
  var oRequest;

  uSpeechBody = null;

  if (sSpeechText.length > nPartLen)
  {
    sSpeechPart = sSpeechText.substr(0, nPartLen + 1);

    if ((/ \S*$/.test(sSpeechPart)) && (RegExp.index > 0))
      nPartLen = RegExp.index;

    sSpeechPart = sSpeechPart.substr(0, nPartLen);
    sSpeechText = sSpeechText.substr(nPartLen).replace(/^ /, "");
  }
  else
  {
    sSpeechPart = sSpeechText;
    sSpeechText = "";
  }

  if (sSpeechPart)
  {
    try
    {
      oRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (oError)
    {
      sSpeechPart = "";
      ErrorBox(sTxtNoSupport);
      return;
    }

    OpenRequest(oRequest, "GET", "https://translate.google.com/translate_tts?client=qlt&ie=utf-8&tl=" + aLangs[nSpeechLang][0] + "&q=" + encodeURIComponent(sSpeechPart));

    if (! SendRequest(oRequest, null))
    {
      sSpeechPart = "";
      return;
    }

    if (oRequest.status == 200)
      uSpeechBody = oRequest.responseBody; //array of unsigned bytes, typeof="unknown"
    else
    {
      sSpeechPart = "";
      ErrorBox(oRequest.status + " : " + oRequest.statusText);
    }
  }
}

function PlayTextToSpeech()
{
  if (sSpeechPart)
  {
    var sMp3File = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".mp3";
    var oStream  = new ActiveXObject("ADODB.Stream");
    var nError;

    oStream.Type = 1; // adTypeBinary
    oStream.Open();
    oStream.Write(uSpeechBody);
    oStream.SaveToFile(sMp3File, 2 /*adSaveCreateOverWrite*/);
    oStream.Close();

    nError = oSys.Call("Winmm::mciSendStringW", 'open "' + sMp3File + '" alias TTS', 0, 0, 0);

    if (! nError)
    {
      nError = oSys.Call("Winmm::mciSendStringW", "play TTS notify", 0, 0, hWndDlg);

      if (! nError)
        GetTextToSpeech();
    }

    if (nError)
    {
      KillTimer();
      oSys.Call("Winmm::mciGetErrorStringW", nError, lpBuffer, nBufSize);
      ErrorBox(nError + ": " + AkelPad.MemRead(lpBuffer, DT_UNICODE));
    }
  }
  else
    KillTimer();
}

function KillTimer()
{
  oSys.Call("User32::KillTimer", hWndDlg, IDTIMER);
  SetWindowText(aWnd[nListenID].HWND, sTxtListen);
}

function OpenInBrowser(bSelection)
{
  var nFromLang = SendMessage(aWnd[IDFROMLANGCB].HWND, CB_GETITEMDATA, oSelect.FromLang, 0);
  var sFromLang = (nFromLang < 0) ? "auto" : aLangs[nFromLang][0];
  var sToLang   = aLangs[SendMessage(aWnd[IDTOLANGCB].HWND, CB_GETITEMDATA, oSelect.ToLang, 0)][0];
  var sURL;

  if (bSelection)
    sSource = GetEditSelText(aWnd[IDTXTSOURCE].HWND);
  else
    sSource = GetWindowText(aWnd[IDTXTSOURCE].HWND);

  sSource = encodeURIComponent(sSource).replace(/%/g, "%%");

  if (oSelect.API == 0)
    sURL = "https://translate.google.com/#" + sFromLang + "/" + sToLang + "/" + sSource;
  else if (oSelect.API == 1)
    sURL = "http://www.bing.com/translator?from=" + sFromLang + "&to=" + sToLang + "&text=" + sSource;
  else
    sURL = "https://translate.yandex.com/?lang=" + sFromLang + "-" + sToLang + "&text=" + sSource;

  AkelPad.Exec('rundll32.exe shell32, ShellExec_RunDLL ' + sURL);
}

function ReadIni()
{
  var oFile;

  if (oFSO.FileExists(sIniFile))
  {
    oFile = oFSO.OpenTextFile(sIniFile, 1, false, -1);
    try
    {
      eval(oFile.ReadAll());
    }
    catch (oError)
    {}

    oFile.Close();
  }
}

function WriteIni()
{
  var oFile = oFSO.OpenTextFile(sIniFile, 2, true, -1);
  var sIniTxt;
  var i;

  oWndPos.Max = oSys.Call("User32::IsZoomed", hWndDlg);
  sSource     = GetWindowText(aWnd[IDTXTSOURCE].HWND).replace(/[\\"]/g, "\\$&").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
  sTarget     = GetWindowText(aWnd[IDTXTTARGET].HWND).replace(/[\\"]/g, "\\$&").replace(/\r/g, "\\r").replace(/\n/g, "\\n");

  sIniTxt =
   'nOpacity='    + nOpacity    + ';\r\n'  +
   'bSourceInCB=' + bSourceInCB + ';\r\n'  +
   'bSourceWnd='  + bSourceWnd  + ';\r\n'  +
   'bLoadText='   + bLoadText   + ';\r\n'  +
   'bImmediate='  + bImmediate  + ';\r\n'  +
   'bWordWrap='   + bWordWrap   + ';\r\n'  +
   'bFontAP='     + bFontAP     + ';\r\n'  +
   'bFontGUI='    + bFontGUI    + ';\r\n'  +
   'aFont=["'     + aFont[0] + '",' + aFont[1] + ',' + aFont[2] + '];\r\n' +
   'bSortCode='   + bSortCode   + ';\r\n'  +
   'nDetectLang=' + nDetectLang + ';\r\n'  +
   'sSource="'    + sSource     + '";\r\n' +
   'sTarget="'    + sTarget     + '";\r\n' +
   'sLanguage="'  + sLanguage   + '";\r\n';

  for (i = 0; i < aAPIs.length; ++i)
    sIniTxt += 'aAPIs[' + i + '].APIkeyP="' + aAPIs[i].APIkeyP.replace(/[\\"]/g, "\\$&") + '";\r\n';

  for (i in oSelect)
    sIniTxt += 'oSelect.' + i + '=' + oSelect[i] + ';\r\n';
  for (i in oWndPos)
    sIniTxt += 'oWndPos.' + i + '=' + oWndPos[i] + ';\r\n';

  oFile.Write(sIniTxt);
  oFile.Close();

  try
  {
    oFSO.DeleteFile(WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".mp3", 1);
  }
  catch (oError)
  {}
}

function ReadInterfaceLang()
{
  BuiltInLang();

  if (sLanguage)
  {
    var sLangFile = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + "_" + sLanguage + ".lng";
    var oFile;

    if (oFSO.FileExists(sLangFile))
    {
      oFile = oFSO.OpenTextFile(sLangFile, 1, false, -2);

      try
      {
        eval(oFile.ReadAll());
      }
      catch (oError)
      {}

      oFile.Close();
    }
  }
}

function BuiltInLang()
{
  sTxtCaption    = "Translator";
  sTxtUse        = "Use";
  sTxtFromLang   = "From language";
  sTxtToLang     = "To language";
  sTxtAutoDetect = "Auto detect language";
  sTxtListen     = "Listen";
  sTxtTranslate  = "&Translate";
  sTxtTranslateP = "Translate+";
  sTxtOptions    = "&Options";
  sTxtSource     = "Source text";
  sTxtTarget     = "Translated text";
  sTxtSettings   = "Settings";
  sTxtUndo       = "&Undo";
  sTxtRedo       = "&Redo";
  sTxtCut        = "&Cut";
  sTxtCopyCB     = "C&opy to clipboard";
  sTxtInsertAP   = "&Insert to AkelPad";
  sTxtPasteCB    = "&Paste from clipboard";
  sTxtPasteAP    = "Pa&ste from AkelPad";
  sTxtDelete     = "&Delete";
  sTxtSelectAll  = "Select &all";
  sTxtEntireText = "&Entire text";
  sTxtInterface  = "Interface language";
  sTxtSourceInCB = "Source text from Clipboard";
  sTxtSourceWnd  = "Show panel with source text";
  sTxtLoadText   = "Load source text to panel at start";
  sTxtImmediate  = "Start immediately translate";
  sTxtWordWrap   = "Wrap lines";
  sTxtFontAP     = "Font from AkelPad";
  sTxtFontGUI    = "GUI font";
  sTxtSortLang   = "Languages sort";
  sTxtSortCode   = "By code";
  sTxtSortName   = "By name";
  sTxtOwnKey     = "own key";
  sTxtRegister   = "Registration:";
  sTxtOK         = "OK";
  sTxtCancel     = "Cancel";
  sTxtError      = "Error";
  sTxtNoText     = "There is no text to translate.";
  sTxtNoSupport  = "Your system does not support XMLHttpRequest.";
  sTxtNoInternet = "There was a problem with internet connection.";
  sTxtWait       = "Wait...";
  sTxtUndefined  = "Undefined";
  sTxtChooseLang = "You need to choose the language.";
  sTxtNoSpeech   = "No support for speech in this language.";
  sTxtRegScripts = "You must register library: Scripts.dll";
  sTxtNoLibrary  = "Can not load library: ";

  aLangs[ 0] = ["af",     "Afrikaans",           1, 1, 0, 1]; //[code, name, TTS, Google, Bing, Yandex]
  aLangs[ 1] = ["ar",     "Arabic",              1, 1, 1, 1];
  aLangs[ 2] = ["az",     "Azerbaijani",         0, 1, 0, 1];
  aLangs[ 3] = ["be",     "Belarusian",          0, 1, 0, 1];
  aLangs[ 4] = ["bg",     "Bulgarian",           0, 1, 1, 1];
  aLangs[ 5] = ["bs",     "Bosnian",             1, 1, 1, 1];
  aLangs[ 6] = ["ca",     "Catalan",             1, 1, 1, 1];
  aLangs[ 7] = ["cs",     "Czech",               1, 1, 1, 1];
  aLangs[ 8] = ["cy",     "Welsh",               1, 1, 1, 1];
  aLangs[ 9] = ["da",     "Danish",              1, 1, 1, 1];
  aLangs[10] = ["de",     "German",              1, 1, 1, 1];
  aLangs[11] = ["el",     "Greek",               1, 1, 1, 1];
  aLangs[12] = ["en",     "English",             1, 1, 1, 1];
  aLangs[13] = ["eo",     "Esperanto",           1, 1, 0, 0];
  aLangs[14] = ["es",     "Spanish",             1, 1, 1, 1];
  aLangs[15] = ["et",     "Estonian",            0, 1, 1, 1];
  aLangs[16] = ["fa",     "Persian",             0, 1, 1, 1];
  aLangs[17] = ["fi",     "Finnish",             1, 1, 1, 1];
  aLangs[18] = ["fr",     "French",              1, 1, 1, 1];
  aLangs[19] = ["ga",     "Irish",               0, 1, 0, 1];
  aLangs[20] = ["gl",     "Galician",            0, 1, 0, 1];
  aLangs[21] = ["he",     "Hebrew",              0, 0, 1, 1]; //Google=="iw"
  aLangs[22] = ["hi",     "Hindi",               1, 1, 1, 1];
  aLangs[23] = ["hr",     "Croatian",            1, 1, 1, 1];
  aLangs[24] = ["ht",     "Haitian Creole",      0, 1, 1, 1];
  aLangs[25] = ["hu",     "Hungarian",           1, 1, 1, 1];
  aLangs[26] = ["hy",     "Armenian",            1, 1, 0, 1];
  aLangs[27] = ["id",     "Indonesian",          1, 1, 1, 1];
  aLangs[28] = ["is",     "Icelandic",           1, 1, 0, 1];
  aLangs[29] = ["it",     "Italian",             1, 1, 1, 1];
  aLangs[30] = ["iw",     "Hebrew",              0, 1, 0, 0]; //Bing,Yandex=="he"
  aLangs[31] = ["ja",     "Japanese",            1, 1, 1, 1];
  aLangs[32] = ["ka",     "Georgian",            0, 1, 0, 1];
  aLangs[33] = ["ko",     "Korean",              1, 1, 1, 1];
  aLangs[34] = ["la",     "Latin",               1, 1, 0, 1];
  aLangs[35] = ["lt",     "Lithuanian",          0, 1, 1, 1];
  aLangs[36] = ["lv",     "Latvian",             1, 1, 1, 1];
  aLangs[37] = ["mk",     "Macedonian",          1, 1, 0, 1];
  aLangs[38] = ["ms",     "Malay",               0, 1, 1, 1];
  aLangs[39] = ["mt",     "Maltese",             0, 1, 1, 1];
  aLangs[40] = ["nl",     "Dutch",               1, 1, 1, 1];
  aLangs[41] = ["no",     "Norwegian",           1, 1, 1, 1];
  aLangs[42] = ["pa",     "Punjabi",             0, 1, 0, 1];
  aLangs[43] = ["pl",     "Polish",              1, 1, 1, 1];
  aLangs[44] = ["pt",     "Portuguese",          1, 1, 1, 1];
  aLangs[45] = ["ro",     "Romanian",            1, 1, 1, 1];
  aLangs[46] = ["ru",     "Russian",             1, 1, 1, 1];
  aLangs[47] = ["sk",     "Slovak",              1, 1, 1, 1];
  aLangs[48] = ["sl",     "Slovenian",           0, 1, 1, 1];
  aLangs[49] = ["sq",     "Albanian",            1, 1, 0, 1];
  aLangs[50] = ["sr",     "Serbian",             1, 1, 0, 1];
  aLangs[51] = ["sv",     "Swedish",             1, 1, 1, 1];
  aLangs[52] = ["sw",     "Swahili",             1, 1, 0, 1];
  aLangs[53] = ["ta",     "Tamil",               1, 1, 0, 1];
  aLangs[54] = ["th",     "Thai",                1, 1, 1, 1];
  aLangs[55] = ["tl",     "Filipino",            0, 1, 0, 0];
  aLangs[56] = ["tr",     "Turkish",             1, 1, 1, 1];
  aLangs[57] = ["uk",     "Ukrainian",           0, 1, 1, 1];
  aLangs[58] = ["ur",     "Urdu",                0, 1, 1, 1];
  aLangs[59] = ["vi",     "Vietnamese",          1, 1, 1, 1];
  aLangs[60] = ["yi",     "Yiddish",             0, 1, 0, 0];
  aLangs[61] = ["zh",     "Chinese",             1, 0, 0, 1];
  aLangs[62] = ["zh-CHS", "Chinese Simplified",  0, 0, 1, 0];
  aLangs[63] = ["zh-CHT", "Chinese Traditional", 0, 0, 1, 0];
  aLangs[64] = ["zh-CN",  "Chinese Simplified",  1, 1, 0, 0];
  aLangs[65] = ["zh-TW",  "Chinese Traditional", 1, 1, 0, 0];
}

/*
Bing API v2 response:
language detect:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">en</string>
translation:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Text</string>
*/

Last edited by KDJ on Sat Jun 11, 2016 9:13 pm, edited 44 times in total.
Post Reply