AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Scripts collection
Goto page Previous  1, 2, 3 ... 8, 9, 10 ... 15, 16, 17  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
KDJ



Joined: 06 Mar 2010
Posts: 1066
Location: Poland

PostPosted: Sun Jan 16, 2011 7:03 pm    Post subject: Reply with quote

Sorts lines according to two keys: by line length and by string, alphabetically or numerically.
Removes duplicate lines.
Reverses the order of lines.

SortLines.js

Code:
// Sort lines - 2011-03-07
//
// Call("Scripts::Main", 1, "SortLines.js")
//
// Shortcut keys in dialog box:
// Enter - Sort
// Esc   - Close
// Shift+Alt+ Right, Left, Down, Up, End, Home, PgDn, PgUp - move dialog box.

var oSys = AkelPad.SystemFunction();

if (oSys.Call("kernel32::GetUserDefaultLangID") == 0x0415) //Polish
{
  var pTxtCaption   = "Sortowanie wierszy";
  var pTxtRange     = "Zakres";
  var pTxtFrom      = "Od";
  var pTxtTo        = "Do";
  var pTxtLines     = "Wiersze:";
  var pTxtColumns   = "&Kolumny:";
  var pTxtKeys      = "Klucze sortowania";
  var pTxtKey1      = "Klucz &1 - Długość wiersza";
  var pTxtKey2      = "Klucz &2 - Zawartość wiersza";
  var pTxtEntLine   = "Cały &wiersz";
  var pTxtDesc      = "&Malejąco";
  var pTxtIgCase    = "&Ignoruj wlk. liter";
  var pTxtString    = "&String";
  var pTxtLocale    = "&Alfabetycznie";
  var pTxtNum       = "&Numerycznie";
  var pTxtSortAnd   = "Sortuj, a następnie";
  var pTxtRemoDuKey = "&Usuń wiersze z duplikatami kluczy";
  var pTxtExtrDuKey = "&Zachowaj tylko wiersze z duplikatami kluczy";
  var pTxtExtrUnKey = "Zac&howaj tylko wiersze z unikalnymi kluczami";
  var pTxtNoSort    = "Nie sortuj, ale";
  var pTxtReverse   = "&Odwróć kolejność wierszy";
  var pTxtCopyToCB  = "Wynik kopiuj do schowka, nie zmieniaj &tekstu";
  var pTxtUsePlug   = "Użyj wtyczki &Format";
  var pTxtSort      = "Sortuj";
  var pTxtUndo      = "&Cofnij";
  var pTxtRedo      = "&Powtórz";
  var pTxtNoRangeL  = "Brak zakresu wierszy.";
  var pTxtNoKey2    = "Brak zakresu kolumn w drugim kluczu sortowania.";
}
else
{
  var pTxtCaption   = "Sort lines";
  var pTxtRange     = "Range";
  var pTxtFrom      = "From";
  var pTxtTo        = "To";
  var pTxtLines     = "Lines:";
  var pTxtColumns   = "&Columns:";
  var pTxtKeys      = "Keys";
  var pTxtKey1      = "Key &1 - Line length";
  var pTxtKey2      = "Key &2 - Line content";
  var pTxtEntLine   = "&Entire line";
  var pTxtDesc      = "&Descending";
  var pTxtIgCase    = "&Ignore case";
  var pTxtString    = "&String";
  var pTxtLocale    = "&Alphabetically";
  var pTxtNum       = "&Numerically";
  var pTxtSortAnd   = "Sort, and also";
  var pTxtRemoDuKey = "Re&move lines with duplicate keys";
  var pTxtExtrDuKey = "E&xtract lines with duplicate keys";
  var pTxtExtrUnKey = "Extra&ct lines with unique keys";
  var pTxtNoSort    = "No sort, but";
  var pTxtReverse   = "Reverse &order of lines";
  var pTxtCopyToCB  = "Resul&t copy to clipboard, do not replace text";
  var pTxtUsePlug   = "Use &Format plugin";
  var pTxtSort      = "Sort";
  var pTxtUndo      = "&Undo";
  var pTxtRedo      = "&Redo";
  var pTxtNoRangeL  = "There is no range of lines.";
  var pTxtNoKey2    = "There is no range of columns in second key.";
}

var DT_DWORD    = 3;
var BM_SETCHECK = 241;

var hMainWnd     = AkelPad.GetMainWnd();
var hEditWnd     = AkelPad.GetEditWnd();
var hGuiFont     = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var pScriptName  = WScript.ScriptName;
var hInstanceDLL = AkelPad.GetInstanceDll();

var bKey1      = 0;
var bDescLen   = 0;
var bKey2      = 1;
var bEntLine   = 0;
var bDesc      = 0;
var bIgCase    = 1;
var nMethod    = 1;
var nSortAnd   = 0;
var nNoSort    = 0;
var bCopyToCB  = 0;
var bUsePlug   = 0;
var nUndoLimit = 0;
var nRedoLimit = 0;
var nWordWrap;
var nLastCol;
var hWndDlg;
var lpBuffer;
var bGetSel;
var lpStrA;
var lpStrB;
var bIsReturn;
var hFocus;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var lpWnd       = [];
var IDRANGE     = 1000;
var IDFROM      = 1001;
var IDTO        = 1002;
var IDLINES     = 1003;
var IDBEGLINE   = 1004;
var IDENDLINE   = 1005;
var IDSORT1     = 1006;
var IDKEY1      = 1007;
var IDDESCLEN   = 1008;
var IDSORT2     = 1009;
var IDKEY2      = 1010;
var IDENTLINE   = 1011;
var IDFROM2     = 1012;
var IDTO2       = 1013;
var IDCOLUMNS   = 1014;
var IDBEGCOL    = 1015;
var IDENDCOL    = 1016;
var IDDESC      = 1017;
var IDIGCASE    = 1018;
var IDSORT3     = 1019;
var IDSTRING    = 1020;
var IDLOCALE    = 1021;
var IDNUM       = 1022;
var IDSORT4     = 1023;
var IDREMODUKEY = 1024;
var IDEXTRDUKEY = 1025;
var IDEXTRUNKEY = 1026;
var IDNOSORT    = 1027;
var IDREVERSE   = 1028;
var IDREMODULIN = 1029;
var IDEXTRDULIN = 1030;
var IDEXTRUNLIN = 1031;
var IDCOPYTOCB  = 1032;
var IDUSEPLUG   = 1033;
var IDSORT      = 1034;
var IDUNDO      = 1035;
var IDREDO      = 1036;

var WNDTYPE  = 0;
var WND      = 1;
var WNDEXSTY = 2;
var WNDSTY   = 3;
var WNDX     = 4;
var WNDY     = 5;
var WNDW     = 6;
var WNDH     = 7;
var WNDTXT   = 8;

//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
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50012080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL|ES_NUMBER
//Windows              WNDTYPE, WND,WNDEXSTY,     WNDSTY,WNDX,WNDY,WNDW,WNDH, WNDTXT
lpWnd[IDRANGE    ] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 185,  70, pTxtRange];
lpWnd[IDFROM     ] = ["STATIC",   0,       0, 0x50000000,  70,  30,  55,  13, pTxtFrom];
lpWnd[IDTO       ] = ["STATIC",   0,       0, 0x50000000, 130,  30,  55,  13, pTxtTo];
lpWnd[IDLINES    ] = ["STATIC",   0,       0, 0x50000000,  20,  45,  50,  13, pTxtLines];
lpWnd[IDBEGLINE  ] = ["STATIC",   0,   0x200, 0x50000000,  70,  45,  55,  20, ""];
lpWnd[IDENDLINE  ] = ["STATIC",   0,   0x200, 0x50000000, 130,  45,  55,  20, ""];
lpWnd[IDSORT1    ] = ["BUTTON",   0,       0, 0x50000007,  10,  90, 290,  52, pTxtKeys];
lpWnd[IDKEY1     ] = ["BUTTON",   0,       0, 0x50010003,  20, 115, 150,  16, pTxtKey1];
lpWnd[IDDESCLEN  ] = ["BUTTON",   0,       0, 0x50010003, 205, 115,  90,  16, pTxtDesc];
lpWnd[IDSORT2    ] = ["BUTTON",   0,       0, 0x50000007,  10, 135, 290, 130, ""];
lpWnd[IDKEY2     ] = ["BUTTON",   0,       0, 0x50010003,  20, 150, 150,  16, pTxtKey2];
lpWnd[IDENTLINE  ] = ["BUTTON",   0,       0, 0x50010003,  70, 180, 120,  16, pTxtEntLine];
lpWnd[IDFROM2    ] = ["STATIC",   0,       0, 0x50000000,  70, 205,  55,  13, pTxtFrom];
lpWnd[IDTO2      ] = ["STATIC",   0,       0, 0x50000000, 130, 205,  55,  13, pTxtTo];
lpWnd[IDCOLUMNS  ] = ["STATIC",   0,       0, 0x50000000,  20, 220,  50,  13, pTxtColumns];
lpWnd[IDBEGCOL   ] = ["EDIT",     0,   0x200, 0x50012080,  70, 220,  55,  20, ""];
lpWnd[IDENDCOL   ] = ["EDIT",     0,   0x200, 0x50012080, 130, 220,  55,  20, ""];
lpWnd[IDDESC     ] = ["BUTTON",   0,       0, 0x50010003, 205, 150,  90,  16, pTxtDesc];
lpWnd[IDIGCASE   ] = ["BUTTON",   0,       0, 0x50010003, 205, 170,  90,  16, pTxtIgCase];
lpWnd[IDSORT3    ] = ["BUTTON",   0,       0, 0x50000007, 195, 185, 105,  80, ""];
lpWnd[IDSTRING   ] = ["BUTTON",   0,       0, 0x50000009, 205, 200,  90,  16, pTxtString];
lpWnd[IDLOCALE   ] = ["BUTTON",   0,       0, 0x50000009, 205, 220,  90,  16, pTxtLocale];
lpWnd[IDNUM      ] = ["BUTTON",   0,       0, 0x50000009, 205, 240,  90,  16, pTxtNum];
lpWnd[IDSORT4    ] = ["BUTTON",   0,       0, 0x50000007,  10, 275, 290,  85, pTxtSortAnd];
lpWnd[IDREMODUKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 295, 230,  16, pTxtRemoDuKey];
lpWnd[IDEXTRDUKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 315, 230,  16, pTxtExtrDuKey];
lpWnd[IDEXTRUNKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 335, 230,  16, pTxtExtrUnKey];
lpWnd[IDNOSORT   ] = ["BUTTON",   0,       0, 0x50000007,  10, 370, 290, 105, pTxtNoSort];
lpWnd[IDREVERSE  ] = ["BUTTON",   0,       0, 0x50010003,  60, 390, 230,  16, pTxtReverse];
lpWnd[IDREMODULIN] = ["BUTTON",   0,       0, 0x50010003,  60, 410, 230,  16, pTxtRemoDuKey];
lpWnd[IDEXTRDULIN] = ["BUTTON",   0,       0, 0x50010003,  60, 430, 230,  16, pTxtExtrDuKey];
lpWnd[IDEXTRUNLIN] = ["BUTTON",   0,       0, 0x50010003,  60, 450, 230,  16, pTxtExtrUnKey];
lpWnd[IDCOPYTOCB ] = ["BUTTON",   0,       0, 0x50010003,  20, 485, 270,  16, pTxtCopyToCB];
lpWnd[IDUSEPLUG  ] = ["BUTTON",   0,       0, 0x50010003,  20, 505, 270,  16, pTxtUsePlug];
lpWnd[IDSORT     ] = ["BUTTON",   0,       0, 0x50010000, 220,  10,  80,  23, pTxtSort];
lpWnd[IDUNDO     ] = ["BUTTON",   0,       0, 0x50010000, 220,  35,  80,  23, pTxtUndo];
lpWnd[IDREDO     ] = ["BUTTON",   0,       0, 0x50010000, 220,  60,  80,  23, pTxtRedo];

if (hEditWnd)
{
  nWordWrap = AkelPad.SendMessage(hEditWnd, 3241 /*AEM_GETWORDWRAP*/, 0, 0);
  if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);

  if (AkelPad.WindowRegisterClass(pScriptName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      //Create dialog
      AkelPad.MemCopy(lpBuffer, pScriptName, _TSTR);
      hWndDlg = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,               //dwExStyle
                          lpBuffer,        //lpClassName
                          0,               //lpWindowName
                          0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                          0,               //x
                          0,               //y
                          315,             //nWidth
                          560,             //nHeight
                          hMainWnd,        //hWndParent
                          0,               //ID
                          hInstanceDLL,    //hInstance
                          DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
      if (hWndDlg)
      {
        //Disable main window, to make dialog modal
        oSys.Call("user32::EnableWindow", hMainWnd, false);

        //Message loop
        AkelPad.WindowGetMessage();
      }
      AkelPad.MemFree(lpBuffer);
    }
    AkelPad.WindowUnregisterClass(pScriptName);
  }

  if (nWordWrap > 0) AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
}

////////
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var i, nLowParam;

  if (uMsg == 1) //WM_CREATE
  {
    //Dialog caption
    AkelPad.MemCopy(lpBuffer, pTxtCaption, _TSTR);
    oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpBuffer);

    //Create windows
    for (i = 1000; i < lpWnd.length; ++i)
    {
      AkelPad.MemCopy(lpBuffer, lpWnd[i][WNDTYPE], _TSTR);
      lpWnd[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                                lpWnd[i][WNDEXSTY],//dwExStyle
                                lpBuffer,          //lpClassName
                                0,                 //lpWindowName
                                lpWnd[i][WNDSTY],  //dwStyle
                                lpWnd[i][WNDX],    //x
                                lpWnd[i][WNDY],    //y
                                lpWnd[i][WNDW],    //nWidth
                                lpWnd[i][WNDH],    //nHeight
                                hWnd,              //hWndParent
                                i,                 //ID
                                hInstanceDLL,      //hInstance
                                0);                //lpParam
      //Set font and text
      SetWindowFontAndText(lpWnd[i][WND], hGuiFont, lpWnd[i][WNDTXT]);
    }

    //Check
    GetSelection();
    SetSelection();
    CheckButtons();
    CheckUndoRedo();

    //Set window position
    if ((nWndPosX == undefined) || (nWndPosY == undefined))
      MoveWindow(hMainWnd, hWnd, "RT");
    else
      MoveWindow(hMainWnd, hWnd, [nWndPosX, nWndPosY]);
  }

  else if (uMsg == 7) //WM_SETFOCUS
    oSys.Call("user32::SetFocus", lpWnd[IDKEY1][WND]);

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDlg, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13) //VK_RETURN
    {
      if (! bIsReturn)
      {
        hFocus = oSys.Call("user32::GetFocus");
        if ((hFocus != lpWnd[IDSORT][WND]) && (hFocus != lpWnd[IDUNDO][WND]) && (hFocus != lpWnd[IDREDO][WND]))
          oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDSORT, 0);
      }
    }
  }

  else if (uMsg == 257) //WM_KEYUP
    bIsReturn = 0;

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

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

    if ((nLowParam == IDBEGCOL) || (nLowParam == IDENDCOL))
    {
      CheckEditValue(nLowParam);
      if (bGetSel)
        SetSelection();
    }

    else if (((nLowParam >= IDKEY1) && (nLowParam <= IDENTLINE)) ||
             ((nLowParam >= IDDESC) && (nLowParam <= IDUSEPLUG)))
    {
      CheckButtons(nLowParam);
    }

    else if (nLowParam == IDSORT)
    {
      if (SortLines())
      {
        CheckUndoRedo(nLowParam);
        GetSelection();
      }
    }

    else if (nLowParam == IDUNDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
      GetSelection();
    }

    else if (nLowParam == IDREDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
      GetSelection();
    }
  }

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

    //Enable main window
    oSys.Call("user32::EnableWindow", hMainWnd, true);
    //Destroy dialog
    oSys.Call("user32::DestroyWindow", hWnd);
  }

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

  else
    SetDefID(hWnd);

  return 0;
}

function SetWindowFontAndText(hWnd, hFont, pText)
{
  var lpWindowText;

  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);

  if (lpWindowText = AkelPad.MemAlloc(256 * _TSIZE))
  {
    AkelPad.MemCopy(lpWindowText, pText.substr(0, 255), _TSTR);
    oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpWindowText);

    AkelPad.MemFree(lpWindowText);
  }
}

function MoveWindow(hWndParent, hWnd, Action)
{
  var rcWndParent;
  var rcWnd;
  var nX;
  var nY;

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

  rcWndParent = GetWindowPos(hWndParent);
  rcWnd       = GetWindowPos(hWnd);

  nX = rcWnd.left;
  nY = rcWnd.top;

  if (Action == "R") //Move right
    nX = rcWnd.left + ((rcWnd.left < rcWndParent.right - 50) ? 20: 0);
  else if (Action == "L") //Move left
    nX = rcWnd.left - ((rcWnd.right > rcWndParent.left + 50) ? 20: 0);
  else if (Action == "D") //Move down
    nY = rcWnd.top + ((rcWnd.top < rcWndParent.bottom - 50) ? 20: 0);
  else if (Action == "U") //Move up
    nY = rcWnd.top - ((rcWnd.bottom > rcWndParent.top + 50) ? 20: 0);
  else if (Action == "E") //Move end (right)
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
  else if (Action == "H") //Move home (left)
    nX = rcWnd.left + (rcWndParent.left - rcWnd.left);
  else if (Action == "B") //Move bottom
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  else if (Action == "T") //Move top
    nY = rcWnd.top + (rcWndParent.top - rcWnd.top);
  else if (Action == "C") //Center window
  {
    nX = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
    nY = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
  }
  else if (Action == "LT") //Move left top
  {
    nX = rcWndParent.left;
    nY = rcWndParent.top;
  }
  else if (Action == "RT") //Move right top
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWndParent.top;
  }
  else if (Action == "LB") //Move left bottom
  {
    nX = rcWndParent.left;
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else if (Action == "RB") //Move right bottom
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else
  {
    nX = Action[0];
    nY = Action[1];
  }

  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 rcRect = [];

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

  rcRect.left   = AkelPad.MemRead(lpRect,     DT_DWORD);
  rcRect.top    = AkelPad.MemRead(lpRect + 4, DT_DWORD);
  rcRect.right  = AkelPad.MemRead(lpRect + 8, DT_DWORD);
  rcRect.bottom = AkelPad.MemRead(lpRect +12, DT_DWORD);
  AkelPad.MemFree(lpRect);

  return rcRect;
}

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

function SetDefID(hWnd)
{
  var nID    = 1000;
  var hFocus = oSys.Call("user32::GetFocus");

  while ((nID < lpWnd.length) && (hFocus != lpWnd[nID][WND]))
    ++nID;

  if ((nID != IDUNDO) && (nID != IDREDO))
    nID = IDSORT;

  oSys.Call("user32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}

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

  if (bWrite)
  {
    rcWnd = GetWindowPos(hWndDlg);

    pTxt = 'nWndPosX='  + rcWnd.left + ';\r\n' +
           'nWndPosY='  + rcWnd.top  + ';\r\n' +
           'bKey1='     + bKey1 + ';\r\n' +
           'bDescLen='  + bDescLen + ';\r\n' +
           'bKey2='     + bKey2 + ';\r\n' +
           'bEntLine='  + bEntLine + ';\r\n' +
           'bDesc='     + bDesc + ';\r\n' +
           'bIgCase='   + bIgCase + ';\r\n' +
           'nMethod='   + nMethod + ';\r\n' +
           'nSortAnd='  + nSortAnd + ';\r\n' +
           'nNoSort='   + nNoSort + ';\r\n' +
           'bCopyToCB=' + bCopyToCB + ';\r\n' +
           'bUsePlug='  + bUsePlug + ';'

    oFile = oFSO.OpenTextFile(pIniName, 2, true, 0);
    oFile.Write(pTxt);
    oFile.Close();
  }

  else if (oFSO.FileExists(pIniName))
  {
    try
    {
      eval(AkelPad.ReadFile(pIniName));
    }
    catch (nError)
    {
    }
  }
}

function CheckButtons(nButton)
{
  if ((nButton == IDKEY1) && ((! bKey1) || (bKey2)))
    bKey1 = ! bKey1;
  else if (nButton == IDDESCLEN)
    bDescLen = ! bDescLen;
  else if ((nButton == IDKEY2) && ((! bKey2) || (bKey1)))
    bKey2 = ! bKey2;
  else if (nButton == IDENTLINE)
    bEntLine = ! bEntLine;
  else if (nButton == IDDESC)
    bDesc = ! bDesc;
  else if (nButton == IDIGCASE)
    bIgCase = ! bIgCase;
  else if ((nButton == IDSTRING) || (nButton == IDLOCALE) || (nButton == IDNUM))
    nMethod = nButton - IDSTRING + 1;
  else if ((nButton == IDREMODUKEY) || (nButton == IDEXTRDUKEY) || (nButton == IDEXTRUNKEY))
  {
    if (nSortAnd == nButton - IDREMODUKEY + 1)
      nSortAnd = 0;
    else
      nSortAnd = nButton - IDREMODUKEY + 1;
  }
  else if ((nButton == IDREVERSE)   || (nButton == IDREMODULIN) ||
           (nButton == IDEXTRDULIN) || (nButton == IDEXTRUNLIN))
  {
    if (nNoSort == nButton - IDREVERSE + 1)
      nNoSort = 0;
    else
      nNoSort = nButton - IDREVERSE + 1;
  }
  else if (nButton == IDCOPYTOCB)
    bCopyToCB = ! bCopyToCB;
  else if (nButton == IDUSEPLUG)
    bUsePlug = ! bUsePlug;

  if ((bUsePlug) && ((nNoSort > 1) || (nMethod == 2)))
    nMethod = 1;

  AkelPad.SendMessage(lpWnd[IDKEY1][WND],      BM_SETCHECK, bKey1,           0);
  AkelPad.SendMessage(lpWnd[IDDESCLEN][WND],   BM_SETCHECK, bDescLen,        0);
  AkelPad.SendMessage(lpWnd[IDKEY2][WND],      BM_SETCHECK, bKey2,           0);
  AkelPad.SendMessage(lpWnd[IDENTLINE][WND],   BM_SETCHECK, bEntLine,        0);
  AkelPad.SendMessage(lpWnd[IDDESC][WND],      BM_SETCHECK, bDesc,           0);
  AkelPad.SendMessage(lpWnd[IDIGCASE][WND],    BM_SETCHECK, bIgCase,         0);
  AkelPad.SendMessage(lpWnd[IDSTRING][WND],    BM_SETCHECK, (nMethod == 1),  0);
  AkelPad.SendMessage(lpWnd[IDLOCALE][WND],    BM_SETCHECK, (nMethod == 2),  0);
  AkelPad.SendMessage(lpWnd[IDNUM][WND],       BM_SETCHECK, (nMethod == 3),  0);
  AkelPad.SendMessage(lpWnd[IDREMODUKEY][WND], BM_SETCHECK, (nSortAnd == 1), 0);
  AkelPad.SendMessage(lpWnd[IDEXTRDUKEY][WND], BM_SETCHECK, (nSortAnd == 2), 0);
  AkelPad.SendMessage(lpWnd[IDEXTRUNKEY][WND], BM_SETCHECK, (nSortAnd == 3), 0);
  AkelPad.SendMessage(lpWnd[IDREVERSE][WND],   BM_SETCHECK, (nNoSort == 1),  0);
  AkelPad.SendMessage(lpWnd[IDREMODULIN][WND], BM_SETCHECK, (nNoSort == 2),  0);
  AkelPad.SendMessage(lpWnd[IDEXTRDULIN][WND], BM_SETCHECK, (nNoSort == 3),  0);
  AkelPad.SendMessage(lpWnd[IDEXTRUNLIN][WND], BM_SETCHECK, (nNoSort == 4),  0);
  AkelPad.SendMessage(lpWnd[IDCOPYTOCB][WND],  BM_SETCHECK, bCopyToCB,       0);
  AkelPad.SendMessage(lpWnd[IDUSEPLUG][WND],   BM_SETCHECK, bUsePlug,        0);

  oSys.Call("user32::EnableWindow", lpWnd[IDKEY1][WND],      (nNoSort != 1) && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDDESCLEN][WND],   (nNoSort == 0) && bKey1 && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDKEY2][WND],      (nNoSort != 1));
  oSys.Call("user32::EnableWindow", lpWnd[IDENTLINE][WND],   (nNoSort != 1) && bKey2);
  oSys.Call("user32::EnableWindow", lpWnd[IDFROM2][WND],     (nNoSort != 1) && bKey2 && (! bEntLine));
  oSys.Call("user32::EnableWindow", lpWnd[IDTO2][WND],       (nNoSort != 1) && bKey2 && (! bEntLine));
  oSys.Call("user32::EnableWindow", lpWnd[IDCOLUMNS][WND],   (nNoSort != 1) && bKey2 && (! bEntLine));
  oSys.Call("user32::EnableWindow", lpWnd[IDBEGCOL][WND],    (nNoSort != 1) && bKey2 && (! bEntLine));
  oSys.Call("user32::EnableWindow", lpWnd[IDENDCOL][WND],    (nNoSort != 1) && bKey2 && (! bEntLine));
  oSys.Call("user32::EnableWindow", lpWnd[IDDESC][WND],      (nNoSort == 0) && bKey2);
  oSys.Call("user32::EnableWindow", lpWnd[IDIGCASE][WND],    (nNoSort != 1) && bKey2 && ((nMethod != 3) || bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDSTRING][WND],    (nNoSort != 1) && bKey2);
  oSys.Call("user32::EnableWindow", lpWnd[IDLOCALE][WND],    (nNoSort != 1) && bKey2 && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDNUM][WND],       (nNoSort != 1) && bKey2 && (! (bUsePlug && (nNoSort > 1))));
  oSys.Call("user32::EnableWindow", lpWnd[IDREMODUKEY][WND], (nNoSort == 0) && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDEXTRDUKEY][WND], (nNoSort == 0) && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDEXTRUNKEY][WND], (nNoSort == 0) && (! bUsePlug));
  oSys.Call("user32::EnableWindow", lpWnd[IDCOPYTOCB][WND],  (! bUsePlug));
}

function CheckUndoRedo(nButton)
{
  var nBegSel  = AkelPad.GetSelStart();
  var pTxtUndo = lpWnd[IDUNDO][WNDTXT];
  var pTxtRedo = lpWnd[IDREDO][WNDTXT];

  if (nButton == IDSORT)
  {
    if (nUndoLimit < AkelPad.SendMessage(hEditWnd, 3084 /*AEM_GETUNDOLIMIT*/, 0, 0))
      ++nUndoLimit;
    nRedoLimit = 0;
  }
  else if ((nButton == IDUNDO) && (nUndoLimit))
  {
    --nUndoLimit;
    ++nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
  }
  else if ((nButton == IDREDO) && (nRedoLimit))
  {
    ++nUndoLimit;
    --nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3078 /*AEM_REDO*/, 0, 0);
    AkelPad.SetSel(nBegSel, AkelPad.GetSelEnd());
  }

  if (nUndoLimit)
    pTxtUndo += " (" + nUndoLimit + ")";
  if (nRedoLimit)
    pTxtRedo += " (" + nRedoLimit + ")";

  if (((oSys.Call("user32::GetFocus") == lpWnd[IDUNDO][WND]) && (nUndoLimit == 0)) ||
      ((oSys.Call("user32::GetFocus") == lpWnd[IDREDO][WND]) && (nRedoLimit == 0)))
    oSys.Call("user32::SetFocus", lpWnd[IDKEY1][WND]);

  SetWindowFontAndText(lpWnd[IDUNDO][WND], hGuiFont, pTxtUndo);
  SetWindowFontAndText(lpWnd[IDREDO][WND], hGuiFont, pTxtRedo);

  oSys.Call("user32::EnableWindow", lpWnd[IDUNDO][WND], nUndoLimit);
  oSys.Call("user32::EnableWindow", lpWnd[IDREDO][WND], nRedoLimit);
}

function CheckEditValue(nID)
{
  var pEditValue;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[nID][WND], lpBuffer, 256);
  pEditValue = AkelPad.MemRead(lpBuffer, _TSTR);

  if (pEditValue == 0)
  {
    SetWindowFontAndText(lpWnd[nID][WND], hGuiFont, "1");
    AkelPad.SendMessage(lpWnd[nID][WND], 177 /*EM_SETSEL*/, 0, -1);
  }
  else if (pEditValue > nLastCol)
  {
    SetWindowFontAndText(lpWnd[nID][WND], hGuiFont, String(nLastCol));
    AkelPad.SendMessage(lpWnd[nID][WND], 177 /*EM_SETSEL*/, 0, -1);
  }
}

function GetSelection()
{
  var lpBegSel = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var lpEndSel = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/);
  var nLine1, nLine2, nCol1, nCol2;

  AkelPad.SendMessage(hEditWnd, 3123 /*AEM_EXGETSEL*/, lpBegSel, lpEndSel);

  nLine1 = AkelPad.MemRead(lpBegSel, DT_DWORD) + 1;
  nLine2 = AkelPad.MemRead(lpEndSel, DT_DWORD) + 1;

  if ((nLine1 == nLine2) && (! bGetSel))
  {
    nLine1 = 1;
    nLine2 = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);
  }

  nLastCol = LineMaxLength(nLine1, nLine2) + 1;
  SetWindowFontAndText(lpWnd[IDBEGLINE][WND], hGuiFont, String(nLine1));
  SetWindowFontAndText(lpWnd[IDENDLINE][WND], hGuiFont, String(nLine2));

  if (! bGetSel)
  {
    if (AkelPad.MemRead(lpBegSel + 8, DT_DWORD) < AkelPad.MemRead(lpEndSel + 8, DT_DWORD))
    {
      nCol1 = AkelPad.MemRead(lpBegSel + 8, DT_DWORD) + 1;
      nCol2 = AkelPad.MemRead(lpEndSel + 8, DT_DWORD) + 1;
    }
    else
    {
      nCol1 = AkelPad.MemRead(lpEndSel + 8, DT_DWORD) + 1;
      nCol2 = AkelPad.MemRead(lpBegSel + 8, DT_DWORD) + 1;
    }
 
    if (nCol1 > nLastCol)
      nCol1 = nLastCol;
    if (nCol2 > nLastCol)
      nCol2 = nLastCol;

    SetWindowFontAndText(lpWnd[IDBEGCOL][WND],  hGuiFont, String(nCol1));
    SetWindowFontAndText(lpWnd[IDENDCOL][WND],  hGuiFont, String(nCol2));
    bEntLine = ! AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
  }

  AkelPad.MemFree(lpBegSel);
  AkelPad.MemFree(lpEndSel);
  bGetSel = 1;
}

function LineMaxLength(nLine1, nLine2)
{
  var nMaxLenL = 0;
  var nBegLine;
  var nLenLine;
  var i;

  for (i = nLine1 - 1; i < nLine2; ++i)
  {
    nBegLine = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, i, 0);
    nLenLine = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine, 0);
    if (nLenLine > nMaxLenL)
      nMaxLenL = nLenLine;
  }

  return nMaxLenL;
}

function SetSelection()
{
  var hWndFocus = oSys.Call("user32::GetFocus");
  var lpSelect  = AkelPad.MemAlloc(28 /*sizeof(AESELECTION)*/);
  var lpBegSel  = lpSelect;
  var lpEndSel  = lpSelect + 12;
  var lpSelFlag = lpSelect + 24;
  var nColSel   = 1;
  var nLine1, nLine2, nCol1, nCol2;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDBEGLINE][WND], lpBuffer, 256);
  nLine1 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDENDLINE][WND], lpBuffer, 256);
  nLine2 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;

  if ((hWndFocus == lpWnd[IDBEGCOL][WND]) || (hWndFocus == lpWnd[IDENDCOL][WND]))
  {
    oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDBEGCOL][WND], lpBuffer, 256);
    nCol1 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
    oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDENDCOL][WND], lpBuffer, 256);
    nCol2 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
  }
  else
  {
    nCol1   = 0;
    nCol2   = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine2, 0), 0);
    nColSel = 0;
  }

  AkelPad.MemCopy(lpBegSel,     nLine1,  DT_DWORD);
  AkelPad.MemCopy(lpBegSel + 8, nCol1,   DT_DWORD);
  AkelPad.MemCopy(lpEndSel,     nLine2,  DT_DWORD);
  AkelPad.MemCopy(lpEndSel + 8, nCol2,   DT_DWORD);
  AkelPad.MemCopy(lpSelFlag,    nColSel, DT_DWORD);

  AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpBegSel);
  AkelPad.SendMessage(hEditWnd, 3132 /*AEM_INDEXUPDATE*/, 0, lpEndSel);

  AkelPad.SendMessage(hEditWnd, 3126 /*AEM_SETSEL*/, 0, lpSelect);

  AkelPad.MemFree(lpSelect);
}

function SortLines()
{
  var aTxt  = [];
  var pText = "";
  var nLine1;
  var nLine2;
  var nCol1;
  var nCol2;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDBEGLINE][WND], lpBuffer, 256);
  nLine1 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDENDLINE][WND], lpBuffer, 256);
  nLine2 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDBEGCOL][WND], lpBuffer, 256);
  nCol1 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDENDCOL][WND], lpBuffer, 256);
  nCol2 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;

  if (nLine1 == nLine2)
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoRangeL, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    return 0;
  }

  if ((nCol1 == nCol2) && bKey2 && (! bEntLine) && (nNoSort != 1))
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoKey2, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("user32::SetFocus", lpWnd[IDENDCOL][WND]);
    AkelPad.SendMessage(lpWnd[IDENDCOL][WND], 177 /*EM_SETSEL*/, 0, -1);
    return 0;
  }

  if (bUsePlug)
  {
    if (! bEntLine)
    {
      oSys.Call("user32::SetFocus", lpWnd[IDENDCOL][WND]);
      SetSelection();
    }
    SortByPlugin();
    oSys.Call("user32::SetFocus", lpWnd[IDSORT][WND]);
    return 1;
  }

  else
  {
    if (nNoSort == 1)
    {
      aTxt  = AkelPad.GetSelText(1 /*\r*/).split("\r");
      pText = aTxt.reverse().join("\r");
    }

    else
    {
      aTxt.length = 2;
      aTxt[0] = AkelPad.GetSelText(1 /*\r*/).split("\r");
      if (bEntLine)
        aTxt[1] = AkelPad.GetSelText(1 /*\r*/).split("\r");
      else
      {
        aTxt[1] = GetTextRangeColumn([nLine1, nCol1], [nLine2, nCol2]);
      }

      aTxt = ArrayTransp(aTxt);

      ArraySort(aTxt);

      for (i = 0; i < aTxt.length; ++i)
      {
        pText += aTxt[i][0] + "\r";
      }
      pText = pText.slice(0, -1);
    }

    if (bCopyToCB)
    {
      AkelPad.SetClipboardText(pText);
      return 0;
    }
    else
    {
      AkelPad.ReplaceSel(pText, 1);
      return 1;
    }
  }
}

////////
function GetTextRangeColumn(aBeg, aEnd, bReturnText, nNewLine, bFillSpaces)
{
  var nBegLine1;
  var nBegLine2;
  var nLenLine2;
  var nLine1;
  var nLine2;
  var nCol1;
  var nCol2;
  var aLines;
  var nWidth;
  var i;

  if (aBeg[0] < aEnd[0])
  {
    nLine1 = aBeg[0];
    nLine2 = aEnd[0];
  }
  else
  {
    nLine1 = aEnd[0];
    nLine2 = aBeg[0];
  }

  if (aBeg[1] < aEnd[1])
  {
    nCol1 = aBeg[1];
    nCol2 = aEnd[1];
  }
  else
  {
    nCol1 = aEnd[1];
    nCol2 = aBeg[1];
  }

   nBegLine1 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine1, 0);
   nBegLine2 = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, nLine2, 0);
   nLenLine2 = AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine2, 0);
  aLines    = AkelPad.GetTextRange(nBegLine1, nBegLine2 + nLenLine2, 1 /*"\r"*/).split("\r");
  nWidth    = nCol2 - nCol1;

  for (i = 0; i < aLines.length; ++i)
  {
    aLines[i] = aLines[i].substring(nCol1, nCol2);
    if (bFillSpaces)
      while (aLines[i].length < nWidth)
        aLines[i] += " ";
  }

  if (bReturnText)
  {
    if ((! nNewLine) || (nNewLine == 1))
      pNewLine = "\r";
    else if (nNewLine == 2)
      pNewLine = "\n";
    else
      pNewLine = "\r\n";

    return aLines.join(pNewLine);
  }
  else
    return aLines;
}

////////
function ArrayTransp(aArr)
{
  var nLen1 = aArr.length;
  var nLen2 = aArr[0].length;
  var aArr2 = [];
  var i, n;

  aArr2.length = nLen2;

  for (n = 0; n < nLen2; ++n)
  {
    aArr2[n] = [];
    for (i = 0; i < nLen1; ++i)
    {
      aArr2[n].push(aArr[i][n]);
    }
  }
  return aArr2;
}

////////
function ArraySort(aTxt)
{
  lpStrA = AkelPad.MemAlloc(nLastCol * _TSIZE);
  lpStrB = AkelPad.MemAlloc(nLastCol * _TSIZE);

  if (nNoSort == 0)
  {
    aTxt.sort(CompareValue);
    RemoveFromArray(aTxt);
  }
  else
    NoSort(aTxt);

  AkelPad.MemFree(lpStrA);
  AkelPad.MemFree(lpStrB);
}

////////
function CompareValue(ValA, ValB)
{
  var nResult = 0;

  if (bKey1)
    if (ValA[0].length > ValB[0].length)
      nResult = bDescLen ? -1 : 1;
    else if (ValA[0].length < ValB[0].length)
      nResult = bDescLen ? 1 : -1;

  if ((bKey2) && (nResult == 0))
  {
    if (nMethod == 1)
    {
      if (bIgCase)
      {
        ValA[1] = ValA[1].toUpperCase();
        ValB[1] = ValB[1].toUpperCase();
      }
      if (ValA[1] > ValB[1])
        nResult = bDesc ? -1 : 1;
      else if (ValA[1] < ValB[1])
        nResult = bDesc ? 1 : -1;
    }
    else if (nMethod == 2)
    {
      AkelPad.MemCopy(lpStrA, ValA[1], _TSTR);
      AkelPad.MemCopy(lpStrB, ValB[1], _TSTR);
      nResult = oSys.Call("kernel32::lstrcmp" + (bIgCase ? "i" : "") + _TCHAR, lpStrA, lpStrB);
      if (bDesc)
        nResult = -nResult;
    }
    else
    {
      var oRegExp = /(-?\d+\.?\d*)|(-?\.\d+)/;
 
      ValA[1] = oRegExp.exec(ValA[1]);
      ValB[1] = oRegExp.exec(ValB[1]);
      ValA[1] = ValA[1] ? parseFloat(ValA[1][0]) : 0;
      ValB[1] = ValB[1] ? parseFloat(ValB[1][0]) : 0;
      nResult = bDesc ? (ValB[1] - ValA[1]) : (ValA[1] - ValB[1]);
    }
  }

  return nResult;
}

////////
function RemoveFromArray(aTxt)
{
  var i;

  if (nSortAnd == 1)
  {
    for (i = aTxt.length - 1; i > 0; --i)
    {
      if (CompareValue(aTxt[i], aTxt[i - 1]) == 0)
        aTxt.splice(i, 1);
    }
  }

  else if (nSortAnd == 2)
  {
    for (i = aTxt.length - 2; i > 0; --i)
    {
      if ((CompareValue(aTxt[i], aTxt[i + 1]) != 0) && (CompareValue(aTxt[i], aTxt[i - 1]) != 0))
        aTxt.splice(i, 1);
    }
    if ((aTxt.length > 1) && (CompareValue(aTxt[aTxt.length - 1], aTxt[aTxt.length - 2]) != 0))
      aTxt.splice(aTxt.length - 1, 1);
    if ((aTxt.length > 1) && (CompareValue(aTxt[0], aTxt[1]) != 0))
      aTxt.splice(0, 1);
    if (aTxt.length == 1)
      aTxt.splice(0, 1);
  }

  else if (nSortAnd == 3)
  {
    i = aTxt.length - 1;
    while (i > 0)
    {
      if (CompareValue(aTxt[i], aTxt[i - 1]) == 0)
      {
        aTxt.splice(i - 1, 2);
        i -= 2;
      }
      else
        --i;
    }
  }
}

////////
function NoSort(aTxt)
{
  var i, n, bIsDup;

  if (nNoSort == 2)
  {
    for (n = 0; n < aTxt.length; ++n)
    {
      i = n + 1;
      while (i < aTxt.length)
      {
        if (CompareValue(aTxt[i], aTxt[n]) == 0)
          aTxt.splice(i, 1);
        else
          ++i;
      }
    }
  }

  else if (nNoSort == 3)
  {
    n = 0;
    while (n < aTxt.length)
    {
      bIsDup = false;
      for (i = 0; i < aTxt.length; ++i)
      {
        if ((CompareValue(aTxt[i], aTxt[n]) == 0) && (i != n))
        {
          bIsDup = true;
          break;
        }
      }
      if (bIsDup)
        ++n;
      else
        aTxt.splice(n, 1);
    }
  }

  else if (nNoSort == 4)
  {
    n = 0;
    while (n < aTxt.length)
    {
      bIsDup = false;
      i = n + 1;
      while (i < aTxt.length)
      {
        if (CompareValue(aTxt[i], aTxt[n]) == 0)
        {
          bIsDup = true;
          aTxt.splice(i, 1);
        }
        else
          ++i;
      }
      if (bIsDup)
        aTxt.splice(n, 1);
      else
        ++n;
    }
  }
}

function SortByPlugin()
{
  var pAscDesc = bDesc ? "Desc" : "Asc";

  if (nNoSort == 1)
    AkelPad.Call("Format::LineReverse");
  else if (nNoSort == 2)
    AkelPad.Call("Format::LineRemoveDuplicates", ! bIgCase);
  else if (nNoSort == 3)
    AkelPad.Call("Format::LineGetDuplicates", ! bIgCase);
  else if (nNoSort == 4)
    AkelPad.Call("Format::LineGetUnique", ! bIgCase);
  else if (nMethod == 1)
    AkelPad.Call("Format::LineSortStr" + pAscDesc, ! bIgCase);
  else if (nMethod == 3)
    AkelPad.Call("Format::LineSortInt" + pAscDesc, ! bIgCase);
}



Last edited by KDJ on Mon Mar 07, 2011 9:14 pm; edited 9 times in total
Back to top
View user's profile Send private message
Andrey_A_A



Joined: 03 Jun 2010
Posts: 477
Location: Сочи, Хоста

PostPosted: Mon Jan 17, 2011 10:39 pm    Post subject: Reply with quote

SwitchSplittedWindow.vbs

Code:
' SwitchSplittedWindow.vbs
'========================   Описание   =====================================
' Переключение между позициями окна в заданной очерёдностью
'========================  Параметры =====================================
'В параметрах вызова скрипта должен быть прописан один параметр:
' 1 - Переключение горизонтальное --> вертикальное --> четыре части
' 2 - Переключение вертикальное --> горизонтальное --> четыре части
' 3 - Переключение горизонтальное --> четыре части -> вертикальное
' 4 - Переключение вертикальное --> четыре части --> горизонтальное
' 5 - Переключение четыре части --> вертикальное --> горизонтальное
' 6 - Переключение четыре части -- > горизонтальное --> вертикальное
'
' Call("Scripts::Main", 1, "SwitchSplittedWindow.vbs", `"2"`)
'
' Автор:           Аверин Андрей & VladSh
' Версия:          1.4 (2011.01.06 - 18.11.2011)
' Mail:            Averin-And@yandex.ru
' Site:            http://tc-image.3dn.ru/forum/9-412-1196-16-1333816090
' Site:            http://akelpad.sourceforge.net/forum/viewtopic.php?p=11012#11012
'========================================================================
Set WSH = CreateObject("WScript.Shell")

If WScript.Arguments.Count < 1 Then
   Param = 1 'если порядок не задан в аргументах, то по умолчанию работает 1-й вариант: гор -> верт -> 4 части
Else
   Param = CInt(WScript.Arguments(0))
End If

Select Case Param
   Case 1 Call Switch(4214, 4213, 4212)
   Case 2 Call Switch(4213, 4214, 4212)
   Case 3 Call Switch(4214, 4212, 4213)
   Case 4 Call Switch(4213, 4212, 4214)
   Case 5 Call Switch(4212, 4213, 4214)
   Case 6 Call Switch(4212, 4214, 4213)
End Select

Sub Switch(n, m, k)
   Tree = "HKCU\Software\Akelsoft\AkelPad\Plugs\Scripts\SwitchSplittedWindow\"
   Name = GetHandleCurrent()
   If Name = 0 Then
      Call SplitWindow(n) : Call RegWrite(Tree, n)
   Else
      On Error Resume Next
      l = CInt(WSH.RegRead(Tree & Name))
      Select Case l
        Case 0 l = n
        Case n l = m
        Case m l = k
        Case k Call SplitWindow(k) : Call WSH.RegDelete(Tree & Name) : Call WsEnd
      End Select
      Call SplitWindow(l) : Call RegWrite(Tree, l) : Call WsEnd
   End If
End Sub

Function GetHandleCurrent() : GetHandleCurrent = AkelPad.SendMessage(AkelPad.GetEditWnd(), 3447, 0, 0) : End Function
Sub SplitWindow(n) : Call AkelPad.SendMessage(AkelPad.GetMainWnd(), 273, n, 0) : End Sub
Sub RegWrite(Tree, n) : Call WSH.RegWrite(Tree & GetHandleCurrent(), Cstr(n)) : End Sub
Sub WsEnd : Set WSH = Nothing : WScript.Quit : End Sub



А это иконка для скрипта:
SwitchSplittedWindow.b64

Code:
MIME-Version: 1.0
Content-Type: application/octet-stream; name="SwitchWindow.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="SwitchWindow.zip"

UEsDBBQAAgAIAI2ZJj5r+EqoaQIAADYVAAAWAAAAQWtlbFBhZFRvb2xCYXJfNjMyLmljb+1YQU8T
QRR+VbCIhlQFtbWtDcEGEz0Y/wBXEyWevFStJzUxRgViJBpZCm1tJZj4D4BENCZeQI3BHrxw8KBW
arQV2Y3B7smLF4+fb3dbusXdSrfFEt3XfJk37823XyY7+zozRA7aRIEAcRughy6iIBG5XFr/YhPR
G/a7OcZDqIe0uGKCi2yzbUPZ5AlCI6DXt2qTvda4RvpE1UGvT1X8zPSrsdX6a+bZ+rb+f6xf6fu3
qm8J/9D8FRNIWDMa+f5tfVu/HvpW9x9m+otiGp8zKWQzL5GriFTJ/5BS9Y3GKc/JLsyVIacgM4cl
8e1v+tMnCVPFvZmuRpX1e3X9P+3vjhMmjmko+lPcPmI8Mah/L8KEp6ESZk8XWgVnClBiBcyGSijj
nCXM8NgZ9udvdOFVnwfPOPb61kE8P0cYDIcROx+CONy+oj9/yYFcxI/8+CHIST/ku53Ijx2AnPBB
HgsyujgW4FhQzcnJ/cgneDzn8wkv8nEPw43lWAfk+B4sRxkjHfj5+JT6vuVkQP3X+3bviLpu70Qm
8ON+54r+xwHCp+F9kMYPQ4r7IUXZj3ogRnZDGnVD5GeJwk7296pxacQNKeZjeLnv02KjPF7YxZx2
iEM7sHS7DYuDzfhyc1vB34KvQhvkSAu+R1uQue6EffLZGGZc32jzekKvpdxTuAp3FcV7ip6m+s8z
fbUZtcLMHlw+WrHu6vlG57gi3+y8Zqa/mm+2320U32j+ZvxK+Bv6ZvvIWua/3vxq11+teNe/He/7
tiJ9jWv4QCsW+lvZd3LOqeWvODjvRHbIq64cZX7TF7pRnzplkejQuL8AUEsBAhQAFAACAAgAjZkm
Pmv4SqhpAgAANhUAABYAAAAAAAAAAAAgAAAAAAAAAEFrZWxQYWRUb29sQmFyXzYzMi5pY29QSwUG
AAAAAAEAAQBEAAAAnQIAAAAA



Last edited by Andrey_A_A on Thu Sep 13, 2012 2:49 am; edited 5 times in total
Back to top
View user's profile Send private message Send e-mail Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2507
Location: Киев, Русь

PostPosted: Fri Jan 21, 2011 11:46 am    Post subject: Reply with quote

RegJump.js
Code:
///Opens the selected branch in the registry editor
///Открывает выделенную ветвь в редакторе реестра
// если выделения искомой ветви не произошло, значит её не существует
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11092#11092
// Version: 1.4 (2011.01.21) - 1.9 (2012.04.03) by VladSh
// Version: 1.3 by mozers™ (SciTE)
//
// Понимает записи вида:
//      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
//      [HKLM\SYSTEM\CurrentControlSet\Control]   /символы [] обрезаются/
//      HKLM\\SYSTEM\\CurrentControlSet\\Control
//   Предлагаемая комбинация клавиш:   Ctrl+Alt+J

var key = AkelPad.GetSelText();
if (!key)
{      //Если текст не выделен, то будем пытаться получить "ссылку" из текущей строки
   var hWndEdit = AkelPad.GetEditWnd();
   var nPosCurrent = AkelPad.GetSelStart();      //позиция курсора в файле
   
   var oLine = getLine(nPosCurrent);
   var nIndexCurrent = nPosCurrent - oLine.start + 1;      //позиция курсора в строке
   
   key = getKey(oLine.text, nIndexCurrent)      //предварительный поиск ключа, отталкиваясь от позиции курсора
   if (!key)
      key = getKey(oLine.text, -1);      //предварительный поиск ключа - во всей строке
}
else
{
   key = getKey(key, -1);      //предварительный поиск ключа - по выделенному тексту
   if (!key) WScript.Quit();
}
//Проверяем, есть ли что-то похожее на ветку реестра
var posStart = key.indexOf("HK");
if (posStart == -1) WScript.Quit();
key = key.substr(posStart);

var pSlash = "\\";
var procRegEdit = "regedit.exe";
var WshShell = new ActiveXObject("WScript.Shell");

var LastKeyPath = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\";
var LastKeyName = LastKeyPath + "Lastkey";      //параметр отдельно от пути, т.к. с помощью Run выделение осуществляется только для каталога
key = key.replace(/^HKLM\\/, "HKEY_LOCAL_MACHINE\\");
key = key.replace(/^HKCR\\/, "HKEY_CLASSES_ROOT\\");
key = key.replace(/^HKCU\\/, "HKEY_CURRENT_USER\\");
key = key.replace(/\\\\/g, pSlash);
key = key.replace(/\[/g, "");      //обрезаем [] (для строки из *.reg-файла)
key = key.replace(/\]/g, "");
key = WshShell.RegRead(LastKeyName).match(/^[^\\]+/) + pSlash + key;

if (key.lastIndexOf(pSlash) == key.length - pSlash.length)
   key = key.substr(0, key.length - pSlash.length);      //обрезаем финальный слэш, если он есть, т.к. с ним не происходит выделения ветки

TaskKill(procRegEdit);      //для "обновления", т.к. иначе перехода на нужную ветку не производится

WshShell.RegWrite(LastKeyName, key, "REG_SZ");
WshShell.Run(procRegEdit, 1, false);


function getLine(nPos)
{
   var line = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nPos);
   var index = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, line, 0);
   var len = AkelPad.SendMessage(hWndEdit, 193 /*EM_LINELENGTH*/, index, 0);
   var text = AkelPad.GetTextRange(index, index + len);
   
   return {
      text: text,
      start: index,
      len: len
   };
}

///Поиск ключа по границам, иначе берём всю переданную строку, т.к. возможно текст выделен правильно, без ограничителей
function getKey(pText, nIndex)
{
   var key = getBlock(pText, nIndex, '[', ']');      //ищём внутри []
   if (!key)
   {
      key = getBlock(pText, nIndex, '"', '"');      //иначе ищём внутри ""
      if (!key)
         key = getBlock(pText, nIndex, "'", "'");      //иначе ищём внутри ''
         if (!key)
            key = pText;      //берём всю переданную строку
   }
   return key;
}

function getBlock(pText, nPos, pTextStart, pTextEnd)      //если в nPos передано -1, то искать во всей строке
{
   var pBlock = "";
   var nLbound;
   var nUbound;
   if (nPos != -1)
   {
      nLbound = nPos;
      nUbound = nPos;
   }
   else
   {
      nLbound = pTextStart.length + 1;
      nUbound = pText.length - pTextEnd.length - 1;
   }
   
   var posTextStart = pText.lastIndexOf(pTextStart, nUbound);               //Ищем вверх
   if (posTextStart != -1)
   {
      var posTextEnd = pText.indexOf(pTextEnd, nLbound);                     //Ищем вниз
      if (posTextEnd != -1)
      {
         posTextStart += 1;
         if (posTextStart < posTextEnd)
            pBlock = pText.substring(posTextStart, posTextEnd);
         else
            pBlock = pText.substring(posTextEnd + pTextStart.length, posTextStart - pTextEnd.length);
      }
   }
   return pBlock;
}

function TaskKill(process_name)
{
   var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2");
   var colProcessList = objWMIService.ExecQuery ('SELECT * FROM Win32_Process WHERE NAME = "' + process_name + '"');
   var enumItems = new Enumerator(colProcessList);
   for (; !enumItems.atEnd(); enumItems.moveNext())
      enumItems.item().Terminate();
}

Алгоритм:
1. Если есть выделение, то берётся чисто выделение; пробелы в конце не обрезаются, т.к. кроме пробелов там может быть любые символы...;
2. Если нет выделения, тогда:
- отталкиваемся от позиции курсора (считаем, что он установлен внутри [] или "");
- если ничего не найдено, то берём всю строку и берём текст внутри крайних [] или "";
3. Если в строке нет символов, в которые может быть заключён путь. то предполагаем, что это просто текстовый файл, поэтому берём строку с символов "HK" и пытаемся открыть; если этих символов - выходим, т.к. это не ветка реестра.

Из этого следует несколько вариантов работы скрипта (для пользователя):
- по выделению (путь должен быть чётко выделен);
- по позиции курсора внутри пути (самый частый и простой способ);
- из всей строки, в которой установлен курсор (в этом случае пользователь соглашается с тем, что текст между крайними [] или "" считается путём, т.е. корректно скрипт будет работать, если в текущей строке пара вышеуказанных символов встречается 1 раз); этот способ подходит для больших строк (трудно такое придумать чтобы курсором тяжело было попасть, но... пусть будет).

Благодарности: mozers™, KDJ.


Last edited by VladSh on Tue Apr 03, 2012 8:44 am; edited 10 times in total
Back to top
View user's profile Send private message Visit poster's website
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Fri Jan 21, 2011 5:04 pm    Post subject: Reply with quote

converter.js <download | mirror | development version>
  • Encode/decode HTML entities
  • Convert JavaScript escape sequences like "\u00a9" or "\xa9" («©» symbol)
  • Escape/unescape special RegExp symbols
  • Escape/unescape special strings symbols
  • Encode/decode Uniform Resource Identifiers (URIs)
  • Hexadecimal escape/unescape
  • Base64 encode/decode
  • Convert charset
Screenshots



Post size limit, here is packed file:
converter.uue
Code:
begin 644 converter.7z
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
/?F<7S@$5!@$`(```````
`
end
sum -r/size 27819/18060

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip. Smile


Last edited by Infocatcher on Sat Mar 02, 2013 5:06 pm; edited 14 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Fri Jan 21, 2011 5:24 pm    Post subject: Reply with quote

getHash.js <download | mirror | development version>
Calculates hash sum of text.
It can be very slow, be careful.

Screenshots



Post size limit, here is packed file:
getHash.uue
Code:
begin 644 getHash.7z
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
/W/T%S@$5!@$`(```````
`
end
sum -r/size 42305/18420

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip. Smile


Last edited by Infocatcher on Sun Feb 10, 2013 6:29 pm; edited 12 times in total
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1066
Location: Poland

PostPosted: Mon Jan 24, 2011 7:45 pm    Post subject: Reply with quote

Sorts lists in lines by using Format plugin.

SortList.js

Code:
// Sort list by using Format plugin - 2011-03-07
//
// Call("Scripts::Main", 1, "SortList.js")
//
// Note:
// In each line, sorts separately.
// If you do not specify a separator, it will be sorted single characters.
// Shortcut keys in dialog box:
// Enter - Sort
// Esc   - Close
// Shift+Alt+ Right, Left, Down, Up, End, Home, PgDn, PgUp - move dialog box.

var oSys = AkelPad.SystemFunction();

if (oSys.Call("kernel32::GetUserDefaultLangID") == 0x0415) //Polish
{
  var pTxtCaption  = "Sortowanie list w wierszach";
  var pTxtSep      = "Separator:";
  var pTxtTab      = "\\t = Tabulacja";
  var pTxtSortMet  = "Metoda sortowania";
  var pTxtDesc     = "&Malejąco";
  var pTxtIgCase   = "&Ignoruj wlk. liter";
  var pTxtString   = "&String";
  var pTxtNum      = "&Numerycznie";
  var pTxtNoSort   = "Nie sortuj, ale";
  var pTxtReverse  = "&Odwróć kolejność elementów";
  var pTxtRemoDup  = "&Usuń duplikaty elementów";
  var pTxtExtrDup  = "&Zachowaj tylko powielone elementy";
  var pTxtExtrUni  = "Zac&howaj tylko unikalne elementy";
  var pTxtCopyToCB = "Wynik kopiuj do schowka, nie zmieniaj &tekstu";
  var pTxtSort     = "Sortuj";
  var pTxtUndo     = "&Cofnij";
  var pTxtRedo     = "&Powtórz";
  var pTxtNoSep    = "Zaznaczony tekst nie zawiera separatora.";
}
else
{
  var pTxtCaption  = "Sort lists in lines";
  var pTxtSep      = "Separator:";
  var pTxtTab      = "\\t = Tabulation";
  var pTxtSortMet  = "Sort method";
  var pTxtDesc     = "&Descending";
  var pTxtIgCase   = "&Ignore case";
  var pTxtString   = "&String";
  var pTxtNum      = "&Numerically";
  var pTxtNoSort   = "No sort, but";
  var pTxtReverse  = "Reverse &order of elements";
  var pTxtRemoDup  = "Re&move duplicate elements";
  var pTxtExtrDup  = "E&xtract duplicate elements";
  var pTxtExtrUni  = "Extra&ct unique elements";
  var pTxtCopyToCB = "Resul&t copy to clipboard, do not replace text";
  var pTxtSort     = "Sort";
  var pTxtUndo     = "&Undo";
  var pTxtRedo     = "&Redo";
  var pTxtNoSep    = "Selected text not contain separator.";
}

var DT_DWORD    = 3;
var BM_SETCHECK = 241;

var hMainWnd     = AkelPad.GetMainWnd();
var hEditWnd     = AkelPad.GetEditWnd();
var hGuiFont     = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var pScriptName  = WScript.ScriptName;
var hInstanceDLL = AkelPad.GetInstanceDll();

var pSep       = ";";
var bTab       = 1;
var bDesc      = 0;
var bIgCase    = 1;
var nMethod    = 1;
var nNoSort    = 0;
var bCopyToCB  = 0;
var nUndoLimit = 0;
var nRedoLimit = 0;
var hWndDlg;
var lpBuffer;
var bIsReturn;
var hFocus;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var lpWnd      = [];
var IDGROUP1   = 1000;
var IDSTATSEP  = 1001;
var IDSEP      = 1002;
var IDTAB      = 1003;
var IDGROUP2   = 1004;
var IDDESC     = 1005;
var IDIGCASE   = 1006;
var IDGROUP3   = 1007;
var IDSTRING   = 1008;
var IDNUM      = 1009;
var IDGROUP4   = 1010;
var IDREVERSE  = 1011;
var IDREMODUP  = 1012;
var IDEXTRDUP  = 1013;
var IDEXTRUNI  = 1014;
var IDCOPYTOCB = 1015;
var IDSORT     = 1016;
var IDUNDO     = 1017;
var IDREDO     = 1018;

var WNDTYPE  = 0;
var WND      = 1;
var WNDEXSTY = 2;
var WNDSTY   = 3;
var WNDX     = 4;
var WNDY     = 5;
var WNDW     = 6;
var WNDH     = 7;
var WNDTXT   = 8;

//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
//0x50010003 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
//0x50010080 - WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL
//Windows             WNDTYPE, WND,WNDEXSTY,     WNDSTY,WNDX,WNDY,WNDW,WNDH, WNDTXT
lpWnd[IDGROUP1  ] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 170,  75, ""];
lpWnd[IDSTATSEP ] = ["STATIC",   0,       0, 0x50000000,  20,  30,  60,  13, pTxtSep];
lpWnd[IDSEP     ] = ["EDIT",     0,   0x200, 0x50010080,  80,  30,  90,  20, pSep];
lpWnd[IDTAB     ] = ["BUTTON",   0,       0, 0x50010003,  80,  60,  90,  16, pTxtTab];
lpWnd[IDGROUP2  ] = ["BUTTON",   0,       0, 0x50000007,  10,  95, 260,  65, pTxtSortMet];
lpWnd[IDDESC    ] = ["BUTTON",   0,       0, 0x50010003,  40, 115,  90,  16, pTxtDesc];
lpWnd[IDIGCASE  ] = ["BUTTON",   0,       0, 0x50010003,  40, 135,  90,  16, pTxtIgCase];
lpWnd[IDGROUP3  ] = ["BUTTON",   0,       0, 0x50000007, 150,  95, 120,  65, ""];
lpWnd[IDSTRING  ] = ["BUTTON",   0,       0, 0x50000009, 175, 115,  90,  16, pTxtString];
lpWnd[IDNUM     ] = ["BUTTON",   0,       0, 0x50000009, 175, 135,  90,  16, pTxtNum];
lpWnd[IDGROUP4  ] = ["BUTTON",   0,       0, 0x50000007,  10, 170, 260, 105, pTxtNoSort];
lpWnd[IDREVERSE ] = ["BUTTON",   0,       0, 0x50010003,  60, 190, 200,  16, pTxtReverse];
lpWnd[IDREMODUP ] = ["BUTTON",   0,       0, 0x50010003,  60, 210, 200,  16, pTxtRemoDup];
lpWnd[IDEXTRDUP ] = ["BUTTON",   0,       0, 0x50010003,  60, 230, 200,  16, pTxtExtrDup];
lpWnd[IDEXTRUNI ] = ["BUTTON",   0,       0, 0x50010003,  60, 250, 200,  16, pTxtExtrUni];
lpWnd[IDCOPYTOCB] = ["BUTTON",   0,       0, 0x50010003,  20, 285, 240,  16, pTxtCopyToCB];
lpWnd[IDSORT    ] = ["BUTTON",   0,       0, 0x50010000, 190,  14,  80,  23, pTxtSort];
lpWnd[IDUNDO    ] = ["BUTTON",   0,       0, 0x50010000, 190,  39,  80,  23, pTxtUndo];
lpWnd[IDREDO    ] = ["BUTTON",   0,       0, 0x50010000, 190,  64,  80,  23, pTxtRedo];

if (hEditWnd)
{
  AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, 0 /*AESELT_COLUMNOFF*/, 0);
  if (AkelPad.GetSelStart() == AkelPad.GetSelEnd())
    AkelPad.SetSel(0, -1);

  if (AkelPad.WindowRegisterClass(pScriptName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      //Create dialog
      AkelPad.MemCopy(lpBuffer, pScriptName, _TSTR);
      hWndDlg = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                          0,               //dwExStyle
                          lpBuffer,        //lpClassName
                          0,               //lpWindowName
                          0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                          0,               //x
                          0,               //y
                          285,             //nWidth
                          340,             //nHeight
                          hMainWnd,        //hWndParent
                          0,               //ID
                          hInstanceDLL,    //hInstance
                          DialogCallback); //Script function callback. To use it class must be registered by WindowRegisterClass.
      if (hWndDlg)
      {
        //Disable main window, to make dialog modal
        oSys.Call("user32::EnableWindow", hMainWnd, false);

        //Message loop
        AkelPad.WindowGetMessage();
      }
      AkelPad.MemFree(lpBuffer);
    }
    AkelPad.WindowUnregisterClass(pScriptName);
  }
}

////////
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
  var i, nLowParam;

  if (uMsg == 1) //WM_CREATE
  {
    //Dialog caption
    AkelPad.MemCopy(lpBuffer, pTxtCaption, _TSTR);
    oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpBuffer);

    //Create windows
    for (i = 1000; i < lpWnd.length; ++i)
    {
      AkelPad.MemCopy(lpBuffer, lpWnd[i][WNDTYPE], _TSTR);
      lpWnd[i][WND] = oSys.Call("user32::CreateWindowEx" + _TCHAR,
                                lpWnd[i][WNDEXSTY],//dwExStyle
                                lpBuffer,          //lpClassName
                                0,                 //lpWindowName
                                lpWnd[i][WNDSTY],  //dwStyle
                                lpWnd[i][WNDX],    //x
                                lpWnd[i][WNDY],    //y
                                lpWnd[i][WNDW],    //nWidth
                                lpWnd[i][WNDH],    //nHeight
                                hWnd,              //hWndParent
                                i,                 //ID
                                hInstanceDLL,      //hInstance
                                0);                //lpParam
      //Set font and text
      SetWindowFontAndText(lpWnd[i][WND], hGuiFont, lpWnd[i][WNDTXT]);
    }

    //Set limit edit text
    AkelPad.SendMessage(lpWnd[IDSEP][WND], 197 /*EM_LIMITTEXT*/, 20, 0);

    //Check
    CheckButtons();
    CheckUndoRedo();

    //Set window position
    if ((nWndPosX == undefined) || (nWndPosY == undefined))
      MoveWindow(hMainWnd, hWnd, "RT");
    else
      MoveWindow(hMainWnd, hWnd, [nWndPosX, nWndPosY]);
  }

  else if (uMsg == 7) //WM_SETFOCUS
  {
    oSys.Call("user32::SetFocus", lpWnd[IDSEP][WND]);
    AkelPad.SendMessage(lpWnd[IDSEP][WND], 177 /*EM_SETSEL*/, 0, -1);
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 27) //VK_ESCAPE
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDlg, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13) //VK_RETURN
    {
      if (! bIsReturn)
      {
        hFocus = oSys.Call("user32::GetFocus");
        if ((hFocus != lpWnd[IDSORT][WND]) && (hFocus != lpWnd[IDUNDO][WND]) && (hFocus != lpWnd[IDREDO][WND]))
          oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDSORT, 0);
      }
    }
  }

  else if (uMsg == 257) //WM_KEYUP
    bIsReturn = 0;

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

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

    if ((nLowParam >= IDTAB) && (nLowParam <= IDCOPYTOCB))
    {
      CheckButtons(nLowParam);
    }

    else if (nLowParam == IDSORT)
    {
      if (SortList())
        CheckUndoRedo(nLowParam);
    }

    else if (nLowParam == IDUNDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
    }

    else if (nLowParam == IDREDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
    }
  }

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

    //Enable main window
    oSys.Call("user32::EnableWindow", hMainWnd, true);
    //Destroy dialog
    oSys.Call("user32::DestroyWindow", hWnd);
  }

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

  else
    SetDefID(hWnd);

  return 0;
}

function SetWindowFontAndText(hWnd, hFont, pText)
{
  var lpWindowText;

  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);

  if (lpWindowText = AkelPad.MemAlloc(256 * _TSIZE))
  {
    AkelPad.MemCopy(lpWindowText, pText.substr(0, 255), _TSTR);
    oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, lpWindowText);

    AkelPad.MemFree(lpWindowText);
  }
}

function MoveWindow(hWndParent, hWnd, Action)
{
  var rcWndParent;
  var rcWnd;
  var nX;
  var nY;

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

  rcWndParent = GetWindowPos(hWndParent);
  rcWnd       = GetWindowPos(hWnd);

  nX = rcWnd.left;
  nY = rcWnd.top;

  if (Action == "R") //Move right
    nX = rcWnd.left + ((rcWnd.left < rcWndParent.right - 50) ? 20: 0);
  else if (Action == "L") //Move left
    nX = rcWnd.left - ((rcWnd.right > rcWndParent.left + 50) ? 20: 0);
  else if (Action == "D") //Move down
    nY = rcWnd.top + ((rcWnd.top < rcWndParent.bottom - 50) ? 20: 0);
  else if (Action == "U") //Move up
    nY = rcWnd.top - ((rcWnd.bottom > rcWndParent.top + 50) ? 20: 0);
  else if (Action == "E") //Move end (right)
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
  else if (Action == "H") //Move home (left)
    nX = rcWnd.left + (rcWndParent.left - rcWnd.left);
  else if (Action == "B") //Move bottom
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  else if (Action == "T") //Move top
    nY = rcWnd.top + (rcWndParent.top - rcWnd.top);
  else if (Action == "C") //Center window
  {
    nX = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
    nY = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
  }
  else if (Action == "LT") //Move left top
  {
    nX = rcWndParent.left;
    nY = rcWndParent.top;
  }
  else if (Action == "RT") //Move right top
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWndParent.top;
  }
  else if (Action == "LB") //Move left bottom
  {
    nX = rcWndParent.left;
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else if (Action == "RB") //Move right bottom
  {
    nX = rcWnd.left + (rcWndParent.right - rcWnd.right);
    nY = rcWnd.top + (rcWndParent.bottom - rcWnd.bottom);
  }
  else
  {
    nX = Action[0];
    nY = Action[1];
  }

  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 rcRect = [];

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

  rcRect.left   = AkelPad.MemRead(lpRect,     DT_DWORD);
  rcRect.top    = AkelPad.MemRead(lpRect + 4, DT_DWORD);
  rcRect.right  = AkelPad.MemRead(lpRect + 8, DT_DWORD);
  rcRect.bottom = AkelPad.MemRead(lpRect +12, DT_DWORD);
  AkelPad.MemFree(lpRect);

  return rcRect;
}

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

function SetDefID(hWnd)
{
  var nID    = 1000;
  var hFocus = oSys.Call("user32::GetFocus");

  while ((nID < lpWnd.length) && (hFocus != lpWnd[nID][WND]))
    ++nID;

  if ((nID != IDUNDO) && (nID != IDREDO))
    nID = IDSORT;

  oSys.Call("user32::DefDlgProc" + _TCHAR, hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
}

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

  if (bWrite)
  {
    rcWnd = GetWindowPos(hWndDlg);

    oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDSEP][WND], lpBuffer, 256);
    pSep = AkelPad.MemRead(lpBuffer, _TSTR);

    pTxt = 'nWndPosX='  + rcWnd.left + ';\r\n' +
           'nWndPosY='  + rcWnd.top  + ';\r\n' +
           'pSep="'     + pSep.replace(/[\\"]/g, "\\$&") + '";\r\n' +
           'bTab='      + bTab + ';\r\n' +
           'bDesc='     + bDesc + ';\r\n' +
           'bIgCase='   + bIgCase + ';\r\n' +
           'nMethod='   + nMethod + ';\r\n' +
           'nNoSort='   + nNoSort + ';\r\n' +
           'bCopyToCB=' + bCopyToCB + ';'

    oFile = oFSO.OpenTextFile(pIniName, 2, true, 0);
    oFile.Write(pTxt);
    oFile.Close();
  }

  else if (oFSO.FileExists(pIniName))
  {
    try
    {
      eval(AkelPad.ReadFile(pIniName));
    }
    catch (nError)
    {
    }
  }
}

function CheckButtons(nButton)
{
  if (nButton == IDTAB)
    bTab = ! bTab;
  else if (nButton == IDDESC)
    bDesc = ! bDesc;
  else if (nButton == IDIGCASE)
    bIgCase = ! bIgCase;
  else if ((nButton == IDSTRING) || (nButton == IDNUM))
    nMethod = nButton - IDSTRING + 1;
  else if ((nButton == IDREVERSE) || (nButton == IDREMODUP) ||
           (nButton == IDEXTRDUP) || (nButton == IDEXTRUNI))
  {
    if (nNoSort == nButton - IDREVERSE + 1)
      nNoSort = 0;
    else
      nNoSort = nButton - IDREVERSE + 1;
  }
  else if (nButton == IDCOPYTOCB)
    bCopyToCB = ! bCopyToCB;

  if (nNoSort > 1)
    nMethod = 1;

  AkelPad.SendMessage(lpWnd[IDTAB][WND],      BM_SETCHECK, bTab,           0);
  AkelPad.SendMessage(lpWnd[IDDESC][WND],     BM_SETCHECK, bDesc,          0);
  AkelPad.SendMessage(lpWnd[IDIGCASE][WND],   BM_SETCHECK, bIgCase,        0);
  AkelPad.SendMessage(lpWnd[IDSTRING][WND],   BM_SETCHECK, (nMethod == 1), 0);
  AkelPad.SendMessage(lpWnd[IDNUM][WND],      BM_SETCHECK, (nMethod == 2), 0);
  AkelPad.SendMessage(lpWnd[IDREVERSE][WND],  BM_SETCHECK, (nNoSort == 1), 0);
  AkelPad.SendMessage(lpWnd[IDREMODUP][WND],  BM_SETCHECK, (nNoSort == 2), 0);
  AkelPad.SendMessage(lpWnd[IDEXTRDUP][WND],  BM_SETCHECK, (nNoSort == 3), 0);
  AkelPad.SendMessage(lpWnd[IDEXTRUNI][WND],  BM_SETCHECK, (nNoSort == 4), 0);
  AkelPad.SendMessage(lpWnd[IDCOPYTOCB][WND], BM_SETCHECK, bCopyToCB,      0);

  oSys.Call("user32::EnableWindow", lpWnd[IDDESC][WND],   (nNoSort == 0));
  oSys.Call("user32::EnableWindow", lpWnd[IDIGCASE][WND], (nNoSort != 1));
  oSys.Call("user32::EnableWindow", lpWnd[IDSTRING][WND], (nNoSort != 1));
  oSys.Call("user32::EnableWindow", lpWnd[IDNUM][WND],    (nNoSort == 0));
}

function CheckUndoRedo(nButton)
{
  var nBegSel  = AkelPad.GetSelStart();
  var pTxtUndo = lpWnd[IDUNDO][WNDTXT];
  var pTxtRedo = lpWnd[IDREDO][WNDTXT];

  if (nButton == IDSORT)
  {
    if (nUndoLimit < AkelPad.SendMessage(hEditWnd, 3084 /*AEM_GETUNDOLIMIT*/, 0, 0))
      ++nUndoLimit;
    nRedoLimit = 0;
  }
  else if ((nButton == IDUNDO) && (nUndoLimit))
  {
    --nUndoLimit;
    ++nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
  }
  else if ((nButton == IDREDO) && (nRedoLimit))
  {
    ++nUndoLimit;
    --nRedoLimit;
    AkelPad.SendMessage(hEditWnd, 3078 /*AEM_REDO*/, 0, 0);
    AkelPad.SetSel(nBegSel, AkelPad.GetSelEnd());
  }

  if (nUndoLimit)
    pTxtUndo += " (" + nUndoLimit + ")";
  if (nRedoLimit)
    pTxtRedo += " (" + nRedoLimit + ")";

  if (((oSys.Call("user32::GetFocus") == lpWnd[IDUNDO][WND]) && (nUndoLimit == 0)) ||
      ((oSys.Call("user32::GetFocus") == lpWnd[IDREDO][WND]) && (nRedoLimit == 0)))
    oSys.Call("user32::SetFocus", lpWnd[IDSEP][WND]);

  SetWindowFontAndText(lpWnd[IDUNDO][WND], hGuiFont, pTxtUndo);
  SetWindowFontAndText(lpWnd[IDREDO][WND], hGuiFont, pTxtRedo);

  oSys.Call("user32::EnableWindow", lpWnd[IDUNDO][WND], nUndoLimit);
  oSys.Call("user32::EnableWindow", lpWnd[IDREDO][WND], nRedoLimit);
}

function SortList()
{
  var nBegSel  = AkelPad.GetSelStart();
  var nEndSel  = AkelPad.GetSelEnd();
  var pText    = AkelPad.GetSelText();
  var nLine1   = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nBegSel);
  var nLine2   = AkelPad.SendMessage(hEditWnd, 1078 /*EM_EXLINEFROMCHAR*/, 0, nEndSel);
  var nBegLen  = TextLen();
  var nBegLine;
  var nEndLine;
  var bSepEnd;
  var reSep;
  var reSep_g;
  var reSepEnd;
  var i;

  oSys.Call("user32::GetWindowText" + _TCHAR, lpWnd[IDSEP][WND], lpBuffer, 256);
  pSep = AkelPad.MemRead(lpBuffer, _TSTR);

  if (bTab) pSep = pSep.replace(/\\t/g, "\t");

  reSep    = new RegExp(escapeRegExp(pSep));
  reSep_g  = new RegExp(escapeRegExp(pSep), "g");
  reSepEnd = new RegExp(escapeRegExp(pSep) + "$");

  if (! reSep.test(pText))
  {
    AkelPad.MessageBox(hWndDlg, pTxtNoSep, pTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    return 0;
  }

  SetRedraw(hEditWnd, false);
  AkelPad.SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
  AkelPad.SendMessage(hEditWnd, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
  AkelPad.ReplaceSel(pText, 1);

  for (i = nLine1; i <= nLine2; ++i)
  {
    if (nLine1 < nLine2)
    {
       nBegLine = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, i, 0);
       nEndLine = AkelPad.SendMessage(hEditWnd, 187 /*EM_LINEINDEX*/, i, 0) +
                    AkelPad.SendMessage(hEditWnd, 193 /*EM_LINELENGTH*/, nBegLine, 0);
      if (i == nLine1)
        AkelPad.SetSel(nBegSel, nEndLine);
      else if (i == nLine2)
        AkelPad.SetSel(nBegLine, nEndSel - nBegLen + TextLen());
      else
        AkelPad.SetSel(nBegLine, nEndLine);

      pText = AkelPad.GetSelText();
    }

    if (reSep.test(pText))
    {
      bSepEnd = reSepEnd.test(pText);
      pText   = pText.replace(reSep_g, "\r");
      AkelPad.ReplaceSel("\r" + pText + "\r", 1);
      AkelPad.SetSel(AkelPad.GetSelStart() + 1, AkelPad.GetSelEnd() - 1);
      SortByPlugin();
      pText = AkelPad.GetTextRange(AkelPad.GetSelStart(), AkelPad.GetSelEnd() - 1 + bSepEnd).replace(/\r/g, pSep);
      AkelPad.SetSel(AkelPad.GetSelStart() - 1, AkelPad.GetSelEnd() + bSepEnd);
      AkelPad.ReplaceSel(pText, 1);
    }
  }

  AkelPad.SetSel(nBegSel, AkelPad.GetSelEnd());
  AkelPad.SendMessage(hEditWnd, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
  AkelPad.SendMessage(hEditWnd, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);

  if (bCopyToCB)
  {
    AkelPad.SetClipboardText(AkelPad.GetSelText());
    AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0);
  }

  SetRedraw(hEditWnd, true);
  return ! bCopyToCB;
}

function SortByPlugin()
{
  var pAscDesc = bDesc ? "Desc" : "Asc";

  if (nNoSort == 1)
    AkelPad.Call("Format::LineReverse");
  else if (nNoSort == 2)
    AkelPad.Call("Format::LineRemoveDuplicates", ! bIgCase);
  else if (nNoSort == 3)
    AkelPad.Call("Format::LineGetDuplicates", ! bIgCase);
  else if (nNoSort == 4)
    AkelPad.Call("Format::LineGetUnique", ! bIgCase);
  else if (nMethod == 1)
    AkelPad.Call("Format::LineSortStr" + pAscDesc, ! bIgCase);
  else if (nMethod == 2)
    AkelPad.Call("Format::LineSortInt" + pAscDesc, ! bIgCase);
}

function escapeRegExp(str)
{
  return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
}

function SetRedraw(hWnd, bRedraw)
{
  var oSys = AkelPad.SystemFunction();
  AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
  bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

function TextLen()
{
  var nOffset = -1;
  var lpIndex;

  if (lpIndex = AkelPad.MemAlloc(12 /*sizeof(AECHARINDEX)*/))
  {
    AkelPad.SendMessage(hEditWnd, 3130 /*AEM_GETINDEX*/, 2 /*AEGI_LASTCHAR*/, lpIndex);
    nOffset = AkelPad.SendMessage(hEditWnd, 3136 /*AEM_INDEXTORICHOFFSET*/, 0, lpIndex);
    AkelPad.MemFree(lpIndex);
  }
  return nOffset;
}



Last edited by KDJ on Mon Mar 07, 2011 9:15 pm; edited 3 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Sun Jan 30, 2011 9:37 pm    Post subject: Reply with quote

AESCrypt.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11212#11212
// http://infocatcher.ucoz.net/js/akelpad_scripts/AESCrypt.js

// (c) Infocatcher 2010-2011
// version 0.2.7 - 2011-12-20

//===================
// AES-256 encrypt/decrypt
// Based on script from http://www.movable-type.co.uk/scripts/aes.html

// Arguments:
//   -mode=0             - (default) ask user about direction (encrypt or decrypt)
//        =1             - encrypt
//        =2             - decrypt
//   -maxLineWidth=75    - allow split output to lines with fixed width
//   -showPassword=true  - force show or hide password
//   -saveOptions=true   - allow store last used password state

// Usage:
//   Call("Scripts::Main", 1, "AESCrypt.js", "-mode=1")     - encrypt
//   Call("Scripts::Main", 1, "AESCrypt.js", "-mode=2")     - decrypt
//   Call("Scripts::Main", 1, "AESCrypt.js", "-mode=0 -maxLineWidth=0 -showPassword=true -saveOptions=false")
//===================

function _localize(s) {
   var strings = {
      "Nothing to encrypt!": {
         ru: "Нечего зашифровывать!"
      },
      "Nothing to decrypt!": {
         ru: "Нечего расшифровывать!"
      },
      "Direction": {
         ru: "Направление"
      },
      "Encrypt": {
         ru: "Зашифровать"
      },
      "Decrypt": {
         ru: "Расшифровать"
      },
      "Password": {
         ru: "Пароль"
      },
      "&Encrypt": {
         ru: "&Зашифровать"
      },
      "&Decrypt": {
         ru: "&Расшифровать"
      },
      "Impossible to decrypt: invalid format!": {
         ru: "Невозможно расшифровать: некорректный формат!"
      },
      "Enter &password:": {
         ru: "Введите &пароль:"
      },
      "Reenter p&assword:": {
         ru: "Повторите п&ароль:"
      },
      "&Show password": {
         ru: "По&казывать пароль"
      },
      "OK": {
         ru: "ОК"
      },
      "Cancel": {
         ru: "Отмена"
      },
      "Passwords do not match!": {
         ru: "Пароли не совпадают!"
      }
   };
   var lng;
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru"; break;
      default:   lng = "en";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

var MODE_USER_SELECT = 0;
var MODE_ENCRYPT     = 1;
var MODE_DECRYPT     = 2;

// Read arguments:
// getArg(argName, defaultValue)
var mode         = getArg("mode", 0);
var maxLineWidth = getArg("maxLineWidth", 75);
var showPassword = getArg("showPassword");
var saveOptions  = getArg("saveOptions", true);

var decrypt = mode == MODE_DECRYPT;


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*  AES implementation in JavaScript (c) Chris Veness 2005-2010                                   */
/*   - see http://csrc.nist.gov/publications/PubsFIPS.html#197                                    */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

var Aes = {};  // Aes namespace

/**
 * AES Cipher function: encrypt 'input' state with Rijndael algorithm
 *   applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage
 *
 * @param {Number[]} input 16-byte (128-bit) input state array
 * @param {Number[][]} w   Key schedule as 2D byte-array (Nr+1 x Nb bytes)
 * @returns {Number[]}     Encrypted output state array
 */
Aes.cipher = function(input, w) {    // main Cipher function [§5.1]
  var Nb = 4;               // block size (in words): no of columns in state (fixed at 4 for AES)
  var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys

  var state = [[],[],[],[]];  // initialise 4xNb byte-array 'state' with input [§3.4]
  for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i];

  state = Aes.addRoundKey(state, w, 0, Nb);

  for (var round=1; round<Nr; round++) {
    state = Aes.subBytes(state, Nb);
    state = Aes.shiftRows(state, Nb);
    state = Aes.mixColumns(state, Nb);
    state = Aes.addRoundKey(state, w, round, Nb);
  }

  state = Aes.subBytes(state, Nb);
  state = Aes.shiftRows(state, Nb);
  state = Aes.addRoundKey(state, w, Nr, Nb);

  var output = new Array(4*Nb);  // convert state to 1-d array before returning [§3.4]
  for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
  return output;
}

/**
 * Perform Key Expansion to generate a Key Schedule
 *
 * @param {Number[]} key Key as 16/24/32-byte array
 * @returns {Number[][]} Expanded key schedule as 2D byte-array (Nr+1 x Nb bytes)
 */
Aes.keyExpansion = function(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [§5.2]
  var Nb = 4;            // block size (in words): no of columns in state (fixed at 4 for AES)
  var Nk = key.length/4  // key length (in words): 4/6/8 for 128/192/256-bit keys
  var Nr = Nk + 6;       // no of rounds: 10/12/14 for 128/192/256-bit keys

  var w = new Array(Nb*(Nr+1));
  var temp = new Array(4);

  for (var i=0; i<Nk; i++) {
    var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
    w[i] = r;
  }

  for (var i=Nk; i<(Nb*(Nr+1)); i++) {
    w[i] = new Array(4);
    for (var t=0; t<4; t++) temp[t] = w[i-1][t];
    if (i % Nk == 0) {
      temp = Aes.subWord(Aes.rotWord(temp));
      for (var t=0; t<4; t++) temp[t] ^= Aes.rCon[i/Nk][t];
    } else if (Nk > 6 && i%Nk == 4) {
      temp = Aes.subWord(temp);
    }
    for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t];
  }

  return w;
}

/*
 * ---- remaining routines are private, not called externally ----
 */

Aes.subBytes = function(s, Nb) {    // apply SBox to state S [§5.1.1]
  for (var r=0; r<4; r++) {
    for (var c=0; c<Nb; c++) s[r][c] = Aes.sBox[s[r][c]];
  }
  return s;
}

Aes.shiftRows = function(s, Nb) {    // shift row r of state S left by r bytes [§5.1.2]
  var t = new Array(4);
  for (var r=1; r<4; r++) {
    for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];  // shift into temp copy
    for (var c=0; c<4; c++) s[r][c] = t[c];         // and copy back
  }          // note that this will work for Nb=4,5,6, but not 7,8 (always 4 for AES):
  return s;  // see asmaes.sourceforge.net/rijndael/rijndaelImplementation.pdf
}

Aes.mixColumns = function(s, Nb) {   // combine bytes of each col of state S [§5.1.3]
  for (var c=0; c<4; c++) {
    var a = new Array(4);  // 'a' is a copy of the current column from 's'
    var b = new Array(4);  // 'b' is a•{02} in GF(2^8)
    for (var i=0; i<4; i++) {
      a[i] = s[i][c];
      b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;

    }
    // a[n] ^ b[n] is a•{03} in GF(2^8)
    s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // 2*a0 + 3*a1 + a2 + a3
    s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 * 2*a1 + 3*a2 + a3
    s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + 2*a2 + 3*a3
    s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // 3*a0 + a1 + a2 + 2*a3
  }
  return s;
}

Aes.addRoundKey = function(state, w, rnd, Nb) {  // xor Round Key into state S [§5.1.4]
  for (var r=0; r<4; r++) {
    for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
  }
  return state;
}

Aes.subWord = function(w) {    // apply SBox to 4-byte word w
  for (var i=0; i<4; i++) w[i] = Aes.sBox[w[i]];
  return w;
}

Aes.rotWord = function(w) {    // rotate 4-byte word w left by one byte
  var tmp = w[0];
  for (var i=0; i<3; i++) w[i] = w[i+1];
  w[3] = tmp;
  return w;
}

// sBox is pre-computed multiplicative inverse in GF(2^8) used in subBytes and keyExpansion [§5.1.1]
Aes.sBox =  [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
             0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
             0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
             0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
             0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
             0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
             0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
             0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
             0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
             0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
             0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
             0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
             0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
             0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
             0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
             0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];

// rCon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [§5.2]
Aes.rCon = [ [0x00, 0x00, 0x00, 0x00],
             [0x01, 0x00, 0x00, 0x00],
             [0x02, 0x00, 0x00, 0x00],
             [0x04, 0x00, 0x00, 0x00],
             [0x08, 0x00, 0x00, 0x00],
             [0x10, 0x00, 0x00, 0x00],
             [0x20, 0x00, 0x00, 0x00],
             [0x40, 0x00, 0x00, 0x00],
             [0x80, 0x00, 0x00, 0x00],
             [0x1b, 0x00, 0x00, 0x00],
             [0x36, 0x00, 0x00, 0x00] ];


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*  AES Counter-mode implementation in JavaScript (c) Chris Veness 2005-2009                      */
/*   - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf                       */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

Aes.Ctr = {};  // Aes.Ctr namespace: a subclass or extension of Aes

/**
 * Encrypt a text using AES encryption in Counter mode of operation
 *
 * Unicode multi-byte character safe
 *
 * @param {String} plaintext Source text to be encrypted
 * @param {String} password  The password to use to generate a key
 * @param {Number} nBits     Number of bits to be used in the key (128, 192, or 256)
 * @returns {string}         Encrypted text
 */
Aes.Ctr.encrypt = function(plaintext, password, nBits) {
  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
  if (!(nBits==128 || nBits==192 || nBits==256)) return '';  // standard allows 128/192/256 bit keys
  plaintext = Utf8.encode(plaintext);
  password = Utf8.encode(password);
  //var t = new Date();  // timer

  // use AES itself to encrypt password to get cipher key (using plain password as source for key
  // expansion) - gives us well encrypted key
  var nBytes = nBits/8;  // no bytes in key
  var pwBytes = new Array(nBytes);
  for (var i=0; i<nBytes; i++) {
    pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
  }
  var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes));  // gives us 16-byte key
  key = key.concat(key.slice(0, nBytes-16));  // expand key to 16/24/32 bytes long

  // initialise counter block (NIST SP800-38A §B.2): millisecond time-stamp for nonce in 1st 8 bytes,
  // block counter in 2nd 8 bytes
  var counterBlock = new Array(blockSize);
  var nonce = (new Date()).getTime();  // timestamp: milliseconds since 1-Jan-1970
  var nonceSec = Math.floor(nonce/1000);
  var nonceMs = nonce%1000;
  // encode nonce with seconds in 1st 4 bytes, and (repeated) ms part filling 2nd 4 bytes
  for (var i=0; i<4; i++) counterBlock[i] = (nonceSec >>> i*8) & 0xff;
  for (var i=0; i<4; i++) counterBlock[i+4] = nonceMs & 0xff;
  // and convert it to a string to go on the front of the ciphertext
  var ctrTxt = '';
  for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);

  // generate key schedule - an expansion of the key into distinct Key Rounds for each round
  var keySchedule = Aes.keyExpansion(key);

  var blockCount = Math.ceil(plaintext.length/blockSize);
  var ciphertxt = new Array(blockCount);  // ciphertext as array of strings

  for (var b=0; b<blockCount; b++) {
    // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
    // done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
    for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;
    for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8)

    var cipherCntr = Aes.cipher(counterBlock, keySchedule);  // -- encrypt counter block --

    // block size is reduced on final block
    var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
    var cipherChar = new Array(blockLength);

    for (var i=0; i<blockLength; i++) {  // -- xor plaintext with ciphered counter char-by-char --
      cipherChar[i] = cipherCntr[i] ^ plaintext.charCodeAt(b*blockSize+i);
      cipherChar[i] = String.fromCharCode(cipherChar[i]);
    }
    ciphertxt[b] = cipherChar.join('');
  }

  // Array.join is more efficient than repeated string concatenation in IE
  var ciphertext = ctrTxt + ciphertxt.join('');
  ciphertext = Base64.encode(ciphertext);  // encode in base64

  //alert((new Date()) - t);
  return ciphertext;
}

/**
 * Decrypt a text encrypted by AES in counter mode of operation
 *
 * @param {String} ciphertext Source text to be encrypted
 * @param {String} password   The password to use to generate a key
 * @param {Number} nBits      Number of bits to be used in the key (128, 192, or 256)
 * @returns {String}          Decrypted text
 */
Aes.Ctr.decrypt = function(ciphertext, password, nBits) {
  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
  if (!(nBits==128 || nBits==192 || nBits==256)) return '';  // standard allows 128/192/256 bit keys
  ciphertext = Base64.decode(ciphertext);
  password = Utf8.encode(password);
  //var t = new Date();  // timer

  // use AES to encrypt password (mirroring encrypt routine)
  var nBytes = nBits/8;  // no bytes in key
  var pwBytes = new Array(nBytes);
  for (var i=0; i<nBytes; i++) {
    pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
  }
  var key = Aes.cipher(pwBytes, Aes.keyExpansion(pwBytes));
  key = key.concat(key.slice(0, nBytes-16));  // expand key to 16/24/32 bytes long

  // recover nonce from 1st 8 bytes of ciphertext
  var counterBlock = new Array(8);
  ctrTxt = ciphertext.slice(0, 8);
  for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);

  // generate key schedule
  var keySchedule = Aes.keyExpansion(key);

  // separate ciphertext into blocks (skipping past initial 8 bytes)
  var nBlocks = Math.ceil((ciphertext.length-8) / blockSize);
  var ct = new Array(nBlocks);
  for (var b=0; b<nBlocks; b++) ct[b] = ciphertext.slice(8+b*blockSize, 8+b*blockSize+blockSize);
  ciphertext = ct;  // ciphertext is now array of block-length strings

  // plaintext will get generated block-by-block into array of block-length strings
  var plaintxt = new Array(ciphertext.length);

  for (var b=0; b<nBlocks; b++) {
    // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
    for (var c=0; c<4; c++) counterBlock[15-c] = ((b) >>> c*8) & 0xff;
    for (var c=0; c<4; c++) counterBlock[15-c-4] = (((b+1)/0x100000000-1) >>> c*8) & 0xff;

    var cipherCntr = Aes.cipher(counterBlock, keySchedule);  // encrypt counter block

    var plaintxtByte = new Array(ciphertext[b].length);
    for (var i=0; i<ciphertext[b].length; i++) {
      // -- xor plaintxt with ciphered counter byte-by-byte --
      plaintxtByte[i] = cipherCntr[i] ^ ciphertext[b].charCodeAt(i);
      plaintxtByte[i] = String.fromCharCode(plaintxtByte[i]);
    }
    plaintxt[b] = plaintxtByte.join('');
  }

  // join array of blocks into single plaintext string
  var plaintext = plaintxt.join('');
  plaintext = Utf8.decode(plaintext);  // decode from UTF8 back to Unicode multi-byte chars

  //alert((new Date()) - t);
  return plaintext;
}


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*  Base64 class: Base 64 encoding / decoding (c) Chris Veness 2002-2010                          */
/*    note: depends on Utf8 class                                                                 */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

var Base64 = {};  // Base64 namespace

Base64.code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

/**
 * Encode string into Base64, as defined by RFC 4648 [http://tools.ietf.org/html/rfc4648]
 * (instance method extending String object). As per RFC 4648, no newlines are added.
 *
 * @param {String} str The string to be encoded as base-64
 * @param {Boolean} [utf8encode=false] Flag to indicate whether str is Unicode string to be encoded
 *   to UTF8 before conversion to base64; otherwise string is assumed to be 8-bit characters
 * @returns {String} Base64-encoded string
 */
Base64.encode = function(str, utf8encode) {  // http://tools.ietf.org/html/rfc4648
  utf8encode =  (typeof utf8encode == 'undefined') ? false : utf8encode;
  var o1, o2, o3, bits, h1, h2, h3, h4, e=[], pad = '', c, plain, coded;
  var b64 = Base64.code;

  plain = utf8encode ? str.encodeUTF8() : str;

  c = plain.length % 3;  // pad string to length of multiple of 3
  if (c > 0) { while (c++ < 3) { pad += '='; plain += '\0'; } }
  // note: doing padding here saves us doing special-case packing for trailing 1 or 2 chars

  for (c=0; c<plain.length; c+=3) {  // pack three octets into four hexets
    o1 = plain.charCodeAt(c);
    o2 = plain.charCodeAt(c+1);
    o3 = plain.charCodeAt(c+2);

    bits = o1<<16 | o2<<8 | o3;

    h1 = bits>>18 & 0x3f;
    h2 = bits>>12 & 0x3f;
    h3 = bits>>6 & 0x3f;
    h4 = bits & 0x3f;

    // use hextets to index into code string
    e[c/3] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
  }
  coded = e.join('');  // join() is far faster than repeated string concatenation in IE

  // replace 'A's from padded nulls with '='s
  coded = coded.slice(0, coded.length-pad.length) + pad;

  return coded;
}

/**
 * Decode string from Base64, as defined by RFC 4648 [http://tools.ietf.org/html/rfc4648]
 * (instance method extending String object). As per RFC 4648, newlines are not catered for.
 *
 * @param {String} str The string to be decoded from base-64
 * @param {Boolean} [utf8decode=false] Flag to indicate whether str is Unicode string to be decoded
 *   from UTF8 after conversion from base64
 * @returns {String} decoded string
 */
Base64.decode = function(str, utf8decode) {
  utf8decode =  (typeof utf8decode == 'undefined') ? false : utf8decode;
  var o1, o2, o3, h1, h2, h3, h4, bits, d=[], plain, coded;
  var b64 = Base64.code;

  coded = utf8decode ? str.decodeUTF8() : str;


  for (var c=0; c<coded.length; c+=4) {  // unpack four hexets into three octets
    h1 = b64.indexOf(coded.charAt(c));
    h2 = b64.indexOf(coded.charAt(c+1));
    h3 = b64.indexOf(coded.charAt(c+2));
    h4 = b64.indexOf(coded.charAt(c+3));

    bits = h1<<18 | h2<<12 | h3<<6 | h4;

    o1 = bits>>>16 & 0xff;
    o2 = bits>>>8 & 0xff;
    o3 = bits & 0xff;

    d[c/4] = String.fromCharCode(o1, o2, o3);
    // check for padding
    if (h4 == 0x40) d[c/4] = String.fromCharCode(o1, o2);
    if (h3 == 0x40) d[c/4] = String.fromCharCode(o1);
  }
  plain = d.join('');  // join() is far faster than repeated string concatenation in IE

  return utf8decode ? plain.decodeUTF8() : plain;
}


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
/*  Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple          */
/*              single-byte character encoding (c) Chris Veness 2002-2010                         */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

var Utf8 = {};  // Utf8 namespace

/**
 * Encode multi-byte Unicode string into utf-8 multiple single-byte characters
 * (BMP / basic multilingual plane only)
 *
 * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars
 *
 * @param {String} strUni Unicode string to be encoded as UTF-8
 * @returns {String} encoded string
 */
Utf8.encode = function(strUni) {
  // use regular expressions & String.replace callback function for better efficiency
  // than procedural approaches
  var strUtf = strUni.replace(
      /[\u0080-\u07ff]/g,  // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz
      function(c) {
        var cc = c.charCodeAt(0);
        return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
    );
  strUtf = strUtf.replace(
      /[\u0800-\uffff]/g,  // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
      function(c) {
        var cc = c.charCodeAt(0);
        return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
    );
  return strUtf;
}

/**
 * Decode utf-8 encoded string back into multi-byte Unicode characters
 *
 * @param {String} strUtf UTF-8 string to be decoded back to Unicode
 * @returns {String} decoded string
 */
Utf8.decode = function(strUtf) {
  // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
  var strUni = strUtf.replace(
      /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
      function(c) {  // (note parentheses for precence)
        var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f);
        return String.fromCharCode(cc); }
    );
  strUni = strUni.replace(
      /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
      function(c) {  // (note parentheses for precence)
        var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
        return String.fromCharCode(cc); }
    );
  return strUni;
}

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */


var hMainWnd = AkelPad.GetMainWnd();
var oSys = AkelPad.SystemFunction();
var hWndEdit = AkelPad.GetEditWnd();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
   encryptOrDecrypt();

function encryptOrDecrypt(pass) {
   var text = AkelPad.GetSelText();
   var selectAll = false;
   if(!text) {
      text = getAllText();
      if(!text) {
         var msg = _localize("Nothing to " + (decrypt ? "decrypt" : "encrypt") + "!");
         AkelPad.MessageBox(hMainWnd, msg, WScript.ScriptName, 48 /*MB_ICONEXCLAMATION*/);
         return;
      }
      selectAll = true;
   }

   if(mode == MODE_USER_SELECT) {
      var dirObj = { value: isBase64(text) };
      var pass = passwordPrompt(WScript.ScriptName, _localize("Password"), true, dirObj);
      if(!pass) // Cancel
         return;
      decrypt = dirObj.value;
   }

   if(decrypt) {
      //if(maxLineWidth > 0)
      text = text.replace(/[\n\r]+/g, "");
      if(!isBase64(text)) {
         AkelPad.MessageBox(
            hMainWnd,
            _localize("Impossible to decrypt: invalid format!"),
            WScript.ScriptName,
            16 /*MB_ICONERROR*/
         );
         return;
      }
   }

   if(!pass)
      pass = passwordPrompt(WScript.ScriptName, _localize(decrypt ? "Decrypt" : "Encrypt"), true);
   if(!pass) // Cancel
      return;

   var res = Aes.Ctr[decrypt ? "decrypt" : "encrypt"](text, pass, 256);
   if(!decrypt && maxLineWidth > 0)
      res = res.replace(new RegExp(".{" + maxLineWidth + "}", "g"), "$&\n");

   insertNoScroll(res, selectAll);
}
function isBase64(str) {
   str = str.replace(/[\n\r]+/g, "");
   return str.length % 4 == 0 && !/[^a-zA-Z0-9+\/]/.test(str.replace(/=+$/, ""));
}

function passwordPrompt(caption, label, modal, direction) {
   var hInstanceDLL = AkelPad.GetInstanceDll();
   var dialogClass = "AkelPad::Scripts::" + WScript.ScriptName + "::" + oSys.Call("kernel32::GetCurrentProcessId");

   // Note: "modal" argument is always true now and following should not happens
   var hWndDialog = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, dialogClass, 0);
   if(hWndDialog) {
      if(oSys.Call("user32::IsIconic", hWndDialog))
         oSys.Call("user32::ShowWindow", hWndDialog, 9 /*SW_RESTORE*/);
      AkelPad.SendMessage(hWndDialog, 7 /*WM_SETFOCUS*/, 0, 0);
      return null;
   }

   if(
      !AkelPad.WindowRegisterClass(dialogClass)
      && ( // Previous script instance crashed
         !AkelPad.WindowUnregisterClass(dialogClass)
         || !AkelPad.WindowRegisterClass(dialogClass)
      )
   )
      return null;

   var pass;
   var lpBuffer = AkelPad.MemAlloc(256 * _TSIZE);
   if(!lpBuffer)
      return null;

   var IDC_STATIC      = -1;
   var IDC_ENCRYPT     = 1001;
   var IDC_DECRYPT     = 1002;
   var IDC_PASS        = 1003;
   var IDC_PASS2       = 1004;
   var IDC_PASS2_LABEL = 1005;
   var IDC_SHOWPASS    = 1006;
   var IDC_OK          = 1007;
   var IDC_CANCEL      = 1008;

   var hWndGroupMode, hWndEncrypt, hWndDecrypt;
   var hWndGroup, hWndPassLabel, hWndPass, hWndPass2Label, hWndPass2, hWndShowPass;
   var hWndOK, hWndCancel;

   var addY = direction ? 54 : 0;
   var p2h = direction || !decrypt ? 0 : 52;

   var scale = new Scale(0, hMainWnd);
   var sizeNonClientX = oSys.Call("user32::GetSystemMetrics", 7 /*SM_CXFIXEDFRAME*/)*2;
   var sizeNonClientY = oSys.Call("user32::GetSystemMetrics", 8 /*SM_CYFIXEDFRAME*/)*2
      + oSys.Call("user32::GetSystemMetrics", 4 /*SM_CYCAPTION*/);

   // Create dialog
   hWndDialog = oSys.Call(
      "user32::CreateWindowEx" + _TCHAR,
      0,                                          //dwExStyle
      dialogClass,                                //lpClassName
      0,                                          //lpWindowName
      0x90CA0000,                                 //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
      scale.x(0),                                 //x
      scale.y(0),                                 //y
      scale.x(252) + sizeNonClientX,              //nWidth
      scale.y(214 + addY - p2h) + sizeNonClientY, //nHeight
      hMainWnd,                                   //hWndParent
      0,                                          //ID
      hInstanceDLL,                               //hInstance
      dialogCallback                              //Script function callback. To use it class must be registered by WindowRegisterClass.
   );
   if(!hWndDialog)
      return null;

   function dialogCallback(hWnd, uMsg, wParam, lParam) {
      switch(uMsg) {
         case 1: //WM_CREATE
            function setWindowFontAndText(hWnd, hFont, pText) {
               AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
               oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText.substr(0, 255));
            }

            var hGuiFont = oSys.Call("gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);

            // Dialog caption
            oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, caption);

            if(direction) {
               // GroupBox mode
               hWndGroupMode = createWindowEx(
                  0,            //dwExStyle
                  "BUTTON",     //lpClassName
                  0,            //lpWindowName
                  0x50000007,   //WS_VISIBLE|WS_CHILD|BS_GROUPBOX
                  14,           //x
                  13,           //y
                  224,          //nWidth
                  44,           //nHeight
                  hWnd,         //hWndParent
                  IDC_STATIC,   //ID
                  hInstanceDLL, //hInstance
                  0             //lpParam
               );
               setWindowFontAndText(hWndGroupMode, hGuiFont, _localize("Direction"));

               // Radiobutton encrypt
               hWndEncrypt = createWindowEx(
                  0,            //dwExStyle
                  "BUTTON",     //lpClassName
                  0,            //lpWindowName
                  0x50000009,   //WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
                  26,           //x
                  33,           //y
                  96,           //nWidth
                  16,           //nHeight
                  hWnd,         //hWndParent
                  IDC_ENCRYPT,  //ID
                  hInstanceDLL, //hInstance
                  0             //lpParam
               );
               setWindowFontAndText(hWndEncrypt, hGuiFont, _localize("&Encrypt"));
               checked(hWndEncrypt, !direction.value);

               // Radiobutton decrypt
               hWndDecrypt = createWindowEx(
                  0,            //dwExStyle
                  "BUTTON",     //lpClassName
                  0,            //lpWindowName
                  0x50000009,   //WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON
                  128,          //x
                  33,           //y
                  96,           //nWidth
                  16,           //nHeight
                  hWnd,         //hWndParent
                  IDC_DECRYPT,  //ID
                  hInstanceDLL, //hInstance
                  0             //lpParam
               );
               setWindowFontAndText(hWndDecrypt, hGuiFont, _localize("&Decrypt"));
               //checked(hWndDecrypt, mode == MODE_DECRYPT);
               checked(hWndDecrypt, direction.value);
            }

            // GroupBox
            hWndGroup = createWindowEx(
               0,            //dwExStyle
               "BUTTON",     //lpClassName
               0,            //lpWindowName
               0x50000007,   //WS_VISIBLE|WS_CHILD|BS_GROUPBOX
               14,           //x
               13 + addY,    //y
               224,          //nWidth
               152 - p2h,    //nHeight
               hWnd,         //hWndParent
               IDC_STATIC,   //ID
               hInstanceDLL, //hInstance
               0             //lpParam
            );
            setWindowFontAndText(hWndGroup, hGuiFont, label);

            // Static window: password label
            hWndPassLabel = createWindowEx(
               0,            //dwExStyle
               "STATIC",     //lpClassName
               0,            //lpWindowName
               0x50000000,   //WS_VISIBLE|WS_CHILD
               32,           //x
               35 + addY,    //y
               177,          //nWidth
               13,           //nHeight
               hWnd,         //hWndParent
               IDC_STATIC,   //ID
               hInstanceDLL, //hInstance
               0             //lpParam
            );
            setWindowFontAndText(hWndPassLabel, hGuiFont, _localize("Enter &password:"));

            // Edit window: password
            hWndPass = createWindowEx(
               0x200,        //WS_EX_CLIENTEDGE
               "EDIT",       //lpClassName
               0,            //lpWindowName
               0x500100A0,   //WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL|ES_PASSWORD
               29,           //x
               53 + addY,    //y
               195,          //nWidth
               23,           //nHeight
               hWnd,         //hWndParent
               IDC_PASS,     //ID
               hInstanceDLL, //hInstance
               0             //lpParam
            );
            setWindowFontAndText(hWndPass, hGuiFont, "");

            if(direction || !decrypt) {
               // Static window: password 2 label
               hWndPass2Label = createWindowEx(
                  0,               //dwExStyle
                  "STATIC",        //lpClassName
                  0,               //lpWindowName
                  0x50000000,      //WS_VISIBLE|WS_CHILD
                  32,              //x
                  86 + addY,       //y
                  177,             //nWidth
                  13,              //nHeight
                  hWnd,            //hWndParent
                  IDC_PASS2_LABEL, //ID
                  hInstanceDLL,    //hInstance
                  0                //lpParam
               );
               setWindowFontAndText(hWndPass2Label, hGuiFont, _localize("Reenter p&assword:"));

               // Edit window: password 2
               hWndPass2 = createWindowEx(
                  0x200,        //WS_EX_CLIENTEDGE
                  "EDIT",       //lpClassName
                  0,            //lpWindowName
                  0x500100A0,   //WS_VISIBLE|WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL|ES_PASSWORD
                  29,           //x
                  104 + addY,   //y
                  195,          //nWidth
                  23,           //nHeight
                  hWnd,         //hWndParent
                  IDC_PASS2,    //ID
                  hInstanceDLL, //hInstance
                  0             //lpParam
               );
               setWindowFontAndText(hWndPass2, hGuiFont, "");
            }

            // Checkbox: show password
            hWndShowPass = createWindowEx(
               0,                //dwExStyle
               "BUTTON",         //lpClassName
               0,                //lpWindowName
               0x50010003,       //WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_AUTOCHECKBOX
               32,               //x
               138 + addY - p2h, //y
               177,              //nWidth
               16,               //nHeight
               hWnd,             //hWndParent
               IDC_SHOWPASS,     //ID
               hInstanceDLL,     //hInstance
               0                 //lpParam
            );
            setWindowFontAndText(hWndShowPass, hGuiFont, _localize("&Show password"));
            var sp = showPassword === undefined
               ? saveOptions
                  ? pref("showPassword", 1 /*PO_DWORD*/) == 1
                  : false
               : showPassword;
            checked(hWndShowPass, sp);
            setShowPass(sp, direction ? !direction.value : !decrypt);

            // OK button window
            hWndOK = createWindowEx(
               0,                //dwExStyle
               "BUTTON",         //lpClassName
               0,                //lpWindowName
               0x50010001,       //WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON
               13,               //x
               178 + addY - p2h, //y
               107,              //nWidth
               23,               //nHeight
               hWnd,             //hWndParent
               IDC_OK,           //ID
               hInstanceDLL,     //hInstance
               0                 //lpParam
            );
            setWindowFontAndText(hWndOK, hGuiFont, _localize("OK"));

            // Cancel button window
            hWndCancel = createWindowEx(
               0,                //dwExStyle
               "BUTTON",         //lpClassName
               0,                //lpWindowName
               0x50010000,       //WS_VISIBLE|WS_CHILD|WS_TABSTOP
               132,              //x
               178 + addY - p2h, //y
               107,              //nWidth
               23,               //nHeight
               hWnd,             //hWndParent
               IDC_CANCEL,       //ID
               hInstanceDLL,     //hInstance
               0                 //lpParam
            );
            setWindowFontAndText(hWndCancel, hGuiFont, _localize("Cancel"));

            oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_PASS, 0);

            //centerWindow(hMainWnd, hWnd);
            centerWindow(null, hWnd);
         break;
         case 7: //WM_SETFOCUS
            var hWndFocus = hWndPass;
            if(direction) {
               if(checked(hWndEncrypt))      hWndFocus = hWndEncrypt;
               else if(checked(hWndDecrypt)) hWndFocus = hWndDecrypt;
            }
            oSys.Call("user32::SetFocus", hWndFocus);
         break;
         case 256: //WM_KEYDOWN
            if(wParam == 27) //VK_ESCAPE
               oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_CANCEL, 0);
            else if(wParam == 13) //VK_RETURN
               oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, IDC_OK, 0);
         break;
         case 273: //WM_COMMAND
            switch(wParam & 0xffff) {
               case IDC_OK:
                  oSys.Call("user32::GetWindowText" + _TCHAR, hWndPass, lpBuffer, 256);
                  var pass1 = AkelPad.MemRead(lpBuffer, _TSTR);
                  if(!pass1)
                     break;
                  var showPass = checked(hWndShowPass);
                  var enc = direction ? checked(hWndEncrypt) : !decrypt;
                  if(!showPass && enc) {
                     oSys.Call("user32::GetWindowText" + _TCHAR, hWndPass2, lpBuffer, 256);
                     var pass2 = AkelPad.MemRead(lpBuffer, _TSTR);
                     if(pass1 != pass2) {
                        AkelPad.MessageBox(
                           hWnd,
                           _localize("Passwords do not match!"),
                           WScript.ScriptName,
                           16 /*MB_ICONERROR*/
                        );
                        break;
                     }
                  }
                  if(direction && !readRadiosState())
                     break;
                  saveOptions && pref("showPassword", 1 /*PO_DWORD*/, Number(showPass));
                  pass = pass1;
                  closeDialog();
               break;
               case IDC_CANCEL:
                  closeDialog();
               break;
               case IDC_SHOWPASS:
               case IDC_ENCRYPT:
               case IDC_DECRYPT:
                  setShowPass(checked(hWndShowPass), direction ? checked(hWndEncrypt) : !decrypt);
               break;
               case IDC_PASS:
               case IDC_PASS2:
                  var hasPass = oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWndPass) > 0;
                  enabled(hWndOK,    hasPass);
                  enabled(hWndPass2, hasPass);
            }
         break;
         case 16: //WM_CLOSE
            modal && enabled(hMainWnd, true); // Enable main window
            oSys.Call("user32::DestroyWindow", hWnd); // Destroy dialog
         break;
         case 2: //WM_DESTROY
            oSys.Call("user32::PostQuitMessage", 0); // Exit message loop
      }
      return 0;
   }
   function centerWindow(hWndParent, hWnd) {
      var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
      if(!lpRect)
         return;
      if(!hWndParent)
         hWndParent = oSys.Call("user32::GetDesktopWindow");
      oSys.Call("user32::GetWindowRect", hWndParent, lpRect);
      var rcWndParent = parseRect(lpRect);
      oSys.Call("user32::GetWindowRect", hWnd, lpRect);
      var rcWnd = parseRect(lpRect);
      var x = rcWndParent.left + ((rcWndParent.right  - rcWndParent.left) / 2 - (rcWnd.right  - rcWnd.left) / 2);
      var y = rcWndParent.top  + ((rcWndParent.bottom - rcWndParent.top)  / 2 - (rcWnd.bottom - rcWnd.top)  / 2);
      oSys.Call("user32::SetWindowPos", hWnd, 0, x, y, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
      AkelPad.MemFree(lpRect);
   }
   function parseRect(lpRect) {
      return {
         left:   AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/),
         top:    AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/),
         right:  AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/),
         bottom: AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/)
      };
   }
   function readRadiosState() {
      if(checked(hWndEncrypt))
         direction.value = false;
      else if(checked(hWndDecrypt))
         direction.value = true;
      else
         return false;
      return true;
   }
   function checked(hWnd, val) {
      return arguments.length == 1
         ? AkelPad.SendMessage(hWnd, 240 /*BM_GETCHECK*/, 0, 0)
         : AkelPad.SendMessage(hWnd, 241 /*BM_SETCHECK*/, val ? 1 /*BST_CHECKED*/ : 0, 0);
   }
   function enabled(hWnd, val) {
      oSys.Call("user32::EnableWindow", hWnd, val);
   }
   function showWindow(hWnd, val) {
      oSys.Call("user32::ShowWindow", hWnd, val);
   }
   function closeDialog() {
      oSys.Call("user32::PostMessage" + _TCHAR, hWndDialog, 16 /*WM_CLOSE*/, 0, 0);
   }
   function setShowPass(showPass, showSecondField) {
      showSecondField = !showPass && showSecondField;
      hWndPass2Label && showWindow(hWndPass2Label, showSecondField);
      hWndPass2      && showWindow(hWndPass2,      showSecondField);
      if(!setShowPass.passChar)
         setShowPass.passChar = AkelPad.SendMessage(hWndPass, 0x00D2/*EM_GETPASSWORDCHAR*/, 0, 0) || 0x002A;
      var passChar = showPass ? 0 : setShowPass.passChar;
      AkelPad.SendMessage(hWndPass, 0x00CC/*EM_SETPASSWORDCHAR*/, passChar, 0);
      oSys.Call("user32::InvalidateRect", hWndPass, 0, 1/*TRUE*/);
   }

   function Scale(hDC, hWnd) {
      var hNewDC = hDC || oSys.Call("user32::GetDC", hWnd);
      if(hNewDC) {
         this._x = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 88 /*LOGPIXELSX*/);
         this._y = oSys.Call("gdi32::GetDeviceCaps", hNewDC, 90 /*LOGPIXELSY*/);

         //Align to 16 pixel
         this._x += this._x % 16;
         this._y += this._y % 16;

         !hDC && oSys.Call("user32::ReleaseDC", hWnd, hNewDC);

         this.x = function(x) {
            return oSys.Call("kernel32::MulDiv", x, this._x, 96);
         };
         this.y = function(y) {
            return oSys.Call("kernel32::MulDiv", y, this._y, 96);
         };
      }
      else {
         this.x = this.y = function(n) {
            return n;
         };
      }
   }
   function createWindowEx(
      dwExStyle, lpClassName, lpWindowName, dwStyle,
      x, y, w, h,
      hWndParent, id, hInstance, callback
   ) {
      return oSys.Call(
         "user32::CreateWindowEx" + _TCHAR,
         dwExStyle,
         lpClassName,
         lpWindowName,
         dwStyle,
         scale.x(x),
         scale.y(y),
         scale.x(w),
         scale.y(h),
         hWndParent,
         id,
         hInstance,
         callback || 0
      );
   }

   modal && enabled(hMainWnd, false); // Disable main window, to make dialog modal

   AkelPad.ScriptNoMutex(); // Allow other scripts running
   AkelPad.WindowGetMessage(); // Message loop

   AkelPad.MemFree(lpBuffer);
   AkelPad.WindowUnregisterClass(dialogClass);
   return pass;
}

function getAllText() {
   if(typeof AkelPad.GetTextRange != "undefined")
      return AkelPad.GetTextRange(0, -1);
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return "";
   setRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

   var columnSel = AkelPad.SendMessage(hWndEdit, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0);
   var ss = AkelPad.GetSelStart();
   var se = AkelPad.GetSelEnd();

   AkelPad.SetSel(0, -1);
   var str = AkelPad.GetSelText();

   AkelPad.SetSel(ss, se);
   columnSel && AkelPad.SendMessage(hWndEdit, 3128 /*AEM_UPDATESEL*/, 0x1 /*AESELT_COLUMNON*/, 0);

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   AkelPad.MemFree(lpPoint);
   setRedraw(hWndEdit, true);
   return str;
}
function insertNoScroll(str, selectAll) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return;
   setRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

   selectAll && AkelPad.SetSel(0, -1);
   //var ss = AkelPad.GetSelStart();
   AkelPad.ReplaceSel(str, true);
   //if(ss != AkelPad.GetSelStart())
   //   AkelPad.SetSel(ss, ss + str.length);

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   setRedraw(hWndEdit, true);
   AkelPad.MemFree(lpPoint);
}
function setRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
function pref(name, type, val) {
   var oSet = AkelPad.ScriptSettings();
   if(arguments.length == 3) {
      if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
         return false;
      var ok = oSet.Write(name, type, val);
      oSet.End();
      return ok;
   }
   if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
      return undefined;
   var ret = oSet.Read(name, type || 1 /*PO_DWORD*/);
   oSet.End();
   return ret;
}
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> (see crypt.js)
Encrypt/decrypt text using AES-256.
It can be very slow, be careful.


Last edited by Infocatcher on Fri May 11, 2012 6:04 pm; edited 4 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Sun Jan 30, 2011 11:05 pm    Post subject: Reply with quote

insertTag.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11213#11213
// http://infocatcher.ucoz.net/js/akelpad_scripts/insertTag.js

// (c) Infocatcher 2009-2012
// version 0.2.4 - 2012-09-17

//===================
// Simplify tags insertion.
// By default ask user for tag and insert
// <tag>{selected_text}</tag>

// Arguments:
//   -bbcode=0                            - Use <tag>
//          =1                            - Use [tag]
//          =-1                           - Autodetection
//   -xmlExts="[sx]html?|mht(ml)?|xml"    - Mask for file extension or Coder plugin alias (for -bbcode=-1)
//   -clip=true                           - Use text from clipboard instead of selected text
//   -selectMode=0                        - Select all inserted text: [<tag>text</tag>]
//              =1                        - Select text inside tags:  <tag>[text]</tag>
//   -tag="div"                           - Don't ask tag
//   -template="<a href=\"%%|\">%%S</a>"  - Use template (and ignore all other arguments)
//   -saveLastTag=0                       - don't save last used tag
//               =1                       - save only typed (default)
//               =2                       - always save

// Special variables in templates:
//   %|  - selection start or end
//   %S  - selected text
//   %C  - clipboard text
//   %SC - selected text or clipboard text
//   %CS - clipboard text or selected text

// Usage:
//   Call("Scripts::Main", 1, "insertTag.js")
//   Call("Scripts::Main", 1, "insertTag.js", `-bbcode=1 -tag="quote"`)
//   Call("Scripts::Main", 1, "insertTag.js", `'-template="<a href=\"%%C\">%%|%%S%%|</a>"'`)
//===================

function _localize(s) {
   var strings = {
      "Tag:": {
         ru: "Тэг:"
      }
   };
   var lng = "en";
   switch(AkelPad.GetLangId(1 /*LANGID_PRIMARY*/)) {
      case 0x19: lng = "ru";
   }
   _localize = function(s) {
      return strings[s] && strings[s][lng] || s;
   };
   return _localize(s);
}

// Read arguments:
// getArg(argName, defaultValue)
var useBBCode    = getArg("bbcode", -1);
var xmlExts      = getArg("xmlExts", "[xs]?html?|mht(ml)?|hta|asp|jsm?|css|xml|axl|dxl|fb2|kml|manifest|msc|ndl|rdf|rss|svg|user|wsdl|xaml|xmp|xsd|xslt?|xul|resx|v[cbd]proj|csproj|wx[ils]|wixobj|wixout|wixlib|wixpdb|wixmsp|wixmst");
var useClipboard = getArg("clip", false);
var selectMode   = getArg("selectMode", 0);
var tag          = getArg("tag"); // Override tag prompt
var template     = getArg("template"); // Use template and ignore all arguments except -bbcode=-1 (and -xmlExts)
var saveLastTag  = getArg("saveLastTag", 1);


var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit))
   insertTag();

function insertTag() {
   var txt, ss, se;
   if(template) {
      // Example: <a href="%C">%|%S%|</a>
      if(useBBCode == -1) {
         template = detectBBCode()
            ? template.replace(/</g, "[").replace(/>/g, "]")
            : template.replace(/\[/g, "<").replace(/\]/g, ">");
      }

      var rnd = function() {
         return Math.random().toString(36).substr(2) + Math.random().toString(36).substr(2);
      };
      var posMarker = rnd();
      var percent   = rnd();

      var sel  = /%C?S/.test(template) && AkelPad.GetSelText();
      var clip = /%S?C/.test(template) && AkelPad.GetClipboardText();

      txt = template
         .replace(/%%/g, percent)
         .replace(/%\|/g, posMarker)
         .replace(/%SC/g, sel || clip)
         .replace(/%CS/g, clip || sel)
         .replace(/%S/g, sel)
         .replace(/%C/g, clip)
         .replace(new RegExp(percent, "g"), "%");

      var posMarkerRe = new RegExp(posMarker);
      if(posMarkerRe.test(txt)) {
         ss = se = AkelPad.GetSelStart() + RegExp.leftContext.length;
         txt = RegExp.leftContext + RegExp.rightContext;
      }
      if(posMarkerRe.test(txt)) {
         se = AkelPad.GetSelStart() + RegExp.leftContext.length;
         txt = RegExp.leftContext + RegExp.rightContext;
      }
   }
   else {
      txt = useClipboard
         ? AkelPad.GetClipboardText()
         : AkelPad.GetSelText();
      var hasTxt = !!txt;

      if(!tag) {
         var tagTyped = true;
         tag = AkelPad.InputBox(
            hMainWnd,
            WScript.ScriptName,
            _localize("Tag:"),
            saveLastTag && pref("lastTag", 3 /*PO_STRING*/) || ""
         );
      }
      if(!tag)
         return;
      if(saveLastTag && (tagTyped || saveLastTag == 2))
         pref("lastTag", 3 /*PO_STRING*/, tag);

      if(tagTyped) {
         var first = tag.charAt(0);
         if(first == "<" || first == "[") {
            useBBCode = first == "[";
            tag = tag.substr(1);
         }
      }

      if(useBBCode == -1)
         useBBCode = detectBBCode();

      var attrs = /^([^\s=]+)([\s=].*)$/.test(tag) ? RegExp.$2 : "";
      if(attrs)
         tag = RegExp.$1;

      var sTag = (useBBCode ? "["  : "<")  + tag + attrs + (useBBCode ? "]" : ">");
      var eTag = (useBBCode ? "[/" : "</") + tag         + (useBBCode ? "]" : ">");
      txt = sTag + txt + eTag;

      if(!hasTxt || selectMode == 1) {
         var _ss = AkelPad.GetSelStart();
         ss = _ss + sTag.length;
         se = _ss + txt.length - eTag.length;
      }
   }
   insertNoScroll(txt, ss, se);
}
function detectBBCode() {
   var file = AkelPad.GetEditFile(0);
   if(!file)
      file = getCoderAlias();
   else if(/\.[^.]*$/.test(file))
      file = RegExp.lastMatch;
   return !new RegExp("\\.(" + xmlExts + ")$", "i").test(file);
}
function getCoderAlias() {
   // http://akelpad.sourceforge.net/forum/viewtopic.php?p=19363#19363
   var hWndEdit = AkelPad.GetEditWnd();
   var hDocEdit = AkelPad.GetEditDoc();
   var pAlias = "";
   if(hWndEdit && hDocEdit) {
      var lpAlias = AkelPad.MemAlloc(256 * 2 /*sizeof(wchar_t)*/);
      if(lpAlias) {
         AkelPad.CallW("Coder::Settings", 18 /*DLLA_CODER_GETALIAS*/, hWndEdit, hDocEdit, lpAlias, 0);
         pAlias = AkelPad.MemRead(lpAlias, 1 /*DT_UNICODE*/);
         AkelPad.MemFree(lpAlias);
      }
   }
   return pAlias;
}

function insertNoScroll(str, ss, se) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return;
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);
   setRedraw(hWndEdit, false);

   //var ss = AkelPad.GetSelStart();
   AkelPad.ReplaceSel(str, true);
   //if(ss != AkelPad.GetSelStart())
   //   AkelPad.SetSel(ss, ss + str.length);

   if(ss != undefined || se != undefined) {
      if(ss == undefined) ss = AkelPad.GetSelStart();
      if(se == undefined) se = AkelPad.GetSelEnd();
      AkelPad.SetSel(ss, se);
   }

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   setRedraw(hWndEdit, true);
   AkelPad.MemFree(lpPoint);
}
function setRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}

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);
}
function pref(name, type, val) {
   var oSet = AkelPad.ScriptSettings();
   if(arguments.length == 3) {
      if(!oSet.Begin(WScript.ScriptBaseName, 0x2 /*POB_SAVE*/))
         return false;
      var ok = oSet.Write(name, type, val);
      oSet.End();
      return ok;
   }
   if(!oSet.Begin(WScript.ScriptBaseName, 0x1 /*POB_READ*/))
      return undefined;
   var ret = oSet.Read(name, type || 1 /*PO_DWORD*/);
   oSet.End();
   return ret;
}
<download>
Simplify tags insertion.
By default ask user for tag and insert
<tag>{selected_text}</tag>


Last edited by Infocatcher on Mon Sep 17, 2012 5:32 pm; edited 4 times in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Tue Feb 01, 2011 6:43 pm    Post subject: Reply with quote

replaceDiacriticLetters.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11240#11240

// (c) Infocatcher 2008, 2011-2012
// version 0.1.2 - 2012-12-11

var map = {
   "à": "a",
   "À": "A",
   "á": "a",
   "Á": "A",
   "â": "a",
   "Â": "A",
   "ã": "a",
   "Ã": "A",
   "ä": "a",
   "Ä": "A",
   "å": "a",
   "Å": "A",
   "æ": "ae",
   "Æ": "AE",
   "ç": "c",
   "Ç": "C",
   "È": "E",
   "è": "e",
   "é": "e",
   "É": "E",
   "ê": "e",
   "Ê": "E",
   "ë": "e",
   "Ë": "E",
   "Ì": "I",
   "ì": "i",
   "í": "i",
   "Í": "I",
   "î": "i",
   "Î": "I",
   "Ï": "I",
   "ï": "i",
   "Ð": "D",
   "ð": "d",
   "ñ": "n",
   "Ñ": "N",
   "Ò": "O",
   "ò": "o",
   "Ó": "O",
   "Ó": "O",
   "ó": "o",
   "ó": "o",
   "ô": "o",
   "Ô": "O",
   "Õ": "O",
   "õ": "o",
   "ö": "o",
   "Ö": "O",
   "ù": "u",
   "Ù": "U",
   "Ú": "U",
   "ú": "u",
   "û": "u",
   "Û": "U",
   "ü": "u",
   "Ü": "U",
   "ý": "y",
   "Ý": "Y",
   "ÿ": "y",
   "Ÿ": "Y",
   "ā": "a",
   "Ā": "A",
   "ă": "a",
   "Ă": "A",
   "Ą": "A",
   "Ą": "A",
   "ą": "a",
   "ą": "a",
   "Ć": "C",
   "ć": "c",
   "Ć": "C",
   "ć": "c",
   "ĉ": "c",
   "Ĉ": "C",
   "Ċ": "C",
   "ċ": "c",
   "č": "c",
   "Č": "C",
   "ď": "d",
   "Ď": "D",
   "Đ": "D",
   "đ": "d",
   "Ē": "E",
   "ē": "e",
   "ĕ": "e",
   "Ĕ": "E",
   "ė": "e",
   "Ė": "E",
   "ę": "e",
   "Ę": "E",
   "Ę": "E",
   "ę": "e",
   "Ě": "E",
   "ě": "e",
   "ĝ": "g",
   "Ĝ": "G",
   "ğ": "g",
   "Ğ": "G",
   "ġ": "g",
   "Ġ": "G",
   "ģ": "g",
   "Ģ": "G",
   "Ĥ": "H",
   "ĥ": "h",
   "ħ": "h",
   "Ħ": "H",
   "ĩ": "i",
   "Ĩ": "I",
   "ī": "i",
   "Ī": "I",
   "Ĭ": "I",
   "ĭ": "i",
   "Į": "I",
   "į": "i",
   "İ": "I",
   "ı": "i",
   "ij": "ij",
   "IJ": "IJ",
   "ĵ": "j",
   "Ĵ": "J",
   "ķ": "k",
   "Ķ": "K",
   "ĸ": "k",
   "ĺ": "l",
   "Ĺ": "L",
   "Ļ": "L",
   "ļ": "l",
   "Ľ": "L",
   "ľ": "l",
   "Ŀ": "L",
   "ŀ": "l",
   "Ł": "L",
   "ł": "l",
   "Ł": "L",
   "ł": "l",
   "ń": "n",
   "Ń": "N",
   "ń": "n",
   "Ń": "N",
   "ņ": "n",
   "Ņ": "N",
   "ň": "n",
   "Ň": "N",
   "ʼn": "n",
   "Ō": "O",
   "ō": "o",
   "Ŏ": "O",
   "ŏ": "o",
   "ő": "o",
   "Ő": "O",
   "œ": "oe",
   "Œ": "OE",
   "Ŕ": "R",
   "ŕ": "r",
   "ŗ": "r",
   "Ŗ": "R",
   "ř": "r",
   "Ř": "R",
   "Ś": "S",
   "ś": "s",
   "ś": "s",
   "Ś": "S",
   "ŝ": "s",
   "Ŝ": "S",
   "ş": "s",
   "Ş": "S",
   "š": "s",
   "Š": "S",
   "Ţ": "T",
   "ţ": "t",
   "ť": "t",
   "Ť": "T",
   "ŧ": "t",
   "Ŧ": "T",
   "ũ": "u",
   "Ũ": "U",
   "Ū": "U",
   "ū": "u",
   "ŭ": "u",
   "Ŭ": "U",
   "ů": "u",
   "Ů": "U",
   "Ű": "U",
   "ű": "u",
   "Ų": "U",
   "ų": "u",
   "ŵ": "w",
   "Ŵ": "W",
   "ŷ": "Y",
   "Ŷ": "Y",
   "Ź": "Z",
   "Ź": "Z",
   "ź": "z",
   "ź": "z",
   "ż": "z",
   "Ż": "Z",
   "Ż": "Z",
   "ż": "z",
   "ž": "z",
   "Ž": "Z",
   "ƀ": "b",
   "ƈ": "c",
   "Ƈ": "C",
   "ƒ": "f",
   "Ƒ": "F",
   "Ƙ": "K",
   "ƙ": "k",
   "ơ": "o",
   "Ơ": "O",
   "ƥ": "p",
   "Ƥ": "P",
   "ƫ": "t",
   "ƭ": "t",
   "Ƭ": "T",
   "Ư": "U",
   "ư": "u",
   "Ƶ": "Z",
   "ƶ": "z",
   "DŽ": "DZ",
   "Dž": "Dz",
   "dž": "dz",
   "Lj": "Lj",
   "LJ": "LJ",
   "lj": "lj",
   "Nj": "Nj",
   "nj": "nj",
   "NJ": "NJ",
   "ǎ": "a",
   "Ǎ": "A",
   "ǐ": "i",
   "Ǐ": "I",
   "Ǒ": "O",
   "ǒ": "o",
   "Ǔ": "U",
   "ǔ": "u",
   "ǖ": "u",
   "Ǖ": "U",
   "ǘ": "u",
   "Ǘ": "U",
   "Ǚ": "U",
   "ǚ": "u",
   "Ǜ": "U",
   "ǜ": "u",
   "ǝ": "e",
   "ǟ": "a",
   "Ǟ": "A",
   "ǡ": "a",
   "Ǡ": "A",
   "ǣ": "ae",
   "Ǣ": "AE",
   "ǥ": "g",
   "Ǥ": "G",
   "ǧ": "g",
   "Ǧ": "G",
   "ǩ": "k",
   "Ǩ": "K",
   "ǫ": "o",
   "Ǫ": "O",
   "ǭ": "o",
   "Ǭ": "O",
   "Ǯ": "Z",
   "ǰ": "J",
   "ǯ": "z",
   "DZ": "DZ",
   "Dz": "Dz",
   "dz": "dz",
   "Ǵ": "G",
   "ǵ": "g",
   "Ǻ": "A",
   "ǻ": "a",
   "Ǽ": "AE",
   "ǽ": "ae",
   "Ǿ": "O",
   "ǿ": "o",
   "Ȁ": "A",
   "ȁ": "a",
   "Ȃ": "A",
   "ȃ": "a",
   "Ȅ": "E",
   "ȅ": "e",
   "Ȇ": "E",
   "ȇ": "e",
   "ȉ": "i",
   "Ȉ": "I",
   "Ȋ": "I",
   "ȋ": "i",
   "Ȍ": "O",
   "ȍ": "o",
   "ȏ": "o",
   "Ȏ": "O",
   "Ȑ": "R",
   "ȑ": "r",
   "Ȓ": "R",
   "ȓ": "r",
   "ȕ": "u",
   "Ȕ": "U",
   "ȗ": "u",
   "Ȗ": "U",
   "ɐ": "a",
   "ɑ": "a",
   "ɒ": "a",
   "Ɓ": "B",
   "Ɖ": "D",
   "ɖ": "d",
   "Ɗ": "D",
   "ɗ": "d",
   "ɛ": "e",
   "Ɠ": "G",
   "Ʀ": "R",
   "Ʈ": "T",
   "ʤ": "dz",
   "ʣ": "dz",
   "ʥ": "dz",
   "ʦ": "ts",
   "ʧ": "tf",
   "ΐ": "i",
   "Ά": "A",
   "Έ": "E",
   "Ή": "H",
   "Ί": "I",
   "ϊ": "i",
   "ϋ": "u",
   "Ό": "O",
   "ό": "o",
   "ύ": "u",
   "Ύ": "Y",
   "і": "i",
   "ї": "i",
   "ј": "j",
   "ќ": "k",
   "ў": "y",
   "ӑ": "a",
   "Ӑ": "A",
   "Ӓ": "A",
   "ӓ": "a",
   "ӕ": "ae",
   "Ӕ": "AE",
   "Ӗ": "E",
   "ӗ": "e"
};

function replaceLetters(str) {
   for(var s in map)
      str = str.replace(new RegExp(s, "g"), map[s]);
   return str;
}

var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var oSys = AkelPad.SystemFunction();

if(hMainWnd && !AkelPad.GetEditReadOnly(hWndEdit)) {
   var text = AkelPad.GetSelText();
   if(!text) {
      var selectAll = true;
      text = AkelPad.GetTextRange(0, -1);
   }
   var res = replaceLetters(text);
   if(res != text)
      insertNoScroll(res, selectAll);
}

function insertNoScroll(str, selectAll) {
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if(!lpPoint)
      return;
   setRedraw(hWndEdit, false);
   AkelPad.SendMessage(hWndEdit, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

   selectAll && AkelPad.SetSel(0, -1);
   //var ss = AkelPad.GetSelStart();
   AkelPad.ReplaceSel(str, true);
   //if(ss != AkelPad.GetSelStart())
   //   AkelPad.SetSel(ss, ss + str.length);

   AkelPad.SendMessage(hWndEdit, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
   setRedraw(hWndEdit, true);
   AkelPad.MemFree(lpPoint);
}
function setRedraw(hWnd, bRedraw) {
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}
<download>
Updated version of old script.


Last edited by Infocatcher on Tue Dec 11, 2012 5:14 pm; edited 1 time in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Wed Feb 02, 2011 12:11 am    Post subject: Reply with quote

jsBeautifier.js <download | mirror | development version>
JavaScript unpacker and beautifier, based on code from http://jsbeautifier.org/.
Additionally can unpack HTML with scripts and styles inside.

Post size limit, here is packed file:
jsBeautifier.uue
Code:
begin 644 jsBeautifier.7z
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
21_J[<OQ'S@$5!@$`(```````
`
end
sum -r/size 63613/29178

Save as text file with .uue extension, unpack with Total Commander or WinRAR. And unpack .7z with WinRAR or 7-Zip. Smile


Last edited by Infocatcher on Fri May 03, 2013 1:02 pm; edited 44 times in total
Back to top
View user's profile Send private message
Andrey_A_A



Joined: 03 Jun 2010
Posts: 477
Location: Сочи, Хоста

PostPosted: Wed Feb 02, 2011 2:16 pm    Post subject: Reply with quote

OpenFileNameFromBuffer.vbs

Code:
' OpenFileNameFromBuffer.vbs
'========================   Описание   =====================================
' Открыть файл, имя/путь которого, находится в выделении или в буфере обмена
' - можно скопировать/выделить кнопку/пункт меню AkelPad, Total Commander ...
' - можно скопировать/выделить пути с абсолютными именами
' - можно скопировать/выделить строку со всяким "лишним мусором" в котором есть имя/путь для открытия
' (если ни в выделении, ни в буфере ничего нет ничего подходящего - поиск имени производится во всей строке...)
'====================  Как работает скрипт  ================================
' из выделенной/отправленной в буфер строки извлекается имя/путь скрипта/файла
' и далее имя проверяется в указанных папках и открывается в AkelPad
' (если такого нет в папках - выдаётся сообщение
'=======================  Дополнение =======================================
' Вы можете удалить/внести свои условия/адреса поиска в скрипте
' используется Functions.vbs, который следует положить ...AkelFiles\Plugs\Scripts\Include\
'=========================    Пример    ====================================
' -"Открыть выделенное имя/путь файла или из буфера" Call("Scripts::Main", 1, "OpenFileNameFromBuffer.vbs")

' используется Functions.vbs, который следует положить в ...AkelFiles\Plugs\Scripts\Include\

' Автор:           Аверин Андрей
' Версия:          1.8 (10.10.2010 - 19.08.2012)
' Mail:            Averin-And@yandex.ru
' Site:            http://tc-image.3dn.ru/forum/9-391-1166-16-1333732766
' Site:            http://akelpad.sourceforge.net/forum/viewtopic.php?p=11255#11255
'===========================================================================
Count = 1 : Call TestingPath

Sub TestingPath
  With AkelPad Text = .GetSelText()
    If Count = 0 Then : Text = ClearNameOrPath(GetLine) : Count = 2 : End If
    If Len(Text) = 0 And Count = 1 Then : Text = .GetClipboardText() : Count = 0 : End If
    If Len(Text) = 0 Then MsBoxErr
    nSelStart = .GetSelStart()
    If InStr(Text, vbNewLine) > 0 Then : sText = Split(Text, vbNewLine) : pText = sText(0) : Else : pText = Text : End If
    Call .Include("Functions.vbs")
  End With
  If CreateObject("Scripting.FileSystemObject").FileExists(pText) Then OpenFF(pText)
  If pText = "TOTALCMD#BAR#DATA" Then pText = sText(1) ' если выделена в буфер кнопка Total Commander
  pText = ClearNameOrPath(pText)
  If Len(pText) = 0 Then Call MsBoxErr
  If InStr(UCase(pText), "AU3") = 0 Then pText = ClearEndLine(pText, "0123456789")
  pText = ReplaceSymPath(pText)

  If Instr(pText, "\") > 0 And Instr(pText, ".") > 0 Then
    If Left(pText, 1) = "%" Then pText = GetPath(pText) ' если путь содержит переменные окружения
    If CreateObject("Scripting.FileSystemObject").FileExists(pText) Then
      OpenFF(pText)
    Else
      If Instr(pText, ".") = InstrRev(pText, ".") Then OpenFF(RunPath(pText)) : Call MsBoxErr
    End If
  Else
    If Instr(pText, ".") = InstrRev(pText, ".") Then OpenFF(RunPath(pText)) : Call MsBoxErr
  End If
End Sub

Sub OpenFF(Name) : Call AkelPad.OpenFile(Name) : Wscript.Quit : End Sub

' функция проверки нахождения имени файла в указанных папках
' удалите ненужные и вставьте свои папки
Function RunPath(FName)
  With AkelPad
    P0 = .GetAkelDir(0) & "\" : P1 = .GetAkelDir(1) & "\" : P2 = .GetAkelDir(2) & "\"
    P4 = .GetAkelDir(4) & "\" : P5 = .GetAkelDir(5) & "\" : P6 = .GetAkelDir(6) & "\"
  End With
  TC =  GetPath("%COMMANDER_PATH%") & "\" : TCF = TC & "Files\" : TU =  TC & "Utilities\"
  TCFL = TCF & "Lists\" : TCC = TC & "Scripts\" : TCB = TC & "Bar\"
  PT = P4 & "Templates\" : TM = TC & "0\" : TS = TM & "Script_Site\"
  WD = GetPath("%WINDIR%") & "\"
  APath = Array(P0, P0 & "Help", P1 & "List", P2, P4, P4 & "AkelMenu", P4 & "AutoComplete",_
          P4 & "AkelMenu", P4 & "Coder", P4 & "Sessions", P4 & "SpellCheck", P4 & "Templates",_
          PT & "AkelPad", PT & "Asp", PT & "Asp.net", PT & "Assemblers", PT & "Batch",_
          PT & "C-Language", PT & "Css", PT & "Html", PT & "Pascal", PT & "Xml", P5,_
          P5 & "Include", P5 & "Include\win32", P5 & "Params", P5 & "Params\ShowMenuEx",_
          P5 & "Params\ShowMenuAlt", P5 & "ShowMenu", P5 & "win32lib", P6, TC, TC & "Language",_
          TC & "Keys", TCB, TCB & "Bars", TCB & "Bars_Plus", TCB & "Filter", TCF & "ExtProgram", _
          TCB & "Font", TCB & "Rename", TCB & "Search", TCB & "Select", TCB & "Start_Menu", _
          TCF, TCF & "Bat", TCF & "Comands", TCF & "Ncl", TCF & "Tab", TCF & "HTML",_
          TCF & "Help\TCInfo",  TCFL & "Collection", TCFL & "CreateMenu", TCFL & "Lst", _
          TCFL & "MarkerList", TCFL & "MusicList", TCFL & "PathList", TCFL & "Play", _
          TCFL & "ProgramList", TCFL & "ReportList", TCFL & "StatisticFile", _
          TCC & "AddIcons", TCC & "Attributes", TCC & "Buffer", TCC & "Copy", TCC & "CreateBar", _
          TCC & "CreateLists", TCC & "CreateRegistration", TCC & "FileEditing", TCC & "Filters", _
          TCC & "Folders", TCC & "ImageWSH", TCC & "Include", TCC & "Keyboard", TCC & "Link", _
          TCC & "Marker", TCC & "Miscellanea", TCC & "Move", TCC & "Panel", TCC & "Plus", _
          TCC & "ReNames", TCC & "Run", TCC & "Searches", TCC & "SysScript", TCC & "NetWork", _
          TCC & "TextWork", TCC & "Un-Packing", WD, WD & "system32", "c:\MyFiles",_
          TS & "N_V", TS & "S", TS & "V", TU & "Inet\WGet", P1 & "Regs")
  p = 0
  For ii = 0 To Ubound(APath)
    PF = Trim(APath(ii) & "\" & FName)
    If CreateObject("Scripting.FileSystemObject").FileExists(PF) Then : RunPath = PF : p = 1 : Exit For : End If
  Next
  If p = 0 Then MsBoxErr
End Function

Sub MsBoxErr
  If Count = 1 Then
    Call AkelPad.SetSel(nSelStart, nSelStart) : Call TestingPath
  Else
    If Count = 0 Then
      Call TestingPath
    Else
      MsgBox "Ни в выделении ни в буфере обмена" & vbNewLine &_
      "Нет корректного ИМЕНИ / ПУТИ файла для открытия" & vbNewLine &_
      "или такого файла нет в папках, указанных в скрипте" & vbNewLine &_
      "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" & vbNewLine &_
      "Выделите или скопируйте чего-нибудь подходящее" & vbNewLine &_
      "И повторите попытку " , vbApplicationModal & vbExclamation,_
      "Открытие файла, путь/имя которого скопирован или выделен" : Wscript.Quit
    End If
  End If
End Sub




используется: Functions.vbs


Last edited by Andrey_A_A on Thu Sep 13, 2012 2:43 am; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Andrey_A_A



Joined: 03 Jun 2010
Posts: 477
Location: Сочи, Хоста

PostPosted: Wed Feb 02, 2011 3:47 pm    Post subject: Reply with quote

DublicateFile.vbs

Code:
' DublicateFile.vbs
'========================   Описание   =====================================
' Создание дубликата файла в той же папке и его открытие с добавлением счетчика _N
'
' Call("Scripts::Main", 1, "DublicateFile.vbs")
' предлагаемая горячая клавиша Alt + F5

' Автор:           Аверин Андрей
' Версия:          1.3 (22.11.2010 - 01.05.2012)
' Mail:            Averin-And@yandex.ru
' Site:            http://tc-image.3dn.ru/forum/9-354-1087-16-1333507842
' Site:            http://akelpad.sourceforge.net/forum/viewtopic.php?p=11259#11259
'===========================================================================
File = AkelPad.GetEditFile(0)
If AkelPad.GetEditWnd() = 0 Or Len(File) = 0 Then WScript.Quit
With CreateObject("Scripting.FileSystemObject")
  Path  = .GetParentFolderName(File) & "\"
  Name = .GetBaseName(File)
  Ext = "." & .GetExtensionName(File)
  FPath = Path  & Name & Ext
  Do While .FileExists(FPath)
      i = i + 1 : FPath = Path & Name & "_" & (i Mod 10) & Ext
  Loop
  If .FileExists(File) Then .CopyFile File, FPath
  AkelPad.OpenFile(FPath)
End With



Иконка к скрипту:
DublicateFile.b64

Code:
MIME-Version: 1.0
Content-Type: application/octet-stream; name="DublicateFile.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="DublicateFile.zip"

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
BgAAAAABAAEAPwAAABgJAAAAAA==



Last edited by Andrey_A_A on Thu Sep 13, 2012 2:45 am; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2507
Location: Киев, Русь

PostPosted: Thu Feb 03, 2011 7:37 am    Post subject: Reply with quote

SmartBackspace.js

Code:
///Deleting block of whitespaces; for other characters - a usual deleting (1 symbol)
/// Удаляет пробелы блоками (количество пробелов в блоке берётся из настроек программы);
/// для других символов - обычное удаление (посимвольно)
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11267#11267
// Version: 2.0 (2011.01.21) - 2.2 (2011.01.26) by VladSh
// Version: 1.0 by lexa
// Предлагаемая комбинация клавиш:   Shift+Alt+Backspace

var nPosCurrent = AkelPad.GetSelStart();
if (!nPosCurrent) WScript.Quit();

if (nPosCurrent == AkelPad.GetSelEnd())
{
   var hWndEdit = AkelPad.GetEditWnd();
   var oLine = getBlockLeft(nPosCurrent);
   
   var nTabStop = AkelPad.SendMessage(AkelPad.GetEditWnd(), 3239 /*AEM_GETTABSTOP*/, 0, 0);      //количество пробелов (из настроек)
   var pSpaces = repeat(" ", nTabStop);
   
   var posCursorNew = oLine.len - nTabStop;
   var pPartDel = oLine.text.substr(posCursorNew);      //предполагаемая удаляемая часть
   if (pPartDel != pSpaces)
      posCursorNew = oLine.len - 1;
   var pPartRemain = oLine.text.substr(0, posCursorNew);
   
   var bNoSelEOL = false;
   if (!oLine.start)
   {
      var fNoSelEOL = "SmartSel::NoSelEOL";
      var bNoSelEOL = AkelPad.IsPluginRunning(fNoSelEOL);
      if (bNoSelEOL) AkelPad.Call(fNoSelEOL);      //Turn OFF
   }
   
   setRedraw(hWndEdit, false);
   AkelPad.SetSel(nPosCurrent - oLine.text.length, nPosCurrent);
   AkelPad.ReplaceSel(pPartRemain);
   setRedraw(hWndEdit, true);
   
   if (bNoSelEOL) AkelPad.Call(fNoSelEOL);      //Turn ON
}
else
   AkelPad.ReplaceSel("");


function repeat(pText, nCount)
{
   return (new Array(nCount + 1)).join(pText);
}

function getBlockLeft(nPos)
{
   var line = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nPos);
   var index = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, line, 0);
   if (index == nPos && index != 0)
   {
      var line = AkelPad.SendMessage(hWndEdit, 1078 /*EM_EXLINEFROMCHAR*/, 0, nPos - 1);
      var index = AkelPad.SendMessage(hWndEdit, 187 /*EM_LINEINDEX*/, line, 0);
   }
   var text = AkelPad.GetTextRange(index, nPos);
   
   return {
      text: text,
      start: index,
      len: text.length
   };
}

function setRedraw(hWnd, bRedraw)
{
   var oSys = AkelPad.SystemFunction();
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
}



ParagraphRemove.js

Code:
///Удаление параграфа по Ctrl+Alt+Y
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11267#11267
// Version: 1.2 (2011.12.12)

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

AkelPad.Command(4197);

N.B. Скрипт использует selCompleteLine.js.


Last edited by VladSh on Tue Sep 11, 2012 3:45 pm; edited 9 times in total
Back to top
View user's profile Send private message Visit poster's website
VladSh



Joined: 29 Nov 2006
Posts: 2507
Location: Киев, Русь

PostPosted: Fri Feb 04, 2011 4:48 pm    Post subject: Reply with quote

XMLGetAttrValues.js

Code:
///Receiving appointed attributes of each line of XML-file
///Вытягивание определённых атрибутов из каждой строки файла с XML-структурой
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11340#11340
// Version: 1.6 (2012.12.18)
//
// Параметры:
//    sep - разделитель для разбора идентификаторов и надписей в param-файле (подробнее см. параметр pParsepProcSep в ShowMenuEx.js)

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

var arrAttr = getSelectedMenuItem(POS_CURSOR, AkelPad.GetArgValue("sep", ""), 0).split(", ");

//создаём структуру искомых тэгов, перечень которых берём из файла параметров
var structAttr = {};
for (var i = 0, l = arrAttr.length; i < l; i++)
   structAttr[arrAttr[i]] = 1;

var pContent = AkelPad.GetTextRange(0, -1);

//вызываем основную функцию обработчика всего файла
var pContent = processRowText(pContent, "\r");

AkelPad.Call("Log::Output", 5, pContent + "\r", -1, 1);


//функция обработки отдельной строки
function processString(rowXML) {
   var pResult = "";
   var aRES = getAttributesValues(rowXML);
   if (aRES != null)
      pResult = aRES.join(", ");
   return pResult
}

function getAttributesValues(sXML) {
   var aXML = sXML.split('"');
   
   var sATTR = "";
   var aRES = [];
   var r = 0;
   
   for (var n = 0; n <= aXML.length; n++) {
      sATTR = aXML[n].replace(/ /g, "");
      sATTR = sATTR.replace(/=/g, "");
      sATTR = sATTR.replace(/</g, "");
      
      if (structAttr[sATTR] == 1) {
         aRES[r] = aXML[n + 1];
         r += 1;
      }
      n += 1;
   }
   
   if (r > 0) return aRES
}

function addToResult(arrOutput, vResult) {
   if (vResult) arrOutput[arrOutput.length] = vResult;
}

NB: Скрипт использует:
- ShowMenuEx.js (для вывода меню наименований атрибутов);
- ProcessRowText.js (для обработки всех строк файла в цикле).

Атрибуты для отбора в файле параметров указываются через ", ", например строка:
Code:
model, posX, posY
Пример XML можно взять здесь.

Благодарности: Infocatcher


Last edited by VladSh on Tue Dec 18, 2012 2:11 pm; edited 6 times in total
Back to top
View user's profile Send private message Visit poster's website
Infocatcher



Joined: 06 Aug 2007
Posts: 1431

PostPosted: Fri Feb 04, 2011 7:29 pm    Post subject: Reply with quote

openRelativeFile.js
Code:
// http://akelpad.sourceforge.net/forum/viewtopic.php?p=11346#11346
// http://infocatcher.ucoz.net/js/akelpad_scripts/openRelativeFile.js

// (c) Infocatcher 2011
// version 0.1.6 - 2011-02-18

//===================
// Tries to open file with relative path
// System association is used for opening binary files
// Supports Mozilla's chrome.manifest files (https://developer.mozilla.org/en/chrome_registration)

// Usage:
//   Call("Scripts::Main", 1, "openRelativeFile.js")
//===================

//== Settings begin
// You can use openRelativeFile-options.js file for override settings

//var paths = ["%ProgramFiles%\\Something"];
var paths = [];

var delimitersStart = {
   '"': true,
   "'": true,
   "<": true,
   "[": true,
   "(": true,
   ">": true,
   "=": true
};
var delimitersEnd = {
   '"': true,
   "'": true,
   ">": true,
   "]": true,
   ")": true,
   "<": true
};
var delimitersSpaces = {
   " ": true,
   "\t": true,
   "\n": true,
   "\r": true,
   "\0": true
};
var delimitersStop = {
   "\n": true,
   "\r": true,
   "\0": true
};

var maxLength = 2000;
//== Settings end

var optionsPath = WScript.ScriptFullName.replace(/(\.[^.]+)?$/, "-options$&");
if(new ActiveXObject("Scripting.FileSystemObject").FileExists(optionsPath))
   eval(AkelPad.ReadFile(optionsPath));

var hMainWnd=AkelPad.GetMainWnd();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var wsh = new ActiveXObject("WScript.Shell");

if(hMainWnd)
   openRelativeFile();

function openRelativeFile() {
   var pathStart, pathEnd;

   var ss = AkelPad.GetSelStart();
   var se = AkelPad.GetSelEnd();

   if(ss != se)
      ss++, se--;

   var startsWithSpace = false;
   var cnt = 0;
   for(;;) {
      var chr = AkelPad.GetTextRange(--ss, ss + 1);
      if(chr in delimitersSpaces && pathStart == undefined) {
         startsWithSpace = true;
         pathStart = ss + 1;
      }
      else if(chr in delimitersStart) {
         startsWithSpace = false;
         pathStart = ss + 1;
         break;
      }
      if(chr in delimitersStop)
         break;
      if(ss == 0) // Start of file
         break;
      if(++cnt > maxLength)
         break;
   }
   if(pathStart == undefined)
      return false;

   for(;;) {
      var chr = AkelPad.GetTextRange(se, ++se);
      if(!chr) // End of file
         break;
      if(chr in delimitersSpaces && pathEnd == undefined) {
         pathEnd = se - 1;
         if(startsWithSpace)
            break;
      }
      else if(chr in delimitersEnd) {
         pathEnd = se - 1;
         break;
      }
      if(chr in delimitersStop)
         break;
      if(++cnt > maxLength)
         break;
   }
   if(pathEnd == undefined)
      return false;

   var relPath = AkelPad.GetTextRange(pathStart, pathEnd)
      .replace(/#.*$/, "")
      .replace(/\?.*$/, "");
   try {
      relPath = decodeURIComponent(relPath);
   }
   catch(e) {
   }

   var path;

   var curPath = AkelPad.GetEditFile(0);
   var curDir = fso.GetParentFolderName(curPath);
   var tmp = curDir + "\\" + relPath;
   if(fso.FileExists(tmp))
      path = tmp;
   else {
      if(/^(chrome|resource):\/\//.test(relPath)) {
         tmp = parseChromePath(curDir, relPath);
         if(tmp)
            path = tmp;
      }
      if(!path && /^\w+:\//.test(relPath)) {
         var tokens = relPath.replace(/^\w+:/, "").split(/[\\\/]+/);
         for(;;) {
            tmp = getFile(curDir, tokens.concat());
            if(tmp) {
               path = tmp;
               break;
            }
            var newDir = curDir.replace(/[\\\/]+[^\\\/]+$/, "");
            if(!newDir || newDir == curDir)
               break;
            curDir = newDir;
         }
      }
      if(!path) {
         for(var i = 0, l = paths.length; i < l; i++) {
            tmp = wsh.ExpandEnvironmentStrings(paths[i]) + "\\" + relPath;
            if(fso.FileExists(tmp)) {
               path = tmp;
               break;
            }
         }
      }
   }
   if(!path)
      return false;

   AkelPad.SetSel(pathStart, pathEnd);
   if(isFileBinary(path)) // Use system association for binary files
      wsh.Exec('rundll32.exe shell32.dll,ShellExec_RunDLL "' + path + '"');
   else
      AkelPad.OpenFile(path);

   return true;
}
function parseChromePath(curDir, chromePath) {
   if(/^(resource):\/+([^\/]+)(\/.*)?/.test(chromePath)) {
      var protocol = RegExp.$1;
      var domain   = RegExp.$2;
      var path     = RegExp.$3;
   }
   else if(/^(\w+):\/+([^\/]+)\/([^\/]+)(\/.*)?/.test(chromePath)) {
      var protocol = RegExp.$1;
      var domain   = RegExp.$2;
      var type     = RegExp.$3;
      var path     = RegExp.$4;
   }
   else
      return false;

   for(;;) { // See https://developer.mozilla.org/en/chrome_registration
      var tmp = curDir + "\\chrome.manifest";
      if(fso.FileExists(tmp)) {
         var manifest = AkelPad.ReadFile(tmp);
         break;
      }
      var newDir = curDir.replace(/[\\\/]+[^\\\/]+$/, "");
      if(!newDir || newDir == curDir)
         return false;
      curDir = newDir;
   }
   if(!manifest)
      return false;

   var pattern;
   switch(protocol) {
      case "chrome":
         switch(type) {
            case "content":
               // content extensionname chrome/content/
               pattern = new RegExp("(^|[\\n\\r])content[ \\t]+" + escapeRegExp(domain) + "[ \\t]+(\\S+)");
            break;
            case "skin":
               // skin extensionname classic/1.0 chrome/skin/
               pattern = new RegExp("(^|[\\n\\r])skin[ \\t]+" + escapeRegExp(domain) + "[ \\t]+\\S+[ \\t]+(\\S+)");
            break;
            case "locale":
               // locale extensionname en-US chrome/locale/en-US/
               pattern = new RegExp("(^|[\\n\\r])locale[ \\t]+" + escapeRegExp(domain) + "[ \\t]+\\S+[ \\t]+(\\S+)");
         }
      break;
      case "resource":
         // resource extensionname resource/
         pattern = new RegExp("(^|[\\n\\r])resource[ \\t]+" + escapeRegExp(domain) + "[ \\t]+(\\S+)");
   }

   if(!pattern)
      return false;

   tmp = getManifestInfo(pattern, manifest, curDir, path);
   if(tmp)
      return tmp;

   // https://developer.mozilla.org/en/chrome_registration#manifest
   var lines = manifest.split(/[\n\r]+/);
   for(var i = 0, l = lines.length; i < l; i++) {
      var line = lines[i];
      if(!/^manifest[ \t]+(\S+)/.test(line))
         continue;
      var manifestPath = curDir + "\\" + RegExp.$1;
      if(!fso.FileExists(manifestPath))
         continue;
      manifest = AkelPad.ReadFile(manifestPath);
      tmp = getManifestInfo(pattern, manifest, fso.GetParentFolderName(manifestPath), path);
      if(tmp)
         return tmp;
   }

   return false;
}
function getManifestInfo(pattern, manifest, curDir, path) {
   if(!pattern.test(manifest))
      return false;
   var fullPath = curDir + "\\" + unwrapChromePath(RegExp.$2) + path;
   if(fso.FileExists(fullPath))
      return fullPath;
   return false;
}
function unwrapChromePath(path) {
   if(/^jar:/.test(path))
      path = path.substr(4).replace(/[^\/]+!\//, "");
   return path;
}
function escapeRegExp(str) {
   return str.replace(/[\\\/.^$+*?|()\[\]{}]/g, "\\$&");
}
function getFile(curDir, tokens) {
   var parts = [];
   for(;;) {
      parts.unshift(tokens.pop());
      tmp = curDir + "\\" + parts.join("\\");
      if(fso.FileExists(tmp))
         return tmp;
      if(!tokens.length)
         break;
   }
   return null;
}
function isFileBinary(pFile) {
   // Thanks to Instructor
   // http://akelpad.sourceforge.net/forum/viewtopic.php?p=11344#11344
   var lpDetectCodepage;
   var bResult=false;

   if (lpDetectCodepage=AkelPad.MemAlloc(_X64?24:20 /*sizeof(DETECTCODEPAGEW)*/))
   {
      AkelPad.MemCopy(lpDetectCodepage /*offsetof(DETECTCODEPAGEW, pFile)*/, AkelPad.MemStrPtr(pFile), 2 /*DT_QWORD*/);
      AkelPad.MemCopy(lpDetectCodepage + (_X64?8:4) /*offsetof(DETECTCODEPAGEW, dwBytesToCheck)*/, 1024, 3 /*DT_DWORD*/);
      AkelPad.MemCopy(lpDetectCodepage + (_X64?12:8) /*offsetof(DETECTCODEPAGEW, dwFlags)*/, 0x11 /*ADT_BINARY_ERROR|ADT_NOMESSAGES*/, 3 /*DT_DWORD*/);
      if (AkelPad.SendMessage(hMainWnd, 1177 /*AKD_DETECTCODEPAGEW*/, 0, lpDetectCodepage) == -4 /*EDT_BINARY*/)
         bResult=true;

      AkelPad.MemFree(lpDetectCodepage);
   }
   return bResult;
}
<download>
Tries to open file with relative path.
System association is used for opening binary files.
Supports Mozilla's chrome.manifest files.

Thanks to Instructor for IsFileBinary() example.


Last edited by Infocatcher on Sat Apr 09, 2011 7:22 pm; edited 1 time in total
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 8, 9, 10 ... 15, 16, 17  Next
Page 9 of 17

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group