root/java/sql-vyuka/web/hlavni.js @ 61:9e60af36a9df

Revision 61:9e60af36a9df, 7.2 KB (checked in by František Kučera <franta-hg@…>, 15 years ago)

Podpora vnitřních odkazů v průvodci.
Stačí napsat <a href="@klíč">vnitřní odkaz</a> a převede se na správný javascriptový odkaz.

Line 
1/** ID html prvků */
2const vstupniPole = 'vstupniPole';
3const vystupniPole = 'vystupniPole';
4const napovedniPole = 'napovedniPole';
5const stavovePole = 'stavovePole';
6
7
8/**
9 * Aby to fungovalo i v MSIE 6.
10 * @return AJAXový objekt.
11 */
12function getXmlHttpRequestObject() {
13    if (window.XMLHttpRequest) {
14        return new XMLHttpRequest();
15    } else if(window.ActiveXObject) {
16        return new ActiveXObject("Microsoft.XMLHTTP");
17    } else {
18        alert(document.getElementById('lokalizace').nepodporovany.value);
19        return null;
20    }
21}
22
23
24/** Náš AJAXový objekt. */
25var ajax = getXmlHttpRequestObject();
26
27
28/**
29 * Vrací vstup od uživatele.
30 * @return SQL příkaz zadaný uživatelem.
31 **/
32function getSQL() {
33    return document.getElementById('aplikace').vstupniPole.value;
34}
35
36
37/**
38 * Zobrazí text na požadovaném místě.
39 * @param text text k zobrazení. V případě formulářů prostý text, v ostatních případech HTML text.
40 * @param kde id prvku, do kterého se má text vypsat.
41 **/
42function zobraz(text, kde) {
43    if (kde == vstupniPole) {
44        document.getElementById('aplikace').vstupniPole.value = vratEntity(text);
45    } else if (kde == stavovePole)  {
46        document.getElementById('aplikace').stavovePole.value = vratEntity(text);
47    } else {
48        document.getElementById(kde).innerHTML = text + '<p>&nbsp;<!-- Šťastné hackování ;-) --></p>';
49    }
50}
51
52
53/** Jednoduchá AJAXová funkce, načte obsah souboru a zobrazí ho ve výstupním okně. */
54function ajaxVykonatSQL() {
55    if (ajax.readyState == 4 || ajax.readyState == 0) {
56        zobraz(document.getElementById('lokalizace').probihaSQL.value, stavovePole);
57        ajax.open("POST", 'ajax.jspx?akce=vykonat&sql=' + encodeURIComponent(getSQL()), true);
58        ajax.onreadystatechange = function() {
59            if (ajax.readyState == 4) {
60                zobraz(ajax.responseText, vystupniPole);
61                zobraz('', stavovePole);
62            }
63        };
64        ajax.send(null);
65    }
66    ulozURL();
67}
68
69
70/** Jednoduchá AJAXová funkce, načte obsah souboru a zobrazí ho ve výstupním okně. */
71function ajaxZobrazitHistorii() {
72    if (ajax.readyState == 4 || ajax.readyState == 0) {
73        zobraz(document.getElementById('lokalizace').probihaHistorie.value, stavovePole);
74        ajax.open("POST", 'ajax.jspx?akce=historie', true);
75        ajax.onreadystatechange = function() {
76            if (ajax.readyState == 4) {
77                zobraz(ajax.responseText, vystupniPole);
78                zobraz('', stavovePole);
79            }
80        };
81        ajax.send(null);
82    }
83}
84
85var pruvodceAktualniId = 0;
86var urlOdkaz = new Array();
87urlOdkaz['pruvodce'] = null;
88
89function ajaxPruvodcePredchozi() {
90    ajaxPruvodceNaviguj('predchozi', pruvodceAktualniId, null);
91}
92
93function ajaxPruvodceZpet() {
94    /** TODO: historie navigace */
95    alert('Tato funkce se teprve připravuje.');
96}
97
98function ajaxPruvodceVpred() {
99    /** TODO: historie navigace */
100    alert('Tato funkce se teprve připravuje.');
101}
102
103function ajaxPruvodceNasledujici() {
104    ajaxPruvodceNaviguj('nasledujici', pruvodceAktualniId, null);
105}
106
107function ajaxPruvodceKod(kod) {
108    ajaxPruvodceNaviguj('podleKodu', 0, kod);
109}
110
111function ajaxPruvodceId(id) {
112    ajaxPruvodceNaviguj('podleId', id, null);
113
114}
115
116function ajaxPruvodceNaviguj(akcePruvodce, id, kod) {
117    if (ajax.readyState == 4 || ajax.readyState == 0) {
118        ajax.open("POST", 'ajax.jspx?akce=napoveda&pruvodce=' + encodeURIComponent(akcePruvodce) + '&idPruvodce=' + encodeURIComponent(id) + '&kodPruvodce=' + encodeURIComponent(kod), true);
119        ajax.onreadystatechange = function() {
120            if (ajax.readyState == 4) {
121                zobraz(ajax.responseText, napovedniPole);
122                /** Uložíme si do paměti ID aktuální stránky */
123                if (document.getElementById('pruvodceData')) {
124                    pruvodceAktualniId = document.getElementById('pruvodceData').id.value;
125                } else {
126                    pruvodceAktualniId = 0;
127                }
128                /** Změníme URL v prohlížeči */
129                urlOdkaz['pruvodce']  = 'pruvodce=' + encodeURIComponent(pruvodceAktualniId);
130                ulozURL();
131                sestavStromy();
132                aktivujPruvodce();
133            }
134        };
135        ajax.send(null);
136    }
137}
138
139/**
140 * Parametry si ukládáme za # do URL (window.location.hash)
141 * Můžeme měnit URL, aniž by prohlížeč obnovoval stránku.
142 * Uživatel si může URL zkopírovat a obnovit si příště stav aplikace.
143 * @param parametr jméno parametru, který hledáme
144 * @return hodnota parametr
145 */
146function getParametr(parametr) {
147    parametr = parametr.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
148    //var regexS = "[\\?&]"+parametr+"=([^&#]*)";
149    var regexS = "[\\#&]"+parametr+"=([^&]*)";
150    var regex = new RegExp( regexS );
151    var results = regex.exec(window.location.hash);
152    if( results == null )
153        return "";
154    else
155        return decodeURIComponent(results[1]);
156}
157
158/**
159 * Uloží parametry (jako je SQL příkaz a stránka průvodce) do URL (za #),
160 * aby si uživatel mohl URL zkopírovat a příště si obnovit stav aplikace.
161 */
162function ulozURL() {
163    if (urlOdkaz['pruvodce']) {
164        window.location.hash = urlOdkaz['pruvodce'] + '&sql=' + encodeURIComponent(getSQL());
165    } else {
166        window.location.hash = 'sql=' + encodeURIComponent(getSQL());
167    }
168}
169/**
170 * Načte uložený stav aplikace z URL (SQL příkaz, průvodce).
171 */
172function nactiURL() {
173    /** Načteme uživatelův SQL příkaz z URL do vstupního pole */
174    if (getParametr('sql')) {
175        zobraz(getParametr('sql'), vstupniPole);
176    }
177   
178    /** Načteme pozici v nápovědě */
179    if (getParametr('pruvodce')) {
180        ajaxPruvodceId(getParametr('pruvodce'));
181    } else {
182        ajaxPruvodceKod('vitejte');
183    }
184}
185
186window.onload = function() {
187    nactiURL();
188}
189
190/**
191 * Přidá <pre> elementům v průvodci akci onclick,
192 * která se postará o načtení obsahu daného elementu do vstupního pole,
193 * aby uživatel tento kód nemusel opisovat.
194 *
195 * Zpracuje odkazy na průvodce:
196 * převede href="@klíč" na správný javascriptový odkaz.
197 */
198function aktivujPruvodce() {
199    /** Ukázky SQL kódu */
200    elementy = document.getElementsByTagName("pre");
201    for (var i = 0; i < elementy.length; i++) {
202        if (elementy[i].parentNode.id == napovedniPole) {
203            elementy[i].title = document.getElementById('lokalizace').klikniProNacteniPrikladu.value;
204            elementy[i].onclick = function() {
205                zobraz(this.innerHTML, 'vstupniPole');
206                return true;
207            };
208        }
209    }
210
211    /** Aktivace interních odkazů na průvodce */
212    elementy = document.getElementsByTagName("a");
213    for (var j = 0; j < elementy.length; j++) {
214        var odkaz = elementy[j].getAttribute("href");
215        if (odkaz.substring(0, 1) == '@') {
216            elementy[j].href = "javascript:ajaxPruvodceKod('" + odkaz.substring(1, odkaz.length) + "');";
217        }
218    }
219}
220
221/**
222 * Převede HTML entity zpět na znaky,
223 * aby se správně zobrazily ve vstupním nebo stavovém poli.
224 */
225function vratEntity (text) {
226    var vysledek = text;
227    vysledek = vysledek.replace('&lt;', '<', 'g');
228    vysledek = vysledek.replace('&gt;', '>', 'g');
229    vysledek = vysledek.replace('&amp;', '&', 'g');
230    return vysledek;
231
232}
Note: See TracBrowser for help on using the browser.