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