java/sql-vyuka/web/hlavni.js
author František Kučera <franta-hg@frantovo.cz>
Wed Jun 03 22:25:45 2009 +0200 (2009-06-03)
changeset 41 28b38fb1391b
parent 40 cc77526f46cf
child 42 4faa76a089e3
permissions -rw-r--r--
Experimentální implementace historie – fungují tlačítka zpět a vpřed v prohlížeči i v aplikaci (v navigační liště), ale nepracuje úplně správně.
Běží v nekonečné smyčce s čekáním 200 ms. Procházení historie nemění SQL příkaz (záměrně), ale přesto někdy nepracuje tak, jak se čeká.
franta-hg@3
     1
/** ID html prvků */
franta-hg@3
     2
const vstupniPole = 'vstupniPole';
franta-hg@3
     3
const vystupniPole = 'vystupniPole';
franta-hg@3
     4
const napovedniPole = 'napovedniPole';
franta-hg@20
     5
const stavovePole = 'stavovePole';
franta-hg@3
     6
franta-hg@3
     7
franta-hg@2
     8
/**
franta-hg@2
     9
 * Aby to fungovalo i v MSIE 6.
franta-hg@2
    10
 * @return AJAXový objekt.
franta-hg@2
    11
 */
franta-hg@2
    12
function getXmlHttpRequestObject() {
franta-hg@2
    13
    if (window.XMLHttpRequest) {
franta-hg@2
    14
        return new XMLHttpRequest();
franta-hg@2
    15
    } else if(window.ActiveXObject) {
franta-hg@2
    16
        return new ActiveXObject("Microsoft.XMLHTTP");
franta-hg@2
    17
    } else {
franta-hg@22
    18
        alert(document.lokalizace.nepodporovany.value);
franta-hg@2
    19
        return null;
franta-hg@2
    20
    }
franta-hg@2
    21
}
franta-hg@2
    22
franta-hg@22
    23
franta-hg@2
    24
/** Náš AJAXový objekt. */
franta-hg@2
    25
var ajax = getXmlHttpRequestObject();
franta-hg@2
    26
franta-hg@22
    27
franta-hg@2
    28
/**
franta-hg@3
    29
 * Vrací vstup od uživatele.
franta-hg@3
    30
 * @return SQL příkaz zadaný uživatelem.
franta-hg@3
    31
 **/
franta-hg@3
    32
function getSQL() {
franta-hg@11
    33
    return document.aplikace.vstupniPole.value;
franta-hg@3
    34
}
franta-hg@3
    35
franta-hg@22
    36
franta-hg@3
    37
/**
franta-hg@2
    38
 * Zobrazí text na požadovaném místě.
franta-hg@22
    39
 * @param text text k zobrazení. V případě formulářů prostý text, v ostatních případech HTML text.
franta-hg@22
    40
 * @param kde id prvku, do kterého se má text vypsat.
franta-hg@2
    41
 **/
franta-hg@2
    42
function zobraz(text, kde) {
franta-hg@19
    43
    if (kde == vstupniPole) {
franta-hg@19
    44
        document.aplikace.vstupniPole.value = text;
franta-hg@20
    45
    } else if (kde == stavovePole)  {
franta-hg@20
    46
        document.aplikace.stavovePole.value = text;
franta-hg@19
    47
    } else {
franta-hg@19
    48
        document.getElementById(kde).innerHTML = text + '<p>&nbsp;<!-- Šťastné hackování ;-) --></p>';
franta-hg@19
    49
    }
franta-hg@2
    50
}
franta-hg@2
    51
franta-hg@2
    52
franta-hg@2
    53
/** Jednoduchá AJAXová funkce, načte obsah souboru a zobrazí ho ve výstupním okně. */
franta-hg@5
    54
function ajaxVykonatSQL() {
franta-hg@2
    55
    if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@22
    56
        zobraz(document.lokalizace.probihaSQL.value, stavovePole);
franta-hg@24
    57
        ajax.open("POST", 'ajax.jspx?akce=vykonat&sql=' + encodeURIComponent(getSQL()), true);
franta-hg@19
    58
        ajax.onreadystatechange = function() {
franta-hg@19
    59
            if (ajax.readyState == 4) {
franta-hg@22
    60
                zobraz(ajax.responseText, vystupniPole);
franta-hg@22
    61
                zobraz('', stavovePole);
franta-hg@19
    62
            }
franta-hg@19
    63
        };
franta-hg@2
    64
        ajax.send(null);
franta-hg@2
    65
    }
franta-hg@39
    66
    ulozURL();
franta-hg@2
    67
}
franta-hg@5
    68
franta-hg@5
    69
franta-hg@5
    70
/** Jednoduchá AJAXová funkce, načte obsah souboru a zobrazí ho ve výstupním okně. */
franta-hg@5
    71
function ajaxZobrazitHistorii() {
franta-hg@5
    72
    if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@22
    73
        zobraz(document.lokalizace.probihaHistorie.value, stavovePole);
franta-hg@24
    74
        ajax.open("POST", 'ajax.jspx?akce=historie', true);
franta-hg@19
    75
        ajax.onreadystatechange = function() {
franta-hg@19
    76
            if (ajax.readyState == 4) {
franta-hg@22
    77
                zobraz(ajax.responseText, vystupniPole);
franta-hg@22
    78
                zobraz('', stavovePole);
franta-hg@19
    79
            }
franta-hg@19
    80
        };
franta-hg@5
    81
        ajax.send(null);
franta-hg@5
    82
    }
franta-hg@5
    83
}
franta-hg@38
    84
franta-hg@38
    85
var pruvodceAktualniId = 0;
franta-hg@39
    86
var urlOdkaz = new Array();
franta-hg@39
    87
urlOdkaz['pruvodce'] = null;
franta-hg@38
    88
franta-hg@38
    89
function ajaxPruvodcePredchozi() {
franta-hg@38
    90
    ajaxPruvodceNaviguj('predchozi', pruvodceAktualniId, null);
franta-hg@38
    91
}
franta-hg@38
    92
franta-hg@38
    93
function ajaxPruvodceZpet() {
franta-hg@41
    94
    try {
franta-hg@41
    95
        window.back();
franta-hg@41
    96
    } catch (e) { }
franta-hg@38
    97
}
franta-hg@38
    98
franta-hg@38
    99
function ajaxPruvodceVpred() {
franta-hg@41
   100
    try {
franta-hg@41
   101
        window.forward();
franta-hg@41
   102
    } catch (e) { }
franta-hg@38
   103
}
franta-hg@38
   104
franta-hg@38
   105
function ajaxPruvodceNasledujici() {
franta-hg@38
   106
    ajaxPruvodceNaviguj('nasledujici', pruvodceAktualniId, null);
franta-hg@38
   107
}
franta-hg@38
   108
franta-hg@38
   109
function ajaxPruvodceKod(kod) {
franta-hg@38
   110
    ajaxPruvodceNaviguj('podleKodu', 0, kod);
franta-hg@38
   111
}
franta-hg@38
   112
franta-hg@38
   113
function ajaxPruvodceId(id) {
franta-hg@38
   114
    ajaxPruvodceNaviguj('podleId', id, null);
franta-hg@38
   115
franta-hg@38
   116
}
franta-hg@38
   117
franta-hg@41
   118
function ajaxPruvodceNaviguj(akcePruvodce, id, kod) {
franta-hg@41
   119
    navigaceProhlizecem = false;
franta-hg@38
   120
    if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@38
   121
        ajax.open("POST", 'ajax.jspx?akce=napoveda&pruvodce=' + encodeURIComponent(akcePruvodce) + '&idPruvodce=' + encodeURIComponent(id) + '&kodPruvodce=' + encodeURIComponent(kod), true);
franta-hg@38
   122
        ajax.onreadystatechange = function() {
franta-hg@38
   123
            if (ajax.readyState == 4) {
franta-hg@38
   124
                zobraz(ajax.responseText, napovedniPole);
franta-hg@39
   125
                /** Uložíme si do paměti ID aktuální stránky */
franta-hg@38
   126
                if (document.pruvodceData) {
franta-hg@38
   127
                    pruvodceAktualniId = document.pruvodceData.id.value
franta-hg@38
   128
                } else {
franta-hg@38
   129
                    pruvodceAktualniId = 0;
franta-hg@38
   130
                }
franta-hg@39
   131
                /** Změníme URL v prohlížeči */
franta-hg@40
   132
                urlOdkaz['pruvodce']  = 'pruvodce=' + encodeURIComponent(pruvodceAktualniId);
franta-hg@39
   133
                ulozURL();
franta-hg@38
   134
            }
franta-hg@38
   135
        };
franta-hg@38
   136
        ajax.send(null);
franta-hg@38
   137
    }
franta-hg@38
   138
}
franta-hg@39
   139
franta-hg@39
   140
/**
franta-hg@40
   141
 * Parametry si ukládáme za # do URL (window.location.hash)
franta-hg@40
   142
 * Můžeme měnit URL, aniž by prohlížeč obnovoval stránku.
franta-hg@40
   143
 * Uživatel si může URL zkopírovat a obnovit si příště stav aplikace.
franta-hg@39
   144
 * @param parametr jméno parametru, který hledáme
franta-hg@39
   145
 * @return hodnota parametr
franta-hg@39
   146
 */
franta-hg@39
   147
function getParametr(parametr) {
franta-hg@39
   148
    parametr = parametr.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
franta-hg@39
   149
    //var regexS = "[\\?&]"+parametr+"=([^&#]*)";
franta-hg@39
   150
    var regexS = "[\\#&]"+parametr+"=([^&#]*)";
franta-hg@39
   151
    var regex = new RegExp( regexS );
franta-hg@39
   152
    var results = regex.exec(window.location.hash);
franta-hg@39
   153
    if( results == null )
franta-hg@39
   154
        return "";
franta-hg@39
   155
    else
franta-hg@39
   156
        return decodeURIComponent(results[1]);
franta-hg@39
   157
}
franta-hg@39
   158
franta-hg@39
   159
/**
franta-hg@39
   160
 * Uloží parametry (jako je SQL příkaz a stránka průvodce) do URL (za #),
franta-hg@39
   161
 * aby si uživatel mohl URL zkopírovat a příště si obnovit stav aplikace.
franta-hg@39
   162
 */
franta-hg@39
   163
function ulozURL() {
franta-hg@39
   164
    if (urlOdkaz['pruvodce']) {
franta-hg@39
   165
        window.location.hash = urlOdkaz['pruvodce'] + '&sql=' + encodeURIComponent(getSQL());
franta-hg@39
   166
    } else {
franta-hg@39
   167
        window.location.hash = 'sql=' + encodeURIComponent(getSQL());
franta-hg@39
   168
    }
franta-hg@39
   169
}
franta-hg@41
   170
franta-hg@41
   171
/**
franta-hg@41
   172
 * Načte uloženou pozici průvodce.
franta-hg@41
   173
 */
franta-hg@41
   174
function nactiURL() {
franta-hg@41
   175
    nactiURL(false);
franta-hg@41
   176
}
franta-hg@41
   177
franta-hg@39
   178
/**
franta-hg@39
   179
 * Načte uložený stav aplikace z URL (SQL příkaz, průvodce).
franta-hg@39
   180
 */
franta-hg@41
   181
function nactiURL(nacistSQL) {
franta-hg@40
   182
    /** Načteme uživatelův SQL příkaz z URL do vstupního pole */
franta-hg@41
   183
    if (nacistSQL && getParametr('sql')) {
franta-hg@39
   184
        zobraz(getParametr('sql'), vstupniPole);
franta-hg@39
   185
    }
franta-hg@40
   186
    
franta-hg@40
   187
    /** Načteme pozici v nápovědě */
franta-hg@40
   188
    if (getParametr('pruvodce')) {
franta-hg@40
   189
        ajaxPruvodceId(getParametr('pruvodce'));
franta-hg@40
   190
    } else {
franta-hg@40
   191
        ajaxPruvodceKod('vitejte');
franta-hg@40
   192
    }
franta-hg@39
   193
}
franta-hg@39
   194
franta-hg@39
   195
window.onload = function() {
franta-hg@41
   196
    nactiURL(true);
franta-hg@41
   197
}
franta-hg@41
   198
franta-hg@41
   199
var locationHash = location.hash;
franta-hg@41
   200
var navigaceProhlizecem = false;
franta-hg@41
   201
franta-hg@41
   202
setInterval(function() {
franta-hg@41
   203
    if (location.hash != locationHash) {
franta-hg@41
   204
        if (navigaceProhlizecem) {
franta-hg@41
   205
            nactiURL();
franta-hg@41
   206
        }
franta-hg@41
   207
        navigaceProhlizecem = false;
franta-hg@41
   208
        locationHash = location.hash;
franta-hg@41
   209
    }
franta-hg@41
   210
}, 200);
franta-hg@41
   211