Czech translation

Discuss and announce AkelPad language modules
Post Reply
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Czech translation

Post by Instructor »

-=-

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Návod AkelPadu v cz

Post by graybeard »

Link na návod AkelPad pokud ho někdo potřebuje přeložený https://yadi.sk/d/0ZQKKa6JFaICGw
Last edited by graybeard on Mon Nov 09, 2020 2:05 am, edited 1 time in total.

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Český překlad pro FindReplaceFiles.js

Post by graybeard »

Český jazykový modul pro FindReplaceFiles.js

FindReplaceFiles_1029.lng

Code: Select all

/************************************************
FindReplaceFiles.js - ver. 2018-11-06 
Interface       language
Language:       Čeština (1029) hex:0x405 Win:1250
Translated by: 	Zapa
*************************************************/
sTxtDlgTitle        = "Najít/nahradit soubory";
sTxtDir             = "&Adresář";
sTxtCurrent         = "Ak&tuální";
sTxtBrowse          = "&Procházet...";
sTxtSubDirs         = "Úrov&eň podsložek:";
sTxtAll             = "Vše";
sTxtFileName        = "Název souboru:streamy";
sTxtRegExp          = "Regulární výrazy";
sTxtNotName         = "Kromě těchto jmen";
sTxtFiles           = "Soubory (hlavní streamy) ";
sTxtStreams         = "Alternativní NTFS streamy";
sTxtTextInFile      = "&Text v souboru/streamu";
sTxtMatchCase       = "&Rozlišit VELKÁ malá písmena";
sTxtMultiline       = "&Víceřádkový";
sTxtNotContain      = "Neobsahuje text";
sTxtSkipBinary      = "Přeskočit binární soubory";
sTxtSkipLarger      = "Přeskočit větší než [B]:";
sTxtReplaceWith     = "Nahradit &za:";
sTxtSkipFiles       = "Přeskočit soubory";
sTxtReadOnly        = "Jen ke čtení";
sTxtHidden          = "Skryté";
sTxtSystem          = "Systémové";
sTxtInResults       = "Ve výsledcích";
sTxtSearch          = "&Hledat";
sTxtReplace         = "&Nahradit";
sTxtHistory         = "&Historie";
sTxtEdit            = "&Upravit";
sTxtCopyList        = "Kopírovat seznam";
sTxtClearList       = "Vymazat seznam";
sTxtSettings        = "Nastavení";
sTxtClose           = "Zavřít";
sTxtFilesFound      = "Nalezeny soubory";
sTxtFilesRepl       = "Soubory nahrazeny";
sTxtNoFiles         = "<žádné soubory>";
sTxtByteSymbol      = "B";
sTxtNTFSStream      = "Stream NTFS";
sTxtWait            = "Počkat ...";
sTxtChooseDir       = "Vyberte adresář:";
sTxtPathShow        = "Zobrazit úplnou cestu v seznamu souborů";
sTxtSeparateWnd     = "Spustit v samostatném okně";
sTxtKeepHist        = "Zachovat historii při ukončení";
sTxtKeepFiles       = "Zachovat seznam souborů";
sTxtDirNoExist      = "Adresář neexistuje.";
sTxtFileNoExist     = "Soubory neexistují. ";
STxtErrorRE         = "Chyba v regulárním výrazu. ";
sTxtWantReplace     = "Chcete nahradit obsah souborů?\n\nUpozornění: tuto operaci nelze vrátit zpět.";
sTxtDocModified     = "Dokument byl změněn. Chcete jej uložit?";
sHlpAnyChar         = "libovolný jeden znak";
sHlpAnyString       = "libovolný řetězec znaků";
sHlpSemicolQuot     = "středník musí být v uvozovkách";
sHlpListSepar       = "oddělovač seznamu (středník)";
sHlpStreamSepar     = "Soubor: Oddělovač proudu (dvojtečka)";
sHlpAnyChar_NL      = "libovolný znak, kromě \\n";
sHlpDigit           = "číslice [0-9]";
sHlpNonDigit        = "non-digit [^0-9]";
sHlpWhiteSp         = "mezery  [ \\f\\n\\r\\t\\v]";
sHlpNonWhiteSp      = "non-whitespace";
sHlpWordChar        = "znak slova [A-Za-z0-9_]";
sHlpNonWordChar     = "ne-písmeno znak";
sHlpNULL            = "NULL znak";
sHlpFF              = "nová stránka FF \\x0C";
sHlpNL              = "nový řádek NL \\x0A";
sHlpCR              = "konec řádku CR \\x0D";
sHlpTab             = "Horizontal tab \\x09";
sHlpVTab            = "Vertical tab \\x0B";
sHlpCharHex         = "Hexadecimální znak FF";
sHlpUniCharHex      = "Unicode char hex code 00FF";
sHlpBegin           = "začátek řetězce/řádku";
sHlpEnd             = "konec řetězce/řádku";
sHlpWordBoun        = "hranice slova";
sHlpNonWordBoun     = "neslovná hranice";
sHlpAlternative     = "alternativní ab nebo xy ";
sHlpCharSet         = "znaková sada, jakýkoliv specifikovanou";
sHlpNegCharSet      = "negativní znaková sada";
sHlpRange           = "rozsah znaků od A do Z";
sHlpNegRange        = "záporný rozsah znaků";
sHlpCapture         = "zachytit";
sHlpNotCapture      = "nezachytit";
sHlpFollow          = "následuje ab";
sHlpNotFollow       = "nenásleduje ab";
sHlpBackrefer9      = "zpětná reference, rozsah 1-9";
sHlpBackrefer99     = "zpětná reference, rozsah 01-99";
sHlpZeroOrOne       = "nula nebo jednou";
sHlpZeroOrMore      = "nula nebo vícekrát";
sHlpOneOrMore       = "jednou nebo vícekrát";
sHlpexactly         = "přesně 3krát";
sHlpAtLeast         = "alespoň 3krát";
sHlpFromTo          = "3krát až 7krát";
sHlpSpecChars       = "()[]{}^$.?+*|\\ speciální znaky";
sHlpDollar          = "znak dolaru";
sHlpEntireStr       = "celý řetězec shodný";
sHlpPrecedeStr      = "podřetězec, který předchází odpovídajícímu řetězci";
sHlpFollowStr       = "podřetězec, který následuje po odpovídajícím řetězci";
sHlpSubmatch9       = "9. zachycený dílčí díl, rozsah 1-9";
sHlpSubmatch99      = "99. zachycený dílčí díl, rozsah 01-99";
sHlpBackslash       = "zpětné lomítko";   
uložit jako UTF8-BOM
Last edited by graybeard on Mon Nov 30, 2020 8:18 pm, edited 6 times in total.

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Czech Interface lang for FindReplaceEx.js

Post by graybeard »

Czech Interface lang for FindReplaceEx.js

save as UTF8-BOM
FindReplaceEx_1029.lng

Code: Select all

/**************************************************
FindReplaceEx.js - ver. 2018-11-06
Interface       language
Language: 	Čeština (1029)
Translated by: 	Zapa
**************************************************/
sTxtMore          = '&Více';
sTxtCount         = 'Vy&počítat ';
sTxtFindAll       = '&Najít vše';
sTxtShowInLog     = 'Zobrazit v Log-panelu';
sTxtOnlyMatched   = 'pouze nalezeno';
sTxtEntireLines   = 'celé řádky';
sTxtCopyToCB      = 'Zkopírovat do schránky';
sTxtOpenInTab     = 'Otevřít na nové kartě';
sTxtBookmarkLines = 'Přidejte si řádky do záložek';
sTxtUnmarkLines   = 'Odeberte záložky z řádků';
sTxtTemplates     = 'Šablony';
sTxtBatches       = 'Dávky(Batch)';
sTxtTransparentNA = 'Transparentnost - je-li neaktivní dialog';
sTxtWait          = 'Počkejte...';
sTxtStop          = 'Stop';
sTxtNoName        = 'beze jména';
sTxtTotalFound    = 'Celkem nalezeno: ';
sTxtReplAllCD     = '"Nahradit vše" zavře dialo&g';
sTxtReplAllWM     = '"Nahradit vše" &beze zpráv';
sTxtCheckInSel    = 'Označit "Při výběru" pokud existuje výběr';
sTxtCycleSearch   = 'C&yklické Hledání';
sTxtPrompt        = 'Vý&zva';
sTxtWhatFind      = 'Najít co';
sTxtReplaceWith   = 'Nahradit za';
sTxtMatchCase     = 'Rozeznat VELKÁ a &malá písmena';
sTxtWholeWord     = '&Celé slovo';
sTxtRegExp        = 'Reg&ulární výrazy';
sTxtDotMatchesNL  = '&. zachycuje \\n';
sTxtEscSeq        = '&Esc-sekvence';
sTxtDirection     = 'Směr';
sTxtDirDown       = '&Dolů';
sTxtDirUp         = 'Na&horu';
sTxtDirBeginning  = '&Od začátku';
sTxtDirInSel      = 'Ve výbě&ru';
sTxtDirAllFiles   = 'Všechny &soubory';
sTxtNew           = 'Nový';
sTxtAdd           = 'Přidat do';
sTxtRename        = 'Upravit název';
sTxtMoveUp        = 'Nahoru';
sTxtMoveDown      = 'Dolů';
sTxtRemove        = 'Vymazat';
sTxtCheckExpr     = 'Zkontrolujte výraz';
sTxtAddToBatch    = 'Přidat do dávky';
sTxtOK            = 'OK';
sTxtClose         = 'Zavřít';
sTxtBatchReplace  = 'Výměna dávky(Batch)';
sTxtBatchReplAll  = 'Vyměňte vše (s Batch)';
sTxtEnableAll     = 'Zapněte/vypněte vše';
sTxtClosesDialog  = 'Zavřít dialog';
sTxtWithoutMsg    = 'Žádná zpráva ';
sTxtTemplateName  = 'Název šablony';
sTxtConditions    = 'Podmínky';
sTxtAllColumns    = 'Všechny sloupce';
sTxtNameOnly      = 'Pouze jméno';
sTxtSortByName    = 'Seřaď dle jména';
sTxtNameInvalid   = 'Neplatné jméno.';
sTxtNameExists    = 'Tento název šablony se již používá.';
sTxtWantRemove    = 'Opravdu chcete tuto šablonu smazat?';
sTxtBatchNumber   = 'Dávka №';
sTxtWantBatchRepl = 'Nahraďte vše touto dávkou(Batch)?';
sTxtNoFindText    = 'V poli "Co najít" není žádný text.';
sTxtExprOK        = 'Výraz je správný.';
sTxtExprError     = 'Chyba ve výrazu';
sTxtCountChanges  = 'Počet náhrad: ';
//context menu edit
sMnuUndo      = 'Zpět ';
sMnuRedo      = 'Opakovat';
sMnuCut       = 'Vyjmout';
sMnuCopy      = 'Kopírovat';
sMnuPaste     = 'Vložit';
sMnuDelete    = 'Vymazat';
sMnuSelectAll = 'Vybrat vše';
sMnuAPFont    = 'Písmo (Zobrazit->Písmo)';
sMnuNextTempl = 'Další šablona';
sMnuPrevTempl = 'Předchozí šablona';
//RegExp help
sHlpAnyChar        = 'jakýkoli znak (tečka)';
sHlpSpecChars      = '()[]{}^$.?+*|\\ Speciální symboly';
sHlpBackslash      = 'obrácené lomítko';
sHlpNull           = 'prázdný znak(NULL)';
sHlpFF             = 'posuv o stránku(FF)';
sHlpNL             = 'nový řádek(NL)';
sHlpAnyNL          = 'nový řádek libovolného formátu';
sHlpTab            = 'tabulátor(tab)';
sHlpVTab           = 'vertikální tabulátor(Vtab)';
sHlpDigit          = 'číslice';
sHlpNonDigit       = 'ne-čísla';
sHlpWhiteSp        = 'znak mezery';
sHlpNonWhiteSp     = 'znak bez mezer';
sHlpWordChar       = 'slovní symbol  (non-delimiter)';
sHlpNonWordChar    = 'neslovní symbol (delimiter)';
sHlpCharHex        = 'znak - kód v rozsahu 0-10FFFF';
sHlpCharHex2       = 'symbol - 2-číselný hex-kód';
sHlpCharHex4       = 'symbol - 4-číselný hex-kód';
sHlpAlternative    = 'jedna z alternativ: ab nebo xy';
sHlpCharSet        = 'sadu znaků, potřebujete kteroukoli z nich';
sHlpNegCharSet     = 'exkluzivní znaková sada';
sHlpRange          = 'rozsah znaků od a do z';
sHlpNegRange       = 'kromě rozsahu';
sHlpBeginLine      = 'začátek řádku';
sHlpEndLine        = 'konec řádku';
sHlpBeginText      = 'začátek dokumentu';
sHlpEndText        = 'konec dokumentu';
sHlpBeginRange     = 'začátek rozsahu hledání';
sHlpEndRange       = 'konec rozsahu hledání';
sHlpWordBoun       = 'hranice slova';
sHlpNonWordBoun    = 'ne hranice slova';
sHlpExcludePrev    = 'vyloučit předchozí z výsledku';
sHlpZeroOrOne      = '0 nebo 1krát';
sHlpZeroOrMore     = '0 nebo vícekrát ';
sHlpOneOrMore      = '1 nebo vícekrát';
sHlpExactly        = 'přesně 3krát';
sHlpAtLeast        = 'nejméně 3krát';
sHlpFromTo         = '3 až 7krát';
sHlpEntireStr      = 'celý zachycený řádek';
sHlpSubmatch9      = '9. podřetězec (rozsah 1-9)';
sHlpSubmatch99     = '99. podřetězec (rozsah 01-99)';
sHlpGreedy         = '- nad chamtivými kvantifikátory ';
sHlpLazy           = 'přidat pro líný kvantifikátor';
sHlpPossesive      = 'přidat pro ultra-chamtivý kvantifikátor';
sHlpCapture1       = 'odpovídá zachytu ab';
sHlpCapture2       = 'odpovídá negativnímu ab, zachycení';
sHlpNotCapture     = 'odpovídá ab, ne zachycuje';
sHlpAtomicGrouping = 'atomizovaná skupina (bez zachycení)';
sHlpPreceded       = 'před řetězcem je ab';
sHlpNotPreceded    = 'před řetězcem není ab';
sHlpFollowed       = 'za řetězcem je ab';
sHlpNotFollowed    = 'za řetězcem není ab';
sHlpCondition      = 'pokud (1), pak x, jinak y';
sHlpBackrefer9     = 'zpětný odkaz, rozsah 1-9';
sHlpBackrefer99    = 'zpětný odkaz, rozsah 01-99';
sHlpIgnoreCase     = 'ignorovat VELKÁ a malá písmena';
sHlpMultiline      = 'víceřádkové vyhledávání (výchozí)';
sHlpDotDefault     = 'tečka odpovídá libovolnému znaku (ve výchozím nastavení)';
sHlpInvertGreed    = 'invertovat chamtivé kvantifikátory';
sHlpMatchCase      = 'rozeznávat VELKÁ a malá písmena';
sHlpMultilineOff   = 'vypnout víceřádkové vyhledávání';
sHlpDotDefaultOff  = 'tečka odpovídá libovolnému znaku kromě \\n';
sHlpInvertGreedOff = 'vrátit invertní chamtivost';

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Czech Interface lang for Translator.js

Post by graybeard »

Czech Interface lang for Translator.js

Save as UTF16 small Endian +BOM.
For my unclear reason, saving as UTF8 is non-working?

Translator_Czech.lng

Code: Select all

/********************************
Translator.js - ver. 2018-11-06
Interface language
Language:      Czech
Translated by: r.zapa
********************************/
sTxtCaption    = "Překladač";
sTxtUse        = "Použit";
sTxtFromLang   = "Z jazyka";
sTxtToLang     = "Do jazyka";
sTxtAutoDetect = "Autodetekce jazyka";
sTxtListen     = "Naslouchat";
sTxtTranslate  = "&Přeložit";
sTxtTranslateP = "Přeložit+";
sTxtOptions    = "&Možnosti";
sTxtSource     = "Zdrojový t&ext";
sTxtTarget     = "Přeložený &text";
sTxtSettings   = "Nastavení";
sTxtUndo       = "V&rátit";
sTxtRedo       = "Z&opakovat";
sTxtCut        = "&Vyjmout";
sTxtCopyCB     = "&Zkopírovat do schránky";
sTxtInsertAP   = "Vložte do &AkelPad'u";
sTxtPasteCB    = "Vložit ze &schránky";
sTxtPasteAP    = "V&ložit z AkelPad'u";
sTxtDelete     = "Vy&mazat";
sTxtSelectAll  = "Vy&brat vše";
sTxtEntireText = "&Celý text";
sTxtInterface  = "Jazyk Interfejsu";
sTxtSourceInCB = "Zdrojový text ze schránky";
sTxtSourceWnd  = "Zobrazit panel se zdrojovým textem";
sTxtLoadText   = "Načíst zdrojový text do panelu při spuštění";
sTxtImmediate  = "Začněte okamžitě překládat";
sTxtWordWrap   = "Zalomit řádky";
sTxtFontAP     = "Písmo AkelPad'u";
sTxtFontGUI    = "Písmo interfejsu GUI";
sTxtSortLang   = "Třídění jazyků";
sTxtSortCode   = "Podle kódu";
sTxtSortName   = "Podle jména";
sTxtOwnKey     = "vlastní klíč";
sTxtRegister   = "Registrace:";
sTxtOK         = "OK";
sTxtCancel     = "Zrušit";
sTxtError      = "Chyba";
sTxtNoText     = "Žádný text k překladu.";
sTxtNoSupport  = "Váš systém nepodporuje XMLHttpRequest.";
sTxtNoInternet = "Došlo k problému s připojením k internetu.";
sTxtWait       = "Čekejte...";
sTxtUndefined  = "Nedefinováno";
sTxtChooseLang = "Musíte si vybrat jazyk.";
sTxtNoSpeech   = "Žádná podpora výslovnosti pro tento jazyk.";
sTxtRegScripts = "Musíte zaregistrovat knihovnu: Scripts.dll";
sTxtNoLibrary  = "Knihovnu nelze načíst: ";

aLangs[ 0][1] = "Afrikánština";
aLangs[ 1][1] = "Arabština";
aLangs[ 2][1] = "Ázerbájdžánský";
aLangs[ 3][1] = "Běloruština";
aLangs[ 4][1] = "Bulharština";
aLangs[ 5][1] = "Bosenština";
aLangs[ 6][1] = "Katalánština";
aLangs[ 7][1] = "Česky";
aLangs[ 8][1] = "Velština";
aLangs[ 9][1] = "Dánština";
aLangs[10][1] = "Německy";
aLangs[11][1] = "Řecky";
aLangs[12][1] = "Anglicky";
aLangs[13][1] = "Esperanto";
aLangs[14][1] = "Španělština";
aLangs[15][1] = "Estonština";
aLangs[16][1] = "Peršan";
aLangs[17][1] = "Finština";
aLangs[18][1] = "Francouzština";
aLangs[19][1] = "Irština";
aLangs[20][1] = "Galicijština";
aLangs[21][1] = "Hebrejsky";
aLangs[22][1] = "Hindština";
aLangs[23][1] = "Chorvatština";
aLangs[24][1] = "Haitská kreolština";
aLangs[25][1] = "Maďarština";
aLangs[26][1] = "Arménský";
aLangs[27][1] = "Indonéština";
aLangs[28][1] = "Islandský";
aLangs[29][1] = "Italština";
aLangs[30][1] = "Hebrejsky";
aLangs[31][1] = "Japonština";
aLangs[32][1] = "Gruzínština";
aLangs[33][1] = "Korejština";
aLangs[34][1] = "Latinka";
aLangs[35][1] = "Litevština";
aLangs[36][1] = "Lotyština";
aLangs[37][1] = "Makedonština";
aLangs[38][1] = "Malajština";
aLangs[39][1] = "Maltština";
aLangs[40][1] = "Nizozemština";
aLangs[41][1] = "Norština";
aLangs[42][1] = "Pandžábský";
aLangs[43][1] = "Polsky";
aLangs[44][1] = "Portugalština";
aLangs[45][1] = "Rumunština";
aLangs[46][1] = "Rusky";
aLangs[47][1] = "Slovensky";
aLangs[48][1] = "Slovinština";
aLangs[49][1] = "Albánec";
aLangs[50][1] = "Srbština";
aLangs[51][1] = "Švédština";
aLangs[52][1] = "Svahilština";
aLangs[53][1] = "Tamil";
aLangs[54][1] = "Thajština";
aLangs[55][1] = "Filipínský";
aLangs[56][1] = "Turečtina";
aLangs[57][1] = "Ukrajinsky";
aLangs[58][1] = "Urdština";
aLangs[59][1] = "Vietnamština";
aLangs[60][1] = "Jidiš";
aLangs[61][1] = "Čínština";
aLangs[62][1] = "Zjednodušená čínština";
aLangs[63][1] = "Tradiční čínština";
aLangs[64][1] = "Zjednodušená čínština";
aLangs[65][1] = "Tradiční čínština";

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Řazení ve sloupcích

Post by graybeard »

Sort in columns script with GUI
Czech Interface lang in within script SortInColumns.js from KDJ + small preparations.

save as UTF8+BOM

SortInColumns.js

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=10491#p10491
// Version: 2015-01-08
// Author: KDJ
//
// *** Sort in columns ***
//
// Usage:
//   Call("Scripts::Main", 1, "SortInColumns.js")
//
// Shortcut keys in dialog box:
//   Enter - Sort
//   Esc   - Close
//   Shift+Alt+Right (Left, Down, Up, End, Home, PgDn, PgUp) - move dialog box.
//
// Remark:
//   To effect was clearly visible, you should use a fixed-width font.

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0415) //Polish
{
  var sTxtCaption   = "Sortowanie w kolumnach";
  var sTxtSortRange = "Zakres sortowania";
  var sTxtFrom      = "Od";
  var sTxtTo        = "Do";
  var sTxtColumns   = "&Kolumny:";
  var sTxtLines     = "&Wiersze:";
  var sTxtSortKeys  = "Klucze sortowania - kolumny";
  var sTxtKey       = "Klucz";
  var sTxtDesc      = "Malejąco";
  var sTxtIgCase    = "Ignoruj wlk. liter";
  var sTxtString    = "String";
  var sTxtLocale    = "Alfabetycznie";
  var sTxtNum       = "Numerycznie";
  var sTxtAllKeys   = "Wszystkie klucze";
  var sTxtDescAll   = "&Malejąco";
  var sTxtIgCaseAll = "&Ignoruj wlk. liter";
  var sTxtStringAll = "&String";
  var sTxtLocaleAll = "&Alfabetycznie";
  var sTxtNumAll    = "&Numerycznie";
  var sTxtReverse   = "&Odwróć tylko kolejność wierszy";
  var sTxtCopyToCB  = "Wynik kopiuj do schowka, nie zmieniaj &tekstu";
  var sTxtSort      = "Sortuj";
  var sTxtUndo      = "&Cofnij";
  var sTxtRedo      = "&Powtórz";
  var sTxtNoRangeC  = "Brak zakresu kolumn do sortowania.";
  var sTxtNoRangeL  = "Brak zakresu wierszy do sortowania.";
  var sTxtNoKey1    = "Brak zakresu kolumn w pierwszym kluczu.";
}
  else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0405 /*Czech*/)
  {
    //translated by r.zapa
  var sTxtCaption   = "Třídit ve sloupcích";
  var sTxtSortRange = "Rozsah třídění";
  var sTxtFrom      = "Od";
  var sTxtTo        = "Do";
  var sTxtColumns   = "Sloupce:";
  var sTxtLines     = "Řádky:";
  var sTxtSortKeys  = "Klíče třídění - sloupce";
  var sTxtKey       = "Klíč";
  var sTxtDesc      = "Klesající";
  var sTxtIgCase    = "Ignorovat VEL.písmena";
  var sTxtString    = "String";
  var sTxtLocale    = "Abecedně";
  var sTxtNum       = "Numericky";
  var sTxtAllKeys   = "Všechny klíče";
  var sTxtDescAll   = "Klesající Vše";
  var sTxtIgCaseAll = "Ignorovat vše VEL.písm.";
  var sTxtStringAll = "String Vše";
  var sTxtLocaleAll = "Abecedně Vše";
  var sTxtNumAll    = "Numericky Vše";
  var sTxtReverse   = "Obraťte pouze řádky";
  var sTxtCopyToCB  = "Zkopírujte výsledek do schránky, neměňte text";
  var sTxtSort      = "Třídit";
  var sTxtUndo      = "Zpět";
  var sTxtRedo      = "Zopakovat";
  var sTxtNoRangeC  = "Neexistuje žádný rozsah sloupců k třídění.";
  var sTxtNoRangeL  = "Neexistuje žádný rozsah řádků k třídění.";
  var sTxtNoKey1    = "V prvním klíči není žádný rozsah sloupců.";
  }
else
{
  var sTxtCaption   = "Sort in columns";
  var sTxtSortRange = "Sort range";
  var sTxtFrom      = "From";
  var sTxtTo        = "To";
  var sTxtColumns   = "&Columns:";
  var sTxtLines     = "&Lines:";
  var sTxtSortKeys  = "Sort keys - columns";
  var sTxtKey       = "Key";
  var sTxtDesc      = "Descending";
  var sTxtIgCase    = "Ignore case";
  var sTxtString    = "String";
  var sTxtLocale    = "Alphabetically";
  var sTxtNum       = "Numerically";
  var sTxtAllKeys   = "All keys";
  var sTxtDescAll   = "&Descending";
  var sTxtIgCaseAll = "&Ignore case";
  var sTxtStringAll = "&String";
  var sTxtLocaleAll = "&Alphabetically";
  var sTxtNumAll    = "&Numerically";
  var sTxtReverse   = "Reverse &order of lines only";
  var sTxtCopyToCB  = "Resul&t copy to clipboard, do not replace text";
  var sTxtSort      = "Sort";
  var sTxtUndo      = "&Undo";
  var sTxtRedo      = "&Redo";
  var sTxtNoRangeC  = "There is no range of columns to sort.";
  var sTxtNoRangeL  = "There is no range of lines to sort.";
  var sTxtNoKey1    = "There is no range of columns in first sort key.";
}

var DT_DWORD    = 3;
var BM_GETCHECK = 240;
var BM_SETCHECK = 241;

var oSys       = AkelPad.SystemFunction();
var hMainWnd   = AkelPad.GetMainWnd();
var hEditWnd   = AkelPad.GetEditWnd();
var hGuiFont   = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hInstDLL   = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var aDesc      = [0,0,0,0,0];
var aIgCase    = [1,1,1,1,1];
var aString    = [1,1,1,1,1];
var aLocale    = [0,0,0,0,0];
var aNum       = [0,0,0,0,0];
var bDescAll   = 0;
var bIgCaseAll = 1;
var nMethod    = 1;
var bReverse   = 0;
var bCopyToCB  = 0;
var nUndoLimit = 0;
var nRedoLimit = 0;
var nWordWrap;
var nLastLine;
var nLastCol;
var hWndDlg;
var lpBuffer;
var bGetSel;
var bIsReturn;
var hFocus;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var aWnd        = [];
var IDSORTRANGE = 1000;
var IDFROM      = 1001;
var IDTO        = 1002;
var IDCOLUMNS   = 1003;
var IDBEGCOL    = 1004;
var IDENDCOL    = 1005;
var IDLINES     = 1006;
var IDBEGLINE   = 1007;
var IDENDLINE   = 1008;
var IDSORTK1    = 1009;
var IDSORTK2    = 1010;
var IDSORTK3    = 1011;
var IDSORTK4    = 1012;
var IDSORTK5    = 1013;
var IDSORTK6    = 1014;
var IDFROM1     = 1015;
var IDTO1       = 1016;
var IDALLKEYS   = 1017;
var IDKEY1      = 1018;
var IDBEGCOL1   = 1019;
var IDENDCOL1   = 1020;
var IDDESC1     = 1021;
var IDIGCASE1   = 1022;
var IDSTRING1   = 1023;
var IDLOCALE1   = 1024;
var IDNUM1      = 1025;
var IDKEY2      = 1026;
var IDBEGCOL2   = 1027;
var IDENDCOL2   = 1028;
var IDDESC2     = 1029;
var IDIGCASE2   = 1030;
var IDSTRING2   = 1031;
var IDLOCALE2   = 1032;
var IDNUM2      = 1033;
var IDKEY3      = 1034;
var IDBEGCOL3   = 1035;
var IDENDCOL3   = 1036;
var IDDESC3     = 1037;
var IDIGCASE3   = 1038;
var IDSTRING3   = 1039;
var IDLOCALE3   = 1040;
var IDNUM3      = 1041;
var IDKEY4      = 1042;
var IDBEGCOL4   = 1043;
var IDENDCOL4   = 1044;
var IDDESC4     = 1045;
var IDIGCASE4   = 1046;
var IDSTRING4   = 1047;
var IDLOCALE4   = 1048;
var IDNUM4      = 1049;
var IDKEY5      = 1050;
var IDBEGCOL5   = 1051;
var IDENDCOL5   = 1052;
var IDDESC5     = 1053;
var IDIGCASE5   = 1054;
var IDSTRING5   = 1055;
var IDLOCALE5   = 1056;
var IDNUM5      = 1057;
var IDDESCALL   = 1058;
var IDIGCASEALL = 1059;
var IDSTRINGALL = 1060;
var IDLOCALEALL = 1061;
var IDNUMALL    = 1062;
var IDREVERSE   = 1063;
var IDCOPYTOCB  = 1064;
var IDSORT      = 1065;
var IDUNDO      = 1066;
var IDREDO      = 1067;

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

//0x50000000 - WS_VISIBLE|WS_CHILD
//0x50000007 - WS_VISIBLE|WS_CHILD|BS_GROUPBOX
//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               CLASS, WND, EXSTYLE,      STYLE,   X,   Y,   W,   H, TXT
aWnd[IDSORTRANGE] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 195,  85, sTxtSortRange];
aWnd[IDFROM     ] = ["STATIC",   0,       0, 0x50000000,  80,  25,  55,  13, sTxtFrom];
aWnd[IDTO       ] = ["STATIC",   0,       0, 0x50000000, 140,  25,  55,  13, sTxtTo];
aWnd[IDCOLUMNS  ] = ["STATIC",   0,       0, 0x50000000,  20,  40,  60,  13, sTxtColumns];
aWnd[IDBEGCOL   ] = ["EDIT",     0,   0x200, 0x50012080,  80,  40,  55,  20, ""];
aWnd[IDENDCOL   ] = ["EDIT",     0,   0x200, 0x50012080, 140,  40,  55,  20, ""];
aWnd[IDLINES    ] = ["STATIC",   0,       0, 0x50000000,  20,  65,  60,  13, sTxtLines];
aWnd[IDBEGLINE  ] = ["EDIT",     0,   0x200, 0x50012080,  80,  65,  55,  20, ""];
aWnd[IDENDLINE  ] = ["EDIT",     0,   0x200, 0x50012080, 140,  65,  55,  20, ""];
aWnd[IDSORTK1   ] = ["BUTTON",   0,       0, 0x50000007,  10, 110, 320,  82, sTxtSortKeys];
aWnd[IDSORTK2   ] = ["BUTTON",   0,       0, 0x50000007,  10, 185, 320,  82, ""];
aWnd[IDSORTK3   ] = ["BUTTON",   0,       0, 0x50000007,  10, 260, 320,  82, ""];
aWnd[IDSORTK4   ] = ["BUTTON",   0,       0, 0x50000007,  10, 335, 320,  82, ""];
aWnd[IDSORTK5   ] = ["BUTTON",   0,       0, 0x50000007,  10, 410, 320,  82, ""];
aWnd[IDSORTK6   ] = ["BUTTON",   0,       0, 0x50000007,  10, 485, 320,  82, ""];
aWnd[IDFROM1    ] = ["STATIC",   0,       0, 0x50000000,  80, 125,  55,  13, sTxtFrom];
aWnd[IDTO1      ] = ["STATIC",   0,       0, 0x50000000, 140, 125,  55,  13, sTxtTo];
aWnd[IDALLKEYS  ] = ["STATIC",   0,       0, 0x50000000,  20, 515,  90,  13, sTxtAllKeys];
aWnd[IDKEY1     ] = ["STATIC",   0,       0, 0x50000000,  20, 140,  60,  13, sTxtKey+" &1:"];
aWnd[IDBEGCOL1  ] = ["EDIT",     0,   0x200, 0x50012080,  80, 140,  55,  20, ""];
aWnd[IDENDCOL1  ] = ["EDIT",     0,   0x200, 0x50012080, 140, 140,  55,  20, ""];
aWnd[IDDESC1    ] = ["BUTTON",   0,       0, 0x50010003, 205, 125,  120,  16, sTxtDesc];
aWnd[IDIGCASE1  ] = ["BUTTON",   0,       0, 0x50010003, 205, 145,  120,  16, sTxtIgCase];
aWnd[IDSTRING1  ] = ["BUTTON",   0,       0, 0x50010003,  50, 170,  60,  16, sTxtString];
aWnd[IDLOCALE1  ] = ["BUTTON",   0,       0, 0x50010003, 110, 170,  90,  16, sTxtLocale];
aWnd[IDNUM1     ] = ["BUTTON",   0,       0, 0x50010003, 205, 170,  120,  16, sTxtNum];
aWnd[IDKEY2     ] = ["STATIC",   0,       0, 0x50000000,  20, 215,  60,  13, sTxtKey+" &2:"];
aWnd[IDBEGCOL2  ] = ["EDIT",     0,   0x200, 0x50012080,  80, 215,  55,  20, ""];
aWnd[IDENDCOL2  ] = ["EDIT",     0,   0x200, 0x50012080, 140, 215,  55,  20, ""];
aWnd[IDDESC2    ] = ["BUTTON",   0,       0, 0x50010003, 205, 200,  120,  16, sTxtDesc];
aWnd[IDIGCASE2  ] = ["BUTTON",   0,       0, 0x50010003, 205, 220,  120,  16, sTxtIgCase];
aWnd[IDSTRING2  ] = ["BUTTON",   0,       0, 0x50010003,  50, 245,  60,  16, sTxtString];
aWnd[IDLOCALE2  ] = ["BUTTON",   0,       0, 0x50010003, 110, 245,  90,  16, sTxtLocale];
aWnd[IDNUM2     ] = ["BUTTON",   0,       0, 0x50010003, 205, 245,  120,  16, sTxtNum];
aWnd[IDKEY3     ] = ["STATIC",   0,       0, 0x50000000,  20, 290,  60,  13, sTxtKey+" &3:"];
aWnd[IDBEGCOL3  ] = ["EDIT",     0,   0x200, 0x50012080,  80, 290,  55,  20, ""];
aWnd[IDENDCOL3  ] = ["EDIT",     0,   0x200, 0x50012080, 140, 290,  55,  20, ""];
aWnd[IDDESC3    ] = ["BUTTON",   0,       0, 0x50010003, 205, 275,  120,  16, sTxtDesc];
aWnd[IDIGCASE3  ] = ["BUTTON",   0,       0, 0x50010003, 205, 295,  120,  16, sTxtIgCase];
aWnd[IDSTRING3  ] = ["BUTTON",   0,       0, 0x50010003,  50, 320,  60,  16, sTxtString];
aWnd[IDLOCALE3  ] = ["BUTTON",   0,       0, 0x50010003, 110, 320,  90,  16, sTxtLocale];
aWnd[IDNUM3     ] = ["BUTTON",   0,       0, 0x50010003, 205, 320,  120,  16, sTxtNum];
aWnd[IDKEY4     ] = ["STATIC",   0,       0, 0x50000000,  20, 365,  60,  13, sTxtKey+" &4:"];
aWnd[IDBEGCOL4  ] = ["EDIT",     0,   0x200, 0x50012080,  80, 365,  55,  20, ""];
aWnd[IDENDCOL4  ] = ["EDIT",     0,   0x200, 0x50012080, 140, 365,  55,  20, ""];
aWnd[IDDESC4    ] = ["BUTTON",   0,       0, 0x50010003, 205, 350,  120,  16, sTxtDesc];
aWnd[IDIGCASE4  ] = ["BUTTON",   0,       0, 0x50010003, 205, 370,  120,  16, sTxtIgCase];
aWnd[IDSTRING4  ] = ["BUTTON",   0,       0, 0x50010003,  50, 395,  60,  16, sTxtString];
aWnd[IDLOCALE4  ] = ["BUTTON",   0,       0, 0x50010003, 110, 395,  90,  16, sTxtLocale];
aWnd[IDNUM4     ] = ["BUTTON",   0,       0, 0x50010003, 205, 395,  120,  16, sTxtNum];
aWnd[IDKEY5     ] = ["STATIC",   0,       0, 0x50000000,  20, 440,  60,  13, sTxtKey+" &5:"];
aWnd[IDBEGCOL5  ] = ["EDIT",     0,   0x200, 0x50012080,  80, 440,  55,  20, ""];
aWnd[IDENDCOL5  ] = ["EDIT",     0,   0x200, 0x50012080, 140, 440,  55,  20, ""];
aWnd[IDDESC5    ] = ["BUTTON",   0,       0, 0x50010003, 205, 425,  120,  16, sTxtDesc];
aWnd[IDIGCASE5  ] = ["BUTTON",   0,       0, 0x50010003, 205, 445,  120,  16, sTxtIgCase];
aWnd[IDSTRING5  ] = ["BUTTON",   0,       0, 0x50010003,  50, 470,  60,  16, sTxtString];
aWnd[IDLOCALE5  ] = ["BUTTON",   0,       0, 0x50010003, 110, 470,  90,  16, sTxtLocale];
aWnd[IDNUM5     ] = ["BUTTON",   0,       0, 0x50010003, 205, 470,  120,  16, sTxtNum];
aWnd[IDDESCALL  ] = ["BUTTON",   0,       0, 0x50010003, 205, 500,  120,  16, sTxtDescAll];
aWnd[IDIGCASEALL] = ["BUTTON",   0,       0, 0x50010003, 205, 520,  120,  16, sTxtIgCaseAll];
aWnd[IDSTRINGALL] = ["BUTTON",   0,       0, 0x50010003,  50, 545,  60,  16, sTxtStringAll];
aWnd[IDLOCALEALL] = ["BUTTON",   0,       0, 0x50010003, 110, 545,  90,  16, sTxtLocaleAll];
aWnd[IDNUMALL   ] = ["BUTTON",   0,       0, 0x50010003, 205, 545,  120,  16, sTxtNumAll];
aWnd[IDREVERSE  ] = ["BUTTON",   0,       0, 0x50010003,  20, 575, 170,  16, sTxtReverse];
aWnd[IDCOPYTOCB ] = ["BUTTON",   0,       0, 0x50010003,  20, 595, 290,  16, sTxtCopyToCB];
aWnd[IDSORT     ] = ["BUTTON",   0,       0, 0x50010000, 240,  15,  80,  23, sTxtSort];
aWnd[IDUNDO     ] = ["BUTTON",   0,       0, 0x50010000, 240,  47,  80,  23, sTxtUndo];
aWnd[IDREDO     ] = ["BUTTON",   0,       0, 0x50010000, 240,  72,  80,  23, sTxtRedo];

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

  if (! AkelPad.SendMessage(hEditWnd, 3127 /*AEM_GETCOLUMNSEL*/, 0, 0))
    AkelPad.SendMessage(hEditWnd, 3128 /*AEM_UPDATESEL*/, 1 /*AESELT_COLUMNON*/, 0);

  nLastLine = AkelPad.SendMessage(hEditWnd, 3129 /*AEM_GETLINENUMBER*/, 0 /*AEGL_LINECOUNT*/, 0);
  nLastCol  = LineMaxLength() + 1;

  if (AkelPad.WindowRegisterClass(sClassName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      hWndDlg = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                  0,               //dwExStyle
                  sClassName,      //lpClassName
                  sTxtCaption,     //lpWindowName
                  0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                  0,               //x
                  0,               //y
                  345,             //nWidth
                  650,             //nHeight
                  hMainWnd,        //hWndParent
                  0,               //ID
                  hInstDLL,        //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(sClassName);
  }

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

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

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

    CheckButtonsAll(0);
    CheckUndoRedo();

    bGetSel = GetSelection();

    //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", aWnd[IDBEGCOL][WND]);
    AkelPad.SendMessage(aWnd[IDBEGCOL][WND], 177 /*EM_SETSEL*/, 0, -1);
  }

  else if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 9) //VK_TAB
      SetSelection();
    else if (wParam == 27) //VK_ESCAPE
      oSys.Call("User32::PostMessage" + _TCHAR, hWnd, 16 /*WM_CLOSE*/, 0, 0);
    else if (wParam == 13) //VK_RETURN
    {
      if (! bIsReturn)
      {
        hFocus = oSys.Call("User32::GetFocus");
        if ((hFocus != aWnd[IDSORT][WND]) && (hFocus != aWnd[IDUNDO][WND]) && (hFocus != aWnd[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)  ||
        (nLowParam == IDBEGLINE) || (nLowParam == IDENDLINE) ||
        (nLowParam == IDBEGCOL1) || (nLowParam == IDENDCOL1) ||
        (nLowParam == IDBEGCOL2) || (nLowParam == IDENDCOL2) ||
        (nLowParam == IDBEGCOL3) || (nLowParam == IDENDCOL3) ||
        (nLowParam == IDBEGCOL4) || (nLowParam == IDENDCOL4) ||
        (nLowParam == IDBEGCOL5) || (nLowParam == IDENDCOL5))
    {
      CheckEditValue(nLowParam);
      if (bGetSel)
        SetSelection();
    }

    else if (((nLowParam >= IDDESC1) && (nLowParam <= IDNUM1)) ||
             ((nLowParam >= IDDESC2) && (nLowParam <= IDNUM2)) ||
             ((nLowParam >= IDDESC3) && (nLowParam <= IDNUM3)) ||
             ((nLowParam >= IDDESC4) && (nLowParam <= IDNUM4)) ||
             ((nLowParam >= IDDESC5) && (nLowParam <= IDNUM5)))
    {
      CheckButtons1(nLowParam);
      SetSelection();
    }

    else if ((nLowParam >= IDDESCALL) && (nLowParam <= IDCOPYTOCB))
    {
      CheckButtonsAll(nLowParam);
      SetSelection();
    }

    else if (nLowParam == IDSORT)
    {
      oSys.Call("User32::SetFocus", aWnd[IDBEGCOL][WND]);
      SetSelection();
      if (SortColumns())
      {
        SetSelection();
        CheckUndoRedo(nLowParam);
      }
    }

    else if (nLowParam == IDUNDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
      oSys.Call("User32::SetFocus", aWnd[IDBEGCOL][WND]);
    }

    else if (nLowParam == IDREDO)
    {
      bIsReturn = 1;
      CheckUndoRedo(nLowParam);
      oSys.Call("User32::SetFocus", aWnd[IDBEGCOL][WND]);
    }
  }

  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, sText)
{
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
  oSys.Call("User32::SetWindowText" + _TCHAR, hWnd, sText);
}

function MoveWindow(hWndParent, hWnd, vAction)
{
  var aRectParent;
  var aRect;
  var nX;
  var nY;

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

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

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

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

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

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

  return aRect;
}

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

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

  while ((nID < aWnd.length) && (hFocus != aWnd[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 sIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var aRect;
  var oFile;
  var sIniTxt;

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

    sIniTxt = 'nWndPosX='   + aRect.left + ';\r\n' +
              'nWndPosY='   + aRect.top  + ';\r\n' +
              'aDesc=['     + aDesc + '];\r\n' +
              'aIgCase=['   + aIgCase + '];\r\n' +
              'aString=['   + aString + '];\r\n' +
              'aLocale=['   + aLocale + '];\r\n' +
              'aNum=['      + aNum + '];\r\n' +
              'bDescAll='   + bDescAll + ';\r\n' +
              'bIgCaseAll=' + bIgCaseAll + ';\r\n' +
              'nMethod='    + nMethod + ';\r\n' +
              'bReverse='   + bReverse + ';\r\n' +
              'bCopyToCB='  + bCopyToCB + ';'

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

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

function CheckButtonsAll(nButton)
{
  var nDif = IDDESC2 - IDDESC1;
  var i;

  if (nButton == IDDESCALL)
  {
    bDescAll = AkelPad.SendMessage(aWnd[IDDESCALL][WND], BM_GETCHECK, 0, 0);
    aDesc    = [bDescAll, bDescAll, bDescAll, bDescAll, bDescAll];
  }
  else if (nButton == IDIGCASEALL)
  {
    bIgCaseAll = AkelPad.SendMessage(aWnd[IDIGCASEALL][WND], BM_GETCHECK, 0, 0);
    aIgCase    = [bIgCaseAll, bIgCaseAll, bIgCaseAll, bIgCaseAll, bIgCaseAll];
  }
  else if ((nButton == IDSTRINGALL) || (nButton == IDLOCALEALL) || (nButton == IDNUMALL))
  {
    if (nMethod == nButton - IDSTRINGALL + 1)
      nMethod = 0;
    else
    {
      nMethod = nButton - IDSTRINGALL + 1;
      aString = [0,0,0,0,0];
      aLocale = [0,0,0,0,0];
      aNum    = [0,0,0,0,0];
      if (nMethod == 1)
        aString = [1,1,1,1,1];
      else if (nMethod == 2)
        aLocale = [1,1,1,1,1];
      else if (nMethod == 3)
        aNum = [1,1,1,1,1];
    }
  }
  else if (nButton == IDREVERSE)
    bReverse = AkelPad.SendMessage(aWnd[IDREVERSE][WND],  BM_GETCHECK, 0, 0);
  else if (nButton == IDCOPYTOCB)
    bCopyToCB  = AkelPad.SendMessage(aWnd[IDCOPYTOCB][WND],  BM_GETCHECK, 0, 0);

  AkelPad.SendMessage(aWnd[IDDESCALL][WND],   BM_SETCHECK, bDescAll,       0);
  AkelPad.SendMessage(aWnd[IDIGCASEALL][WND], BM_SETCHECK, bIgCaseAll,     0);
  AkelPad.SendMessage(aWnd[IDSTRINGALL][WND], BM_SETCHECK, (nMethod == 1), 0);
  AkelPad.SendMessage(aWnd[IDLOCALEALL][WND], BM_SETCHECK, (nMethod == 2), 0);
  AkelPad.SendMessage(aWnd[IDNUMALL][WND],    BM_SETCHECK, (nMethod == 3), 0);
  AkelPad.SendMessage(aWnd[IDREVERSE][WND],   BM_SETCHECK, bReverse,       0);
  AkelPad.SendMessage(aWnd[IDCOPYTOCB][WND],  BM_SETCHECK, bCopyToCB,      0);

  for (i = 0; i < 5; ++i)
  {
    AkelPad.SendMessage(aWnd[IDDESC1   + i * nDif][WND], BM_SETCHECK, aDesc[i],   0);
    AkelPad.SendMessage(aWnd[IDIGCASE1 + i * nDif][WND], BM_SETCHECK, aIgCase[i], 0);
    AkelPad.SendMessage(aWnd[IDSTRING1 + i * nDif][WND], BM_SETCHECK, aString[i], 0);
    AkelPad.SendMessage(aWnd[IDLOCALE1 + i * nDif][WND], BM_SETCHECK, aLocale[i], 0);
    AkelPad.SendMessage(aWnd[IDNUM1    + i * nDif][WND], BM_SETCHECK, aNum[i],    0);
  }

  for (i = IDSORTK1; i <= IDNUMALL; ++i)
    oSys.Call("User32::EnableWindow", aWnd[i][WND], ! bReverse);
}

function CheckButtons1(nButton)
{
  var nDif = IDDESC2 - IDDESC1;
  var nKey;
  var i;

  if (((nButton - IDDESC1) % nDif) == 0)
  {
    aDesc[(nButton - IDDESC1) / nDif] = AkelPad.SendMessage(aWnd[nButton][WND], BM_GETCHECK, 0, 0);
    if (aDesc[0] && aDesc[1] && aDesc[2] && aDesc[3] && aDesc[4])
      bDescAll = 1;
    else
      bDescAll = 0;
    AkelPad.SendMessage(aWnd[IDDESCALL][WND], BM_SETCHECK, bDescAll, 0);
  }
  else if (((nButton - IDIGCASE1) % nDif) == 0)
  {
    aIgCase[(nButton - IDIGCASE1) / nDif] = AkelPad.SendMessage(aWnd[nButton][WND], BM_GETCHECK, 0, 0);
    if (aIgCase[0] && aIgCase[1] && aIgCase[2] && aIgCase[3] && aIgCase[4])
      bIgCaseAll = 1;
    else
      bIgCaseAll = 0;
    AkelPad.SendMessage(aWnd[IDIGCASEALL][WND], BM_SETCHECK, bIgCaseAll, 0);
  }
  else
  {
    nKey = Math.floor((nButton - IDDESC1) / nDif);
    aString[nKey] = 0;
    aLocale[nKey] = 0;
    aNum[nKey]    = 0;

    if (((nButton - IDSTRING1) % nDif) == 0)
      aString[nKey] = 1;
    else if (((nButton - IDLOCALE1) % nDif) == 0)
      aLocale[nKey] = 1;
    else if (((nButton - IDNUM1) % nDif) == 0)
      aNum[nKey] = 1;

    AkelPad.SendMessage(aWnd[IDSTRING1 + nKey * nDif][WND], BM_SETCHECK, aString[nKey], 0);
    AkelPad.SendMessage(aWnd[IDLOCALE1 + nKey * nDif][WND], BM_SETCHECK, aLocale[nKey], 0);
    AkelPad.SendMessage(aWnd[IDNUM1    + nKey * nDif][WND], BM_SETCHECK, aNum[nKey],    0);

    if (aString[0] && aString[1] && aString[2] && aString[3] && aString[4])
      nMethod = 1;
    else if (aLocale[0] && aLocale[1] && aLocale[2] && aLocale[3] && aLocale[4])
      nMethod = 2;
    else if (aNum[0] && aNum[1] && aNum[2] && aNum[3] && aNum[4])
      nMethod = 3;
    else
      nMethod = 0;

    AkelPad.SendMessage(aWnd[IDSTRINGALL][WND], BM_SETCHECK, (nMethod == 1), 0);
    AkelPad.SendMessage(aWnd[IDLOCALEALL][WND], BM_SETCHECK, (nMethod == 2), 0);
    AkelPad.SendMessage(aWnd[IDNUMALL][WND],    BM_SETCHECK, (nMethod == 3), 0);
  }
}

function CheckUndoRedo(nButton)
{
  var sTxtUndo = aWnd[IDUNDO][TXT];
  var sTxtRedo = aWnd[IDREDO][TXT];

  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);
  }

  if (nUndoLimit)
    sTxtUndo += " (" + nUndoLimit + ")";
  if (nRedoLimit)
    sTxtRedo += " (" + nRedoLimit + ")";

  SetWindowFontAndText(aWnd[IDUNDO][WND], hGuiFont, sTxtUndo);
  SetWindowFontAndText(aWnd[IDREDO][WND], hGuiFont, sTxtRedo);

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

function CheckEditValue(nIdWnd)
{
  var sEditValue;

  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[nIdWnd][WND], lpBuffer, 256);
  sEditValue = AkelPad.MemRead(lpBuffer, _TSTR);

  if ((nIdWnd == IDBEGLINE) || (nIdWnd == IDENDLINE))
  {
    if (sEditValue == 0)
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, "1");
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
    else if (sEditValue > nLastLine)
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, String(nLastLine));
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
  }

  else if ((nIdWnd == IDBEGCOL)  || (nIdWnd == IDENDCOL) ||
           (nIdWnd == IDBEGCOL1) || (nIdWnd == IDENDCOL1))
  {
    if (sEditValue == 0)
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, "1");
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
    else if (sEditValue > nLastCol)
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, String(nLastCol));
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
  }

  else if ((nIdWnd == IDBEGCOL2) || (nIdWnd == IDENDCOL2) ||
           (nIdWnd == IDBEGCOL3) || (nIdWnd == IDENDCOL3) ||
           (nIdWnd == IDBEGCOL4) || (nIdWnd == IDENDCOL4) ||
           (nIdWnd == IDBEGCOL5) || (nIdWnd == IDENDCOL5))
  {
    if (sEditValue == "0")
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, "");
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
    else if (sEditValue > nLastCol)
    {
      SetWindowFontAndText(aWnd[nIdWnd][WND], hGuiFont, String(nLastCol));
      AkelPad.SendMessage(aWnd[nIdWnd][WND], 177 /*EM_SETSEL*/, 0, -1);
    }
  }
}

function GetSelection()
{
  var lpBegSel = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpEndSel = AkelPad.MemAlloc(_X64 ? 24 : 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 (AkelPad.MemRead(_PtrAdd(lpBegSel, _X64 ? 16 : 8), DT_DWORD) < AkelPad.MemRead(_PtrAdd(lpEndSel, _X64 ? 16 : 8), DT_DWORD))
  {
    nCol1 = AkelPad.MemRead(_PtrAdd(lpBegSel, _X64 ? 16 : 8), DT_DWORD) + 1;
    nCol2 = AkelPad.MemRead(_PtrAdd(lpEndSel, _X64 ? 16 : 8), DT_DWORD) + 1;
  }
  else
  {
    nCol1 = AkelPad.MemRead(_PtrAdd(lpEndSel, _X64 ? 16 : 8), DT_DWORD) + 1;
    nCol2 = AkelPad.MemRead(_PtrAdd(lpBegSel, _X64 ? 16 : 8), DT_DWORD) + 1;
  }

  SetWindowFontAndText(aWnd[IDBEGLINE][WND], hGuiFont, String(nLine1));
  SetWindowFontAndText(aWnd[IDENDLINE][WND], hGuiFont, String(nLine2));
  SetWindowFontAndText(aWnd[IDBEGCOL][WND],  hGuiFont, String(nCol1));
  SetWindowFontAndText(aWnd[IDENDCOL][WND],  hGuiFont, String(nCol2));
  SetWindowFontAndText(aWnd[IDBEGCOL1][WND], hGuiFont, String(nCol1));
  SetWindowFontAndText(aWnd[IDENDCOL1][WND], hGuiFont, String(nCol2));

  AkelPad.MemFree(lpBegSel);
  AkelPad.MemFree(lpEndSel);
  return 1;
}

function SetSelection()
{
  var hWndFocus = oSys.Call("User32::GetFocus");
  var lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  var lpBegSel  = lpSelect;
  var lpEndSel  = _PtrAdd(lpSelect, _X64 ? 24 : 12);
  var lpSelFlag = _PtrAdd(lpSelect, _X64 ? 48 : 24);
  var nLine1, nLine2, nCol1, nCol2, i;

  for (i = 1000; i < aWnd.length; ++i)
  {
    if (aWnd[i][WND] == hWndFocus)
      break;
  }

  if ((i >= IDBEGCOL1) && (i <= IDNUM1))
    i = IDBEGCOL1;
  else if ((i >= IDBEGCOL2) && (i <= IDNUM2))
    i = IDBEGCOL2;
  else if ((i >= IDBEGCOL3) && (i <= IDNUM3))
    i = IDBEGCOL3;
  else if ((i >= IDBEGCOL4) && (i <= IDNUM4))
    i = IDBEGCOL4;
  else if ((i >= IDBEGCOL5) && (i <= IDNUM5))
    i = IDBEGCOL5;
  else
    i = IDBEGCOL;

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

  if ((nCol1 < 0) || (nCol2 < 0))
    nCol1 = nCol2 = 0;

  AkelPad.MemCopy(lpBegSel, nLine1, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpBegSel, _X64 ? 16 : 8), nCol1, DT_DWORD);
  AkelPad.MemCopy(lpEndSel, nLine2, DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpEndSel, _X64 ? 16 : 8), nCol2, DT_DWORD);
  AkelPad.MemCopy(lpSelFlag, 1, 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 LineMaxLength()
{
  var nMaxLenL = 0;
  var nBegLine;
  var nLenLine;
  var i;

  for (i = 0; i < nLastLine; ++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 SortColumns()
{
  var aDesc   = new Array(5);
  var aIgCase = new Array(5);
  var aString = new Array(5);
  var aLocale = new Array(5);
  var aNum    = new Array(5);
  var aCol    = [[], [], [], [], [], []];
  var aTxt    = [];
  var sText   = "";
  var nDif    = IDBEGCOL2 - IDBEGCOL1;
  var nLine1;
  var nLine2;
  var i;

  for (i = 0; i < 5; ++i)
  {
    aDesc[i]   = AkelPad.SendMessage(aWnd[IDDESC1   + i * nDif][WND], BM_GETCHECK, 0, 0);
    aIgCase[i] = AkelPad.SendMessage(aWnd[IDIGCASE1 + i * nDif][WND], BM_GETCHECK, 0, 0);
    aString[i] = AkelPad.SendMessage(aWnd[IDSTRING1 + i * nDif][WND], BM_GETCHECK, 0, 0);
    aLocale[i] = AkelPad.SendMessage(aWnd[IDLOCALE1 + i * nDif][WND], BM_GETCHECK, 0, 0);
    aNum[i]    = AkelPad.SendMessage(aWnd[IDNUM1    + i * nDif][WND], BM_GETCHECK, 0, 0);
  }

  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDBEGCOL][WND], lpBuffer, 256);
  aCol[0][0] = Number(AkelPad.MemRead(lpBuffer, _TSTR));
  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDENDCOL][WND], lpBuffer, 256);
  aCol[0][1] = Number(AkelPad.MemRead(lpBuffer, _TSTR));
  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDBEGLINE][WND], lpBuffer, 256);
  nLine1 = Number(AkelPad.MemRead(lpBuffer, _TSTR));
  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDENDLINE][WND], lpBuffer, 256);
  nLine2 = Number(AkelPad.MemRead(lpBuffer, _TSTR));
  for (i = 1; i < 6; ++i)
  {
    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDBEGCOL1 + (i - 1) * nDif][WND], lpBuffer, 256);
    aCol[i][0] = Number(AkelPad.MemRead(lpBuffer, _TSTR));
    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDENDCOL1 + (i - 1) * nDif][WND], lpBuffer, 256);
    aCol[i][1] = Number(AkelPad.MemRead(lpBuffer, _TSTR));
    if ((aCol[i][0] == 0) || (aCol[i][1] == 0) || (aCol[i][0] == aCol[i][1]))
    {
      aCol[i][0] = aCol[i][1] = 0;
      SetWindowFontAndText(aWnd[IDBEGCOL1 + (i - 1) * nDif][WND], hGuiFont, String(aCol[i][0]));
      SetWindowFontAndText(aWnd[IDENDCOL1 + (i - 1) * nDif][WND], hGuiFont, String(aCol[i][1]));
    }
  }

  if (aCol[0][0] == aCol[0][1])
  {
    AkelPad.MessageBox(hWndDlg, sTxtNoRangeC, sTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("User32::SetFocus", aWnd[IDENDCOL][WND]);
    AkelPad.SendMessage(aWnd[IDENDCOL][WND], 177 /*EM_SETSEL*/, 0, -1);
    return 0;
  }

  if (nLine1 == nLine2)
  {
    AkelPad.MessageBox(hWndDlg, sTxtNoRangeL, sTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("User32::SetFocus", aWnd[IDENDLINE][WND]);
    AkelPad.SendMessage(aWnd[IDENDLINE][WND], 177 /*EM_SETSEL*/, 0, -1);
    return 0;
  }

  if ((aCol[1][0] == aCol[1][1]) && (! bReverse))
  {
    AkelPad.MessageBox(hWndDlg, sTxtNoKey1, sTxtCaption, 48 /*MB_ICONEXCLAMATION*/);
    oSys.Call("User32::SetFocus", aWnd[IDENDCOL1][WND]);
    AkelPad.SendMessage(aWnd[IDENDCOL1][WND], 177 /*EM_SETSEL*/, 0, -1);
    return 0;
  }

  for (i = 5; i >= 0; --i)
  {
    if (aCol[i][0] == 0)
    {
      aCol.splice(i, 1);
      aDesc.splice(i - 1, 1);
      aIgCase.splice(i - 1, 1);
      aString.splice(i - 1, 1);
      aLocale.splice(i - 1, 1);
      aNum.splice(i - 1, 1);
    }
    else
    {
      --aCol[i][0];
      --aCol[i][1];
    }
  }
  --nLine1;
  --nLine2;

  if (bReverse)
  {
    aTxt  = GetTextRangeColumn([nLine1, aCol[0][0]], [nLine2, aCol[0][1]]);
    sText = aTxt.reverse().join("\r");
  }
  else
  {
    aTxt.length = aCol.length;
    for (i = 0; i < aTxt.length; ++i)
      aTxt[i] = GetTextRangeColumn([nLine1, aCol[i][0]], [nLine2, aCol[i][1]]);

    aTxt = ArrayTransp(aTxt);

    ArraySort(aTxt, aDesc, aIgCase, aString, aLocale, aNum);

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

  AkelPad.SendMessage(aWnd[IDBEGCOL][WND], 177 /*EM_SETSEL*/, 0, -1);

  if (bCopyToCB)
  {
    AkelPad.SetClipboardText(sText);
    return 0;
  }
  else
  {
    AkelPad.ReplaceSel(sText);
    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, aDesc, aIgCase, aString, aLocale, aNum)
{
  var lpStrA = AkelPad.MemAlloc(nLastCol * _TSIZE);
  var lpStrB = AkelPad.MemAlloc(nLastCol * _TSIZE);
  var nComp;
  var i;

  aTxt.sort(function(a, b) {
    for (i = 0; i < aDesc.length; ++i)
    {
      nComp = CompareValue(a[i + 1], b[i + 1], lpStrA, lpStrB, aDesc[i], aIgCase[i], aString[i], aLocale[i], aNum[i]);
      if (nComp != 0)
        return nComp;
    }
    return 0; });

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

function CompareValue(ValA, ValB, lpStrA, lpStrB, bDesc, bIgCase, bString, bLocale, bNum)
{
  var nResult;

  if (bString)
  {
    if (bIgCase)
    {
      ValA = ValA.toUpperCase();
      ValB = ValB.toUpperCase();
    }
    if (ValA > ValB)
      nResult = bDesc ? -1 : 1;
    else if (ValA < ValB)
      nResult = bDesc ? 1 : -1;
    else
      nResult = 0;
  }
  else if (bLocale)
  {
    AkelPad.MemCopy(lpStrA, ValA, _TSTR);
    AkelPad.MemCopy(lpStrB, ValB, _TSTR);
    nResult = oSys.Call("Kernel32::lstrcmp" + (bIgCase ? "i" : "") + _TCHAR, lpStrA, lpStrB);
    if (bDesc)
      nResult = -nResult;
  }
  else
  {
    var oRegExp = /(-?\d+\.?\d*)|(-?\.\d+)/;

    ValA    = oRegExp.exec(ValA);
    ValB    = oRegExp.exec(ValB);
    ValA    = ValA ? parseFloat(ValA[0]) : 0;
    ValB    = ValB ? parseFloat(ValB[0]) : 0;
    nResult = bDesc ? (ValB - ValA) : (ValA - ValB);
  }

  return nResult;
}

Offline
Posts: 7
Joined: Mon Nov 09, 2020 1:07 am

Řazení a ůpravy v řádcích

Post by graybeard »

Sort in Lines script with GUI
Czech Interface lang in within script SortLines.js from KDJ .

save as UTF8+BOM

SortLines.js

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=10988#p10988
// Version: 2019-07-01
// Author: KDJ
//
// *** Sort lines ***
//
// Sort lines according to two keys: by line length and by string, alphabetically or numerically; removes duplicate lines, reverses the order of lines
// Cz Řazení řádků podle dvou kláves: podle délky řádku a podle řetězce, abecedně nebo číselně;  odstraní duplicitní řádky, obrátí pořadí řádků
//
// Usage:
//   Call("Scripts::Main", 1, "SortLines.js")
//
// Shortcut keys in dialog box:
// Klávesové zkratky v dialogovém okně:
//   Enter - Sort
//   Esc   - Close
//   Shift+Alt+Right (Left, Down, Up, End, Home, PgDn, PgUp) - move dialog box(přesunout dialogové okno).

if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0415) //Polish
{
  var sTxtCaption   = "Sortowanie wierszy";
  var sTxtRange     = "Zakres";
  var sTxtFrom      = "Od";
  var sTxtTo        = "Do";
  var sTxtLines     = "Wiersze:";
  var sTxtColumns   = "&Kolumny:";
  var sTxtKeys      = "Klucze sortowania";
  var sTxtKey1      = "Klucz &1 - Długość wiersza";
  var sTxtKey2      = "Klucz &2 - Zawartość wiersza";
  var sTxtRTL       = "Czytaj od prawej do lewej";
  var sTxtEntLine   = "Cały &wiersz";
  var sTxtDesc      = "&Malejąco";
  var sTxtIgCase    = "&Ignoruj wlk. liter";
  var sTxtString    = "&String";
  var sTxtLocale    = "&Alfabetycznie";
  var sTxtNum       = "&Numerycznie";
  var sTxtSortAnd   = "Sortuj, a następnie";
  var sTxtRemoDuKey = "&Usuń wiersze z duplikatami kluczy";
  var sTxtExtrDuKey = "&Zachowaj tylko wiersze z duplikatami kluczy";
  var sTxtExtrUnKey = "Zac&howaj tylko wiersze z unikalnymi kluczami";
  var sTxtNoSort    = "Nie sortuj, ale";
  var sTxtReverse   = "&Odwróć kolejność wierszy";
  var sTxtCopyToCB  = "Wynik kopiuj do schowka, nie zmieniaj &tekstu";
  var sTxtUsePlug   = "Użyj wtyczki &Format";
  var sTxtSort      = "Sortuj";
  var sTxtUndo      = "&Cofnij"; 
  var sTxtRedo      = "&Powtórz";
  var sTxtNoRangeL  = "Brak zakresu wierszy.";
  var sTxtNoKey2    = "Brak zakresu kolumn w drugim kluczu sortowania.";
}
else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0419) //Russian translation by AZJIO
{
  var sTxtCaption   = "Сортировка строк";
  var sTxtRange     = "Диапазон строк";
  var sTxtFrom      = "От";
  var sTxtTo        = "До";
  var sTxtLines     = "Строки:";
  var sTxtColumns   = "&Колонки:";
  var sTxtKeys      = "Сортировать по ключам";
  var sTxtKey1      = "Ключ &1 - По длине строки";
  var sTxtKey2      = "Ключ &2 - По содержимому";
  var sTxtRTL       = "Читать справа налево";
  var sTxtEntLine   = "Вычислять всю &строку";
  var sTxtDesc      = "&По убыванию";
  var sTxtIgCase    = "&Игнор регистр";
  var sTxtString    = "&Строка";
  var sTxtLocale    = "&По алфавиту";
  var sTxtNum       = "&По номерам";
  var sTxtSortAnd   = "Сортировать, и далее:";
  var sTxtRemoDuKey = "&Удалить строки с дубль-ключами";
  var sTxtExtrDuKey = "&Оставить строки только с дубль-ключами";
  var sTxtExtrUnKey = "Оставить строки с уникальными ключами";
  var sTxtNoSort    = "Не сортировать, но:";
  var sTxtReverse   = "&Обратный порядок строк";
  var sTxtCopyToCB  = "Результат в буфер обмена, не изменяя документ";
  var sTxtUsePlug   = "Использовать плагин &Format";
  var sTxtSort      = "Сортировать";
  var sTxtUndo      = "&Отменить";
  var sTxtRedo      = "&Вернуть";
  var sTxtNoRangeL  = "Нет диапазона строк.";
  var sTxtNoKey2    = "Нет диапазона колонок во 2-м ключе сортировки.";
}
else if (AkelPad.GetLangId(0 /*LANGID_FULL*/) == 0x0405) //Czech translation by r.zapa
{
  var sTxtCaption   = "Řazení řádků";
  var sTxtRange     = "Rozsah řádků";
  var sTxtFrom      = "Od";
  var sTxtTo        = "Do";
  var sTxtLines     = "Řádky:";
  var sTxtColumns   = "&Sloupce:";
  var sTxtKeys      = "Seřadit podle klíčů";
  var sTxtKey1      = "Klíč &1-podle délky řádku";
  var sTxtKey2      = "Klíč &2-podle obsahu";
  var sTxtRTL       = "Číst zprava doleva";
  var sTxtEntLine   = "Vypočítat celý &řádek";
  var sTxtDesc      = "&Sestupně";
  var sTxtIgCase    = "&Ignor Velik.písm.";
  var sTxtString    = "&Řetězec";
  var sTxtLocale    = "&Dle abecedy";
  var sTxtNum       = "&Podle čísel";
  var sTxtSortAnd   = "Seřadit, a další:";
  var sTxtRemoDuKey = "&Odstranit řádky s dvojitými klíči";
  var sTxtExtrDuKey = "&Ponechat řádky pouze s dvojitými klíči";
  var sTxtExtrUnKey = "Nechte řádky s &jedinečnými klíči";
  var sTxtNoSort    = "Ne třídit, ale:";
  var sTxtReverse   = "&Reverzní pořadí řádků";
  var sTxtCopyToCB  = "Výsledek do schránky bez změny dokumentu";
  var sTxtUsePlug   = "Použít plugin &Format";
  var sTxtSort      = "Třídit";
  var sTxtUndo      = "&Zrušit";
  var sTxtRedo      = "&Vrátit";
  var sTxtNoRangeL  = "Žádný rozsah řádků.";
  var sTxtNoKey2    = "Žádný rozsah sloupců ve 2. klíči řazení.";
}
else
{
  var sTxtCaption   = "Sort lines";
  var sTxtRange     = "Range";
  var sTxtFrom      = "From";
  var sTxtTo        = "To";
  var sTxtLines     = "Lines:";
  var sTxtColumns   = "&Columns:";
  var sTxtKeys      = "Keys";
  var sTxtKey1      = "Key &1 - Line length";
  var sTxtKey2      = "Key &2 - Line content";
  var sTxtRTL       = "Read from right to left";
  var sTxtEntLine   = "&Entire line";
  var sTxtDesc      = "&Descending";
  var sTxtIgCase    = "&Ignore case";
  var sTxtString    = "&String";
  var sTxtLocale    = "&Alphabetically";
  var sTxtNum       = "&Numerically";
  var sTxtSortAnd   = "Sort, and also";
  var sTxtRemoDuKey = "Re&move lines with duplicate keys";
  var sTxtExtrDuKey = "E&xtract lines with duplicate keys";
  var sTxtExtrUnKey = "Extra&ct lines with unique keys";
  var sTxtNoSort    = "Not sort, but";
  var sTxtReverse   = "Reverse &order of lines";
  var sTxtCopyToCB  = "Resul&t copy to clipboard, do not replace text";
  var sTxtUsePlug   = "Use &Format plugin";
  var sTxtSort      = "Sort";
  var sTxtUndo      = "&Undo";
  var sTxtRedo      = "&Redo";
  var sTxtNoRangeL  = "There is no range of lines.";
  var sTxtNoKey2    = "There is no range of columns in second key.";
}

var DT_DWORD    = 3;
var BM_SETCHECK = 241;

var oSys       = AkelPad.SystemFunction();
var hMainWnd   = AkelPad.GetMainWnd();
var hEditWnd   = AkelPad.GetEditWnd();
var hGuiFont   = oSys.Call("Gdi32::GetStockObject", 17 /*DEFAULT_GUI_FONT*/);
var hInstDLL   = AkelPad.GetInstanceDll();
var sClassName = "AkelPad::Scripts::" + WScript.ScriptName + "::" + hInstDLL;
var bKey1      = 0;
var bDescLen   = 0;
var bKey2      = 1;
var bRTL       = 0;
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 bIsReturn;
var hFocus;
var nWndPosX;
var nWndPosY;

ReadWriteIni(0);

var aWnd        = [];
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 IDRTL       = 1011;
var IDENTLINE   = 1012;
var IDFROM2     = 1013;
var IDTO2       = 1014;
var IDCOLUMNS   = 1015;
var IDBEGCOL    = 1016;
var IDENDCOL    = 1017;
var IDDESC      = 1018;
var IDIGCASE    = 1019;
var IDSORT3     = 1020;
var IDSTRING    = 1021;
var IDLOCALE    = 1022;
var IDNUM       = 1023;
var IDSORT4     = 1024;
var IDREMODUKEY = 1025;
var IDEXTRDUKEY = 1026;
var IDEXTRUNKEY = 1027;
var IDNOSORT    = 1028;
var IDREVERSE   = 1029;
var IDREMODULIN = 1030;
var IDEXTRDULIN = 1031;
var IDEXTRUNLIN = 1032;
var IDCOPYTOCB  = 1033;
var IDUSEPLUG   = 1034;
var IDSORT      = 1035;
var IDUNDO      = 1036;
var IDREDO      = 1037;

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

//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               CLASS, WND, EXSTYLE,      STYLE,   X,   Y,   W,   H, TXT
aWnd[IDRANGE    ] = ["BUTTON",   0,       0, 0x50000007,  10,  10, 185,  70, sTxtRange];
aWnd[IDFROM     ] = ["STATIC",   0,       0, 0x50000000,  70,  30,  55,  13, sTxtFrom];
aWnd[IDTO       ] = ["STATIC",   0,       0, 0x50000000, 130,  30,  55,  13, sTxtTo];
aWnd[IDLINES    ] = ["STATIC",   0,       0, 0x50000000,  20,  45,  50,  13, sTxtLines];
aWnd[IDBEGLINE  ] = ["STATIC",   0,   0x200, 0x50000000,  70,  45,  55,  20, ""];
aWnd[IDENDLINE  ] = ["STATIC",   0,   0x200, 0x50000000, 130,  45,  55,  20, ""];
aWnd[IDSORT1    ] = ["BUTTON",   0,       0, 0x50000007,  10,  90, 290,  52, sTxtKeys];
aWnd[IDKEY1     ] = ["BUTTON",   0,       0, 0x50010003,  20, 115, 150,  16, sTxtKey1];
aWnd[IDDESCLEN  ] = ["BUTTON",   0,       0, 0x50010003, 205, 115,  90,  16, sTxtDesc];
aWnd[IDSORT2    ] = ["BUTTON",   0,       0, 0x50000007,  10, 135, 290, 130, ""];
aWnd[IDKEY2     ] = ["BUTTON",   0,       0, 0x50010003,  20, 150, 150,  16, sTxtKey2];
aWnd[IDRTL      ] = ["BUTTON",   0,       0, 0x50010003,  40, 170, 140,  16, sTxtRTL];
aWnd[IDENTLINE  ] = ["BUTTON",   0,       0, 0x50010003,  40, 190, 140,  16, sTxtEntLine];
aWnd[IDFROM2    ] = ["STATIC",   0,       0, 0x50000000,  70, 215,  55,  13, sTxtFrom];
aWnd[IDTO2      ] = ["STATIC",   0,       0, 0x50000000, 130, 215,  55,  13, sTxtTo];
aWnd[IDCOLUMNS  ] = ["STATIC",   0,       0, 0x50000000,  20, 230,  50,  13, sTxtColumns];
aWnd[IDBEGCOL   ] = ["EDIT",     0,   0x200, 0x50012080,  70, 230,  55,  20, ""];
aWnd[IDENDCOL   ] = ["EDIT",     0,   0x200, 0x50012080, 130, 230,  55,  20, ""];
aWnd[IDDESC     ] = ["BUTTON",   0,       0, 0x50010003, 205, 150,  90,  16, sTxtDesc];
aWnd[IDIGCASE   ] = ["BUTTON",   0,       0, 0x50010003, 205, 170,  90,  16, sTxtIgCase];
aWnd[IDSORT3    ] = ["BUTTON",   0,       0, 0x50000007, 195, 185, 105,  80, ""];
aWnd[IDSTRING   ] = ["BUTTON",   0,       0, 0x50000009, 205, 200,  90,  16, sTxtString];
aWnd[IDLOCALE   ] = ["BUTTON",   0,       0, 0x50000009, 205, 220,  90,  16, sTxtLocale];
aWnd[IDNUM      ] = ["BUTTON",   0,       0, 0x50000009, 205, 240,  90,  16, sTxtNum];
aWnd[IDSORT4    ] = ["BUTTON",   0,       0, 0x50000007,  10, 275, 290,  85, sTxtSortAnd];
aWnd[IDREMODUKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 295, 230,  16, sTxtRemoDuKey];
aWnd[IDEXTRDUKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 315, 230,  16, sTxtExtrDuKey];
aWnd[IDEXTRUNKEY] = ["BUTTON",   0,       0, 0x50010003,  60, 335, 230,  16, sTxtExtrUnKey];
aWnd[IDNOSORT   ] = ["BUTTON",   0,       0, 0x50000007,  10, 370, 290, 105, sTxtNoSort];
aWnd[IDREVERSE  ] = ["BUTTON",   0,       0, 0x50010003,  60, 390, 230,  16, sTxtReverse];
aWnd[IDREMODULIN] = ["BUTTON",   0,       0, 0x50010003,  60, 410, 230,  16, sTxtRemoDuKey];
aWnd[IDEXTRDULIN] = ["BUTTON",   0,       0, 0x50010003,  60, 430, 230,  16, sTxtExtrDuKey];
aWnd[IDEXTRUNLIN] = ["BUTTON",   0,       0, 0x50010003,  60, 450, 230,  16, sTxtExtrUnKey];
aWnd[IDCOPYTOCB ] = ["BUTTON",   0,       0, 0x50010003,  20, 485, 270,  16, sTxtCopyToCB];
aWnd[IDUSEPLUG  ] = ["BUTTON",   0,       0, 0x50010003,  20, 505, 270,  16, sTxtUsePlug];
aWnd[IDSORT     ] = ["BUTTON",   0,       0, 0x50010000, 220,  10,  80,  23, sTxtSort];
aWnd[IDUNDO     ] = ["BUTTON",   0,       0, 0x50010000, 220,  35,  80,  23, sTxtUndo];
aWnd[IDREDO     ] = ["BUTTON",   0,       0, 0x50010000, 220,  60,  80,  23, sTxtRedo];

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

  if (AkelPad.WindowRegisterClass(sClassName))
  {
    if (lpBuffer = AkelPad.MemAlloc(256 * _TSIZE))
    {
      hWndDlg = oSys.Call("User32::CreateWindowEx" + _TCHAR,
                  0,               //dwExStyle
                  sClassName,      //lpClassName
                  sTxtCaption,     //lpWindowName
                  0x90CA0000,      //WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX
                  0,               //x
                  0,               //y
                  315,             //nWidth
                  560,             //nHeight
                  hMainWnd,        //hWndParent
                  0,               //ID
                  hInstDLL,        //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(sClassName);
  }

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

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

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

    GetSelection();
    SetSelection();
    CheckButtons();
    CheckUndoRedo();

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

    hFocus = aWnd[bUsePlug ? IDKEY2 : IDKEY1][WND];
  }

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

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

  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 != aWnd[IDSORT][WND]) && (hFocus != aWnd[IDUNDO][WND]) && (hFocus != aWnd[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
    oSys.Call("User32::PostQuitMessage", 0);

  else
    SetDefID(hWnd);

  return 0;
}

function SetWindowFontAndText(hWnd, hFont, sText)
{
  AkelPad.SendMessage(hWnd, 48 /*WM_SETFONT*/, hFont, true);
  oSys.Call("User32::SetWindowText" + _TCHAR, hWnd, sText);
}

function MoveWindow(hWndParent, hWnd, vAction)
{
  var aRectParent;
  var aRect;
  var nX;
  var nY;

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

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

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

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

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

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

  return aRect;
}

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

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

  while ((nID < aWnd.length) && (hFocus != aWnd[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 sIniName = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.lastIndexOf(".")) + ".ini";
  var aRect;
  var oFile;
  var sIniTxt;

  if (bWrite)
  {
    aRect = GetWindowPos(hWndDlg);
    sIniTxt =
      'nWndPosX='  + aRect.left + ';\r\n' +
      'nWndPosY='  + aRect.top  + ';\r\n' +
      'bKey1='     + bKey1 + ';\r\n' +
      'bDescLen='  + bDescLen + ';\r\n' +
      'bKey2='     + bKey2 + ';\r\n' +
      'bRTL='      + bRTL + ';\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(sIniName, 2, true, 0);
    oFile.Write(sIniTxt);
    oFile.Close();
  }

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

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 == IDRTL)
    bRTL = ! bRTL;
  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(aWnd[IDKEY1][WND],      BM_SETCHECK, bKey1,           0);
  AkelPad.SendMessage(aWnd[IDDESCLEN][WND],   BM_SETCHECK, bDescLen,        0);
  AkelPad.SendMessage(aWnd[IDKEY2][WND],      BM_SETCHECK, bKey2,           0);
  AkelPad.SendMessage(aWnd[IDRTL][WND],       BM_SETCHECK, bRTL,            0);
  AkelPad.SendMessage(aWnd[IDENTLINE][WND],   BM_SETCHECK, bEntLine,        0);
  AkelPad.SendMessage(aWnd[IDDESC][WND],      BM_SETCHECK, bDesc,           0);
  AkelPad.SendMessage(aWnd[IDIGCASE][WND],    BM_SETCHECK, bIgCase,         0);
  AkelPad.SendMessage(aWnd[IDSTRING][WND],    BM_SETCHECK, (nMethod == 1),  0);
  AkelPad.SendMessage(aWnd[IDLOCALE][WND],    BM_SETCHECK, (nMethod == 2),  0);
  AkelPad.SendMessage(aWnd[IDNUM][WND],       BM_SETCHECK, (nMethod == 3),  0);
  AkelPad.SendMessage(aWnd[IDREMODUKEY][WND], BM_SETCHECK, (nSortAnd == 1), 0);
  AkelPad.SendMessage(aWnd[IDEXTRDUKEY][WND], BM_SETCHECK, (nSortAnd == 2), 0);
  AkelPad.SendMessage(aWnd[IDEXTRUNKEY][WND], BM_SETCHECK, (nSortAnd == 3), 0);
  AkelPad.SendMessage(aWnd[IDREVERSE][WND],   BM_SETCHECK, (nNoSort == 1),  0);
  AkelPad.SendMessage(aWnd[IDREMODULIN][WND], BM_SETCHECK, (nNoSort == 2),  0);
  AkelPad.SendMessage(aWnd[IDEXTRDULIN][WND], BM_SETCHECK, (nNoSort == 3),  0);
  AkelPad.SendMessage(aWnd[IDEXTRUNLIN][WND], BM_SETCHECK, (nNoSort == 4),  0);
  AkelPad.SendMessage(aWnd[IDCOPYTOCB][WND],  BM_SETCHECK, bCopyToCB,       0);
  AkelPad.SendMessage(aWnd[IDUSEPLUG][WND],   BM_SETCHECK, bUsePlug,        0);

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

function CheckUndoRedo(nButton)
{
  var nBegSel  = AkelPad.GetSelStart();
  var sTxtUndo = aWnd[IDUNDO][TXT];
  var sTxtRedo = aWnd[IDREDO][TXT];

  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)
    sTxtUndo += " (" + nUndoLimit + ")";
  if (nRedoLimit)
    sTxtRedo += " (" + nRedoLimit + ")";

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

  SetWindowFontAndText(aWnd[IDUNDO][WND], hGuiFont, sTxtUndo);
  SetWindowFontAndText(aWnd[IDREDO][WND], hGuiFont, sTxtRedo);

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

function CheckEditValue(nID)
{
  var sEditValue;

  oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[nID][WND], lpBuffer, 256);
  sEditValue = AkelPad.MemRead(lpBuffer, _TSTR);

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

function GetSelection()
{
  var lpBegSel = AkelPad.MemAlloc(_X64 ? 24 : 12 /*sizeof(AECHARINDEX)*/);
  var lpEndSel = AkelPad.MemAlloc(_X64 ? 24 : 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(aWnd[IDBEGLINE][WND], hGuiFont, String(nLine1));
  SetWindowFontAndText(aWnd[IDENDLINE][WND], hGuiFont, String(nLine2));

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

    SetWindowFontAndText(aWnd[IDBEGCOL][WND],  hGuiFont, String(nCol1));
    SetWindowFontAndText(aWnd[IDENDCOL][WND],  hGuiFont, String(nCol2));

    //removed (2018-02-01)
    //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 hFocus    = oSys.Call("User32::GetFocus");
  var lpSelect  = AkelPad.MemAlloc(_X64 ? 56 : 32 /*sizeof(AESELECTION)*/);
  var lpBegSel  = lpSelect;
  var lpEndSel  = _PtrAdd(lpSelect, _X64 ? 24 : 12);
  var lpSelFlag = _PtrAdd(lpSelect, _X64 ? 48 : 24);
  var nColSel   = 1;
  var nLine1, nLine2, nCol1, nCol2;

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

  if ((hFocus == aWnd[IDBEGCOL][WND]) || (hFocus == aWnd[IDENDCOL][WND]))
  {
    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[IDBEGCOL][WND], lpBuffer, 256);
    nCol1 = Number(AkelPad.MemRead(lpBuffer, _TSTR)) - 1;
    oSys.Call("User32::GetWindowText" + _TCHAR, aWnd[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(_PtrAdd(lpBegSel, _X64 ? 16 : 8), nCol1, DT_DWORD);
  AkelPad.MemCopy(lpEndSel, nLine2,  DT_DWORD);
  AkelPad.MemCopy(_PtrAdd(lpEndSel, _X64 ? 16 : 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 sText = "";
  var nLine1;
  var nLine2;
  var nCol1;
  var nCol2;
  var i;

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

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

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

  hFocus = oSys.Call("User32::GetFocus");

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

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

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

        if (bRTL)
        {
          for (i = 0; i < aTxt[1].length; ++i)
            aTxt[1][i] = aTxt[1][i].split("").reverse().join("");
        }
      }

      aTxt = ArrayTransp(aTxt);

      ArraySort(aTxt);

      for (i = 0; i < aTxt.length; ++i)
        sText += aTxt[i][0] + "\r";

      sText = sText.slice(0, -1);
    }

    if (bCopyToCB)
    {
      AkelPad.SetClipboardText(sText);
      oSys.Call("User32::SetFocus", hFocus);
      return 0;
    }
    else
    {
      AkelPad.ReplaceSel(sText, -1);
      oSys.Call("User32::SetFocus", hFocus);
      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(aA)
{
  var nLen1 = aA.length;
  var nLen2 = aA[0].length;
  var aB    = new Array(nLen2);
  var i, n;

  for (n = 0; n < nLen2; ++n)
  {
    aB[n] = [];

    for (i = 0; i < nLen1; ++i)
      aB[n].push(aA[i][n]);
  }

  return aB;
}

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

function CompareValue(aA, aB)
{
  var nResult = 0;

  if (bKey1)
  {
    if (aA[0].length > aB[0].length)
      nResult = bDescLen ? -1 : 1;
    else if (aA[0].length < aB[0].length)
      nResult = bDescLen ? 1 : -1;
  }

  if (bKey2 && (nResult == 0))
  {
    if (nMethod == 1)
    {
      if (bIgCase)
      {
        aA[1] = aA[1].toUpperCase();
        aB[1] = aB[1].toUpperCase();
      }
      if (aA[1] > aB[1])
        nResult = bDesc ? -1 : 1;
      else if (aA[1] < aB[1])
        nResult = bDesc ? 1 : -1;
    }
    else if (nMethod == 2)
    {
      nResult = oSys.Call("Kernel32::lstrcmp" + (bIgCase ? "i" : "") + _TCHAR, aA[1], aB[1]);
      if (bDesc)
        nResult = -nResult;
    }
    else
    {
      var oRegExp = /(-?\d+\.?\d*)|(-?\.\d+)/;
  
      aA[1] = oRegExp.exec(aA[1]);
      aB[1] = oRegExp.exec(aB[1]);
      aA[1] = aA[1] ? parseFloat(aA[1][0]) : 0;
      aB[1] = aB[1] ? parseFloat(aB[1][0]) : 0;
      nResult = bDesc ? (aB[1] - aA[1]) : (aA[1] - aB[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 sAscDesc = 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" + sAscDesc, ! bIgCase);
  else if (nMethod == 3)
    AkelPad.Call("Format::LineSortInt" + sAscDesc, ! bIgCase);
}
Post Reply