///////
//
// -= FAQ.JS =- JavaScript file, Copyright 2001 J-Software [http://www.jsoft.web2001.cz] [jsoft@centrum.cz]
//
//  - funkce (wtFAQtoc, wtFAQs)
//  - globální proměnné (Mpath, Mlang, Mimgpath, Mimg, Mtext)
//  = skript je kompatibilní s prohlížeči Microsoft Internet Explorer 5.0 a vyšší, Mozilla v0.9.1 a vyšší a Opera 5.12 a vyšší
//
//////

// - - FUNKCE - -
// funkce wtFAQtoc zapíše do dokumentu dvousloupcouvou tabulku se seznamem dostupných otázek
function wtFAQtoc(){
document.write('<table align="center" width="75%" border="1" cellspacing="0" cellpadding="0" bordercolorlight="#72AADE" bordercolordark="#000080" class="clFAQtoc"><tr bgcolor="#72AADE" align="center"><td colspan="2"><b>Seznam otázek a odpovědí:</b></td></tr><tr>');
var a; for (a=0; a<2; a++) {
 document.write('<td width="50%" align="left" valign="top">');
 var i; for (i=0; i<Math.floor(FAQdata.length/2)+1; i+=3) { FAQno=a*(Math.floor(FAQdata.length/2+2))+i;
  if (FAQdata[FAQno]!=null){
    document.write('<b>&nbsp; '+(FAQno/3+1)+'. &nbsp;</b><a href="#FAQ'+(FAQno/3+1)+'">'+FAQdata[FAQno]+'</a><br>');}}
 document.write('</td>');};
document.write('</tr></table>');
}

// funkce wtFAQs zapíše do dokumentu všechny otázky a odpovědi v jejich plném znění
function wtFAQs(){
var i; for (i=0; i<FAQdata.length; i+=3) { 
document.write('<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr><td><font face="Tahoma" size="4"><b><a name="FAQ'+(i/3+1)+'">'+(i/3+1)+'. '+FAQdata[i]+'</a></b></font></td><td align="right" valign="bottom"><font face="Tahoma" size="1"><b>'+FAQdata[i+2]+'</b></font></td></tr></table><hr size="1"><p>'+FAQdata[i+1]+'</p><br><br><br>');}
}

// - - DEKLARACE GLOBÁLNÍCH PROMĚNNÝCH - -
var FAQdownpath="download/faq/";
var FAQdata = new Array (
"\"Jak mám sakra dostat pryč ten modrej pruh?\"","Ten \"modrej pruh\" je docela důležitá věc pro odlaďování složitějších programů. Programátorovi říká, na jakém příkazu se právě nachází vykonávání programu. Pruh se dá aktivovat buď zastavením spuštěného programu klávesou Break (CTRL+Pause) anebo pomocí tzv. breakpointu (to je zase \"červenej pruh\", který označuje místo v programu, kde se má jeho vykonávání zastavit; breakpoint se aktivuje a deaktivuje stisknutím CTRL+F8 na požadovaném příkazu). Pomocí klávesy F7 můžete program krokovat příkaz po příkazu od místa, kde se program pozastavil, klávesou F9 obnovit běh programu, anebo - konečně - klávesou CTRL+F2 ten \"modrej pruh\" zrušit!","",
"\"Co je to ta ASCII tabulka?\"","Protože počítače nedokáží zpracovávat znaky jako takové, bylo už v dávné minulosti potřeba reprezentovat každý znak určitou číselnou hodnotou. Vznikla proto tzv. ASCII (z angl. American Standard Code of Information Interchange) tabulka. Můžeme si ji představit jako tabulku, kde každý znak má přiřazené vlastní identifikační číslo v rozsahu 0-255. Základní ASCII tabulka byla navržena v Americe pro standardizaci datových přenosů, ale s rozšiřováním počítačů po celém světě bylo potřeba vytvořit mnohem více národních tabulek a tak dnes je např. pro Českou republiku přípustných hned několik takových modifikací (IBM, Latin2, Bratrů Kamenických, KOI-8, Win1152, Win1250, ISO ad.). Dnes už se namísto ASCII standardizace používá ANSI, která může obsahovat až 65536 znaků, takže národní modifikace již nejsou nutné.<br>K příkladu: Obrázek obsahuje grafické zobrazení všech 256 znaků ASCII a jejich hodnot v decimální číselné soustavě.","<a href=\"javascript:{ShowImg('"+FAQdownpath+"ascii.png','Obrázek originálního kódu ASCII',546,536);}\" title=\"ASCII.PNG (7996 b)\">obrázek originálního ASCII od IBM</a>",
"Jak na šipky?","Šipky (stejně jako řada dalších kláves - tzv. rozšířené klávesy) nejsou uvedeny v ASCII tabulce jako znaky, takže je nelze načítat přímo. Pokud je totiž stisknuta rozšířená klávesa, vrátí funkce readkey hodnotu 0, a teprve po následném čtení vrátí kód klávesy.","<a href=\""+FAQdownpath+"ext_keys.txt\" title=\"EXT_KEYS.TXT (4632 b)\">Tabulka rozšířených kódů kláves</a> &nbsp; <a href=\""+FAQdownpath+"ext_keys.zip\" title=\"EXT_KEYS.ZIP (8324 b)\">Příklad</a>",
"Jak na myš?","To je otázka mnoha začínajících programátorů. Komunikace s myším ovladačem probíhá na úrovni assembleru (nejjednodušší programovací jazyk), takže to pro vás možná bude trošku složitější. Myš se ovládá pomocí několika funkcí, označených čísly. Jsou to funkce jako: inicializuj myš, zapni myší kurzor, skryj myší kurzor, vrať stav myši, nastav pozici kurzoru, nastav okno pro myš…<br>K běžné práci postačí funkce 0 (inicializace myši), 1 (zapnutí myšího kurzoru), 2 (skrytí myšího kurzoru) a 3 (zjištění stavu myši - souřadnice kurzoru a stav tlačítek). Jednotlivě funkce se volají (pomocí Pascalovského assembleru) takto (r je typu Registers; je třeba využít knihovnu DOS):<br><pre><font size=\"2\">r.ax:=číslofce;<br>intr(r,$33);<br></font></pre>Případné návratové hodnoty jsou pak v proměnných r.bx, r.cx, r.dx.<br>Pro zapnutí myšího kurzoru tedy stačí napsat:<br><pre><font size=\"2\">r.ax:=1;<br>intr(r,$33);<br></font></pre>Toť vše, o všechno ostatní se už postará ovladač myši.<br>Pro zjištění stavu myši slouží funkce 3:<br><pre><font size=\"2\">r.ax:=3;<br>intr(r,$33);<br></font></pre>Proměnná r.bx pak obsahuje stav tlačítek, r.cx obsahuje x-ovou souřadnici kurzoru myši, r.dx y-ovou souřadnici kurzoru myši.<br>Je důležité vědět, že před jakoukoliv úpravou obrazovky musíte myší kurzor vypnout, a poté znovu zapnout. Jinak se vám pod myším kurzorem budou dít zajímavé věci.<br>Pokud chcete vědět víc podívejte se na <a href=\""+FAQdownpath+"mouse.zip\" title=\"MOUSE.ZIP (28606 b)\"><b>příklad</b></a>. A pokud chcete vědět ještě víc, pak doporučuji Systémový manuál SYSMAN nebo AThelp - oba najdete v části <a href=\"maters.htm\"><b>Užitečné materiály.</b></a><br>","<a href=\""+FAQdownpath+"mouse.zip\" title=\"MOUSE.ZIP (28606 b)\">Příklad</a>",
"Jak zpracovat parametry programu?","Jako parametry jsou označovány informace, které zadá uživatel do příkazového řádku při spouštění programu. Jejich zjištění v programu probíhá pomocí funkcí ParamCount, která vrací počet zadaných parametrů a ParamStr(num), která vrátí text num-tého parametru.","<a href=\""+FAQdownpath+"params.zip\" title=\"PARAMS.ZIP (6412 b)\">Příklad</a>",
"Jak zjistit, jestli soubor/adresář existuje?","Jednoduše - metodou pokus-omyl. Pokud chceme zjistit existenci souboru, pokusíme se ho otevřít. Když proběhne otevření úspěšně (IOResult=0), pak soubor existuje, v opačném případě soubor neexistuje. U adresáře je to podobné: zkusíme vstoupit do adresáře pomocí procedury ChDir a pokud potom IOResult obsahuje 0, je všechno v pořádku - adresář existuje. Důležité je, aby před pokusem otevřít neexistující soubor byla vypnuta direktiva I ({$I-}), a nedošlo tak k chybovému hlášení a ukončení programu.","<a href=\""+FAQdownpath+"exist.zip\" title=\"EXIST.ZIP (7652 b)\">Příklad</a>",
"Jak nejjednodušeji porovnat dvě data?","Samozřejmě, můžeme si napsat svou (poměrně složitou) funkci - ale proč, když to jde jednodušeji? Využijeme pascalovské funkce PackTime a UnPackTime, které dokáží převést časový údaj na typ LongInt a zpět. Nejdříve je třeba deklarovat tři proměnné typu DateTime a dvě proměnné typu LongInt. Do první proměnné DateTime uložíme jedno datum, do druhé druhé datum a na obě použijeme proceduru PackTime, která převede datovou reprezentaci do typů LongInt. Pak od sebe odečteme tyto dvě proměnné LongInt a absolutní hodnotu výsledku převedeme pomocí funkce UnPackTime zpět do třetí proměnné DateTime, která nyní obsahuje rozdíl obou dat (v rocích, měsících, dnech, hodinách, minutách a vteřinách!)<br>Je nutné poznamenat, že tato metoda je vhodná spíše pro zjišťování rozdílů v řádu hodin a minut než roků, protože funkce PackTime správně zpracuje pouze data mezi roky 1980 a 2099.","<a href=\""+FAQdownpath+"date.zip\" title=\"DATE.ZIP (8088 b)\">Příklad</a>",
"Jak na převody číselných soustav?","","",
"Jak spolehlivě použít příkaz EXEC?","Příkaz EXEC spustí jiný program z prostředí vašeho. Aby to správně fungovalo, je důležité nastavit správné paměťové poměry hned na začátku vašeho programu pomocí direktivy M. A neméně důležité je použít příkaz EXEC opravdu správně. Je totiž mnohem lepší využít k volání příkazů a programů povolané služby operačního systému (neboli interpreteru příkazů). To je program jako každý jiný, v DOSu se jmenuje COMMAND.COM a jeho umístění na disku je uložené v systémové proměnné COMSPEC. Na zjištění jejího obsahu použijeme tedy pascalovskou funkci GetEnv, a Exec pak budeme s volat takto:<br><pre><font size=\"2\">SwapVectors;<br>Exec (GetEnv ('COMSPEC'), 'příkaz');<br>SwapVectors;</font></pre>","<a href=\""+FAQdownpath+"exec.zip\" title=\"EXEC.ZIP (7489 b)\">Příklad</a>",
"Jak dostat na pozadí textu všech 16 barev?","Pokud jste si toho ještě nevšimli, tak v normálním textovém režimu můžete pomocí procedury TextBackGround nastavit na pozadí textu pouze prvních 8 barev. Ale grafická karta dokáže nastavit samozřejmě všech 16, jenom se jí to musí říct. A to assemblerem (je potřeba knihovna DOS; r je typu registers;):<br><pre><font size=\"2\">r.ah:=$10;<br>r.al:=$3;<br>r.bl:=$0;<br>intr($10,r);<br></font></pre>Aby to fungovalo musí se barevné atributy textu nastavovat přes proměnnou TextAttr; asi takhle:<br><pre><font size=\"2\">textattr:=pozadítextu*16+barvatextu;<br></font></pre>Asi ještě stojí za zmínku, že za všechno se platí - v tomto případě zaplatíte tím, že už nebudete moci použít efektu blikání textu.","<a href=\""+FAQdownpath+"16bkcol.zip\" title=\"16BKCOL.ZIP (6693 b)\">Příklad</a>",
"Jak změnit kurzor v textovém režimu?","Textový kurzor je malá blikající čárka, která v textovém režimu označuje aktuální pozici výpisu textu na obrazovku. Je možné nastavit vertikální velikost tohoto kurzoru - a to, jak jinak, pomocí assembleru (je potřeba knihovna DOS; r je typu registers;):<br><pre><font size=\"2\">r.ah:=1;<br>r.cl:=<i>pocatecni_linka</i>;<br>r.ch:=<i>koncova_linka</i>;<br>intr($10,r);<br></font></pre>Maximální velikost je na celý znak tj. 8 řádků (od 0 do 8), minimální pak 0 (<i>pocatecni_linka</i> se nastavuje jako 32), takže kurzor není vidět.","<a href=\""+FAQdownpath+"cur_size.zip\" title=\"CUR_SIZE.ZIP (6523 b)\">Příklad</a>",
"Jak změnit kurzor v grafickém režimu?","Zkuste CursorEdit! Nakreslete si kurzory, jaké potřebujete,  uložte je do PAS unity a ve svém programu zavolejte proceduru SetCur(num), která nastaví na myš num-tý kurzor z použité unity.","",
"Jak nastavit jiný font v textovém režimu?","Zkuste FontEditor! Nakreslete si vlastní font, uložte ho do PAS unity, která při inicializaci ve vašem programu nastaví váš font!","",
"Jak pracovat v 256 barevném režimu?","","",
"Jak zjistit stav neaktivních kláves?","","",
"Jak zjistit sériové číslo disku/diskety?","Každý disk/disketa dostane při formátování sériové číslo. Někdy se hodí toto číslo znát, např. pro kontrolu originální diskety. Sériové číslo je zapsáno v boot sektoru disku, což je úplně první sektor na disku. Je tedy potřeba tento sektor z disku načíst a převést z něj sériové číslo do správné podoby. Boot sektor je velký 512 bytů, sériové číslo zabírá 4 byty (40-44 byte boot sektoru). Tyto čtyři bytu čtené pozpátku a převedené do hexadecimálního zápisu s pomlčkou uprostřed tvoří sériové číslo disku (např. 449A-5CF3).","<a href=\""+FAQdownpath+"getsn.zip\" title=\"GETSN.ZIP (6919 b)\">Příklad",
"Jak zkompilovat pomocné soubory přímo do EXE?","Pascal umožňuje zkompilovat pomocné soubory (ovladače grafiky, fonty ale i další soubory) přímo do EXE souboru. Nejprve je potřeba zkonvertovat soubory, které chcete \"přibalit\" do EXE do OBJ souborů. To uděláte pomocí programu BINOBJ.EXE, který je přiložený k Borland Pascalu.<br><pre><font size=\"2\">BINOBJ.EXE EGAVGA.BGI EGAVGA.OBJ SetGraphMode<br>BINOBJ.EXE LITT.CHR LITT.OBJ SetLittFont<br></font></pre>Pak už stačí vložit do programu následující kód ještě před inicializaci grafiky:<br><pre><font size=\"2\">{$L egavga.obj}{$L litt.obj}<br>RegisterBGIDriver (@SetGraphMode);<br>RegisterBGIFont (@SetLittFont);</font></pre>","<a href=\""+FAQdownpath+"pack.zip\" title=\"PACK.ZIP (27133 b)\">Příklad</a>",
"Jak pevně vložit znak na obrazovku?","Pěvné vložení znaku je takové vložení, kdy nevyužijeme žádnou z funkcí Pascalu ani BIOSu, ale zapíšeme znak přímo do videopaměti grafické karty. To je nejen rychlé, ale i průhledné, protože víme, že se nestalo nic jiného, než to, co jsme opravdu chtěli (tedy pouze umístit znak na obrazovku).<br>Začátek videopaměti pro textový režim 80x25 znaků je na adrese $B800:0000. Její velikost je 4000 bajtů - na každý znak obrazovky připadnou 2 bajty (č. znaku v ASCII tabulce a barevný atribut), znaků na obrazovce je 80 v každém z 25 řádků, takže 80*25*2 = 4000 bajtů.<br>Pro zápis znaku do videopaměti potřebujeme znát místo, kam znak a jeho atributy zapsat. Jednotlivé znaky jsou ve videopaměti je uspořádány po řádcích z levého horního rohu směrem vpravo dolů. Pozici ve videopaměti tedy vypočteme takto: (x+25*y)*2, přičemž x je celé číslo mezi 0 až 79 (číslo sloupce); y je celé číslo mezi 0 až 24 (číslo řádku). Na takto vypočtenou pozici zapíšeme 2 bajty definující znak - jeho číslo v ASCII a jeho barevný atribut.<br>Barevný atribut se vypočte jako <i>brava_znaku</i>+16*<i>barva_pozadí</i>.<br>Celé to nakonec může vypadat třeba takhle:<br><pre><font size=\"2\">Var Screen:Array [0..3999] of Byte Absolute $0B800:00000;<br>...<br>Screen[(0+25*0)*2]:=Ord('A');<br>Screen[(0+25*0)*2+1]:=14+1*16;<br></font></pre>Příklad zapíše do levého horního rohu obrazovky písmeno A žlutou barvou na tmavě modrém pozadí.","",
"Jak zjistit znak na obrazovce?","","",
"Jak uschovat a obnovit obsah textové obrazovky?","Jednoduše - zkopírujeme obsah využité videopaměti do RAM a potom zase zpět!<br><pre><font size=\"2\">move (mem[$B800:0000],screen,4000);</font></pre><br>Tato procedura zkopíruje 4000 bajtů z videopaměti ($B800:0000 je počátek videopaměti pro textový režim 80*25) do proměnné screen (typu array[1..4000] of byte). A až to budete chtít dát zpět, tak prostě prohodíte první dva parametry!<br>","<a href=\""+FAQdownpath+"savetext.zip\" title=\"SAVETEXT.ZIP (5806 b)\">Příklad</a>",
"Jak simulovat oheň v grafice?","Simulace hoření ohně není až tak složitá věc. Nejdůležitější je přitom vhodně nastavená paleta barev. Nejlepší je z bílé přes žlutou do červené, tmavě modré a nakonec do černé. Konečná úprava palety je už na vás.<br>Samotný výpočet plamenů ohně probíhá pro každý bod obrazovky (mimo posledních 2 řádků) [I,J] takhle:<br><pre><font size=\"2\">[I,J]:=([I,J]+[I,J+1]+[I-1,J+2]+[I+1,J+2]) div 4;</font></pre><br>Ale ještě předtím je potřeba připravit \"palivo\". Jako palivo náhodně vygenerujeme na poslední dva řádky obrazovky čtveřice (2x2 body) stejných bodů barvy 0 nebo 255 (v naší paletě je to černá nebo bílá).<br>Tak to je všechno. Teď už stačí jenom v cyklu opakovat celý postup v posledním odstavci a celá obrazovka vám shoří :)<br>Výsledek můžete posoudit v <b><a href=\""+FAQdownpath+"fire.zip\" title=\"FIRE.ZIP (9289 b)\">příkladu</a></b>.","<a href=\""+FAQdownpath+"fire.zip\" title=\"FIRE.ZIP (9289 b)\">Příklad</a>",
"Jak zjistit běžící operační systém?"," Teoreticky máme 2 možnosti: Zjistit jméno operačního systému ze systémové proměnné OS - to je rychlé a jednoduché, ale tato proměnná nebývá přítomná vždy a všude. A tak spolehlivější bude detekce assemblerem. Její výpis tady uvádět nebudu (je docela dlouhý), ale můžete se rovnou podívat na <a href=\""+FAQdownpath+"getos.zip\" title=\"GETOS.ZIP (7178 b)\"><b>příklad</b></a>.","<a href=\""+FAQdownpath+"getos.zip\" title=\"GETOS.ZIP (7178 b)\">Příklad</a>",
"Co když je mi to málo?","Tak se mrkni do části <a href=\"maters.htm\"><b>Užitečné materiály</b></a>, tam toho najdeš opravdu hodně (ale budeš si to muset najít sám) anebo se zkus poohlídnout jinde na Internetu.",""
);