java/sql-vyuka/web/hlavni.js
author František Kučera <franta-hg@frantovo.cz>
Thu May 24 15:47:48 2012 +0200 (2012-05-24)
changeset 80 d900e5a112cc
parent 72 fc3d6fa6fbcd
child 81 6fb319847482
permissions -rw-r--r--
Lepší odsazení JavaScriptu (tabulátory).
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@80
    13
	if (window.XMLHttpRequest) {
franta-hg@80
    14
		return new XMLHttpRequest();
franta-hg@80
    15
	} else if(window.ActiveXObject) {
franta-hg@80
    16
		return new ActiveXObject("Microsoft.XMLHTTP");
franta-hg@80
    17
	} else {
franta-hg@80
    18
		alert(document.getElementById('lokalizace').nepodporovany.value);
franta-hg@80
    19
		return null;
franta-hg@80
    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@80
    33
	return document.getElementById('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@80
    43
	if (kde == vstupniPole) {
franta-hg@80
    44
		document.getElementById('aplikace').vstupniPole.value = vratEntity(text);
franta-hg@80
    45
	} else if (kde == stavovePole)  {
franta-hg@80
    46
		document.getElementById('aplikace').stavovePole.value = vratEntity(text);
franta-hg@80
    47
	} else {
franta-hg@80
    48
		document.getElementById(kde).innerHTML = text + '<p>&nbsp;<!-- Šťastné hackování ;-) --></p>';
franta-hg@80
    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@80
    55
	if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@80
    56
		zobraz(document.getElementById('lokalizace').probihaSQL.value, stavovePole);
franta-hg@80
    57
		ajax.open("POST", 'ajax.jspx?akce=vykonat&sql=' + encodeURIComponent(getSQL()), true);
franta-hg@80
    58
		ajax.onreadystatechange = function() {
franta-hg@80
    59
			if (ajax.readyState == 4) {
franta-hg@80
    60
				zobraz(ajax.responseText, vystupniPole);
franta-hg@80
    61
				zobraz('', stavovePole);
franta-hg@80
    62
			}
franta-hg@80
    63
		};
franta-hg@80
    64
		ajax.send(null);
franta-hg@80
    65
	}
franta-hg@80
    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@80
    72
	if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@80
    73
		zobraz(document.getElementById('lokalizace').probihaHistorie.value, stavovePole);
franta-hg@80
    74
		ajax.open("POST", 'ajax.jspx?akce=historie', true);
franta-hg@80
    75
		ajax.onreadystatechange = function() {
franta-hg@80
    76
			if (ajax.readyState == 4) {
franta-hg@80
    77
				zobraz(ajax.responseText, vystupniPole);
franta-hg@80
    78
				zobraz('', stavovePole);
franta-hg@80
    79
				aktivujHistorii();
franta-hg@80
    80
			}
franta-hg@80
    81
		};
franta-hg@70
    82
	ajax.send(null);
franta-hg@80
    83
	}
franta-hg@5
    84
}
franta-hg@38
    85
franta-hg@38
    86
var pruvodceAktualniId = 0;
franta-hg@39
    87
var urlOdkaz = new Array();
franta-hg@39
    88
urlOdkaz['pruvodce'] = null;
franta-hg@38
    89
franta-hg@38
    90
function ajaxPruvodcePredchozi() {
franta-hg@80
    91
	ajaxPruvodceNaviguj('predchozi', pruvodceAktualniId, null);
franta-hg@38
    92
}
franta-hg@38
    93
franta-hg@38
    94
function ajaxPruvodceZpet() {
franta-hg@80
    95
	try {
franta-hg@80
    96
		history.back();
franta-hg@80
    97
		//window.back();
franta-hg@80
    98
		nactiURL();
franta-hg@80
    99
	} catch (e) {
franta-hg@80
   100
		alert(e);
franta-hg@80
   101
		// není historie
franta-hg@80
   102
	}
franta-hg@38
   103
}
franta-hg@38
   104
franta-hg@38
   105
function ajaxPruvodceVpred() {
franta-hg@80
   106
	try {
franta-hg@80
   107
		history.forward();
franta-hg@80
   108
		//window.forward();
franta-hg@80
   109
		nactiURL();
franta-hg@80
   110
	} catch (e) {
franta-hg@80
   111
		alert(e);
franta-hg@80
   112
		// není historie
franta-hg@80
   113
	}
franta-hg@38
   114
}
franta-hg@38
   115
franta-hg@38
   116
function ajaxPruvodceNasledujici() {
franta-hg@80
   117
	ajaxPruvodceNaviguj('nasledujici', pruvodceAktualniId, null);
franta-hg@38
   118
}
franta-hg@38
   119
franta-hg@38
   120
function ajaxPruvodceKod(kod) {
franta-hg@80
   121
	ajaxPruvodceNaviguj('podleKodu', 0, kod);
franta-hg@38
   122
}
franta-hg@38
   123
franta-hg@38
   124
function ajaxPruvodceId(id) {
franta-hg@80
   125
	ajaxPruvodceNaviguj('podleId', id, null);
franta-hg@38
   126
franta-hg@38
   127
}
franta-hg@38
   128
franta-hg@50
   129
function ajaxPruvodceNaviguj(akcePruvodce, id, kod) {
franta-hg@80
   130
	if (ajax.readyState == 4 || ajax.readyState == 0) {
franta-hg@80
   131
		ajax.open("POST", 'ajax.jspx?akce=napoveda&pruvodce=' + encodeURIComponent(akcePruvodce) + '&idPruvodce=' + encodeURIComponent(id) + '&kodPruvodce=' + encodeURIComponent(kod), true);
franta-hg@80
   132
		ajax.onreadystatechange = function() {
franta-hg@80
   133
			if (ajax.readyState == 4) {
franta-hg@80
   134
				zobraz(ajax.responseText, napovedniPole);
franta-hg@80
   135
				/** Uložíme si do paměti ID aktuální stránky */
franta-hg@80
   136
				if (document.getElementById('pruvodceData')) {
franta-hg@80
   137
					pruvodceAktualniId = document.getElementById('pruvodceData').id.value;
franta-hg@80
   138
				} else {
franta-hg@80
   139
					pruvodceAktualniId = 0;
franta-hg@80
   140
				}
franta-hg@80
   141
				/** Změníme URL v prohlížeči */
franta-hg@80
   142
				urlOdkaz['pruvodce']  = 'pruvodce=' + encodeURIComponent(pruvodceAktualniId);
franta-hg@80
   143
				ulozURL();
franta-hg@80
   144
				sestavStromy();
franta-hg@80
   145
				aktivujPruvodce();
franta-hg@80
   146
			}
franta-hg@80
   147
		};
franta-hg@70
   148
	ajax.send(null);
franta-hg@80
   149
	}
franta-hg@38
   150
}
franta-hg@39
   151
franta-hg@39
   152
/**
franta-hg@40
   153
 * Parametry si ukládáme za # do URL (window.location.hash)
franta-hg@40
   154
 * Můžeme měnit URL, aniž by prohlížeč obnovoval stránku.
franta-hg@40
   155
 * Uživatel si může URL zkopírovat a obnovit si příště stav aplikace.
franta-hg@39
   156
 * @param parametr jméno parametru, který hledáme
franta-hg@39
   157
 * @return hodnota parametr
franta-hg@39
   158
 */
franta-hg@39
   159
function getParametr(parametr) {
franta-hg@80
   160
	parametr = parametr.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
franta-hg@80
   161
	//var regexS = "[\\?&]"+parametr+"=([^&#]*)";
franta-hg@80
   162
	var regexS = "[\\#&]"+parametr+"=([^&]*)";
franta-hg@80
   163
	var regex = new RegExp( regexS );
franta-hg@80
   164
	var results = regex.exec(window.location.hash);
franta-hg@80
   165
	if ( results == null ) {
franta-hg@80
   166
		return "";
franta-hg@80
   167
	} else {
franta-hg@80
   168
		return decodeURIComponent(results[1]);
franta-hg@80
   169
	}
franta-hg@39
   170
}
franta-hg@39
   171
franta-hg@39
   172
/**
franta-hg@39
   173
 * Uloží parametry (jako je SQL příkaz a stránka průvodce) do URL (za #),
franta-hg@39
   174
 * aby si uživatel mohl URL zkopírovat a příště si obnovit stav aplikace.
franta-hg@39
   175
 */
franta-hg@39
   176
function ulozURL() {
franta-hg@80
   177
	if (urlOdkaz['pruvodce']) {
franta-hg@80
   178
		window.location.hash = urlOdkaz['pruvodce'] + '&sql=' + encodeURIComponent(getSQL());
franta-hg@80
   179
	} else {
franta-hg@80
   180
		window.location.hash = 'sql=' + encodeURIComponent(getSQL());
franta-hg@80
   181
	}
franta-hg@39
   182
}
franta-hg@39
   183
/**
franta-hg@39
   184
 * Načte uložený stav aplikace z URL (SQL příkaz, průvodce).
franta-hg@39
   185
 */
franta-hg@42
   186
function nactiURL() {
franta-hg@80
   187
	/** Načteme uživatelův SQL příkaz z URL do vstupního pole */
franta-hg@80
   188
	if (getParametr('sql')) {
franta-hg@80
   189
		zobraz(getParametr('sql'), vstupniPole);
franta-hg@80
   190
	}
franta-hg@80
   191
franta-hg@80
   192
	/** Načteme pozici v nápovědě */
franta-hg@80
   193
	if (getParametr('pruvodce')) {
franta-hg@80
   194
		ajaxPruvodceId(getParametr('pruvodce'));
franta-hg@80
   195
	} else {
franta-hg@80
   196
		ajaxPruvodceKod('vitejte');
franta-hg@80
   197
	}
franta-hg@39
   198
}
franta-hg@39
   199
franta-hg@39
   200
window.onload = function() {
franta-hg@80
   201
	nactiURL();
franta-hg@80
   202
	document.getElementById("zahlavi").addEventListener('click', function () {
franta-hg@80
   203
		ajaxPruvodceKod('vitejte');
franta-hg@80
   204
	}, false);
franta-hg@60
   205
}
franta-hg@60
   206
franta-hg@60
   207
/**
franta-hg@60
   208
 * Přidá <pre> elementům v průvodci akci onclick,
franta-hg@60
   209
 * která se postará o načtení obsahu daného elementu do vstupního pole,
franta-hg@60
   210
 * aby uživatel tento kód nemusel opisovat.
franta-hg@61
   211
 *
franta-hg@61
   212
 * Zpracuje odkazy na průvodce:
franta-hg@61
   213
 * převede href="@klíč" na správný javascriptový odkaz.
franta-hg@60
   214
 */
franta-hg@60
   215
function aktivujPruvodce() {
franta-hg@80
   216
	/** Ukázky SQL kódu */
franta-hg@80
   217
	elementy = document.getElementsByTagName("pre");
franta-hg@80
   218
	for (var i = 0; i < elementy.length; i++) {
franta-hg@80
   219
		if (elementy[i].parentNode.id == napovedniPole) {
franta-hg@80
   220
			elementy[i].title = document.getElementById('lokalizace').klikniProNacteniPrikladu.value;
franta-hg@80
   221
			elementy[i].onclick = function() {
franta-hg@80
   222
				zobraz(this.innerHTML, 'vstupniPole');
franta-hg@80
   223
				return true;
franta-hg@80
   224
			};
franta-hg@80
   225
		}
franta-hg@70
   226
	}
franta-hg@61
   227
franta-hg@80
   228
	/** Aktivace interních odkazů na průvodce */
franta-hg@80
   229
	elementy = document.getElementsByTagName("a");
franta-hg@80
   230
	for (var j = 0; j < elementy.length; j++) {
franta-hg@80
   231
		var odkaz = elementy[j].getAttribute("href");
franta-hg@80
   232
		if (odkaz.substring(0, 1) == '@') {
franta-hg@80
   233
			elementy[j].href = "javascript:ajaxPruvodceKod('" + odkaz.substring(1, odkaz.length) + "');";
franta-hg@80
   234
		}
franta-hg@70
   235
	}
franta-hg@60
   236
}
franta-hg@60
   237
franta-hg@60
   238
/**
franta-hg@64
   239
 * Přidá <td> elementům v historii akci onclick,
franta-hg@64
   240
 * která se postará o načtení obsahu daného elementu do vstupního pole,
franta-hg@64
   241
 * aby uživatel tento kód nemusel opisovat.
franta-hg@64
   242
 */
franta-hg@64
   243
function aktivujHistorii() {
franta-hg@80
   244
	radky = document.getElementsByTagName("tr");
franta-hg@80
   245
	for (var i = 1; i < radky.length; i++) {
franta-hg@80
   246
		if (radky[i].parentNode.parentNode.parentNode.id == vystupniPole) {
franta-hg@80
   247
			radky[i].childNodes[1].title = document.getElementById('lokalizace').klikniProNacteniHistorie.value;
franta-hg@80
   248
			radky[i].childNodes[1].style.cursor = 'pointer';
franta-hg@80
   249
			radky[i].childNodes[1].onclick = function() {
franta-hg@80
   250
				zobraz(this.innerHTML, 'vstupniPole');
franta-hg@80
   251
				return true;
franta-hg@80
   252
			};
franta-hg@80
   253
		}
franta-hg@70
   254
	}
franta-hg@64
   255
}
franta-hg@64
   256
franta-hg@64
   257
/**
franta-hg@60
   258
 * Převede HTML entity zpět na znaky,
franta-hg@60
   259
 * aby se správně zobrazily ve vstupním nebo stavovém poli.
franta-hg@60
   260
 */
franta-hg@60
   261
function vratEntity (text) {
franta-hg@80
   262
	var vysledek = text;
franta-hg@80
   263
	vysledek = vysledek.replace('&lt;', '<', 'g');
franta-hg@80
   264
	vysledek = vysledek.replace('&gt;', '>', 'g');
franta-hg@80
   265
	vysledek = vysledek.replace('&amp;', '&', 'g');
franta-hg@80
   266
	vysledek = vysledek.replace('&nbsp;', ' ', 'g');
franta-hg@80
   267
	vysledek = vysledek.replace('&#160;', ' ', 'g');
franta-hg@80
   268
	return vysledek;
franta-hg@60
   269
}
franta-hg@72
   270
franta-hg@72
   271
/**
franta-hg@72
   272
 * Načte dynamicky soubor se skriptem.
franta-hg@72
   273
 * url = název souboru.js
franta-hg@72
   274
 */
franta-hg@72
   275
function nactiJavaScript (url) {
franta-hg@80
   276
	var element = document.createElement("script");
franta-hg@80
   277
	element.src = url;
franta-hg@80
   278
	element.type = "text/javascript";
franta-hg@80
   279
	document.getElementsByTagName("head")[0].appendChild(element);
franta-hg@72
   280
}
franta-hg@80
   281