Prvni commit.
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - funkce pro použití XMLHttpRequest (AJAX)
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Hlavní objekt
|
||||
ajax = new Object();
|
||||
|
||||
// Typ používané metody pro AJAX
|
||||
ajax.typ_metody = new Object();
|
||||
ajax.typ_metody.NIC = 0;
|
||||
ajax.typ_metody.JAVASCRIPT = 1;
|
||||
ajax.typ_metody.ACTIVEX = 2;
|
||||
|
||||
// Nalezená metoda pro AJAX
|
||||
ajax.metoda = ajax.typ_metody.NIC;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní práce se soubory ~=============================================
|
||||
|
||||
// Zjištění podporované metody
|
||||
ajax.zjisti_metodu = function ()
|
||||
{
|
||||
ajax.metoda = ajax.typ_metody.NIC;
|
||||
try {
|
||||
if ( window.XMLHttpRequest ) {
|
||||
var nahravac = new XMLHttpRequest();
|
||||
if ( nahravac ) {
|
||||
ladici_vypis(LADENI, "ajax",
|
||||
"nalezen javascriptový XMLHttpRequest");
|
||||
ajax.metoda = ajax.typ_metody.JAVASCRIPT;
|
||||
}
|
||||
} else if ( window.ActiveXObject ) {
|
||||
var nahravac = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
if ( nahravac ) {
|
||||
ladici_vypis(LADENI, "ajax", "nalezen ActiveX objekt XMLHTTP");
|
||||
ajax.metoda = ajax.typ_metody.ACTIVEX;
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
|
||||
if ( ajax.metoda == ajax.typ_metody.NIC ) {
|
||||
ladici_vypis(CHYBA, "ajax", "nenalezena vhodná metoda");
|
||||
}
|
||||
|
||||
return ajax.metoda;
|
||||
}
|
||||
|
||||
// Vrátí true, pokud je možné použít metodu XMLHttpRequest
|
||||
ajax.je_funkcni = function ()
|
||||
{
|
||||
return (ajax.metoda != ajax.typ_metody.NIC);
|
||||
}
|
||||
|
||||
// Vytvoření nahrávače
|
||||
ajax.vrat_nahravac = function ()
|
||||
{
|
||||
try {
|
||||
if ( ajax.metoda == ajax.typ_metody.JAVASCRIPT ) {
|
||||
return new XMLHttpRequest();
|
||||
} else if ( ajax.metoda == ajax.typ_metody.ACTIVEX ) {
|
||||
return new ActiveXObject("Microsoft.XMLHTTP");
|
||||
}
|
||||
} catch (vse) {}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Nahrání souboru
|
||||
ajax.nahraj_soubor = function (nahravac, url, notifikace, asynchronne)
|
||||
{
|
||||
if ( nahravac ) {
|
||||
try {
|
||||
if ( notifikace ) {
|
||||
nahravac.onreadystatechange = notifikace;
|
||||
}
|
||||
nahravac.open("GET", url, asynchronne);
|
||||
nahravac.send(null);
|
||||
return nahravac;
|
||||
} catch (vse) {
|
||||
return undefined;
|
||||
}
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// Nahrání souboru asynchronně
|
||||
ajax.nahraj_soubor_pozdeji = function (nahravac, url, notifikace)
|
||||
{
|
||||
return this.nahraj_soubor(nahravac, url, notifikace, true);
|
||||
}
|
||||
|
||||
// Zkontrolování podporované metody
|
||||
ajax.kontrola_metody = function ()
|
||||
{
|
||||
if ( ajax.zjisti_metodu() == ajax.typ_metody.NIC ) {
|
||||
alert(
|
||||
"Nepodařilo se nalézt vhodnou metodu pro nahrávání souborů.\n\n" +
|
||||
"Funkce spojování slovníku nebude dostupná."
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - kódování odkazů do dokumentu
|
||||
|
||||
var kodovany_mail = [ "oldium", "pro", "seznam", "cz" ];
|
||||
if ( typeof(je_oldium_dot_home) == "undefined" ) {
|
||||
je_oldium_dot_home = false;
|
||||
if ( /^https?:\/\/[^\/]+\.oldium\.home\//.exec(document.URL) ) {
|
||||
je_oldium_dot_home = true;
|
||||
}
|
||||
}
|
||||
|
||||
function dekoduj_mail() {
|
||||
return kodovany_mail[0] + "." + kodovany_mail[1] + "@" +
|
||||
kodovany_mail[2] + "." + kodovany_mail[3];
|
||||
}
|
||||
|
||||
function obnov_odkazy() {
|
||||
var odkazy = document.getElementsByTagName("a");
|
||||
var muj_mail = dekoduj_mail();
|
||||
for ( var i = 0; i < odkazy.length; i++ ) {
|
||||
if ( odkazy[i].href == "mailto:" ) {
|
||||
odkazy[i].href = "mailto:" + muj_mail;
|
||||
} else {
|
||||
if ( je_oldium_dot_home ) {
|
||||
var novy_odkaz = odkazy[i].href.replace(
|
||||
/^(https?:\/\/[^\/]+\.oldium)\.net\//, "$1.home/" );
|
||||
odkazy[i].href = novy_odkaz;
|
||||
}
|
||||
if ( typeof(verze_karla) != "undefined" ) {
|
||||
var odkaz_verze = odkazy[i].href.replace(
|
||||
/karel-VERZE/, "karel-" + verze_karla );
|
||||
odkazy[i].href = odkaz_verze;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - funkce konzole pro ladění
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální nastavení ~====================================================
|
||||
|
||||
// Maximální počet řádek ve výpisu
|
||||
// TODO: Nastavení v uživatelském rozhraní
|
||||
nastaveni.pocet_radek_vypisu = 120;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Informace o vypisu
|
||||
vypisy = new Object();
|
||||
|
||||
// Aktuální počet řádek výpisu
|
||||
vypisy.pocet_radek = 0;
|
||||
|
||||
// Sledování myši
|
||||
vypisy.stisknute = false;
|
||||
|
||||
// Výpis v obráceném pořadí (novější první)
|
||||
vypisy.obracene = true;
|
||||
|
||||
// Úrovně ladicích výpisů
|
||||
CHYBA = 1; // Činnost nelze provést a uživatel nebyl informován
|
||||
VAROVANI = 2; // Činnost nelze provést, ale uživatel byl informován
|
||||
INFORMACE = 3; // Informace o provedené (!) činnosti
|
||||
DETAIL = 4; // Detailní informace o činnosti
|
||||
LADENI = 5; // Ladicí infomace pro vývojáře
|
||||
|
||||
vypisy.nazvy_urovni = new Array(
|
||||
"chyba",
|
||||
"varování",
|
||||
"informace",
|
||||
"detail",
|
||||
"ladění"
|
||||
);
|
||||
|
||||
// Nastavená úrovně výpisů
|
||||
var uroven = unescape(hodnota_cookie("uroven_ladeni"));
|
||||
for ( var i = 0; i < vypisy.nazvy_urovni.length; i++ ) {
|
||||
if ( uroven == vypisy.nazvy_urovni[i] ) {
|
||||
vypisy.uroven = i+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( vypisy.uroven == undefined ) {
|
||||
if ( je_oldium_dot_home ) {
|
||||
vypisy.uroven = DETAIL;
|
||||
} else {
|
||||
vypisy.uroven = INFORMACE;
|
||||
}
|
||||
}
|
||||
|
||||
// Nápověda k nastavení hloubky výpisů
|
||||
vypisy.uroven_tooltip = new Array(
|
||||
[ "Úroveň chyb", "Zapisuj pouze chyby" ],
|
||||
[ "Uroveň varování", "Zapisuj chyby a varování" ],
|
||||
[ "Úroveň informací", "Zapisuj chyby, varování a informativní zprávy" ],
|
||||
[ "Úroveň detailů",
|
||||
"Zapisuj chyby, varování, informativní a detailní zprávy" ],
|
||||
[ "Úroveň pro vývojáře", "Zapisuj všechny informace pro vývojáře" ]
|
||||
);
|
||||
|
||||
vypisy.zobrazeni_tooltip = new Array(
|
||||
[ "Ladicí konzola", "Zobraz ladicí konzolu" ],
|
||||
[ "Ladicí konzola", "Skryj ladicí konzolu" ]
|
||||
);
|
||||
|
||||
// Objekt pro práci s myší
|
||||
vypisy.mys = new Mys(new Tooltip());
|
||||
vypisy.mys.tooltip.muzu_zobrazit = function (info, detail) { return true; }
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce pro operace s konzolí ~==========================================
|
||||
|
||||
function ladici_vypis(uroven, funkce, info, text)
|
||||
{
|
||||
if ( uroven > vypisy.uroven ) return;
|
||||
var konzola = document.getElementById("konzola");
|
||||
if ( !konzola ) return;
|
||||
|
||||
if ( vypisy.pocet_radek == nastaveni.pocet_radek_vypisu ) {
|
||||
if ( ! vypisy.obracene ) {
|
||||
// Smaž první řádku ve výpisu
|
||||
konzola.removeChild(konzola.firstChild); // Text
|
||||
konzola.removeChild(konzola.firstChild); // <BR />
|
||||
vypisy.pocet_radek--;
|
||||
} else {
|
||||
// Smaž poslední řádku ve výpisu
|
||||
konzola.removeChild(konzola.lastChild); // <BR />
|
||||
konzola.removeChild(konzola.lastChild); // Text
|
||||
vypisy.pocet_radek--;
|
||||
}
|
||||
}
|
||||
|
||||
if ( text == undefined ) {
|
||||
text = info;
|
||||
info = undefined;
|
||||
}
|
||||
|
||||
var cas = formatuj_text(new Date());
|
||||
if ( info != undefined ) {
|
||||
info = formatuj_text(info);
|
||||
}
|
||||
|
||||
var element_radka = document.createElement("SPAN");
|
||||
var element_cas = element_radka.cloneNode(false);
|
||||
var element_uroven = element_radka.cloneNode(false);
|
||||
var element_funkce = element_radka.cloneNode(false);
|
||||
if ( info != undefined ) var element_info = element_radka.cloneNode(false);
|
||||
var element_text = element_radka.cloneNode(false);
|
||||
var element_mezera = document.createTextNode("\u00A0"); //
|
||||
var element_br = document.createElement("BR");
|
||||
|
||||
// Text
|
||||
element_cas.appendChild(document.createTextNode(cas));
|
||||
element_funkce.appendChild(document.createTextNode(funkce));
|
||||
element_uroven.appendChild(document.createTextNode(
|
||||
"["+vypisy.nazvy_urovni[uroven-1]+"]"));
|
||||
if ( info != undefined )
|
||||
element_info.appendChild(document.createTextNode("("+info+")"));
|
||||
element_text.appendChild(document.createTextNode(text));;
|
||||
|
||||
// Styly
|
||||
element_radka.className = "radka";
|
||||
element_cas.className = "cas";
|
||||
element_uroven.className = "uroven";
|
||||
element_funkce.className = "funkce";
|
||||
if ( info != undefined ) element_info.className = "info";
|
||||
element_text.className = "text";
|
||||
|
||||
// Tvar
|
||||
element_radka.appendChild(element_cas);
|
||||
element_radka.appendChild(element_mezera.cloneNode(false));
|
||||
element_radka.appendChild(element_uroven);
|
||||
element_radka.appendChild(element_mezera.cloneNode(false));
|
||||
element_radka.appendChild(element_funkce);
|
||||
if ( info != undefined ) {
|
||||
element_radka.appendChild(element_mezera.cloneNode(false));
|
||||
element_radka.appendChild(element_info);
|
||||
}
|
||||
element_radka.appendChild(element_mezera);
|
||||
element_radka.appendChild(element_text);
|
||||
|
||||
// Zařazení do HTML
|
||||
if ( ! vypisy.obracene ) {
|
||||
konzola.appendChild(element_radka);
|
||||
konzola.appendChild(element_br);
|
||||
} else {
|
||||
konzola.insertBefore(element_br, konzola.firstChild);
|
||||
konzola.insertBefore(element_radka, konzola.firstChild);
|
||||
}
|
||||
|
||||
vypisy.pocet_radek++;
|
||||
}
|
||||
|
||||
vypisy.mys.proved_vyber = function(objekt)
|
||||
{
|
||||
if ( objekt == "vypis" ) {
|
||||
return false;
|
||||
} else {
|
||||
vypisy.uroven = objekt.slice(-1);
|
||||
nastav_cookie("uroven_ladeni",
|
||||
escape(vypisy.nazvy_urovni[vypisy.uroven-1]), 365);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
vypisy.mys.prekresli_stav = function(objekt, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
if ( objekt != "vypis" ) {
|
||||
var element=document.getElementById("uroven");
|
||||
ladici_vypis(LADENI,"vypisy.mys.prekresli_stav",objekt,
|
||||
"nastavuji odpovídající pozadí");
|
||||
element.className = objekt;
|
||||
}
|
||||
}
|
||||
|
||||
vypisy.mys.proved_stisk = function(objekt)
|
||||
{
|
||||
if ( objekt == "vypis" ) {
|
||||
var element = document.getElementById("konzola");
|
||||
var konzola = element.parentNode;
|
||||
var ikona = document.getElementById("vypis-ikona");
|
||||
|
||||
if ( konzola.style.display != "block" ) {
|
||||
konzola.style.display = "block";
|
||||
ikona.className = "ikona-sbalit";
|
||||
} else {
|
||||
konzola.style.display = "none";
|
||||
ikona.className = "ikona-rozbalit";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vypisy.mys.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
if ( info == 'vypis' ) {
|
||||
var element = document.getElementById("konzola");
|
||||
var konzola = element.parentNode;
|
||||
var id = ( konzola.style.display != "block" ) ? 0 : 1;
|
||||
tvoric.obnov_tooltip( tooltip, "",
|
||||
vypisy.zobrazeni_tooltip[id][0], vypisy.zobrazeni_tooltip[id][1] );
|
||||
} else {
|
||||
tvoric.obnov_tooltip( tooltip, "", detail.nadpis, detail.popis );
|
||||
}
|
||||
}
|
||||
|
||||
function uroven_ladeni(uroven)
|
||||
{
|
||||
vypisy.mys.vyber("uroven-"+uroven);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar ladicí konzole
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování konzole ~==================================================
|
||||
|
||||
document.write('<div class="ovladani-ladeni">');
|
||||
|
||||
document.write('<div class="prvky"><div class="obsah">');
|
||||
|
||||
document.write('<div id="uroven" class="uroven-1"></div>');
|
||||
|
||||
document.write('<div class="maska">');
|
||||
for ( var i = 1; i <= vypisy.uroven_tooltip.length; i++ ) {
|
||||
var mys_info = "'uroven-"+i+"'";
|
||||
var mys_detail =
|
||||
"{nadpis:'"+vypisy.uroven_tooltip[i-1][0]+"',"+
|
||||
"popis:'"+vypisy.uroven_tooltip[i-1][1]+"'}";
|
||||
document.write('<div id="uroven-'+i+'" '+
|
||||
'onmouseover="return vypisy.mys.pres(event,'+mys_info+','+mys_detail+');" '+
|
||||
'onmouseout="return vypisy.mys.pryc(event,'+mys_info+','+mys_detail+');" '+
|
||||
'onmousedown="return vypisy.mys.stisk(event,'+mys_info+','+mys_detail+');"'+
|
||||
'onmouseup="return vypisy.mys.pust(event,'+mys_info+','+mys_detail+');" '+
|
||||
'></div>');
|
||||
}
|
||||
document.write('</div>');
|
||||
|
||||
document.write('<div id="vypis-ikona" class="ikona-rozbalit"></div>');
|
||||
document.write('<div class="vypis-ikona" '+
|
||||
'onmouseover="return vypisy.mys.pres(event,\'vypis\');" ' +
|
||||
'onmouseout="return vypisy.mys.pryc(event,\'vypis\');" '+
|
||||
'onmousedown="return vypisy.mys.stisk(event,\'vypis\');" '+
|
||||
'onmouseup="return vypisy.mys.pust(event,\'vypis\');" '+
|
||||
'></div>');
|
||||
|
||||
document.write('</div></div>');
|
||||
|
||||
document.write('<p class="popis">Ladicí konzola</p>');
|
||||
|
||||
document.write('</div>');
|
||||
|
||||
document.write('<div class="konzola"><p id="konzola"></p></div>');
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
uroven_ladeni(vypisy.uroven);
|
||||
@@ -0,0 +1,401 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní funkce pro město
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální nastavení ~====================================================
|
||||
|
||||
// Čas pro dvojklik v milisekundách
|
||||
// TODO: Nastavení v uživatelském rozhraní
|
||||
nastaveni.dvojklik = 500;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Pozice Karla
|
||||
karel = new Object();
|
||||
|
||||
// Směr: 0-východ, 1-sever, 2-západ, 3-jih
|
||||
karel.VYCHOD = 0;
|
||||
karel.SEVER = 1;
|
||||
karel.ZAPAD = 2;
|
||||
karel.JIH = 3;
|
||||
|
||||
karel.smer = karel.VYCHOD;
|
||||
karel.pozice = {x:0, y:0};
|
||||
karel.nazev_smeru = new Array("vychod", "sever", "zapad", "jih");
|
||||
karel.nazev_smeru_plny = new Array("východ", "sever", "západ", "jih");
|
||||
|
||||
// Pozice domova
|
||||
domov = new Object();
|
||||
domov.pozice = {x:0, y:0};
|
||||
|
||||
// Konstanty pohybu (východ, sever, západ, jih)
|
||||
plus = new Object();
|
||||
plus.x = new Array(1, 0, -1, 0);
|
||||
plus.y = new Array(0, 1, 0, -1);
|
||||
|
||||
// Struktura města
|
||||
mesto = new Object();
|
||||
|
||||
// Velikost
|
||||
mesto.velikost = {x: 10, y: 10};
|
||||
|
||||
// Pole
|
||||
mesto.pole = new Array();
|
||||
mesto.pole[0] = new Array();
|
||||
for ( var x = 0; x < mesto.velikost.x; x++ ) {
|
||||
mesto.pole[0].push(0);
|
||||
}
|
||||
for ( var y = 1; y < mesto.velikost.y; y++ ) {
|
||||
mesto.pole[y] = mesto.pole[0].concat();
|
||||
}
|
||||
|
||||
// Názvy obrázků
|
||||
mesto.obrazky = new Array();
|
||||
|
||||
mesto.obrazky[-1] = "zed";
|
||||
mesto.obrazky[0] = null;
|
||||
for ( var i = 1; i < 9; i++ ) { // A potom značky
|
||||
mesto.obrazky[i] = "znacka-"+i;
|
||||
}
|
||||
|
||||
// Objekt pro práci s myší
|
||||
mesto.mys = new Mys();
|
||||
|
||||
// Čas posledního kliku (provedení akce) - pro dvojklik
|
||||
mesto.posledni_klik = null;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro aktualizaci města ~=================================
|
||||
|
||||
// Nastav správné parametry políčka podle města
|
||||
mesto.prekresli_pole = function (pozice)
|
||||
{
|
||||
var element = document.getElementById('pozice_'+pozice.x+'_'+pozice.y);
|
||||
var pole = mesto.pole[pozice.x][pozice.y];
|
||||
var obrazek = mesto.obrazky[pole];
|
||||
|
||||
if ( element.className != obrazek ) {
|
||||
element.className = obrazek;
|
||||
}
|
||||
}
|
||||
|
||||
// Nastav pozici Karla
|
||||
mesto.pozice_karla = function (pozice)
|
||||
{
|
||||
if ( pozice.x >= 0 && pozice.x < mesto.velikost.x &&
|
||||
pozice.y >= 0 && pozice.y < mesto.velikost.y &&
|
||||
mesto.pole[pozice.x][pozice.y] >= 0 )
|
||||
{
|
||||
var element = document.getElementById('pozice_karel');
|
||||
element.style.left = (pozice.x*32)+"px";
|
||||
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
|
||||
karel.pozice = pozice;
|
||||
ladici_vypis(DETAIL, "mesto.pozice_karla", pozice, "Karel umístěn");
|
||||
return true;
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "mesto.pozice_karla", pozice, "Karla nelze umístit kvůli zdi");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Nastav orientaci Karla
|
||||
mesto.orientace_karla = function (smer)
|
||||
{
|
||||
smer %= karel.nazev_smeru.length;
|
||||
if ( smer < 0 ) smer += karel.nazev_smeru.length;
|
||||
var element = document.getElementById('pozice_karel');
|
||||
element.className = "karel-"+karel.nazev_smeru[smer];
|
||||
karel.smer = smer;
|
||||
ladici_vypis(DETAIL, "mesto.orientace_karla",
|
||||
"Karel nasměrován na "+karel.nazev_smeru_plny[smer]);
|
||||
}
|
||||
|
||||
// Nastav pozici Domova
|
||||
mesto.pozice_domova = function (pozice)
|
||||
{
|
||||
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
|
||||
var element = document.getElementById('pozice_domov');
|
||||
element.style.left = (pozice.x*32)+"px";
|
||||
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
|
||||
domov.pozice = pozice;
|
||||
ladici_vypis(DETAIL, "mesto.pozice_domova", pozice, "domov umístěn");
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "mesto.pozice_domova", pozice, "domov nelze umístit kvůli zdi");
|
||||
}
|
||||
}
|
||||
|
||||
// Nahrání celého města
|
||||
mesto.nahraj_mesto = function (karel_pozice, smer, domov_pozice, mesto_pole)
|
||||
{
|
||||
var uzivatel_chce = window.confirm("Opravdu si přejete nahrát město?");
|
||||
if ( uzivatel_chce ) {
|
||||
mesto.velikost.x = mesto_pole.length;
|
||||
mesto.velikost.y = mesto_pole[0].length;
|
||||
|
||||
this.pozice_karla(karel_pozice);
|
||||
this.orientace_karla(smer);
|
||||
this.pozice_domova(domov_pozice);
|
||||
for ( var x = 0; x < mesto.pole.length; x++ ) {
|
||||
for ( var y = 0; y < mesto.pole[0].length; y++ ) {
|
||||
if ( mesto.pole[x][y] != mesto_pole[x][y] ) {
|
||||
mesto.pole[x][y] = mesto_pole[x][y];
|
||||
this.prekresli_pole( {x: x, y: y} );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Podmínky pro Karla ~====================================================
|
||||
|
||||
mesto.JE_ZED = function ()
|
||||
{
|
||||
var pozice = {
|
||||
x: karel.pozice.x+plus.x[karel.smer],
|
||||
y: karel.pozice.y+plus.y[karel.smer]
|
||||
};
|
||||
return !( pozice.x >= 0 && pozice.x < mesto.velikost.x &&
|
||||
pozice.y >= 0 && pozice.y < mesto.velikost.y &&
|
||||
mesto.pole[pozice.x][pozice.y] >= 0 );
|
||||
}
|
||||
|
||||
mesto.JE_ZNACKA = function ()
|
||||
{
|
||||
return mesto.pole[karel.pozice.x][karel.pozice.y] > 0;
|
||||
}
|
||||
|
||||
mesto.JE_DOMOV = function ()
|
||||
{
|
||||
return ( karel.pozice.x == domov.pozice.x
|
||||
&& karel.pozice.y == domov.pozice.y );
|
||||
}
|
||||
|
||||
mesto.JE_VYCHOD = function ()
|
||||
{
|
||||
return karel.smer == karel.VYCHOD;
|
||||
}
|
||||
|
||||
mesto.JE_SEVER = function ()
|
||||
{
|
||||
return karel.smer == karel.SEVER;
|
||||
}
|
||||
|
||||
mesto.JE_ZAPAD = function ()
|
||||
{
|
||||
return karel.smer == karel.ZAPAD;
|
||||
}
|
||||
|
||||
mesto.JE_JIH = function ()
|
||||
{
|
||||
return karel.smer == karel.JIH;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Práce s myší ~==========================================================
|
||||
|
||||
mesto.mys.prekresli_stav = function (pozice, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
var element = document.getElementById('pozice_vyber');
|
||||
if ( zvyraznen ) {
|
||||
element.style.visibility = "visible";
|
||||
element.style.left = (pozice.x*32)+"px";
|
||||
element.style.top = ((mesto.velikost.y - pozice.y - 1)*32)+"px";
|
||||
nastroje.zobraz_pozici(pozice);
|
||||
} else if ( !this.je_zvyraznen() ) {
|
||||
element.style.visibility = "hidden";
|
||||
nastroje.zobraz_pozici(null);
|
||||
}
|
||||
}
|
||||
|
||||
mesto.mys.proved_zvyrazneni = function(pozice, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
mesto.mys.proved_vyber = function(pozice, detail)
|
||||
{
|
||||
var cas = new Date();
|
||||
var rychly = (
|
||||
mesto.posledni_klik != null &&
|
||||
(cas-mesto.posledni_klik) < nastaveni.dvojklik
|
||||
);
|
||||
mesto.posledni_klik = cas;
|
||||
switch ( nastroje.vybrany() ) {
|
||||
case "karel":
|
||||
if ( ! rychly || ! jsou_shodne(pozice, karel.pozice) ) {
|
||||
mesto.pozice_karla(pozice);
|
||||
} else {
|
||||
mesto.proved_vlevo_vbok();
|
||||
}
|
||||
break;
|
||||
case "domov":
|
||||
mesto.pozice_domova(pozice);
|
||||
break;
|
||||
case "zed":
|
||||
mesto.umisti_zed(pozice);
|
||||
break;
|
||||
case "znacka-plus":
|
||||
mesto.poloz(pozice);
|
||||
break;
|
||||
case "znacka-minus":
|
||||
mesto.zvedni(pozice);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Příkazy a funkce pro editaci města ~====================================
|
||||
|
||||
mesto.proved_poloz = function (pozice)
|
||||
{
|
||||
var chyba = new Chyba();
|
||||
if ( pozice == null ) {
|
||||
pozice = {x:karel.pozice.x, y:karel.pozice.y};
|
||||
}
|
||||
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
|
||||
if ( mesto.pole[pozice.x][pozice.y] < 8 ) {
|
||||
mesto.pole[pozice.x][pozice.y]++;
|
||||
ladici_vypis(DETAIL, "mesto.proved_poloz", pozice,
|
||||
"položena značka, aktuální počet: "+mesto.pole[pozice.x][pozice.y]);
|
||||
mesto.prekresli_pole(pozice);
|
||||
} else {
|
||||
ladici_vypis(VAROVANI, "mesto.proved_poloz", pozice,
|
||||
"příliš mnoho značek");
|
||||
chyba.nastav( true, "Nemohu položit více jak 8 značek." );
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "mesto.proved_poloz", pozice,
|
||||
"nelze položit značku kvůli zdi");
|
||||
}
|
||||
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
|
||||
}
|
||||
|
||||
mesto.proved_zvedni = function (pozice)
|
||||
{
|
||||
var chyba = new Chyba();
|
||||
if ( pozice == null ) {
|
||||
pozice = {x:karel.pozice.x, y:karel.pozice.y};
|
||||
}
|
||||
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
|
||||
if ( mesto.pole[pozice.x][pozice.y] > 0 ) {
|
||||
mesto.pole[pozice.x][pozice.y]--;
|
||||
ladici_vypis(DETAIL, "mesto.proved_zvedni", pozice,
|
||||
"zvednuta značka, aktuální počet: "+mesto.pole[pozice.x][pozice.y]);
|
||||
mesto.prekresli_pole(pozice);
|
||||
} else {
|
||||
ladici_vypis(VAROVANI, "mesto.proved_zvedni", pozice,
|
||||
"žádná značka, nelze zvednout");
|
||||
chyba.nastav( true, "Nemohu zvednout značku. Žádná tam není." );
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "mesto.proved_zvedni", pozice,
|
||||
"pouze zeď, nelze zvednout");
|
||||
}
|
||||
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
|
||||
}
|
||||
|
||||
mesto.proved_vlevo_vbok = function (pozice)
|
||||
{
|
||||
mesto.orientace_karla(karel.smer+1);
|
||||
return new Vysledek( new Chyba(), Vysledek.PROVEDL_AKCI );
|
||||
}
|
||||
|
||||
mesto.proved_krok = function (pozice)
|
||||
{
|
||||
if ( pozice == null ) {
|
||||
pozice = {x:karel.pozice.x, y:karel.pozice.y};
|
||||
}
|
||||
var nova_pozice =
|
||||
{ x:pozice.x+plus.x[karel.smer], y:pozice.y+plus.y[karel.smer] };
|
||||
var chyba = new Chyba();
|
||||
if ( ! mesto.pozice_karla( nova_pozice ) ) {
|
||||
chyba.nastav( true, "Nemůžu učinit KROK, přede mnou je zeď." );
|
||||
}
|
||||
return new Vysledek( chyba, Vysledek.PROVEDL_AKCI );
|
||||
}
|
||||
|
||||
mesto.poloz = function (pozice)
|
||||
{
|
||||
var navrat = mesto.proved_poloz(pozice);
|
||||
navrat.chyba.zobraz();
|
||||
}
|
||||
|
||||
mesto.zvedni = function (pozice)
|
||||
{
|
||||
var navrat = mesto.proved_zvedni(pozice);
|
||||
navrat.chyba.zobraz();
|
||||
}
|
||||
|
||||
mesto.umisti_zed = function (pozice)
|
||||
{
|
||||
var je_karel = jsou_shodne(pozice, karel.pozice);
|
||||
var je_domov = jsou_shodne(pozice, domov.pozice);
|
||||
if ( !je_karel && !je_domov ) {
|
||||
if ( mesto.pole[pozice.x][pozice.y] >= 0 ) {
|
||||
mesto.pole[pozice.x][pozice.y] = -1;
|
||||
ladici_vypis(DETAIL, "mesto.umisti_zed", pozice, "zeď umístěna");
|
||||
} else {
|
||||
mesto.pole[pozice.x][pozice.y] = 0;
|
||||
ladici_vypis(DETAIL, "mesto.umisti_zed", pozice, "zeď zrušena");
|
||||
}
|
||||
mesto.prekresli_pole(pozice);
|
||||
} else {
|
||||
var hlaska = "";
|
||||
if ( je_karel ) {
|
||||
hlaska = "Karlovi a ";
|
||||
}
|
||||
if ( je_domov ) {
|
||||
hlaska += "domovu ";
|
||||
}
|
||||
ladici_vypis(CHYBA, "mesto.umisti_zed", pozice,
|
||||
"nelze umístit zeď kvůli "+hlaska.slice(0,-3));
|
||||
}
|
||||
}
|
||||
|
||||
mesto.vymaz_znacky = function ()
|
||||
{
|
||||
for ( var x=0; x<mesto.pole.length; x++ ) {
|
||||
for ( var y=0; y<mesto.pole[x].length; y++ ) {
|
||||
if ( mesto.pole[x][y] > 0 ) {
|
||||
mesto.pole[x][y] = 0;
|
||||
mesto.prekresli_pole({x:x, y:y});
|
||||
}
|
||||
}
|
||||
}
|
||||
ladici_vypis(INFORMACE, "mesto.vymaz_znacky", "značky vymazány");
|
||||
}
|
||||
|
||||
mesto.vymaz_mesto = function ()
|
||||
{
|
||||
var uzivatel_chce = window.confirm("Opravdu chcete vyčistit celé město?");
|
||||
if ( uzivatel_chce ) {
|
||||
ladici_vypis(INFORMACE, "mesto.vymaz_mesto", "mažu značky");
|
||||
for ( var x=0; x<mesto.pole.length; x++ ) {
|
||||
for ( var y=0; y<mesto.pole[x].length; y++ ) {
|
||||
if ( mesto.pole[x][y] != 0 ) {
|
||||
mesto.pole[x][y] = 0;
|
||||
mesto.prekresli_pole({x:x, y:y});
|
||||
}
|
||||
}
|
||||
}
|
||||
mesto.pozice_karla({x:0, y:0});
|
||||
mesto.orientace_karla(0);
|
||||
mesto.pozice_domova({x:0, y:0});
|
||||
} else {
|
||||
ladici_vypis(DETAIL, "mesto.vymaz_mesto", "zrušené mazání města");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar města
|
||||
|
||||
// Pomocné funkce
|
||||
function zapis_strukturu(obsah)
|
||||
{
|
||||
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
|
||||
for ( var x = 0; x < mesto.velikost.x; x++ ) {
|
||||
formatovany_obsah = obsah(x, y);
|
||||
document.write('<div>' + formatovany_obsah + '</div>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování města ~====================================================
|
||||
|
||||
// Začátek
|
||||
document.write('<div class="mesto">');
|
||||
|
||||
// Nadpis
|
||||
document.write('<div class="nadpis">Město</div>');
|
||||
|
||||
// Obsah
|
||||
document.write('<div class="obsah">');
|
||||
|
||||
// Pozadí
|
||||
document.write('<div class="linka"></div>');
|
||||
document.write('<div class="pozadi">');
|
||||
zapis_strukturu(function(x, y){ return '<div class="policko"></div>'; });
|
||||
document.write('</div>');
|
||||
|
||||
// Struktura města
|
||||
document.write('<div class="struktura">');
|
||||
zapis_strukturu(function(x, y){ return '<div id="pozice_'+x+'_'+y+'"></div>'; });
|
||||
document.write('</div>');
|
||||
|
||||
// Domov
|
||||
document.write('<div class="policko-domov">' +
|
||||
'<div class="domov" id="pozice_domov"></div></div>');
|
||||
|
||||
// Karel
|
||||
document.write('<div class="policko-karel">' +
|
||||
'<div class="karel-vychod" id="pozice_karel"></div></div>');
|
||||
|
||||
// Výběr
|
||||
document.write('<div class="policko-vyber">' +
|
||||
'<div class="vyber" id="pozice_vyber"></div></div>');
|
||||
|
||||
// Maska města - rychlejší řešení, než :hover
|
||||
document.write('<div class="maska">');
|
||||
zapis_strukturu(function(x, y){ return '<div '+
|
||||
'onmouseover="return mesto.mys.pres(event,{x:'+x+',y:'+y+'});" ' +
|
||||
'onmouseout="return mesto.mys.pryc(event,{x:'+x+',y:'+y+'});" '+
|
||||
'onmousedown="return mesto.mys.stisk(event,{x:'+x+',y:'+y+'});" '+
|
||||
'onmouseup="return mesto.mys.pust(event,{x:'+x+',y:'+y+'});" '+
|
||||
'></div>' });
|
||||
document.write('</div>');
|
||||
|
||||
// Konec
|
||||
document.write('</div>');
|
||||
document.write('</div>');
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
mesto.pozice_karla( karel.pozice );
|
||||
mesto.orientace_karla( karel.smer );
|
||||
mesto.pozice_domova( domov.pozice );
|
||||
@@ -0,0 +1,390 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - objekt pro práci s myší
|
||||
|
||||
// Konstruktor
|
||||
function Mys(tooltip)
|
||||
{
|
||||
// Atribut info je použit pro jednoznačné odlišení objektů
|
||||
// Atribut detail je použit pro uchovávání informací k objektu, jako je např.
|
||||
// obsah tooltipu, obrázky apod.
|
||||
|
||||
// Uživatel na tomto objektu provedl stisk
|
||||
this.stisknut = { info: null, detail: null };
|
||||
|
||||
// Zvýrazněný objekt, uživatel přejel myší nad objekt
|
||||
this.zvyraznen = { info: null, detail: null };
|
||||
|
||||
// Vybraný objekt, běžně bývá zobrazen se sníženými okraji
|
||||
this.vybran = { info: null, detail: null };
|
||||
|
||||
// Kde byl naposledy proveden stisk. Některé prohlížeče neposílají správně
|
||||
// stisky, tak se kontroluje puštění a předchozí stisk
|
||||
this.posledni_stisk = { info: null, detail: null };
|
||||
|
||||
// Objekt třídy tooltipu. Pokud není nastaven, žádný tooltip se nezobrazí
|
||||
if ( !tooltip ) tooltip = null;
|
||||
this.tooltip = tooltip;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Pomocné funkce ~========================================================
|
||||
|
||||
Mys.prototype.je_zvyraznen = function(zvyrazneni)
|
||||
{
|
||||
if ( zvyrazneni == undefined ) {
|
||||
return ( this.zvyraznen.info != null );
|
||||
} else {
|
||||
return ( jsou_shodne(zvyrazneni, this.zvyraznen.info) );
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.je_vybran = function(vyber)
|
||||
{
|
||||
if ( vyber == undefined ) {
|
||||
return ( this.vybran.info != null );
|
||||
} else {
|
||||
return ( jsou_shodne(vyber, this.vybran.info) );
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.je_stisknut = function(stisknuti)
|
||||
{
|
||||
if ( stisknuti == undefined ) {
|
||||
return ( this.stisknut.info != null );
|
||||
} else {
|
||||
return ( jsou_shodne(stisknuti, this.stisknut.info) );
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Obsluha událostí myši ~=================================================
|
||||
|
||||
Mys.prototype.pres = function(e, info, detail)
|
||||
{
|
||||
if ( !e && typeof(event) != "undefined" ) e = event; // IE
|
||||
|
||||
ladici_vypis(LADENI, "mys.pres", info, "myš nad objektem");
|
||||
if ( !jsou_shodne(info,this.posledni_stisk.info) ) {
|
||||
this.posledni_stisk.info = this.posledni_stisk.detail = null;
|
||||
}
|
||||
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
|
||||
if ( this.proved_zvyrazneni(info) ) {
|
||||
var stary_zvyraznen = this.zvyraznen;
|
||||
this.zvyraznen = { info:info, detail:detail };
|
||||
if ( stary_zvyraznen.info != null )
|
||||
this.stav( stary_zvyraznen.info, stary_zvyraznen.detail);
|
||||
this.stav(info, detail);
|
||||
}
|
||||
}
|
||||
|
||||
var element;
|
||||
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
|
||||
this.tooltip.pres(element, info, detail);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Mys.prototype.pryc = function(e, info, detail)
|
||||
{
|
||||
if ( !e && typeof(event) != "undefined" ) e = event; // IE
|
||||
|
||||
var zmena = false;
|
||||
ladici_vypis(LADENI, "mys.pryc", info, "myš pryč z objektu");
|
||||
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
|
||||
this.posledni_stisk.info = this.posledni_stisk.detail = null;
|
||||
}
|
||||
if ( jsou_shodne(info,this.zvyraznen.info) ) {
|
||||
this.zvyraznen.info = this.zvyraznen.detail = null;
|
||||
zmena = true;
|
||||
}
|
||||
if ( jsou_shodne(info,this.stisknut.info) ) {
|
||||
this.stisknut.info = this.stisknut.detail = null;
|
||||
zmena = true;
|
||||
}
|
||||
this.zrus_zvyrazneni(info, detail);
|
||||
if ( zmena ) {
|
||||
this.stav(info, detail);
|
||||
}
|
||||
|
||||
var element;
|
||||
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
|
||||
this.tooltip.pryc(element, info, detail);
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.stisk = function(e, info, detail)
|
||||
{
|
||||
if ( !e && typeof(event) != "undefined" ) e = event; // IE
|
||||
|
||||
ladici_vypis(LADENI, "mys.stisk", info, "myš stiskla tlačítko");
|
||||
|
||||
var stary_zvyraznen = { info: null };
|
||||
var stary_stisknut = { info: null };
|
||||
if ( !jsou_shodne(info,this.zvyraznen.info ) ) {
|
||||
if ( this.proved_zvyrazneni(info, detail) ) {
|
||||
stary_zvyraznen = this.zvyraznen;
|
||||
this.zvyraznen = {info: info, detail: detail};
|
||||
}
|
||||
}
|
||||
|
||||
if ( !jsou_shodne(info,this.stisknut.info) ) {
|
||||
this.stary_stisknut=this.stisknut;
|
||||
}
|
||||
|
||||
this.posledni_stisk = { info: info, detail: detail };
|
||||
this.stisknut = { info: info, detail: detail };
|
||||
if ( stary_stisknut.info != null || stary_zvyraznen.info != null ) {
|
||||
if ( jsou_shodne(stary_stisknut.info,stary_zvyraznen.info) ) {
|
||||
this.stav(stary_stisknut.info, stary_stisknut.detail);
|
||||
} else {
|
||||
if ( stary_stisknut.info != null )
|
||||
this.stav(stary_stisknut.info, stary_stisknut.detail);
|
||||
if ( stary_zvyraznen.info != null )
|
||||
this.stav(stary_zvyraznen.info, stary_zvyraznen.detail);
|
||||
}
|
||||
}
|
||||
this.proved_stisk(info, detail);
|
||||
this.stav(info, detail);
|
||||
|
||||
var element;
|
||||
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
|
||||
this.tooltip.zrus(element, info, detail);
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.pust = function(e, info, detail)
|
||||
{
|
||||
if ( !e && typeof(event) != "undefined" ) e = event; // IE
|
||||
|
||||
var stary_stisknut = this.stisknut;
|
||||
if ( jsou_shodne(info,this.posledni_stisk.info) ) {
|
||||
if ( stary_stisknut.info == null ) {
|
||||
ladici_vypis(LADENI, "mys.pust", info, "pozice nezměněna; chybí stisk myši, simuluji...");
|
||||
this.proved_stisk(info, detail);
|
||||
}
|
||||
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, provedla stisk");
|
||||
this.vyber(info, detail, false);
|
||||
} else {
|
||||
ladici_vypis(LADENI, "mys.pust", info, "myš pustila tlačítko, žádný stisk");
|
||||
|
||||
// Kvůli zrušení stisku
|
||||
info = stary_stisknut.info;
|
||||
detail = stary_stisknut.detail;
|
||||
}
|
||||
|
||||
this.stisknut.info = this.stisknut.detail = null;
|
||||
if ( info != null ) {
|
||||
this.zrus_stisk(info, detail);
|
||||
this.stav(info, detail);
|
||||
}
|
||||
|
||||
var element;
|
||||
if ( this.tooltip && (element = zdrojovy_element(e)) ) {
|
||||
this.tooltip.zrus(element, info, detail);
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.stav = function(info, detail)
|
||||
{
|
||||
var je_zvyraznen = this.je_zvyraznen(info);
|
||||
var je_vybran = this.je_vybran(info);
|
||||
var je_stisknut = this.je_stisknut(info);
|
||||
ladici_vypis(LADENI, "mys.stav", info, "překresluji"+
|
||||
" (z:"+ formatuj_text(je_zvyraznen)+
|
||||
" s:"+ formatuj_text(je_stisknut)+
|
||||
" v:"+ formatuj_text(je_vybran)+ ")");
|
||||
this.prekresli_stav(info, detail, je_zvyraznen, je_stisknut, je_vybran);
|
||||
}
|
||||
|
||||
Mys.prototype.proved_prejmenovani = function(nazev, objekt, info_z, info_na,
|
||||
detail_na)
|
||||
{
|
||||
if ( jsou_shodne( objekt.info, info_z ) ) {
|
||||
ladici_vypis( LADENI, "mys.proved_prejmenovani", "měním " + nazev + " z (" +
|
||||
formatuj_text(objekt.info) + ") na (" + formatuj_text(info_na) + ")" );
|
||||
objekt.info = info_na;
|
||||
objekt.detail = detail_na;
|
||||
return true;
|
||||
} else {
|
||||
ladici_vypis( LADENI, "mys.proved_prejmenovani", "žádná změna v " + nazev +
|
||||
", zůstává (" + formatuj_text(objekt.info) + ")" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Mys.prototype.proved_smazani = function(nazev, objekt, info, detail)
|
||||
{
|
||||
if ( jsou_shodne( objekt.info, info ) ) {
|
||||
ladici_vypis( LADENI, "mys.proved_smazani", info, "ruším " + nazev );
|
||||
objekt.info = objekt.detail = null;
|
||||
return true;
|
||||
} else {
|
||||
ladici_vypis( LADENI, "mys.proved_smazani", info, "žádná změna v " + nazev );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Veřejně přístupné funkce ~==============================================
|
||||
|
||||
// Ruční provedení výběru
|
||||
Mys.prototype.vyber = function(info, detail, prekresli)
|
||||
{
|
||||
var stary_vybran = this.vybran;
|
||||
if ( !jsou_shodne(info,stary_vybran.info) ) {
|
||||
if ( this.proved_vyber(info, detail) ) {
|
||||
if ( stary_vybran.info != null ) {
|
||||
if ( this.zmen_vyber(stary_vybran.info, stary_vybran.detail, info, detail) ) {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí:"+
|
||||
formatuj_text(stary_vybran.info)+")");
|
||||
this.vybran = { info: info, detail: detail };
|
||||
this.stav(stary_vybran.info, stary_vybran.detail );
|
||||
} else {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "změna nepovolena (předchozí:"+
|
||||
formatuj_text(stary_vybran.info)+")");
|
||||
prekresli = false;
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "vybráno (předchozí nevybrán)");
|
||||
this.vybran = { info: info, detail: detail };
|
||||
}
|
||||
if ( prekresli == undefined || prekresli ) {
|
||||
this.stav(info, detail);
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "změna výběru nebyla provedena");
|
||||
}
|
||||
} else {
|
||||
if ( this.zrus_vyber(info) ) {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "zrušení výběru");
|
||||
this.vybran.info = this.vybran.detail = null;
|
||||
if ( prekresli == undefined || prekresli ) {
|
||||
this.stav(info);
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(LADENI, "mys.vyber", info, "žádná změna výběru");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Změna informací. Změní výběr a ostatní informace myši, pokud se změnily
|
||||
// informace, nebo detaily
|
||||
Mys.prototype.prejmenuj = function(info_z, info_na, detail_na)
|
||||
{
|
||||
ladici_vypis(LADENI, "mys.prejmenuj", info_z, "přejmenování na (" +
|
||||
formatuj_text(info_na) + ")");
|
||||
var prekresli = false;
|
||||
if ( this.proved_prejmenovani( "mys.stisknut",
|
||||
this.stisknut, info_z, info_na, detail_na ) ) {
|
||||
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "stisk po přejmenování");
|
||||
this.proved_stisk( info_na, detail_na );
|
||||
prekresli = true;
|
||||
}
|
||||
if ( this.proved_prejmenovani( "mys.zvyraznen",
|
||||
this.zvyraznen, info_z, info_na, detail_na ) ) {
|
||||
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "zvýraznění po přejmenování");
|
||||
this.proved_zvyrazneni( info_na, detail_na );
|
||||
prekresli = true;
|
||||
}
|
||||
if ( this.proved_prejmenovani( "mys.vybran",
|
||||
this.vybran, info_z, info_na, detail_na ) ) {
|
||||
ladici_vypis(LADENI, "mys.prejmenuj", info_na, "výběr po přejmenování");
|
||||
this.proved_vyber( info_na, detail_na );
|
||||
prekresli = true;
|
||||
}
|
||||
this.proved_prejmenovani( "mys.posledni_stisk",
|
||||
this.posledni_stisk, info_z, info_na, detail_na );
|
||||
if ( prekresli ) {
|
||||
this.stav( info_na, detail_na );
|
||||
}
|
||||
}
|
||||
|
||||
// Smazání informací. Zruší výběr a zvýraznění prvku
|
||||
Mys.prototype.smaz = function(info, detail)
|
||||
{
|
||||
ladici_vypis(LADENI, "mys.smaz", info, "smazání prvku");
|
||||
var prekresli = false;
|
||||
if ( this.proved_smazani( "mys.stisknut", this.stisknut, info, detail ) ) {
|
||||
ladici_vypis(LADENI, "mys.smaz", info, "zrušení stisku");
|
||||
this.zrus_stisk( info, detail );
|
||||
prekresli = true;
|
||||
}
|
||||
if ( this.proved_smazani( "mys.zvyraznen", this.zvyraznen, info, detail ) ) {
|
||||
ladici_vypis(LADENI, "mys.smaz", info, "zrušení zvýraznění");
|
||||
this.zrus_zvyrazneni( info, detail );
|
||||
prekresli = true;
|
||||
}
|
||||
if ( this.proved_smazani( "mys.vybran", this.vybran, info, detail ) ) {
|
||||
ladici_vypis(LADENI, "mys.smaz", info, "zrušení výběru");
|
||||
this.smaz_vyber( info, detail );
|
||||
prekresli = true;
|
||||
}
|
||||
this.proved_smazani( "mys.posledni_stisk",
|
||||
this.posledni_stisk, info, detail );
|
||||
if ( prekresli ) {
|
||||
this.stav( info, detail );
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Veřejně editovatelné funkce ~===========================================
|
||||
|
||||
// Překeslení stavu prvku
|
||||
Mys.prototype.prekresli_stav = function(info, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
}
|
||||
|
||||
// Myš stiskla tlačítko
|
||||
Mys.prototype.proved_stisk = function(info, detail)
|
||||
{
|
||||
}
|
||||
|
||||
// Myš pustila tlačítko
|
||||
Mys.prototype.zrus_stisk = function(info, detail)
|
||||
{
|
||||
}
|
||||
|
||||
// Myš klikla na objekt. Vrací true, pokud se vybralo
|
||||
Mys.prototype.proved_vyber = function(info, detail)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Zrušen výběr objektu kliknutím na jiný objekt. Vrací true, pokud se má vybrat
|
||||
Mys.prototype.zmen_vyber = function(info_z, detail_z, info_na, detail_na)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Zrušen výběr objektu kliknutím na stejný objekt. Vrací true, pokud se má
|
||||
// zrušit výběr
|
||||
Mys.prototype.zrus_vyber = function(info, detail)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Vybraný objekt byl smazán
|
||||
Mys.prototype.smaz_vyber = function(info, detail)
|
||||
{
|
||||
}
|
||||
|
||||
// Myš je nad objektem. Vrací true, pokud se zvýraznilo
|
||||
Mys.prototype.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Myš není nad objektem
|
||||
Mys.prototype.zrus_zvyrazneni = function(info, detail)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,917 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - načítání, ukládání a export dat
|
||||
|
||||
// Příkazy a jejich indexy podle verze:
|
||||
//
|
||||
// Verze/Index Příkaz
|
||||
// 1.0 1.1 1.2 2.0
|
||||
// - - - 0 <prázdná řádka> (součást hlavičky)
|
||||
// - - - 1 <komentář> (součást hlavičky)
|
||||
// - - - 2 <název příkazu> (součást hlavičky)
|
||||
// - - - 3 <prázdná řádka> (tělo příkazu)
|
||||
// - - - 4 <komentář> (tělo příkazu)
|
||||
// 0 0 0 5 KONEC, JINAK
|
||||
// 1 1 1 6 KONEC
|
||||
// 2 2 2 7 KDYŽ
|
||||
// 3 3 3 8 DOKUD
|
||||
// 4 4 4 9 OPAKUJ
|
||||
// - 5 5 10 AŽ
|
||||
// - - 6 11 RYCHLE
|
||||
// - - 7 12 POMALU
|
||||
// 5 6 8 13 STOP
|
||||
// 6 7 9 14 KROK
|
||||
// 7 8 10 15 VLEVO-VBOK
|
||||
// 8 9 11 16 POLOŽ
|
||||
// 9 10 12 17 ZVEDNI
|
||||
//
|
||||
// Poznámky k formátům níže:
|
||||
//
|
||||
// \t označuje znak <tabulátor>
|
||||
// \n je pro znak <nová řádka>
|
||||
//
|
||||
// Formát ukládání (příkazy)
|
||||
// =========================
|
||||
//
|
||||
// Karel<verze>\n
|
||||
// P\n
|
||||
// <index posledního příkazu>
|
||||
// <jméno příkazu>\t<příkaz 1>,<příkaz 2>,...\n
|
||||
// <jméno příkazu>\t<příkaz 1>,<příkaz 2>,...\n
|
||||
// ...
|
||||
// KONEC
|
||||
//
|
||||
// Takový řetězec se předá jako parametr funkci escape() a výsledná hodnota
|
||||
// je poté nabídnuta k uložení.
|
||||
//
|
||||
// Formát příkazů:
|
||||
//
|
||||
// 1. Příkaz bez parametrů (<prázdná řádka>, <název příkazu>, KONEC, RYCHLE,
|
||||
// POMALU, STOP, KROK, VLEVO-VBOK, POLOŽ, ZVEDNI a uživatelské příkazy
|
||||
//
|
||||
// <index příkazu>
|
||||
//
|
||||
// 2. Příkaz má parametr (KDYŽ, DOKUD, AŽ, OPAKUJ)
|
||||
//
|
||||
// (a) <index příkazu><mezera><podmínka KDYŽ, DOKUD, AŽ>
|
||||
// (b) <index příkazu OPAKUJ><mezera><počet opakování OPAKUJ>
|
||||
// (c) <index příkazu OPAKUJ>
|
||||
//
|
||||
// <podmínka> je následující:
|
||||
//
|
||||
// 1 ZEĎ -1 NENÍ ZEĎ
|
||||
// 2 ZNAČKA -2 NENÍ ZNAČKA
|
||||
// 3 DOMOV -3 NENÍ DOMOV
|
||||
// 4 VÝCHOD -4 NENÍ VÝCHOD
|
||||
// 5 SEVER -5 NENÍ SEVER
|
||||
// 6 ZÁPAD -6 NENÍ ZÁPAD
|
||||
// 7 JIH -7 NENÍ JIH
|
||||
//
|
||||
// <počet opakování OPAKUJ> je kladné číslo včetně nuly
|
||||
//
|
||||
// 3. Komentář
|
||||
//
|
||||
// <index příkazu><mezera><text upravený funkcí escape()>
|
||||
//
|
||||
// !! VAROVÁNÍ!!
|
||||
//
|
||||
// Od verze 1.1 se rozšířil repertoár o příkaz AŽ, proto při čtení verze
|
||||
// 1.0 je nutno posunout <index příkazu> o 1, pokud je větší než 4.
|
||||
//
|
||||
// Od verze 1.2 přibyly příkazy RYCHLE a POMALU, proto je nutné při čtení
|
||||
// verze 1.1 posunout <index příkazu> o 2, pokud je větší než 5.
|
||||
//
|
||||
// Od verze 2.0 se rozšířil slovník o komentáře a hlavičku, proto je nutné
|
||||
// při čtení verze 1.2 posunout <index příkazu> vždy o 5.
|
||||
//
|
||||
// Verze 2.0 zavedla nový prvek 2.c), který byl v předchozích verzích
|
||||
// ukládán s <počet opakování OPAKUJ> rovno -1 (minus jedné).
|
||||
//
|
||||
// Formát ukládání (město)
|
||||
// =======================
|
||||
//
|
||||
// Karel<verze>\n
|
||||
// M\n
|
||||
// <pozice Karla X><mezera><pozice Karla Y>\n
|
||||
// <směr natočení>\n
|
||||
// <pozice domova X><mezera><pozice domova Y>\n
|
||||
// <[0,9]><[0,8]>...<[0,0]>\n
|
||||
// <[1,9]><[1,8]>...<[1,0]>\n
|
||||
// ...
|
||||
// <[9,9]><[9,8]>...<[9,0]>\n
|
||||
// KONEC
|
||||
//
|
||||
// Takový řetězec se předá jako parametr funkci escape() a výsledná hodnota
|
||||
// je poté nabídnuta k uložení.
|
||||
//
|
||||
// Formát políčka města <[x,y]>: číslo od 0 do 8 podle položených značek,
|
||||
// nebo znak X, pokud je na daném políčku zeď.
|
||||
//
|
||||
// Město nemělo žádnou změnu od začátku vývoje, proto je <verze> rovna
|
||||
// hodnotě "1.0" (bez uvozovek).
|
||||
//
|
||||
// Poznámka k souřadnicím:
|
||||
//
|
||||
// Pozice je vyjádřená jako dvojice [x,y], kde x a y je od 0 do 9. Symbol
|
||||
// x označuje sloupec a symbol y řádku. Formát ukládání je tedy po sloupcích
|
||||
// (první zapsaná textová řádka je rovna prvnímu sloupci města) shora dolů.
|
||||
// Sloupcové ukládání vzniklo nejspíš omylem, ale už nebylo dále upravováno.
|
||||
//
|
||||
// Program Visual Karel 99 ukládá město po řádkách, takže zapsaná textová
|
||||
// řádka odpovídá skutečné řádce města - to je velký rozdíl!
|
||||
//
|
||||
// Karel má na počátku pozici [0,0] (levý dolní roh), ale uživatelské
|
||||
// rozhraní v tu dobu ukazuje souřadnici "1 × 1" (o jednu vyšší). Pravý dolní
|
||||
// roh má pozici [9,0], v uživatelském rozhraní to je "10 × 1".
|
||||
//
|
||||
// Program Visual Karel 99 počítá pozici od jedné, ne od nuly, navíc počátek
|
||||
// je vlevo nahoře. Levý horní roh je (1,1) (odpovídá pozici [0,9]), levý
|
||||
// dolní roh má (1,10) (odpovídá umístění [0,0]), pravý dolní roh je (10,10)
|
||||
// (odpovídá pozici [9,0]).
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Objekt pracující s daty
|
||||
data = new Object();
|
||||
|
||||
// Načítací funkcionalita
|
||||
data.nacitani = new Object();
|
||||
|
||||
// Ukládací funkcionalita
|
||||
data.ukladani = new Object();
|
||||
|
||||
// Konstanty formatu
|
||||
data.FORMAT_10 = 0;
|
||||
data.FORMAT_11 = 1;
|
||||
data.FORMAT_12 = 2;
|
||||
data.FORMAT_20 = 3;
|
||||
data.verze = [
|
||||
{ retezec: "1.0", verze: prikazy.VERZE_10 },
|
||||
{ retezec: "1.1", verze: prikazy.VERZE_11 },
|
||||
{ retezec: "1.2", verze: prikazy.VERZE_12 },
|
||||
{ retezec: "2.0", verze: prikazy.VERZE_20 }
|
||||
];
|
||||
|
||||
// Typy zobrazovaného okna
|
||||
data.typ = new Object();
|
||||
data.typ.ULOZIT = "ulozit.html";
|
||||
data.typ.EXPORT_MESTA = "export-mesto.html";
|
||||
data.typ.EXPORT_SLOVNIKU = "export-slovnik.html";
|
||||
|
||||
// Značky
|
||||
data.znacky = [ ".", "1", "2", "3", "4", "5", "6", "7", "8" ];
|
||||
data.znacky[-1] = "X";
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro ukládání a export města ~===========================
|
||||
|
||||
// Uložení do vnitřního formátu
|
||||
data.ukladani.uloz_mesto = function ()
|
||||
{
|
||||
var uloz = "Karel1.0\nM\n";
|
||||
uloz += karel.pozice.x + " " + (mesto.velikost.y - karel.pozice.y - 1) + "\n";
|
||||
uloz += karel.smer + "\n";
|
||||
uloz += domov.pozice.x + " " + (mesto.velikost.y - domov.pozice.y - 1) + "\n";
|
||||
for ( var x = 0; x < mesto.velikost.x; x++ ) {
|
||||
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
|
||||
uloz += data.znacky[mesto.pole[x][y]];
|
||||
}
|
||||
uloz += "\n";
|
||||
}
|
||||
uloz += "KONEC";
|
||||
uloz = escape(uloz);
|
||||
this.zobraz_v_okne(this.typ.NORMALNI, "uložení města", "<p>"+
|
||||
"Následující text si pečlivě uschovejte. Neprovádějte na něm <i>ŽÁDNÉ</i> "+
|
||||
"úpravy. Každá změna může způsobit jeho zpětnou nepoužitelnost. Nejlépe text "+
|
||||
"označte, zkopírujte do schránky Windows (případně do schránky jiného "+
|
||||
"systému) a vložte do prázdného souboru, např. v aplikaci Poznámkový blok "+
|
||||
"(Notepad). Raději nepoužívejte programy, které provádí další formátování "+
|
||||
"textu, tím by se mohl text znehodnotit."+
|
||||
"</p>", uloz, 24);
|
||||
}
|
||||
|
||||
// Export do formátu Visual Karel 99
|
||||
data.ukladani.export_mesto_k99 = function ()
|
||||
{
|
||||
var uloz =
|
||||
"Velikost města: " + mesto.velikost.x + ", " + mesto.velikost.y + "\n";
|
||||
uloz += "Pozice Karla: " +
|
||||
(karel.pozice.x+1) + ", " + (mesto.velikost.y-karel.pozice.y) + "\n";
|
||||
uloz += "Otočení Karla: " + karel.nazev_smeru_plny[karel.smer] +"\n";
|
||||
uloz += "Umístění domova: " +
|
||||
(domov.pozice.x+1) + ", " + (mesto.velikost.y-domov.pozice.y) + "\n\n";
|
||||
uloz += "Definice města:\n";
|
||||
for ( var y = mesto.velikost.y-1; y >= 0; y-- ) {
|
||||
for ( var x = 0; x < mesto.velikost.x; x++ ) {
|
||||
uloz += data.znacky[mesto.pole[x][y]];
|
||||
}
|
||||
uloz += "\n";
|
||||
}
|
||||
uloz = uloz.slice( 0, -1 ); // Odstranit poslední ukončení řádky
|
||||
this.zobraz_v_okne(this.typ.NORMALNI, "export města", "<p>"+
|
||||
"Následující text je určen pro program Visual Karel 99. Nevím, jak jsou na "+
|
||||
"tom konkurenční programy s formátem, proto nelze zaručit větší "+
|
||||
"přenositelnost města."+
|
||||
"</p><p>"+
|
||||
"Symbol X označuje zeď, číslo nahrazuje počet položených značek a tečka značí "+
|
||||
"prázdné pole. Na jednom poli nemůže být zároveď zeď a Karel, nebo Karlův "+
|
||||
"domov. Na jednom poli také nemůže být víc jak 8 značek."+
|
||||
"</p>", uloz, 23);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro ukládání a export slovníku ~========================
|
||||
|
||||
// Kontrola prázdného slovníku
|
||||
data.ukladani.zkontroluj_slovnik = function ()
|
||||
{
|
||||
if ( prikazy.seznam[prikazy.seznam.length-1].systemovy ) {
|
||||
alert( "Není co uložit. Slovník je prázdný." );
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Příprava slovníku na uložení
|
||||
data.ukladani.priprav_slovnik = function (format)
|
||||
{
|
||||
var verze = data.verze[format].verze;
|
||||
var index = 0;
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( prikaz.kompatibilita & prikaz.verze_ulozeni & verze ) {
|
||||
prikaz.index = index;
|
||||
index++;
|
||||
} else {
|
||||
delete prikaz.index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Formátování seznamu příkazů
|
||||
data.ukladani.formatuj_text = function (objekt)
|
||||
{
|
||||
var text = "";
|
||||
if ( objekt.ostatni.length ) {
|
||||
text += objekt.ostatni.join( ", " );
|
||||
}
|
||||
if ( objekt.prikazy.length ) {
|
||||
if ( text.length > 0 ) {
|
||||
text += " a ";
|
||||
}
|
||||
if ( objekt.prikazy.length == 1 ) {
|
||||
text += "příkaz ";
|
||||
} else {
|
||||
text += "příkazy ";
|
||||
}
|
||||
text += objekt.prikazy.join( ", " );
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
// Přidá jeden příkaz do seznamu špatných příkazů, nebo varování
|
||||
data.ukladani.pridej_prikaz = function (objekt, prikaz)
|
||||
{
|
||||
if ( ! objekt.seznam[prikaz.jmeno] ) {
|
||||
if ( prikaz.prikaz ) {
|
||||
objekt.prikazy.push(prikaz.jmeno);
|
||||
} else {
|
||||
objekt.ostatni.push(prikaz.jmeno);
|
||||
}
|
||||
objekt.seznam[prikaz.jmeno] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Vrací true, pokud není seznam prázdný
|
||||
data.ukladani.nastalo = function (objekt)
|
||||
{
|
||||
return (objekt.prikazy.length || objekt.ostatni.length);
|
||||
}
|
||||
|
||||
// Kontrola verze slovníku
|
||||
data.ukladani.zkontroluj_verze = function (format)
|
||||
{
|
||||
var verze = data.verze[format].verze;
|
||||
var spatne = { seznam: {}, prikazy: [], ostatni: [] };
|
||||
var varovani = { seznam: {}, prikazy: [], ostatni: [] };
|
||||
var i = prikazy.seznam.length-1;
|
||||
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
for ( var j = 0; j < prikaz.telo.length; j++ ) {
|
||||
var radka = prikaz.telo[j];
|
||||
if ( radka[0].verze_ulozeni & (~radka[0].kompatibilita) & verze ) {
|
||||
// Příkaz nelze uložit
|
||||
this.pridej_prikaz( spatne, radka[0] );
|
||||
} else if ( !(radka[0].kompatibilita & verze) ) {
|
||||
// Příkaz se neukládá
|
||||
this.pridej_prikaz( varovani, radka[0] );
|
||||
}
|
||||
}
|
||||
i--;
|
||||
}
|
||||
|
||||
if ( this.nastalo(spatne) ) {
|
||||
return { chyba: true, text: this.formatuj_text(spatne) };
|
||||
} else if ( this.nastalo(varovani) ) {
|
||||
return { varovani: true, text: this.formatuj_text(varovani) };
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
// Kontrola minimální verze slovníku
|
||||
data.ukladani.zkontroluj_minimalni_format = function (format)
|
||||
{
|
||||
var novy_format = format-1;
|
||||
while ( novy_format >= data.FORMAT_10 ) {
|
||||
var test = this.zkontroluj_verze(novy_format);
|
||||
if ( !test.chyba && !test.varovani ) {
|
||||
format = novy_format;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
novy_format--;
|
||||
}
|
||||
return format;
|
||||
}
|
||||
|
||||
// Provede uložení slovníku v daném formátu
|
||||
data.ukladani.proved_ulozeni_prikazu = function (format, prikaz)
|
||||
{
|
||||
var verze = data.verze[format].verze;
|
||||
var uloz = "";
|
||||
if ( !prikaz.systemovy ) {
|
||||
var radka_uloz = new Array();
|
||||
for ( var i = 0; i < prikaz.telo.length; i++ ) {
|
||||
var radka = prikaz.telo[i];
|
||||
var prikaz_uloz;
|
||||
// Pokud se má uložit (příkaz získal index z přípravy slovníku), ulož
|
||||
if ( radka[0].index != undefined ) {
|
||||
if ( radka[0].ukladac ) {
|
||||
prikaz_uloz = radka[0].ukladac(verze, radka);
|
||||
} else {
|
||||
prikaz_uloz = this.obecny(verze, radka);
|
||||
}
|
||||
if ( prikaz_uloz ) {
|
||||
radka_uloz.push(prikaz_uloz);
|
||||
}
|
||||
}
|
||||
}
|
||||
uloz = prikaz.jmeno + "\t" + radka_uloz.join(",") + "\n";
|
||||
}
|
||||
return uloz;
|
||||
}
|
||||
|
||||
// Provede uložení slovníku
|
||||
data.ukladani.proved_ulozeni_slovniku = function (format)
|
||||
{
|
||||
this.priprav_slovnik(format);
|
||||
|
||||
var uloz =
|
||||
"Karel" + data.verze[format].retezec + "\n" +
|
||||
"P\n" +
|
||||
prikazy.seznam[prikazy.seznam.length-1].index + "\n";
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
uloz += this.proved_ulozeni_prikazu(format, prikazy.seznam[i]);
|
||||
}
|
||||
uloz += "KONEC";
|
||||
return escape(uloz);
|
||||
}
|
||||
|
||||
// Ulož slovník v novém formátu
|
||||
data.ukladani.uloz_slovnik = function (format)
|
||||
{
|
||||
if ( this.zkontroluj_slovnik() ) {
|
||||
var navrat = this.zkontroluj_verze(format);
|
||||
if ( navrat.chyba ) {
|
||||
alert( "Chyba!\n\nSlovník nelze uložit ve formátu " +
|
||||
data.verze[format].retezec +
|
||||
", protože obsahuje " + navrat.text + "." );
|
||||
} else {
|
||||
if ( navrat.varovani ) {
|
||||
if ( ! window.confirm(
|
||||
"Varování!\n\nSlovník při ukládání do formátu " +
|
||||
data.verze[format].retezec +
|
||||
" nebude obsahovat " + navrat.text + ".\n\nPřesto uložit?" ) ) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Najdi minimální verzi, ve které jde uložit příkaz
|
||||
format = this.zkontroluj_minimalni_format(format);
|
||||
}
|
||||
|
||||
var uloz = this.proved_ulozeni_slovniku(format);
|
||||
this.zobraz_v_okne(this.typ.NORMALNI, "uložení slovníku", "<p>"+
|
||||
"Následující text si pečlivě uschovejte. Neprovádějte na něm <i>ŽÁDNÉ</i> "+
|
||||
"úpravy. Každá změna může způsobit jeho zpětnou nepoužitelnost. Nejlépe text "+
|
||||
"označte, zkopírujte do schránky Windows (případně do schránky jiného "+
|
||||
"systému) a vložte do prázdného souboru, např. v aplikaci Poznámkový blok "+
|
||||
"(Notepad). Raději nepoužívejte programy, které provádí další formátování "+
|
||||
"textu, tím by se mohl text znehodnotit."+
|
||||
"</p>", uloz, 24);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data.ukladani.export_slovnik_k99 = function ()
|
||||
{
|
||||
if ( this.zkontroluj_slovnik() ) {
|
||||
var format = new Array();
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( !prikaz.systemovy ) {
|
||||
var obsah = new Obsah();
|
||||
var vysledek = prikazy.formatovac.zformatuj_prikaz(prikaz, obsah);
|
||||
format.push(obsah.obsah());
|
||||
}
|
||||
}
|
||||
uloz = format.join("%0A%0A");
|
||||
this.zobraz_v_okne(this.typ.KOMENTARE, "export slovníku", "<p>"+
|
||||
"Následující text je určen pro program Visual Karel 99. Bez větších úprav ho "+
|
||||
"jistě bude možno použít i v jiných (konkurenčních) programech zabývající se "+
|
||||
"problematikou robota Karla."+
|
||||
"</p>"+
|
||||
"<p><b>Varování!</b> Pokud jste použili podmínku nebo opakování s příkazem "+
|
||||
"AŽ, pak nebude v programu Visual Karel 99 fungovat, protože v něm tato "+
|
||||
"vlastnost není naprogramována."+
|
||||
"</p>", unescape(uloz), 21);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce pro ukládání a export jednotlivých příkazů ~=====================
|
||||
|
||||
// Obecné ukládání
|
||||
data.ukladani.obecny = function (format, radka)
|
||||
{
|
||||
if ( radka[0].index != undefined ) {
|
||||
if ( radka.length > 1 ) {
|
||||
return radka[0].index + " " + radka.slice(1).join(" ");
|
||||
} else {
|
||||
return "" + radka[0].index;
|
||||
}
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// Cyklus
|
||||
data.ukladani.uloz_OPAKUJ = function (format, radka)
|
||||
{
|
||||
var pocet = "";
|
||||
if ( radka.length == 1 && format < data.FORMAT_20 ) {
|
||||
pocet = " -1";
|
||||
} else if ( radka.length == 2 ) {
|
||||
pocet = " " + radka[1];
|
||||
}
|
||||
return radka[0].index + pocet;
|
||||
}
|
||||
|
||||
// Komentář
|
||||
data.ukladani.uloz_komentar = function (format, radka)
|
||||
{
|
||||
if ( format >= data.FORMAT_20 ) {
|
||||
return radka[0].index + " " + escape(radka[1]);
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// Název
|
||||
data.ukladani.uloz_nazev = function (format, radka)
|
||||
{
|
||||
if ( format >= data.FORMAT_20 ) {
|
||||
return radka[0].index;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro načítání ~==========================================
|
||||
|
||||
// Nahraj příkazy/město
|
||||
data.nacitani.nacti = function ()
|
||||
{
|
||||
var hodnota = window.prompt(
|
||||
"Vložte prosím text města nebo příkazů, který byl předtím vytvořen tímto " +
|
||||
"Karlem. Jediná dlouhá řádka začíná slovem Karel a končí slovem KONEC.");
|
||||
if ( hodnota && hodnota.length ) {
|
||||
hodnota = hodnota.replace( /\s+/g, "" );
|
||||
}
|
||||
var vysledek = data.nacitani.proved_nacteni(hodnota);
|
||||
vysledek.zobraz_chybu();
|
||||
}
|
||||
|
||||
// Proveď nahrání příkazů/města
|
||||
data.nacitani.proved_nacteni = function (hodnota)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
// Základní kontroly
|
||||
if ( hodnota && hodnota.length ) {
|
||||
var radky = hodnota.split("%0A");
|
||||
vysledek.chyba.formatuj - function (text) {
|
||||
return text + "\n\nNemohu nehrát.";
|
||||
}
|
||||
vysledek.nastav( data.nacitani.kontrola_formatu(radky[0]) );
|
||||
if ( vysledek.byla_chyba() ) return vysledek;
|
||||
var format = vysledek.hodnota;
|
||||
if ( radky[radky.length-1] != "KONEC" ) {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Textová řádka není celá, nebo je poškozená." ) );
|
||||
} else if ( radky.length < 4
|
||||
|| radky.length > 2 && radky[1] != 'M' && radky[1] != 'P' ) {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Nelze rozpoznat, zda se jedná o město nebo příkazy." ) );
|
||||
} else if ( radky[1] == 'M' ) {
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return text + "\n\nNemohu načíst město.";
|
||||
}
|
||||
vysledek.nastav( this.nacti_mesto(format, radky) );
|
||||
if ( vysledek.je_hodnota() ) {
|
||||
var hodnota = vysledek.hodnota;
|
||||
mesto.nahraj_mesto( hodnota.karel, hodnota.smer, hodnota.domov,
|
||||
hodnota.mesto );
|
||||
}
|
||||
} else {
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return text + "\n\nNemohu načíst slovník.";
|
||||
}
|
||||
vysledek.nastav( this.nacti_slovnik(format, radky) );
|
||||
if ( vysledek.je_hodnota() ) {
|
||||
var hodnota = vysledek.hodnota;
|
||||
prikazy.nahraj_slovnik( hodnota );
|
||||
}
|
||||
}
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Kontrola verze
|
||||
data.nacitani.kontrola_formatu = function (format)
|
||||
{
|
||||
format = unescape(format);
|
||||
for ( var i = 0; i < data.verze.length; i++ ) {
|
||||
if ( format == "Karel" + data.verze[i].retezec ) {
|
||||
return new Vysledek( false, Vysledek.NIC, i );
|
||||
}
|
||||
}
|
||||
ladici_vypis( CHYBA, "nacitani.kontrola_formatu", format,
|
||||
"nerozpoznán formát" );
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Neznámá verze " + format + "." ) );
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro načítání města ~====================================
|
||||
|
||||
// Přečti pozici
|
||||
data.nacitani.precti_pozici = function (radka, jmeno)
|
||||
{
|
||||
radka = radka.split( "%20" );
|
||||
var x = parseInt(radka[0]);
|
||||
var y = parseInt(radka[1]);
|
||||
if ( radka.length == 2 && !isNaN(x) && !isNaN(y) ) {
|
||||
if ( x >= 0 && x < mesto.velikost.x && y >= 0 && y < mesto.velikost.y ) {
|
||||
return new Vysledek( false, Vysledek.NIC,
|
||||
{ x: x, y: (mesto.velikost.y - y - 1) } );
|
||||
} else {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Chybná pozice " + jmeno + "." ) );
|
||||
}
|
||||
} else {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nerozpoznána pozice " + jmeno + "." ) );
|
||||
}
|
||||
}
|
||||
|
||||
// Přečti směr
|
||||
data.nacitani.precti_smer = function (radka, jmeno)
|
||||
{
|
||||
var smer = parseInt(radka);
|
||||
if ( !isNaN(smer) ) {
|
||||
if ( smer >= 0 & smer < 4 ) {
|
||||
return new Vysledek( false, Vysledek.NIC, smer );
|
||||
} else {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Chybný směr natočení Karla." ) );
|
||||
}
|
||||
} else {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nerozpoznán směr natočení Karla." ) );
|
||||
}
|
||||
}
|
||||
|
||||
// Přečti řádku města
|
||||
data.nacitani.precti_radku_mesta = function (radka, pocet_radku)
|
||||
{
|
||||
if ( radka.length != pocet_radku ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nebyly nalezeny všechny řádky města." ) );
|
||||
}
|
||||
var mesto_radka = new Array();
|
||||
for ( var y = 0; y < pocet_radku; y++ ) {
|
||||
var znak = radka.charAt(y);
|
||||
for ( var i = -1; i < data.znacky.length; i++ ) {
|
||||
if ( znak == data.znacky[i] ) {
|
||||
mesto_radka[y] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i == data.znacky.length ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nerozpoznáno pole města." ) );
|
||||
}
|
||||
}
|
||||
return new Vysledek( false, Vysledek.NIC, mesto_radka.reverse() );
|
||||
}
|
||||
|
||||
// Načti město
|
||||
data.nacitani.nacti_mesto = function (format, radky)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
if ( format != data.FORMAT_10 ) {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Bohužel neznám verzi " + data.verze[format].retezec + "." ) );
|
||||
} else {
|
||||
var velikost_mesta = { x: 10, y: 10 };
|
||||
|
||||
if ( radky.length != (velikost_mesta.y + 6) ) {
|
||||
vysledek.nastav( new Chyba(true,
|
||||
"Nebyly nalezeny všechny sloupce města." ) );
|
||||
} else {
|
||||
vysledek.nastav( this.precti_pozici(radky[2], "Karla") );
|
||||
var karel_pozice = vysledek.hodnota;
|
||||
vysledek.nastav( this.precti_smer(radky[3]) );
|
||||
var smer = vysledek.hodnota;
|
||||
vysledek.nastav( this.precti_pozici(radky[4], "domova") );
|
||||
var domov_pozice = vysledek.hodnota;
|
||||
var mesto_pole = new Array();
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
for ( var x = 0; x < velikost_mesta.x && !vysledek.byla_chyba(); x++ ) {
|
||||
var nacteno = data.nacitani.precti_radku_mesta( radky[x+5],
|
||||
velikost_mesta.y );
|
||||
vysledek.nastav( nacteno );
|
||||
mesto_pole[x] = vysledek.hodnota;
|
||||
}
|
||||
}
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
vysledek.nastav( false, Vysledek.NIC,
|
||||
{ karel: karel_pozice,
|
||||
smer: smer,
|
||||
domov: domov_pozice,
|
||||
mesto: mesto_pole } );
|
||||
}
|
||||
}
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro načítání slovníku ~=================================
|
||||
|
||||
// Načti slovník
|
||||
data.nacitani.nacti_slovnik = function (format, radky)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
var novy_slovnik = this.priprav_slovnik(format);
|
||||
// Základní kontrola
|
||||
if ( radky.length < 4
|
||||
|| radky.length > 3 && (radky.length-4 != radky[2]-novy_slovnik.length+1)) {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Slovník nejspíš není celý." ) );
|
||||
} else {
|
||||
var radky_slovniku = radky.slice(3, -1);
|
||||
vysledek.nastav(
|
||||
this.dekoduj_slovnik(format, radky_slovniku, novy_slovnik) );
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Příprava slovníku na načtení
|
||||
data.nacitani.priprav_slovnik = function (format)
|
||||
{
|
||||
var novy_slovnik = new Array();
|
||||
var verze = data.verze[format].verze;
|
||||
var slovnik = prikazy.seznam;
|
||||
for ( var i = 0; i < slovnik.length && slovnik[i].systemovy; i++ ) {
|
||||
var prikaz = slovnik[i];
|
||||
if ( prikaz.kompatibilita & prikaz.verze_ulozeni & verze ) {
|
||||
novy_slovnik.push( prikaz );
|
||||
}
|
||||
}
|
||||
return novy_slovnik;
|
||||
}
|
||||
|
||||
// Dekóduj slovník
|
||||
data.nacitani.dekoduj_slovnik = function (format, radky_slovniku, novy_slovnik)
|
||||
{
|
||||
// Připrav prázdné příkazy
|
||||
var vysledek = new Vysledek();
|
||||
var start_index = novy_slovnik.length;
|
||||
|
||||
// Oddělit jednotlivé příkazy
|
||||
vysledek.nastav( this.oddel_prikazy( radky_slovniku, novy_slovnik ) );
|
||||
|
||||
// Změna jmen
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
vysledek.nastav( this.oprav_nazvy( novy_slovnik ) );
|
||||
}
|
||||
|
||||
// Načti příkazy
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
var i = start_index;
|
||||
while ( i < novy_slovnik.length && !vysledek.byla_chyba() ) {
|
||||
var novy_prikaz = novy_slovnik[i];
|
||||
var radky_prikazu = novy_prikaz.kodovane_telo;
|
||||
delete novy_prikaz.kodovane_telo;
|
||||
vysledek.nastav(
|
||||
this.dekoduj_prikaz(format, radky_prikazu, novy_prikaz, novy_slovnik) );
|
||||
i++;
|
||||
}
|
||||
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
novy_slovnik = novy_slovnik.slice(start_index);
|
||||
vysledek.nastav( false, Vysledek.NIC, novy_slovnik );
|
||||
}
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Odděl příkazy
|
||||
data.nacitani.oddel_prikazy = function (radky_slovniku, slovnik)
|
||||
{
|
||||
for ( var i = 0; i < radky_slovniku.length; i++ ) {
|
||||
var zaklad_prikazu = radky_slovniku[i].split("%09");
|
||||
if ( zaklad_prikazu.length != 2 ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nerozpoznán příkaz." ) );
|
||||
}
|
||||
var radky_prikazu = zaklad_prikazu[1].split("%2C");
|
||||
var novy_prikaz = {
|
||||
jmeno: unescape(zaklad_prikazu[0]),
|
||||
telo: new Array(),
|
||||
kodovane_telo: radky_prikazu
|
||||
};
|
||||
if ( !novy_prikaz.jmeno.length ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nerozpoznán název příkazu." ) );
|
||||
}
|
||||
slovnik.push(novy_prikaz);
|
||||
}
|
||||
return new Vysledek();
|
||||
}
|
||||
|
||||
// Oprav názvy
|
||||
data.nacitani.oprav_nazvy = function (novy_slovnik)
|
||||
{
|
||||
for ( var i = 0; i < novy_slovnik.length; i++ ) {
|
||||
var prikaz = novy_slovnik[i];
|
||||
if ( !prikaz.systemovy ) {
|
||||
var vysledek = new Vysledek();
|
||||
vysledek.nastav(
|
||||
prikazy.rozpoznavac.kontrola_jmena(prikaz.jmeno) );
|
||||
if ( vysledek.byla_chyba() ) {
|
||||
var nove_jmeno = this.najdi_nove_jmeno(prikaz.jmeno, novy_slovnik);
|
||||
prikaz.jmeno = nove_jmeno;
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return "Chyba při načítání slovníku: " + text +
|
||||
"\n\nPříkaz byl přejmenován na " + nove_jmeno + ".";
|
||||
}
|
||||
vysledek.zobraz_chybu();
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Vysledek();
|
||||
}
|
||||
|
||||
// Najdi nové nekonfliktní jméno
|
||||
data.nacitani.najdi_nove_jmeno = function (jmeno, slovnik)
|
||||
{
|
||||
var nove_jmeno;
|
||||
var i = 1;
|
||||
var spravne = false;
|
||||
while ( !spravne ) {
|
||||
spravne = true;
|
||||
if ( i == 1 ) {
|
||||
nove_jmeno = "!" + jmeno;
|
||||
} else {
|
||||
nove_jmeno = "!" + jmeno + " " + i;
|
||||
}
|
||||
for ( var j = slovnik.length-1; j >= 0 && !slovnik[j].systemovy; j-- ) {
|
||||
if ( nove_jmeno == slovnik[j].jmeno ) {
|
||||
spravne = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return nove_jmeno;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce pro načítání jednotlivých příkazů ~==============================
|
||||
|
||||
// TODO: Podrobnější popis chyby v příkazu?
|
||||
// Načtení příkazu
|
||||
data.nacitani.dekoduj_prikaz = function (format, radky_prikazu, novy_prikaz,
|
||||
novy_slovnik)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
if ( format < data.FORMAT_20 ) {
|
||||
novy_prikaz.telo.push( [ prikazy.NAZEV, novy_prikaz ] );
|
||||
}
|
||||
var i = 0;
|
||||
while ( i < radky_prikazu.length && !vysledek.byla_chyba() ) {
|
||||
var radka = radky_prikazu[i].split("%20");
|
||||
var cislo = parseInt(radka[0]);
|
||||
if ( isNaN(cislo) || cislo < 0 || cislo >= novy_slovnik.length ) {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Při zpracování těla příkazu " + novy_prikaz.jmeno +
|
||||
" nebyl rozpoznán příkaz." ) );
|
||||
} else {
|
||||
var novy_jeden_prikaz;
|
||||
var prikaz = novy_slovnik[cislo];
|
||||
radka[0] = prikaz;
|
||||
for ( var j = 1; j < radka.length; j++ ) {
|
||||
radka[j] = unescape(radka[j]);
|
||||
}
|
||||
if ( !prikaz.nacitac ) {
|
||||
novy_jeden_prikaz = this.obecny(format, radka, novy_prikaz);
|
||||
} else {
|
||||
novy_jeden_prikaz = prikaz.nacitac(format, radka, novy_prikaz);
|
||||
}
|
||||
if ( novy_jeden_prikaz ) {
|
||||
novy_prikaz.telo.push(novy_jeden_prikaz);
|
||||
} else {
|
||||
vysledek.nastav( new Chyba( true,
|
||||
"Chybné parametry na řádce " + (i+1) + " v těle příkazu " +
|
||||
novy_prikaz.jmeno + "." ) );
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Obecné ukládání
|
||||
data.nacitani.obecny = function (format, radka, novy_prikaz)
|
||||
{
|
||||
if ( radka.length != 1 ) {
|
||||
return undefined;
|
||||
} else {
|
||||
return radka;
|
||||
}
|
||||
}
|
||||
|
||||
// Cyklus
|
||||
data.nacitani.nacti_OPAKUJ = function (format, radka, novy_prikaz)
|
||||
{
|
||||
if ( radka.length > 2 ) return undefined;
|
||||
else if ( radka.length == 2 ) {
|
||||
var pocet = parseInt(radka[1]);
|
||||
if ( isNaN(pocet) || pocet < -1 ) return undefined;
|
||||
if ( pocet == -1 ) {
|
||||
radka = [ radka[0] ];
|
||||
}
|
||||
}
|
||||
return radka;
|
||||
}
|
||||
|
||||
// Podmínka
|
||||
data.nacitani.nacti_podminku = function (format, radka, novy_prikaz)
|
||||
{
|
||||
if ( radka.length != 2 ) return undefined;
|
||||
var podminka = parseInt(radka[1]);
|
||||
if ( isNaN(podminka) || podminka == 0
|
||||
|| !isNaN(podminka) && Math.abs(podminka) > prikazy.podminky.length ) {
|
||||
return undefined;
|
||||
}
|
||||
return radka;
|
||||
}
|
||||
|
||||
// Komentář
|
||||
data.nacitani.nacti_komentar = function (format, radka, novy_prikaz)
|
||||
{
|
||||
if ( radka.length != 2 ) return undefined;
|
||||
radka[1] = unescape(radka[1]);
|
||||
return radka;
|
||||
}
|
||||
|
||||
// Název
|
||||
data.nacitani.nacti_nazev = function (format, radka, novy_prikaz)
|
||||
{
|
||||
if ( radka.length != 1 ) return undefined;
|
||||
radka[1] = novy_prikaz;
|
||||
return radka;
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní funkce nastavení
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Objekt globálního nastavení
|
||||
nastaveni = new Object();
|
||||
|
||||
// Základní nastavení prodlevy
|
||||
nastaveni.zakladni_prodleva = 500;
|
||||
|
||||
// Nápověda k nastavení rychlosti provádění příkazů
|
||||
nastaveni.prodleva_tooltip = new Array(
|
||||
[ 2000, "Prodleva 2,00s", "" ],
|
||||
[ 1750, "Prodleva 1,75s", "" ],
|
||||
[ 1500, "Prodleva 1,50s", "" ],
|
||||
[ 1250, "Prodleva 1,25s", "" ],
|
||||
[ 1000, "Prodleva 1,00s", "" ],
|
||||
[ 750, "Prodleva 0,75s", "" ],
|
||||
[ 500, "Prodleva 0,50s", "" ],
|
||||
[ 250, "Prodleva 0,25s", "" ],
|
||||
[ 200, "Prodleva 0,20s", "" ],
|
||||
[ 150, "Prodleva 0,15s", "" ],
|
||||
[ 100, "Prodleva 0,10s", "" ],
|
||||
[ 50, "Prodleva 0,05s", "" ],
|
||||
[ 0, "Minimální prodleva", "Prováděj příkazy tak rychle, jak to jen jde" ]
|
||||
);
|
||||
|
||||
// Myš
|
||||
nastaveni.mys = new Mys(new Tooltip());
|
||||
nastaveni.mys.tooltip.muzu_zobrazit = function (info, detail) { return true; }
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce pro práci s myší ~===============================================
|
||||
|
||||
// Proveď nastavení podle výběru
|
||||
nastaveni.mys.proved_vyber = function(info, detail)
|
||||
{
|
||||
nastaveni.prodleva = detail.prodleva;
|
||||
nastav_cookie("prodleva", detail.prodleva, 365);
|
||||
prikazy.jadro.prenastav_casovac(detail.prodleva);
|
||||
return true;
|
||||
}
|
||||
|
||||
nastaveni.mys.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
nastaveni.mys.prekresli_stav = function(info, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
var element=document.getElementById(info);
|
||||
var trida;
|
||||
if ( stisknut || vybran ) {
|
||||
trida = "vybrany";
|
||||
} else if ( zvyraznen ) {
|
||||
trida = "zvyrazneny";
|
||||
} else {
|
||||
trida = "nic";
|
||||
}
|
||||
ladici_vypis(LADENI, "nastaveni.mys.prekresli_stav", info,
|
||||
"nastavuji třídu na "+trida);
|
||||
element.className = trida;
|
||||
}
|
||||
|
||||
nastaveni.mys.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
tvoric.obnov_tooltip( tooltip, "", detail.nadpis, detail.popis );
|
||||
}
|
||||
|
||||
nastaveni.nastav_prodlevu = function (prodleva)
|
||||
{
|
||||
var hodnota = parseInt(prodleva);
|
||||
if ( prodleva == undefined || isNaN(hodnota) ) {
|
||||
prodleva = nastaveni.zakladni_prodleva;
|
||||
}
|
||||
var nejblizsi = { rozdil: Infinity };
|
||||
for ( var i = 0; i < nastaveni.prodleva_tooltip.length; i++ ) {
|
||||
var rozdil = Math.abs(nastaveni.prodleva_tooltip[i][0]-prodleva);
|
||||
if ( rozdil < nejblizsi.rozdil ) {
|
||||
nejblizsi.index = i;
|
||||
nejblizsi.prodleva = nastaveni.prodleva_tooltip[i][0];
|
||||
nejblizsi.rozdil = rozdil;
|
||||
nejblizsi.nadpis = nastaveni.prodleva_tooltip[i][1];
|
||||
nejblizsi.popis = nastaveni.prodleva_tooltip[i][1];
|
||||
}
|
||||
}
|
||||
var mys_info = "prodleva-"+(nejblizsi.index+1);
|
||||
var mys_detail = {
|
||||
index: nejblizsi.index,
|
||||
prodleva: nejblizsi.prodleva,
|
||||
nadpis: nejblizsi.nadpis,
|
||||
popis: nejblizsi.popis
|
||||
};
|
||||
|
||||
nastaveni.mys.vyber(mys_info, mys_detail);
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar nastavení
|
||||
|
||||
document.write('<div class="nastaveni-prodleva">');
|
||||
document.write('<div class="prodleva">Rychlost vykonávání příkazů');
|
||||
|
||||
document.write('<div class="obsah">');
|
||||
|
||||
document.write('<div class="stupnice">');
|
||||
document.write('<div class="duha"></div>');
|
||||
|
||||
for ( var i = 0; i < 2; i++ ) {
|
||||
if ( i == 0 ) {
|
||||
document.write('<div class="ukazatel">');
|
||||
} else {
|
||||
document.write('<div class="maska">');
|
||||
}
|
||||
for ( var j = 0; j < nastaveni.prodleva_tooltip.length; j++ ) {
|
||||
var id = "prodleva-"+(j+1);
|
||||
if ( i == 0 ) {
|
||||
document.write('<div id="'+id+'" class="nic"></div>');
|
||||
} else {
|
||||
var mys_info = "'" + id + "'";
|
||||
var mys_detail =
|
||||
"{index:"+i+","+
|
||||
"prodleva:"+nastaveni.prodleva_tooltip[j][0]+","+
|
||||
"nadpis:'"+nastaveni.prodleva_tooltip[j][1]+"',"+
|
||||
"popis:'"+nastaveni.prodleva_tooltip[j][2]+"'}";
|
||||
document.write('<div '+
|
||||
'onmouseover="return nastaveni.mys.pres(event,'+mys_info+','+
|
||||
mys_detail+');"'+
|
||||
'onmouseout="return nastaveni.mys.pryc(event,'+mys_info+','+
|
||||
mys_detail+');" '+
|
||||
'onmousedown="return nastaveni.mys.stisk(event,'+mys_info+','+
|
||||
mys_detail+');"'+
|
||||
'onmouseup="return nastaveni.mys.pust(event,'+mys_info+','+
|
||||
mys_detail+');" '+
|
||||
'></div>');
|
||||
}
|
||||
}
|
||||
document.write('</div>');
|
||||
}
|
||||
|
||||
document.write('</div>');
|
||||
|
||||
document.write('<div class="pomalu">Pomalu</div>');
|
||||
document.write('<div class="rychle">Rychle</div>');
|
||||
document.write('<div class="stredne">Středně rychle</div>');
|
||||
|
||||
document.write('</div>');
|
||||
|
||||
document.write('</div></div>');
|
||||
|
||||
// Nastavení prodlevy
|
||||
nastaveni.nastav_prodlevu(hodnota_cookie("prodleva"));
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní funkce pro panel nástrojů
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Informace o nástrojích
|
||||
nastroje = new Object();
|
||||
|
||||
// Panel nástrojů
|
||||
nastroje.nastroje = new Array(
|
||||
[ "karel", "tip-karel", "Robot Karel",
|
||||
"Přemísti Karla (jeden klik), otoč Karla vlevo (dvojklik)" ],
|
||||
[ "domov", "tip-domov", "Domov", "Přemísti Karlův domov" ],
|
||||
[ "zed", "tip-zed", "Zeď", "Postav, nebo zbourej zeď" ],
|
||||
[ "znacka-plus", "tip-znacka-plus", "Polož značku",
|
||||
"Polož jednu značku, nejvíce však 8 značek na jedno políčko" ],
|
||||
[ "znacka-minus", "tip-znacka-minus", "Zvedni značku",
|
||||
"Zvedni jednu značku, pokud je alespoň jedna na políčku" ],
|
||||
null,
|
||||
[ "smaz-vse", "tip-smaz-vse", "Vyčisti město",
|
||||
"Vyčisti celé město, umísti Karla a domov do levého dolního rohu" ],
|
||||
[ "smaz", "tip-smaz", "Posbírej značky",
|
||||
"Posbírej všechny značky ze všech políček města" ],
|
||||
null,
|
||||
[ "nacist", "tip-nacist", "Načti město", "Načti uložené město (i slovník)" ],
|
||||
[ "ulozit", "tip-ulozit", "Ulož město", "Ulož město pro budoucí použití" ],
|
||||
[ "exportovat-k99", "tip-exportovat-k99", "Exportuj město",
|
||||
"Ulož město do formátu Visual Karel 99" ]
|
||||
);
|
||||
nastroje.nastroje.id_prefix = "nastroje-";
|
||||
nastroje.nastroje.mys = "nastroje.mys";
|
||||
|
||||
// Objekt pro práci s myší
|
||||
nastroje.mys = new Mys(new Tooltip());
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro práci s nástroji ~==================================
|
||||
|
||||
nastroje.zobraz_pozici = function (vyber)
|
||||
{
|
||||
if ( vyber ) {
|
||||
document.getElementById("pozice-x").firstChild.firstChild.data = vyber.x+1;
|
||||
document.getElementById("pozice-y").firstChild.firstChild.data = vyber.y+1;
|
||||
} else {
|
||||
document.getElementById("pozice-x").firstChild.firstChild.data = "\u2022";
|
||||
document.getElementById("pozice-y").firstChild.firstChild.data = "\u2022";
|
||||
}
|
||||
}
|
||||
|
||||
nastroje.mys.prekresli_stav = function(nastroj, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
tvoric.zvyraznovac(
|
||||
nastroje.nastroje.id_prefix+nastroj, zvyraznen, stisknut, vybran);
|
||||
}
|
||||
|
||||
nastroje.mys.proved_zvyrazneni = function(nastroj, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
nastroje.mys.proved_vyber = function(nastroj, detail)
|
||||
{
|
||||
switch ( nastroj )
|
||||
{
|
||||
case "smaz-vse": {
|
||||
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "výmaz města");
|
||||
mesto.vymaz_mesto();
|
||||
return false;
|
||||
}
|
||||
case "smaz": {
|
||||
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "výmaz značek");
|
||||
mesto.vymaz_znacky();
|
||||
return false;
|
||||
}
|
||||
case "nacist": {
|
||||
data.nacitani.nacti();
|
||||
return false;
|
||||
}
|
||||
case "ulozit": {
|
||||
data.ukladani.uloz_mesto();
|
||||
return false;
|
||||
}
|
||||
case "exportovat-k99": {
|
||||
data.ukladani.export_mesto_k99();
|
||||
return false;
|
||||
}
|
||||
default: {
|
||||
ladici_vypis(LADENI, "nastroje.mys.proved_vyber", "změna nástroje na '"+nastroj+"'");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nastroje.vybrany = function ()
|
||||
{
|
||||
return nastroje.mys.vybran.info;
|
||||
}
|
||||
|
||||
nastroje.vyber = function (nastroj)
|
||||
{
|
||||
nastroje.mys.vyber(nastroj);
|
||||
}
|
||||
|
||||
nastroje.mys.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
tvoric.obnov_tooltip( tooltip, detail.ikona, detail.nadpis, detail.popis );
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar panelu nástrojů
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování nástrojů ~=================================================
|
||||
|
||||
document.write('<div class="mesto-nastroje">');
|
||||
document.write('<div id="pozice-x"><span>•</span></div>');
|
||||
document.write('<div class="times"><span>×</span></div>');
|
||||
document.write('<div id="pozice-y"><span>•</span></div>');
|
||||
document.write('<div class="nastroje">');
|
||||
for ( var i = 0; i < nastroje.nastroje.length; i++ ) {
|
||||
var nastroj = nastroje.nastroje[i];
|
||||
if ( nastroj != null ) {
|
||||
tvoric.zapis_tlacitko(false, nastroje.nastroje.id_prefix+nastroj[0],
|
||||
nastroje.nastroje.mys,
|
||||
'\''+nastroj[0]+'\'',
|
||||
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
|
||||
} else {
|
||||
tvoric.zapis_tlacitko(true);
|
||||
}
|
||||
}
|
||||
document.write('</div>');
|
||||
document.write('</div>');
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
nastroje.vyber( nastroje.nastroje[0][0] );
|
||||
@@ -0,0 +1,495 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - různé funkce
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
je_oldium_dot_home = false;
|
||||
|
||||
if ( /^https?:\/\/[^\/]+\.oldium\.home\//.exec(document.URL) ) {
|
||||
je_oldium_dot_home = true;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Chyba při provádění příkazů ~===========================================
|
||||
|
||||
Chyba = function (chyba, text)
|
||||
{
|
||||
if ( chyba != undefined ) {
|
||||
if ( chyba instanceof Chyba ) {
|
||||
this.chyba = chyba.chyba;
|
||||
this.text = chyba.formatuj( chyba.text );
|
||||
this.zobrazen = chyba.zobrazen;
|
||||
} else {
|
||||
this.chyba = chyba;
|
||||
this.text = text;
|
||||
this.zobrazen = false;
|
||||
}
|
||||
} else {
|
||||
this.chyba = false;
|
||||
this.zobrazen = false;
|
||||
}
|
||||
}
|
||||
|
||||
Chyba.prototype.nastav = function (chyba, text)
|
||||
{
|
||||
if ( !this.chyba ) {
|
||||
if ( chyba instanceof Chyba ) {
|
||||
this.chyba = chyba.chyba;
|
||||
this.text = chyba.formatuj(chyba.text);
|
||||
this.zobrazen = this.zobrazen || chyba.zobrazen;
|
||||
} else {
|
||||
this.chyba = chyba;
|
||||
this.text = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Chyba.prototype.formatuj = function (text)
|
||||
{
|
||||
return text;
|
||||
}
|
||||
|
||||
Chyba.prototype.zobraz = function ()
|
||||
{
|
||||
if ( !this.zobrazen && this.chyba && this.text ) {
|
||||
alert( this.formatuj(this.text) );
|
||||
this.zobrazen = true;
|
||||
}
|
||||
}
|
||||
|
||||
Chyba.prototype.byla_chyba = function ()
|
||||
{
|
||||
return this.chyba;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Výsledek provedení příkazu ~============================================
|
||||
|
||||
Vysledek = function (chyba, stav, hodnota)
|
||||
{
|
||||
if ( !chyba ) chyba = new Chyba();
|
||||
|
||||
this.chyba = chyba; // Chyba
|
||||
this.stav = stav;
|
||||
this.hodnota = hodnota; // Hodnota výsledku
|
||||
}
|
||||
|
||||
Vysledek.NIC = 0; // Žádná zvláštní akce
|
||||
Vysledek.PROVEDL_AKCI = 1; // Pokud byl proveden KROK, VLEVO-VBOK atp.
|
||||
Vysledek.PRESKOC_KONEC = 2; // Pokud se má přeskočit blok příkazů
|
||||
Vysledek.KONEC = 4; // Okamžitý konec
|
||||
Vysledek.BYL_UPRAVEN = 8; // Příkaz byl upraven
|
||||
|
||||
Vysledek.MASKA = Vysledek.KONEC|Vysledek.BYL_UPRAVEN; // Maska neměnnosti
|
||||
|
||||
Vysledek.prototype.nastav = function (chyba, stav, hodnota)
|
||||
{
|
||||
if ( chyba != null ) {
|
||||
if ( chyba instanceof Vysledek ) {
|
||||
var vysledek = chyba;
|
||||
if ( ! this.chyba.byla_chyba() ) {
|
||||
this.chyba.nastav( vysledek.chyba );
|
||||
this.stav =
|
||||
(this.stav & Vysledek.MASKA) | (vysledek.stav & (~Vysledek.MASKA));
|
||||
this.hodnota = vysledek.hodnota;
|
||||
}
|
||||
this.stav |= vysledek.stav&Vysledek.MASKA;
|
||||
} else {
|
||||
this.chyba.nastav( chyba );
|
||||
this.stav =
|
||||
((this.stav | stav) & Vysledek.MASKA) | (stav & (~Vysledek.MASKA));
|
||||
this.hodnota = hodnota;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vysledek.prototype.byla_chyba = function ()
|
||||
{
|
||||
return this.chyba.byla_chyba();
|
||||
}
|
||||
|
||||
Vysledek.prototype.byla_akce = function ()
|
||||
{
|
||||
return this.stav & Vysledek.PROVEDL_AKCI;
|
||||
}
|
||||
|
||||
Vysledek.prototype.byl_upraven = function ()
|
||||
{
|
||||
return this.stav & Vysledek.BYL_UPRAVEN;
|
||||
}
|
||||
|
||||
Vysledek.prototype.je_konec = function ()
|
||||
{
|
||||
return this.chyba.byla_chyba() || (this.stav & Vysledek.KONEC);
|
||||
}
|
||||
|
||||
Vysledek.prototype.je_hodnota = function ()
|
||||
{
|
||||
return ( !this.chyba.byla_chyba()
|
||||
&& this.hodnota != undefined && this.hodnota != null );
|
||||
}
|
||||
|
||||
Vysledek.prototype.ma_preskocit = function ()
|
||||
{
|
||||
return this.stav & Vysledek.PRESKOC_KONEC;
|
||||
}
|
||||
|
||||
Vysledek.prototype.zobraz_chybu = function ()
|
||||
{
|
||||
this.chyba.zobraz();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Příkazy po nahrání dokumentu ~==========================================
|
||||
|
||||
seznam_po_spusteni = new Array();
|
||||
|
||||
function po_spusteni (funkce) {
|
||||
seznam_po_spusteni.push(funkce);
|
||||
}
|
||||
|
||||
function spust_po_spusteni () {
|
||||
for ( var i = 0; i < seznam_po_spusteni.length; i++ ) {
|
||||
var funkce = seznam_po_spusteni[i];
|
||||
funkce();
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Nahrání nápovědy a příkladů ~===========================================
|
||||
|
||||
okno_napoveda = null;
|
||||
okno_priklady = null;
|
||||
|
||||
function otevri_okno( url, jmeno, okno )
|
||||
{
|
||||
try {
|
||||
if ( okno && okno.closed() ) {
|
||||
okno = null;
|
||||
}
|
||||
} catch (e) {
|
||||
okno = null;
|
||||
}
|
||||
if ( !okno ) {
|
||||
okno = window.open( url, jmeno );
|
||||
}
|
||||
if ( okno ) {
|
||||
okno.focus();
|
||||
}
|
||||
return okno;
|
||||
}
|
||||
|
||||
function napoveda() {
|
||||
okno_napoveda = otevri_okno(
|
||||
"napoveda.html", "karel_napoveda", okno_napoveda
|
||||
);
|
||||
}
|
||||
|
||||
function priklady() {
|
||||
okno_priklady = otevri_okno(
|
||||
"priklady.html", "karel_okno", okno_priklady
|
||||
);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Různé funkce ~==========================================================
|
||||
|
||||
// Test shodnosti dvou objektů
|
||||
function jsou_shodne(a, b)
|
||||
{
|
||||
if ( a == null || b == null ) return false;
|
||||
var type_a = typeof(a);
|
||||
var type_b = typeof(b);
|
||||
if ( type_a != type_b ) return false;
|
||||
if ( type_a == "object" ) {
|
||||
var pocet=0;
|
||||
for ( var x in a ) {
|
||||
if ( a[x] != b[x] ) {
|
||||
return false;
|
||||
}
|
||||
pocet++;
|
||||
}
|
||||
for ( var x in b ) {
|
||||
pocet--;
|
||||
}
|
||||
return (pocet == 0);
|
||||
} else {
|
||||
return (a == b);
|
||||
}
|
||||
}
|
||||
|
||||
// Vrať textovou reprezentaci
|
||||
function formatuj_text(text)
|
||||
{
|
||||
if ( text == undefined ) {
|
||||
return "nedefinován";
|
||||
} else if ( text == null ) {
|
||||
return "prázdný";
|
||||
} else {
|
||||
switch ( typeof(text) ) {
|
||||
case "boolean":
|
||||
if ( text ) {
|
||||
return "ano";
|
||||
} else {
|
||||
return "ne";
|
||||
}
|
||||
case "object":
|
||||
if ( text instanceof Date ) {
|
||||
var format = text.getUTCFullYear() + "-" +
|
||||
new String("0"+(text.getMonth()+1)).slice(-2) + "-" +
|
||||
new String("0"+(text.getDate())).slice(-2) + " " +
|
||||
new String("0"+(text.getHours())).slice(-2) + ":" +
|
||||
new String("0"+(text.getMinutes())).slice(-2) + ":" +
|
||||
new String("0"+(text.getSeconds())).slice(-2) + "." +
|
||||
new String("00"+(text.getMilliseconds())).slice(-3);
|
||||
return format;
|
||||
} else if ( "innerText" in text || "innerHTML" in text
|
||||
|| typeof(Element) == "object" && text instanceof Element ) {
|
||||
var navrat = "";
|
||||
for ( var hodnota in text ) {
|
||||
var neni_text = ! /^((inner|outer)(HTML|Text)|text(Content)?)$/.exec(hodnota);
|
||||
var neni_funkce = (typeof(text[hodnota]) != "function");
|
||||
if ( neni_text && neni_funkce ) {
|
||||
navrat += hodnota+":"+text[hodnota]+" ";
|
||||
}
|
||||
}
|
||||
return navrat.slice(0,-1);
|
||||
} else {
|
||||
var hodnoty = new Array();
|
||||
var navrat = "";
|
||||
for ( var hodnota in text ) {
|
||||
var neni_funkce = (typeof(text[hodnota]) != "function");
|
||||
if ( neni_funkce ) {
|
||||
hodnoty.push(hodnota);
|
||||
navrat += hodnota+":"+text[hodnota]+" ";
|
||||
}
|
||||
}
|
||||
if ( hodnoty.length == 2 &&
|
||||
hodnoty[0] == 'x' || hodnoty[0] == 'y' &&
|
||||
hodnoty[1] == 'x' || hodnoty[1] == 'y'
|
||||
) {
|
||||
return "x:"+(text.x+1)+" y:"+(text.y+1);
|
||||
} else {
|
||||
return navrat.slice(0,-1);
|
||||
}
|
||||
}
|
||||
default:
|
||||
return ""+text;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Nastav hodnotu cookie. Lze zadat buď čas, nebo počet dnů do vypršení
|
||||
function nastav_cookie(nazev, hodnota, vyprsi)
|
||||
{
|
||||
var text_vyprsi = "";
|
||||
if ( vyprsi != undefined ) {
|
||||
var datum;
|
||||
if ( typeof(vyprsi) == "object" ) {
|
||||
datum = text_vyprsi;
|
||||
} else {
|
||||
datum = new Date();
|
||||
datum.setTime(datum.getTime()+(vyprsi*24*60*60*1000));
|
||||
}
|
||||
text_vyprsi = "; expires="+datum.toUTCString();
|
||||
}
|
||||
var uloz = escape(hodnota);
|
||||
ladici_vypis(LADENI, "pridej_cookie", "nastavuji cookie "+nazev+"="+hodnota);
|
||||
document.cookie = nazev+"="+uloz+text_vyprsi+"; path=/";
|
||||
}
|
||||
|
||||
// Zjisti hodnotu cookie
|
||||
function hodnota_cookie(nazev)
|
||||
{
|
||||
var vyhledej = nazev + "=";
|
||||
var cookie = document.cookie.split(";");
|
||||
for ( var i = 0; i < cookie.length; i++ ) {
|
||||
var hodnota = cookie[i];
|
||||
while ( hodnota.charAt(0) == " " ) {
|
||||
hodnota = hodnota.slice(1);
|
||||
}
|
||||
if ( hodnota.indexOf(vyhledej) == 0 ) {
|
||||
var vrat = unescape(hodnota.slice(vyhledej.length));
|
||||
ladici_vypis(LADENI, "hodnota_cookie", "hodnota cookie "+nazev+"="+vrat);
|
||||
return vrat;
|
||||
}
|
||||
}
|
||||
ladici_vypis(LADENI, "hodnota_cookie", "hodnota cookie "+nazev+" nenalezena");
|
||||
return null;
|
||||
}
|
||||
|
||||
// Zruš cookie
|
||||
function zrus_cookie(nazev)
|
||||
{
|
||||
pridej_cookie(nazev, "", -1);
|
||||
}
|
||||
|
||||
// Nastav text objektu
|
||||
function nastav_text(element, text)
|
||||
{
|
||||
if ( (element.firstChild &&
|
||||
(( typeof(Text) != "undefined" && element.firstChild instanceof Text ) ||
|
||||
element.firstChild.splitText
|
||||
))
|
||||
) {
|
||||
if ( text == "" ) {
|
||||
element.removeChild(element.firstChild);
|
||||
} else {
|
||||
element.firstChild.nodeValue = text;
|
||||
}
|
||||
} else {
|
||||
if ( text != "" ) {
|
||||
element.insertBefore(document.createTextNode(text), element.firstChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Zjisti zdrojový element události (např. kde bylo kliknuto)
|
||||
function zdrojovy_element(udalost)
|
||||
{
|
||||
if ( ! udalost ) {
|
||||
return undefined;
|
||||
} else if ( udalost.currentTarget ) {
|
||||
return udalost.currentTarget;
|
||||
} else if ( udalost.srcElement ) {
|
||||
return udalost.srcElement;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
// Zjisti pozici objektu
|
||||
function zjisti_pozici(objekt)
|
||||
{
|
||||
if ( objekt != null ) {
|
||||
var otec = zjisti_pozici(objekt.offsetParent);
|
||||
return {
|
||||
x: objekt.offsetLeft+otec.x,
|
||||
y: objekt.offsetTop+otec.y
|
||||
};
|
||||
} else {
|
||||
return { x: 0, y: 0 };
|
||||
}
|
||||
}
|
||||
|
||||
// Zjisti velikost objektu
|
||||
function zjisti_velikost(objekt)
|
||||
{
|
||||
return { x: objekt.clientWidth, y: objekt.clientHeight };
|
||||
}
|
||||
|
||||
// Zjisti velikost okna prohlížeče - pouze viditelnou část bez posuvníků
|
||||
function zjisti_velikost_okna()
|
||||
{
|
||||
var velikost1 = zjisti_pozici( document.getElementById('okno1') );
|
||||
var velikost2 = zjisti_velikost( document.getElementById('okno2') );
|
||||
|
||||
if ( velikost1.x != 0 || velikost1.y != 0 || velikost2.x == 0 ) {
|
||||
return velikost1;
|
||||
} else {
|
||||
return velikost2;
|
||||
}
|
||||
}
|
||||
|
||||
// Zjisti pozici posuvníků
|
||||
function zjisti_scroll()
|
||||
{
|
||||
var element = document.documentElement;
|
||||
var body = document.body;
|
||||
return {
|
||||
x: Math.max(body.scrollLeft, element.scrollLeft),
|
||||
y: Math.max(body.scrollTop, element.scrollTop)
|
||||
};
|
||||
}
|
||||
|
||||
// Spočítej rozměry (okraje) podle pozice a velikost
|
||||
function spocitej_rozmery(pozice, velikost)
|
||||
{
|
||||
return {
|
||||
levy: pozice.x,
|
||||
pravy: pozice.x + velikost.x,
|
||||
horni: pozice.y,
|
||||
dolni: pozice.y + velikost.y
|
||||
};
|
||||
}
|
||||
|
||||
// Zmenši okraj o dané rozměry
|
||||
function pridej_okraj(rozmery, okraj)
|
||||
{
|
||||
return {
|
||||
levy: rozmery.levy + okraj,
|
||||
horni: rozmery.horni + okraj,
|
||||
pravy: rozmery.pravy - okraj,
|
||||
dolni: rozmery.dolni - okraj
|
||||
}
|
||||
}
|
||||
|
||||
// Posun horizontálně
|
||||
function posun_x(rozmery, posun)
|
||||
{
|
||||
return {
|
||||
levy: rozmery.levy + posun,
|
||||
horni: rozmery.horni,
|
||||
pravy: rozmery.pravy + posun,
|
||||
dolni: rozmery.dolni
|
||||
};
|
||||
}
|
||||
|
||||
// Posun vertikálně
|
||||
function posun_y(rozmery, posun)
|
||||
{
|
||||
return {
|
||||
levy: rozmery.levy,
|
||||
horni: rozmery.horni + posun,
|
||||
pravy: rozmery.pravy,
|
||||
dolni: rozmery.dolni + posun
|
||||
};
|
||||
}
|
||||
|
||||
// Zjisti rozměry objektu. Pokud není určen objekt, vrať velikost okna
|
||||
// prohlížeče a stránky
|
||||
function zjisti_rozmery(objekt)
|
||||
{
|
||||
if ( objekt != undefined ) {
|
||||
return spocitej_rozmery(zjisti_pozici(objekt), zjisti_velikost(objekt));
|
||||
} else {
|
||||
var okraj = document.getElementById('okraj').offsetTop/2;
|
||||
var stranka = document.getElementById('stranka');
|
||||
var velikost_okna = zjisti_velikost_okna();
|
||||
var scroll = zjisti_scroll();
|
||||
|
||||
var okno_rozmery = {
|
||||
levy: scroll.x,
|
||||
horni: scroll.y,
|
||||
pravy: scroll.x + velikost_okna.x,
|
||||
dolni: scroll.y + velikost_okna.y
|
||||
};
|
||||
|
||||
// Rozměry stránky nemůžou být menší, než je okno prohlížeče
|
||||
var stranka_rozmery = {
|
||||
levy: 0,
|
||||
horni: 0,
|
||||
pravy: Math.max( stranka.offsetWidth, okno_rozmery.pravy ),
|
||||
dolni: Math.max( stranka.offsetHeight, okno_rozmery.dolni )
|
||||
};
|
||||
|
||||
ladici_vypis(LADENI, "zjisti_rozmery", okno_rozmery, "rozměry okna");
|
||||
ladici_vypis(LADENI, "zjisti_rozmery", stranka_rozmery, "rozměry stránky");
|
||||
|
||||
return {
|
||||
okno: pridej_okraj( okno_rozmery, okraj ),
|
||||
stranka: pridej_okraj( stranka_rozmery, okraj )
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - inicializace a ovládání okna pro uložení a export
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro ovládání vstupu a výstupu ~=========================
|
||||
|
||||
// Typ okna
|
||||
data.ukladani.typ = new Object();
|
||||
data.ukladani.typ.NORMALNI = 0;
|
||||
data.ukladani.typ.KOMENTARE = 2;
|
||||
|
||||
// Zobrazení okna podle typu dat. Vstupní data se očekávají ve formátu
|
||||
// unescape(), tedy tak, jak mají být zobrazena
|
||||
data.ukladani.zobraz_v_okne = function (typ, hlavicka, popis, data, pocet_radek)
|
||||
{
|
||||
// Nové okno
|
||||
var w = window.open( "", "", "directories=no,hotkeys=no,"+
|
||||
"location=no,menubar=no,personalbar=no,resizable=yes,scrollbars=yes,"+
|
||||
"status=no,toolbar=no,width=550,height=480" );
|
||||
|
||||
// Zapiš hlavičku
|
||||
w.document.write(
|
||||
'<?xml version="1.0" encoding="utf-8"?>' +
|
||||
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ' +
|
||||
'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' +
|
||||
'<html xmlns="http://www.w3.org/1999/xhtml">' +
|
||||
'<head><title>Robot Karel: ' + hlavicka + '</title>' +
|
||||
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' +
|
||||
'<meta http-equiv="Content-Language" content="cs" />' +
|
||||
'<meta name="Description" content="Robot Karel: ' + hlavicka + '" />' +
|
||||
'<meta name="Author" content="Oldřich Jedlička" />' +
|
||||
'<link href="favicon.ico" rel="icon" />' +
|
||||
'<link href="favicon.ico" rel="shortcut icon" />' +
|
||||
'<style type="text/css">' +
|
||||
'body {' +
|
||||
' font-family: Arial, Helvetica, sans-serif;' +
|
||||
' font-weight: normal;' +
|
||||
' font-size: small;' +
|
||||
' cursor: default;' +
|
||||
' height: auto;' +
|
||||
' margin: 0;' +
|
||||
' padding: 0;' +
|
||||
'}' +
|
||||
'' +
|
||||
'.stranka {' +
|
||||
' z-index: -1;' +
|
||||
' margin: 0;' +
|
||||
' padding: 8px;' +
|
||||
'}' +
|
||||
'' +
|
||||
'.obsah {' +
|
||||
' padding: 10px;' +
|
||||
' border: 1px solid;' +
|
||||
' border-top-color: rgb(90%, 90%, 90%);' +
|
||||
' border-left-color: rgb(90%, 90%, 90%);' +
|
||||
' border-right-color: rgb(40%, 40%, 40%);' +
|
||||
' border-bottom-color: rgb(40%, 40%, 40%);' +
|
||||
' background-color: rgb(75%, 75%, 75%);' +
|
||||
'}' +
|
||||
'' +
|
||||
'p {' +
|
||||
' margin-top: 0;' +
|
||||
' margin-bottom: 8px;' +
|
||||
'}' +
|
||||
'' +
|
||||
'form {' +
|
||||
' margin: 0;' +
|
||||
' padding: 0;' +
|
||||
'}' +
|
||||
'' +
|
||||
'#vnitrni-ramec {' +
|
||||
' display: block;' +
|
||||
' width: 100%;' +
|
||||
' height: 100%;' +
|
||||
' margin: 0;' +
|
||||
' padding: 0;' +
|
||||
' border: 0;' +
|
||||
' background-color: rgb(50%, 90%, 50%);' +
|
||||
'}' +
|
||||
'' +
|
||||
'#ramecek {' +
|
||||
' width: 100%;' +
|
||||
' font-size: 12px;' +
|
||||
' height: ' + (pocet_radek * 2) + 'ex;' +
|
||||
' border: 1px solid;' +
|
||||
' border-top-color: rgb(40%, 40%, 40%);' +
|
||||
' border-left-color: rgb(40%, 40%, 40%);' +
|
||||
' border-bottom-color: rgb(90%, 90%, 90%);' +
|
||||
' border-right-color: rgb(90%, 90%, 90%);' +
|
||||
' padding: 0;' +
|
||||
' margin: 0;' +
|
||||
'}' +
|
||||
'</style>' );
|
||||
|
||||
this.zapis_zmen_komentare( w.document, data );
|
||||
|
||||
w.document.write(
|
||||
'</head>' +
|
||||
'<body>'+
|
||||
'<div class="stranka">' + // Stránka
|
||||
'<div class="obsah">' +
|
||||
popis +
|
||||
'<form action="#">' );
|
||||
|
||||
if ( typ == this.typ.KOMENTARE ) {
|
||||
w.document.write(
|
||||
'<p>\n' +
|
||||
'<input type="radio" name="komentare" id="zobraz-vse" ' +
|
||||
'alt="Zobrazit vše" checked="checked" ' +
|
||||
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
|
||||
'<label for="zobraz-vse">Zobrazit vše</label>\n' +
|
||||
'<input type="radio" name="komentare" id="skryj-komentare" ' +
|
||||
'alt="Skrýt komentáře" '+
|
||||
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
|
||||
'<label for="skryj-komentare">Skrýt komentáře</label>\n' +
|
||||
'<input type="radio" name="komentare" id="skryj-vse" ' +
|
||||
'alt="Skrýt komentáře i prázdné řádky" ' +
|
||||
'onclick="zmen_komentare();" onkeyup="zmen_komentare();" />\n' +
|
||||
'<label for="skryj-vse">Skrýt komentáře i prázdné řádky</label>\n' +
|
||||
'</p>' );
|
||||
}
|
||||
|
||||
w.document.write(
|
||||
'<div id="ramecek"></div>' +
|
||||
'</form>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</body>' +
|
||||
'</html>'
|
||||
);
|
||||
|
||||
w.document.close();
|
||||
|
||||
var obsah = w.document.createElement('iframe');
|
||||
obsah.setAttribute("id", "vnitrni-ramec");
|
||||
w.document.getElementById("ramecek").appendChild(obsah);
|
||||
|
||||
obsah.contentWindow.document.open('text/html', 'replace');
|
||||
obsah.contentWindow.document.write(
|
||||
'<?xml version="1.0" encoding="utf-8"?>' +
|
||||
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ' +
|
||||
'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">' +
|
||||
'<html xmlns="http://www.w3.org/1999/xhtml">' +
|
||||
'<head><title>Robot Karel: ' + hlavicka + '</title>' +
|
||||
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' +
|
||||
'<meta http-equiv="Content-Language" content="cs" />' +
|
||||
'<meta name="Description" content="Robot Karel: ' + hlavicka + '" />' +
|
||||
'<meta name="Author" content="Oldřich Jedlička" />' +
|
||||
'<link href="favicon.ico" rel="icon" />' +
|
||||
'<link href="favicon.ico" rel="shortcut icon" />' +
|
||||
'<style type="text/css">' +
|
||||
'html {' +
|
||||
' height: 100%;' +
|
||||
'}' +
|
||||
'' +
|
||||
'body {' +
|
||||
' font-family: Arial, Helvetica, sans-serif;' +
|
||||
' font-weight: normal;' +
|
||||
' font-size: small;' +
|
||||
' height: 100%;' +
|
||||
' cursor: default;' +
|
||||
' margin: 0;' +
|
||||
' padding: 0;' +
|
||||
'}' +
|
||||
'' +
|
||||
'#zobrazene {' +
|
||||
' border: 0px;' +
|
||||
' margin: 0;' +
|
||||
' padding: 0;' +
|
||||
' width: 100%;' +
|
||||
' height: 100%;' +
|
||||
' font-size: 12px;' +
|
||||
' white-space: pre-wrap;' +
|
||||
' white-space: -moz-pre-wrap !important;' +
|
||||
' white-space: -pre-wrap;' +
|
||||
' white-space: -o-pre-wrap;' +
|
||||
' word-wrap: break-word;' +
|
||||
' background-color: rgb(50%, 90%, 50%);' +
|
||||
'}' +
|
||||
'</style>' +
|
||||
'</head>' +
|
||||
'<body>' +
|
||||
'<pre id="zobrazene">' +
|
||||
'</pre>' +
|
||||
'</body>' +
|
||||
'</html>'
|
||||
);
|
||||
|
||||
obsah.contentWindow.document.close();
|
||||
|
||||
w.zmen_komentare();
|
||||
w.focus();
|
||||
}
|
||||
|
||||
// Zobrazení s komentáři, nebo bez nich
|
||||
data.ukladani.zapis_zmen_komentare = function (d, text) {
|
||||
var puvodni_obsah = escape(text);
|
||||
var bez_komentaru = puvodni_obsah.replace(
|
||||
/%3B([^%]|%(?!0A))*/g, "" );
|
||||
bez_komentaru = bez_komentaru.replace(
|
||||
/^(%09|%0A|%0D|%20)+/g, "" );
|
||||
bez_komentaru = bez_komentaru.replace(
|
||||
/%0A((%09|%0A|%0D|%20)*%0A)+((%09|%0A|%0D|%20)*%0A)/g, "%0A$3" );
|
||||
bez_komentaru = bez_komentaru.replace(
|
||||
/%0A+$/g, "" );
|
||||
var beze_vseho = bez_komentaru.replace(
|
||||
/%0A(%20)+%0A/g, "%0A" );
|
||||
|
||||
d.write(
|
||||
'<script type="text/javascript" charset="utf-8">' );
|
||||
|
||||
d.write('puvodni_obsah="' + puvodni_obsah + '";' );
|
||||
d.write('bez_komentaru="' + bez_komentaru + '";' );
|
||||
d.write('beze_vseho="' + beze_vseho + '";' );
|
||||
|
||||
d.write(
|
||||
'function nastav_text(element, text) {' +
|
||||
' if ( (element.firstChild &&' +
|
||||
' (( typeof(Text) != "undefined" && element.firstChild instanceof Text ) ||' +
|
||||
' element.firstChild.splitText' +
|
||||
' ))' +
|
||||
' ) {' +
|
||||
' if ( text == "" ) {' +
|
||||
' element.removeChild(element.firstChild);' +
|
||||
' } else {' +
|
||||
' element.firstChild.nodeValue = text;' +
|
||||
' }' +
|
||||
' } else {' +
|
||||
' if ( text != "" ) {' +
|
||||
' element.insertBefore(document.createTextNode(text), element.firstChild);' +
|
||||
' }' +
|
||||
' }' +
|
||||
'}' );
|
||||
|
||||
d.write(
|
||||
'function zmen_komentare() {' +
|
||||
' var zobraz_vse = document.getElementById("zobraz-vse");' +
|
||||
' var skryj_komentare = document.getElementById("skryj-komentare");' +
|
||||
' var skryj_vse = document.getElementById("skryj-vse");' +
|
||||
' var zobrazene = document.getElementById("vnitrni-ramec").contentWindow.document.getElementById("zobrazene");' +
|
||||
' if ( zobrazene && zobraz_vse && skryj_komentare && skryj_vse ) {' +
|
||||
' if ( zobraz_vse.checked ' +
|
||||
' || ( !skryj_komentare.checked && !skryj_vse.checked ) ) {'+
|
||||
' nastav_text(zobrazene, unescape(puvodni_obsah));' +
|
||||
' } else if ( skryj_komentare.checked ) {' +
|
||||
' nastav_text(zobrazene, unescape(bez_komentaru));' +
|
||||
' } else if ( skryj_vse.checked ) {' +
|
||||
' nastav_text(zobrazene, unescape(beze_vseho));' +
|
||||
' }' +
|
||||
' } else {' +
|
||||
' nastav_text(zobrazene, unescape(puvodni_obsah));' +
|
||||
' }' +
|
||||
'}' );
|
||||
|
||||
d.write(
|
||||
'</script>' );
|
||||
|
||||
}
|
||||
@@ -0,0 +1,420 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - ovládání editoru
|
||||
|
||||
// POZNÁMKA: Řetězec načtený z příkazového pole je vnitřně udržován ve formě
|
||||
// escape(), protože Konqueror (KDE JavaScript) neumí pracovat s Unicode.
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální nastavení ~====================================================
|
||||
|
||||
// Ukládat, nebo neukládat syntakticky chybné příkazy?
|
||||
nastaveni.ukladat_syntakticky_chybne = true;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Editor
|
||||
editor = new Object();
|
||||
|
||||
// Panel nástrojů
|
||||
editor.nastroje = new Array(
|
||||
[ "novy", "tip-novy", "Nový příkaz", "Vytvoř nový příkaz" ],
|
||||
null,
|
||||
[ "ulozit", "tip-ulozit-prikaz", "Ulož příkaz", "Ulož příkaz do slovníku" ],
|
||||
[ "ulozit-jako", "tip-ulozit-jako", "Ulož příkaz nově", "Ulož příkaz pod novým jménem" ]
|
||||
);
|
||||
editor.nastroje.id_prefix = "editor-";
|
||||
editor.nastroje.mys = "editor.mys_nastroje";
|
||||
|
||||
// Myš nad nástroji
|
||||
editor.mys_nastroje = new Mys(new Tooltip());
|
||||
|
||||
// Zobrazený příkaz včetně textového obsahu (pro účely zjištění změny)
|
||||
editor.zobrazeny = { prikaz: null, obsah: null, zmeneny: false };
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro práci se slovníkem ~================================
|
||||
|
||||
editor.mys_nastroje.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
editor.mys_nastroje.prekresli_stav = function(nastroj, detail, zvyraznen,
|
||||
stisknut, vybran)
|
||||
{
|
||||
tvoric.zvyraznovac( editor.nastroje.id_prefix+nastroj, zvyraznen, stisknut,
|
||||
vybran);
|
||||
}
|
||||
|
||||
editor.mys_nastroje.vyber = function(nastroj, detail)
|
||||
{
|
||||
switch ( nastroj ) {
|
||||
case "novy":
|
||||
editor.prikaz_novy();
|
||||
break;
|
||||
case "ulozit":
|
||||
case "ulozit-jako":
|
||||
editor.prikaz_uloz( (nastroj == "ulozit-jako") );
|
||||
break;
|
||||
default:
|
||||
ladici_vypis(CHYBA, "editor.mys_nastroje.vyber", nastroj,
|
||||
"vybrán neznámý příkaz");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
editor.mys_nastroje.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
tvoric.obnov_tooltip( tooltip, detail.ikona, detail.nadpis, detail.popis );
|
||||
}
|
||||
|
||||
// Zruš ukazatel změny příkazu
|
||||
editor.zrus_zmenu = function()
|
||||
{
|
||||
nastav_text(document.getElementById('zmeneny-prikaz'), '');
|
||||
this.zobrazeny.zmeneny = false;
|
||||
}
|
||||
|
||||
// Editovaný text s upravenými konci řádku
|
||||
editor.editovany_text = function (text)
|
||||
{
|
||||
var element = document.getElementById('editace');
|
||||
if ( text ) {
|
||||
element.value = unescape(text);
|
||||
} else {
|
||||
// Konqueror neumí správně nahrazovat, proto řetězec zpracováváme v escape
|
||||
// módu
|
||||
var obsah = escape(element.value);
|
||||
return obsah.replace(/%0D(%0A)?/g, "%0A");
|
||||
}
|
||||
}
|
||||
|
||||
// Nastaví jméno zobrazeného příkazu
|
||||
editor.zobrazene_jmeno = function (text)
|
||||
{
|
||||
nastav_text(document.getElementById('zobrazeny-prikaz'),
|
||||
text);
|
||||
}
|
||||
|
||||
// Nastav (obnov) ukazatel změny příkazu
|
||||
editor.nastav_zmenu = function ()
|
||||
{
|
||||
if ( this.zobrazeny.obsah != this.editovany_text() ) {
|
||||
nastav_text(document.getElementById('zmeneny-prikaz'), '+');
|
||||
this.zobrazeny.zmeneny = true;
|
||||
} else {
|
||||
this.zrus_zmenu();
|
||||
}
|
||||
return this.zobrazeny.zmeneny;
|
||||
}
|
||||
|
||||
// Kontrola změny příkazu a uložení změn. Vrací true, pokud se může pokračovat
|
||||
editor.kontrola_zmeny = function ()
|
||||
{
|
||||
if ( this.nastav_zmenu() ) {
|
||||
var jmeno = "Nový příkaz";
|
||||
if ( this.zobrazeny.prikaz ) {
|
||||
jmeno = "Zobrazený příkaz " + this.zobrazeny.prikaz.jmeno;
|
||||
}
|
||||
var uzivatel_chce = window.confirm( jmeno + " byl změněn.\n\nPřejete si ho uložit?\n" +
|
||||
"(OK=Ano, Storno=Ne)" );
|
||||
if ( uzivatel_chce ) {
|
||||
return editor.prikaz_uloz();
|
||||
} else {
|
||||
var uzivatel_chce = window.confirm( jmeno +
|
||||
" nebyl uložen. Přesto pokračovat?" );
|
||||
if ( !uzivatel_chce ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Formátování chyb ~======================================================
|
||||
|
||||
// Zobrazení chyby při ukládání příkazu
|
||||
editor.formatuj_chybu_ukladani = function (text, uloz_nove, nove_jmeno,
|
||||
cislo_radky, telo, ulozit)
|
||||
{
|
||||
var text_radky = "";
|
||||
var prikaz_radky = "";
|
||||
var varovani = "";
|
||||
if ( cislo_radky != undefined && cislo_radky != null && cislo_radky >= 0 ) {
|
||||
text_radky = " na řádce " + (cislo_radky+1);
|
||||
if ( telo && cislo_radky < telo.length ) {
|
||||
prikaz_radky = ": " +
|
||||
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
|
||||
}
|
||||
}
|
||||
if ( !ulozit ) {
|
||||
varovani = "\n\nZměny příkazu nebyly uloženy.";
|
||||
}
|
||||
if ( nove_jmeno ) {
|
||||
return "Ukládaný příkaz " + nove_jmeno +
|
||||
" má chybu" + text_radky + prikaz_radky + ".\n" + text + varovani;
|
||||
} else if ( uloz_nove && this.zobrazeny.prikaz ) {
|
||||
return "Zobrazený příkaz " + this.zobrazeny.prikaz.jmeno +
|
||||
" má chybu" + text_radky + prikaz_radky + ".\n" + text + varovani;
|
||||
} else {
|
||||
return "Ukládaný příkaz má" + text_radky + " chybu" + prikaz_radky +
|
||||
".\n" + text + varovani;
|
||||
}
|
||||
}
|
||||
|
||||
// Zobrazení chyby při zobrazení příkazu
|
||||
editor.formatuj_chybu_zobrazeni = function (text, jmeno, cislo_radky, telo)
|
||||
{
|
||||
var text_radky = "";
|
||||
var prikaz_radky = "";
|
||||
if ( cislo_radky != undefined && cislo_radky != null ) {
|
||||
text_radky = " na řádce " + (cislo_radky+1);
|
||||
if ( telo && cislo_radky < telo.length ) {
|
||||
prikaz_radky = ": " +
|
||||
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
|
||||
}
|
||||
}
|
||||
return "Zobrazovaný příkaz " + jmeno +
|
||||
" má chybu" + text_radky + prikaz_radky + ".\n" + text;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Příkazy editace ~=======================================================
|
||||
|
||||
// Nový příkaz
|
||||
editor.prikaz_novy = function (bez_kontroly)
|
||||
{
|
||||
if ( !bez_kontroly && !this.kontrola_zmeny() ) return;
|
||||
var jmeno;
|
||||
var i = 1;
|
||||
do {
|
||||
jmeno = "NOVÝ PŘÍKAZ";
|
||||
if ( i > 1 ) jmeno += " "+i;
|
||||
for ( var j = prikazy.seznam.length-1;
|
||||
j >= 0 && !prikazy.seznam[j].systemovy; j-- ) {
|
||||
if ( jmeno == prikazy.seznam[j].jmeno ) break;
|
||||
}
|
||||
if ( j < 0 || j >= 0 && prikazy.seznam[j].systemovy ) break;
|
||||
i++;
|
||||
} while ( true );
|
||||
|
||||
// Struktura nového příkazu pro zformátování. Zformátování je nutné, protože
|
||||
// se obsah uchovává ve formě escape()
|
||||
var prikaz = { jmeno: jmeno };
|
||||
prikaz.telo = [ [ prikazy.NAZEV, prikaz ], [ prikazy.KONEC ] ];
|
||||
var obsah = new Obsah();
|
||||
var vysledek = prikazy.formatovac.zformatuj_prikaz(prikaz, obsah);
|
||||
|
||||
this.zobrazene_jmeno(prikazy.zadny_prikaz);
|
||||
this.zobrazeny.prikaz = null;
|
||||
this.zobrazeny.obsah = obsah.obsah();
|
||||
this.editovany_text( this.zobrazeny.obsah );
|
||||
this.zrus_zmenu();
|
||||
}
|
||||
|
||||
// Zkontroluj, jestli se nepřepisuje nějaký příkaz. Vrací false, pokud se nemá
|
||||
// přepisovat; true, pokud se normálně pokračuje; nebo příkaz pro smazání, pokud
|
||||
// se přepisuje
|
||||
editor.kontrola_prepsani = function (uloz_nove, novy_prikaz)
|
||||
{
|
||||
var smaz_prikaz;
|
||||
for ( var i = prikazy.seznam.length-1; i >= 0; i-- ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( prikaz.zobrazit ) {
|
||||
if ( prikaz.jmeno == novy_prikaz.jmeno
|
||||
&& this.zobrazeny.prikaz != prikaz ) {
|
||||
if ( !window.confirm("Opravdu má být přepsán příkaz " +
|
||||
prikaz.jmeno + "?") ) {
|
||||
return false;
|
||||
} else {
|
||||
if ( !uloz_nove && this.zobrazeny.prikaz ) {
|
||||
// Po změně musíme smazat původní příkaz
|
||||
smaz_prikaz = this.zobrazeny.prikaz;
|
||||
this.zobrazeny.prikaz = prikaz;
|
||||
return smaz_prikaz;
|
||||
} else {
|
||||
this.zobrazeny.prikaz = prikaz;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Proveď uložení příkazu
|
||||
editor.proved_ulozeni = function (uloz_nove, novy_prikaz, obsah)
|
||||
{
|
||||
if ( uloz_nove || !this.zobrazeny.prikaz ) {
|
||||
prikazy.pridej_novy(novy_prikaz);
|
||||
} else {
|
||||
prikazy.zmen_prikaz(this.zobrazeny.prikaz, novy_prikaz);
|
||||
}
|
||||
|
||||
this.zobrazeny.obsah = obsah;
|
||||
this.zobrazeny.prikaz = novy_prikaz;
|
||||
this.zobrazene_jmeno(novy_prikaz.jmeno);
|
||||
}
|
||||
|
||||
// Ulož příkaz. Vrací true, pokud se může pokračovat
|
||||
editor.prikaz_uloz = function (uloz_nove)
|
||||
{
|
||||
if ( !prikazy.test_spusteni() ) return false;
|
||||
var text = this.editovany_text();
|
||||
var vysledek = new Vysledek();
|
||||
|
||||
var uloz_nove_prikaz = (!uloz_nove ? this.zobrazeny.prikaz : undefined);
|
||||
vysledek.nastav( prikazy.rozpoznavac.rozpoznej( text, uloz_nove_prikaz ) );
|
||||
|
||||
var novy_prikaz = vysledek.hodnota.prikaz;
|
||||
var obsah = vysledek.hodnota.obsah;
|
||||
var cislo_radky = vysledek.hodnota.cislo_radky;
|
||||
|
||||
var ulozit = false;
|
||||
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
var novy_obsah = new Obsah();
|
||||
vysledek.nastav(
|
||||
prikazy.formatovac.zformatuj_prikaz(novy_prikaz, novy_obsah) );
|
||||
obsah = novy_obsah.obsah();
|
||||
cislo_radky = vysledek.hodnota.cislo_radky;
|
||||
|
||||
// Uložit příkaz, stejně jako ve verzi 1.2, nebo neuložit?
|
||||
if ( nastaveni.ukladat_syntakticky_chybne ) {
|
||||
ulozit = true;
|
||||
} else {
|
||||
ulozit = !vysledek.byla_chyba();
|
||||
}
|
||||
}
|
||||
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return editor.formatuj_chybu_ukladani(text, uloz_nove, novy_prikaz.jmeno,
|
||||
cislo_radky, novy_prikaz.telo,
|
||||
ulozit);
|
||||
}
|
||||
|
||||
// Obnov obsah editovacího pole
|
||||
if ( obsah != this.editovany_text() ) {
|
||||
this.editovany_text( obsah );
|
||||
}
|
||||
|
||||
// Kontrola přepsání zobrazeného příkazu
|
||||
if ( novy_prikaz.jmeno ) {
|
||||
if ( uloz_nove && this.zobrazeny.prikaz
|
||||
&& this.zobrazeny.prikaz.jmeno == novy_prikaz.jmeno ) {
|
||||
uloz_nove = false;
|
||||
}
|
||||
}
|
||||
|
||||
vysledek.zobraz_chybu();
|
||||
|
||||
if ( ulozit ) {
|
||||
var smaz_prikaz;
|
||||
var vyber_prikaz;
|
||||
|
||||
// Kontrola přepsání
|
||||
smaz_prikaz = this.kontrola_prepsani(uloz_nove, novy_prikaz);
|
||||
if ( !smaz_prikaz ) {
|
||||
ulozit = false;
|
||||
}
|
||||
|
||||
// Zjisti, jestli se má udržet nějaký výběr
|
||||
if ( ulozit && !uloz_nove && smaz_prikaz instanceof Object
|
||||
&& prikazy.vybrany_prikaz() == smaz_prikaz.jmeno ) {
|
||||
vyber_prikaz = novy_prikaz.jmeno;
|
||||
}
|
||||
|
||||
// Smaž příkaz, pokud je co smazat
|
||||
if ( smaz_prikaz instanceof Object ) {
|
||||
prikazy.nahrad_telo( smaz_prikaz, novy_prikaz );
|
||||
prikazy.proved_smazani( smaz_prikaz );
|
||||
}
|
||||
|
||||
// Ulož nový příkaz
|
||||
if ( ulozit ) {
|
||||
this.proved_ulozeni( uloz_nove, novy_prikaz, obsah );
|
||||
}
|
||||
|
||||
// Obnov výběr příkazu
|
||||
if ( vyber_prikaz && vyber_prikaz != prikazy.vybrany_prikaz() ) {
|
||||
prikazy.vyber_prikaz(vyber_prikaz);
|
||||
}
|
||||
} // end if ( !chyba.byla_chyba() )
|
||||
|
||||
// Indikuj změnu obsahu a vrať výsledek - true, pokud bylo uloženo
|
||||
return !this.nastav_zmenu();
|
||||
}
|
||||
|
||||
// Příkaz byl doplněn, obnov zobrazení
|
||||
editor.prikaz_upraven = function (prikaz)
|
||||
{
|
||||
if ( this.zobrazeny.prikaz == prikaz ) {
|
||||
var obsah = new Obsah();
|
||||
prikazy.formatovac.zformatuj_prikaz( this.zobrazeny.prikaz, obsah );
|
||||
this.zobrazeny.obsah = obsah.obsah();
|
||||
if ( this.nastav_zmenu() ) {
|
||||
// Pokud nebyl příkaz změněný, zobraz nový obsah
|
||||
this.editovany_text( obsah.obsah() );
|
||||
this.nastav_zmenu();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Zobrazit vybraný příkaz
|
||||
editor.zobraz_vybrany_prikaz = function ()
|
||||
{
|
||||
if ( !this.kontrola_zmeny() ) return;
|
||||
|
||||
// Kontrola vybraného příkazu je nutná i zde, protože se výběr mohl
|
||||
// uložením změnit
|
||||
var jmeno = prikazy.vybrany_prikaz();
|
||||
if ( !(jmeno && prikazy.prikaz[jmeno]) ) {
|
||||
alert( "Není vybrán žádný příkaz.\n\n" +
|
||||
"Příkaz vyberte klepnutím myši." );
|
||||
return;
|
||||
}
|
||||
|
||||
var prikaz = prikazy.prikaz[jmeno];
|
||||
|
||||
var vysledek = new Vysledek();
|
||||
var obsah = new Obsah();
|
||||
var chyba = new Chyba();
|
||||
vysledek.nastav( prikazy.formatovac.zformatuj_prikaz(prikaz, obsah) );
|
||||
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return editor.formatuj_chybu_zobrazeni(text, prikaz.jmeno,
|
||||
vysledek.hodnota.cislo_radky,
|
||||
prikaz.telo);
|
||||
}
|
||||
|
||||
this.zobrazeny.prikaz = prikaz;
|
||||
this.zobrazene_jmeno(prikaz.jmeno);
|
||||
this.zobrazeny.obsah = obsah.obsah();
|
||||
this.editovany_text( obsah.obsah() );
|
||||
this.nastav_zmenu();
|
||||
|
||||
vysledek.zobraz_chybu();
|
||||
}
|
||||
|
||||
// Příkaz byl smazán
|
||||
editor.smaz_prikaz = function (prikaz)
|
||||
{
|
||||
if ( this.zobrazeny.prikaz == prikaz ) {
|
||||
this.zobrazeny.prikaz = null;
|
||||
this.zobrazeny.obsah = null;
|
||||
this.zobrazene_jmeno(prikazy.zadny_prikaz);
|
||||
this.nastav_zmenu();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,643 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - příkazy a ovládání slovníku
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální nastavení ~====================================================
|
||||
|
||||
// Při smazání slovníku: zachovat zobrazený příkaz, nebo nezachovat?
|
||||
nastaveni.zachovej_zobrazeny_prikaz = false;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Počet systémových příkazů
|
||||
prikazy.pocet_systemovych = prikazy.seznam.length;
|
||||
|
||||
// Tooltip
|
||||
prikazy.tooltip = {
|
||||
spustit: "Proveď příkaz",
|
||||
zastavit: "Zastav provádění příkazu"
|
||||
};
|
||||
|
||||
// Prefix pro ID příkazů
|
||||
prikazy.id_prefix = "příkaz ";
|
||||
|
||||
// Prefix pro název příkazů
|
||||
prikazy.nazev_prefix = "název ";
|
||||
|
||||
// Prefix pro celý příkaz
|
||||
prikazy.prikaz_prefix = "celý příkaz ";
|
||||
|
||||
// Zobrazený název, když není nic vybraného
|
||||
prikazy.zadny_prikaz = "(žádný)";
|
||||
|
||||
// Panel nástrojů
|
||||
prikazy.nastroje = new Array(
|
||||
[ "zobraz", "tip-zobraz", "Ukaž příkaz", "Ukaž vybraný příkaz" ],
|
||||
[ "smaz", "tip-smaz-prikaz", "Smaž příkaz", "Vymaž vybraný příkaz z paměti" ],
|
||||
null,
|
||||
[ "smaz-vse", "tip-smaz-vse", "Reset paměti", "Vymaž všechny naučené příkazy z paměti" ],
|
||||
null,
|
||||
[ "nacist", "tip-nacist", "Načti slovník", "Načti uložený slovník (i město)" ],
|
||||
[ "ulozit", "tip-ulozit", "Ulož slovník", "Ulož slovník pro budoucí použití. " +
|
||||
"Při ukládání se automaticky použije nejstarší formát vhodný pro uložení" ],
|
||||
null,
|
||||
[ "exportovat-12", "tip-exportovat-12", "Ulož slovník",
|
||||
"Ulož slovník ve starším formátu rozpoznaném starším Karlem 1.2. "+
|
||||
"Komentáře a prázdné řádky nebudou zachovány. Při ukládání se " +
|
||||
"automaticky použije nejstarší formát vhodný pro uložení" ],
|
||||
[ "exportovat-k99", "tip-exportovat-k99", "Exportuj slovník",
|
||||
"Ulož slovník do formátu Visual Karel 99" ]
|
||||
);
|
||||
prikazy.nastroje.id_prefix = "slovnik-";
|
||||
prikazy.nastroje.mys = "prikazy.mys_nastroje";
|
||||
|
||||
// Myš nad tlačítkem
|
||||
prikazy.mys_tlacitko = new Mys(new Tooltip());
|
||||
|
||||
// Myš nad příkazem
|
||||
prikazy.mys_prikaz = new Mys();
|
||||
|
||||
// Myš nad nástroji
|
||||
prikazy.mys_nastroje = new Mys(new Tooltip());
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro práci se slovníkem ~================================
|
||||
|
||||
// Kontrola prázdného slovníku
|
||||
prikazy.je_slovnik_prazdny = function ()
|
||||
{
|
||||
return ( prikazy.seznam[prikazy.seznam.length-1].systemovy );
|
||||
}
|
||||
|
||||
// Zobraz nový příkaz v seznamu příkazů
|
||||
prikazy.pridej = function (prikaz)
|
||||
{
|
||||
var id = prikazy.id_prefix+prikaz.jmeno;
|
||||
var nazev = prikazy.nazev_prefix+prikaz.jmeno;
|
||||
var prikaz_id = prikazy.prikaz_prefix+prikaz.jmeno;
|
||||
|
||||
// Elementy
|
||||
var element = document.getElementById('zobrazene');
|
||||
var element_prikaz = document.createElement('DIV');
|
||||
var element_nazev = element_prikaz.cloneNode(false);
|
||||
var element_nazev_text = document.createElement('DIV');
|
||||
|
||||
// Text
|
||||
element_nazev_text.appendChild( document.createTextNode(prikaz.jmeno) );
|
||||
|
||||
// Události
|
||||
tvoric.nastav_udalosti_mysi( element_nazev, "prikazy.mys_prikaz",
|
||||
'\''+nazev+'\'', '\''+prikaz.jmeno+'\'' );
|
||||
|
||||
// Styly
|
||||
element_prikaz.className = "prikaz";
|
||||
element_nazev.className = "nazev";
|
||||
element_nazev.id = nazev;
|
||||
element_nazev_text.className = "nazev-text";
|
||||
element_prikaz.id = prikaz_id;
|
||||
|
||||
// Tlačítko
|
||||
var element_tlacitko = tvoric.vytvor_tlacitko( false, id,
|
||||
"prikazy.mys_tlacitko", '\''+id+'\'', '\''+prikaz.jmeno+'\'' );
|
||||
|
||||
// Tvar
|
||||
element_nazev.appendChild( element_nazev_text );
|
||||
|
||||
element_prikaz.appendChild( element_tlacitko );
|
||||
element_prikaz.appendChild( element_nazev );
|
||||
|
||||
// Zařazení do HTML
|
||||
element.appendChild( element_prikaz );
|
||||
}
|
||||
|
||||
// Smaž příkaz ze zobrazeného seznamu příkazů
|
||||
prikazy.zrus = function (prikaz)
|
||||
{
|
||||
var prikaz_id = prikazy.prikaz_prefix+prikaz.jmeno;
|
||||
var element_prikaz = document.getElementById( prikaz_id );
|
||||
element_prikaz.parentNode.removeChild(element_prikaz);
|
||||
}
|
||||
|
||||
// Inicializace nového příkazu
|
||||
prikazy.nastav_novy = function (prikaz)
|
||||
{
|
||||
prikaz.zobrazit = true;
|
||||
prikaz.spust = prikazy.jadro.UZIVATELSKY;
|
||||
prikaz.kompatibilita = prikazy.min_VERZE_10;
|
||||
prikaz.verze_ulozeni = prikazy.min_VERZE_10;
|
||||
}
|
||||
|
||||
// Přidej nový příkaz a obnov zobrazený seznam
|
||||
prikazy.pridej_novy = function (prikaz)
|
||||
{
|
||||
if ( ! (prikaz instanceof Object) ) {
|
||||
ladici_vypis( DETAIL, "prikazy.pridej_novy", "přidávám nový příkaz " +
|
||||
prikaz );
|
||||
prikaz = { jmeno: prikaz, telo: [ [ prikazy.KONEC ]] };
|
||||
prikaz.telo.unshift( [ prikazy.NAZEV, prikaz ] );
|
||||
} else {
|
||||
ladici_vypis( DETAIL, "prikazy.pridej_novy", "přidávám nový příkaz " +
|
||||
prikaz.jmeno );
|
||||
}
|
||||
prikazy.nastav_novy(prikaz);
|
||||
prikazy.seznam.push(prikaz);
|
||||
prikazy.prikaz[prikaz.jmeno] = prikaz;
|
||||
prikazy.pridej( prikaz );
|
||||
|
||||
return prikaz;
|
||||
}
|
||||
|
||||
// Změň příkaz v tělech ostatních příkazů. Pokud je novy_prikaz prazdny, smaže
|
||||
// ho z příkazu
|
||||
prikazy.nahrad_telo = function (stary_prikaz, novy_prikaz)
|
||||
{
|
||||
if ( novy_prikaz ) {
|
||||
ladici_vypis( DETAIL, "prikazy.nahrad_telo", "měním výskyt příkazu " +
|
||||
stary_prikaz.jmeno + " na " + novy_prikaz.jmeno );
|
||||
} else {
|
||||
ladici_vypis( DETAIL, "prikazy.nahrad_telo", "mažu výskyt příkazu " +
|
||||
stary_prikaz.jmeno + " ze všech příkazů" );
|
||||
}
|
||||
|
||||
var i = prikazy.seznam.length-1;
|
||||
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
for ( var j = prikaz.telo.length-1; j >= 0; j-- ) {
|
||||
if ( prikaz.telo[j][0] == stary_prikaz ) {
|
||||
if ( novy_prikaz ) {
|
||||
ladici_vypis( LADENI, "prikazy.nahrad_telo", "změna v příkazu " +
|
||||
prikaz.jmeno + " na řádce " + (j+1) );
|
||||
prikaz.telo[j][0] = novy_prikaz;
|
||||
} else {
|
||||
ladici_vypis( LADENI, "prikazy.nahrad_telo", "smazán z příkazu " +
|
||||
prikaz.jmeno + " z řádky " + (j+1) );
|
||||
var pred_prikazem = prikaz.telo.slice(0, j);
|
||||
var po_prikazu = prikaz.telo.slice(j+1);
|
||||
prikaz.telo = pred_prikazem.concat(po_prikazu);
|
||||
}
|
||||
}
|
||||
}
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
// Připrav příkaz na smazání
|
||||
prikazy.dokonci_smazani = function (prikaz)
|
||||
{
|
||||
delete prikaz.telo;
|
||||
}
|
||||
|
||||
// Obnov informaci v seznamu známých příkazů. Pokud není uveden novy_prikaz,
|
||||
// je příkaz smazán
|
||||
prikazy.zmen_seznam = function (stary_prikaz, novy_prikaz)
|
||||
{
|
||||
if ( novy_prikaz ) {
|
||||
ladici_vypis( LADENI, "prikazy.zmen_seznam",
|
||||
"měním v seznamu příkaz " + stary_prikaz.jmeno + " na " +
|
||||
novy_prikaz.jmeno );
|
||||
} else {
|
||||
ladici_vypis( LADENI, "prikazy.zmen_seznam",
|
||||
"mažu ze seznamu příkaz " + stary_prikaz.jmeno );
|
||||
}
|
||||
|
||||
var i;
|
||||
for ( i = prikazy.seznam.length - 1; i >= 0; i-- ) {
|
||||
if ( prikazy.seznam[i] == stary_prikaz ) {
|
||||
if ( novy_prikaz ) {
|
||||
prikazy.seznam[i] = novy_prikaz;
|
||||
} else {
|
||||
prikazy.dokonci_smazani( prikazy.seznam[i] );
|
||||
var pred_prikazem = prikazy.seznam.slice(0, i);
|
||||
var po_prikazu = prikazy.seznam.slice(i+1);
|
||||
prikazy.seznam = pred_prikazem.concat(po_prikazu);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i < 0 ) {
|
||||
ladici_vypis( CHYBA, "prikazy.zmen_seznam", "příkaz " +
|
||||
stary_prikaz.jmeno + " nebyl nalezen v seznamu příkazů" );
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Změň příkaz a obnov zobrazenou informaci
|
||||
prikazy.zmen_prikaz = function (stary_prikaz, novy_prikaz)
|
||||
{
|
||||
if ( stary_prikaz.jmeno == novy_prikaz.jmeno ) {
|
||||
ladici_vypis( DETAIL, "prikazy.zmen_prikaz", "aktualizuji příkaz " +
|
||||
novy_prikaz.jmeno );
|
||||
} else {
|
||||
ladici_vypis( DETAIL, "prikazy.zmen_prikaz", "měním příkaz " +
|
||||
stary_prikaz.jmeno + " na " + novy_prikaz.jmeno );
|
||||
}
|
||||
|
||||
// Obnov seznam známých příkazů
|
||||
if ( !this.zmen_seznam(stary_prikaz, novy_prikaz) ) {
|
||||
ladici_vypis( CHYBA, "prikazy.zmen_prikaz", "starý příkaz " +
|
||||
stary_prikaz.jmeno + " nenalezen v seznamu, raději přidám nový" );
|
||||
prikazy.pridej_novy( novy_prikaz );
|
||||
return;
|
||||
}
|
||||
|
||||
// Atributy nového příkazu
|
||||
prikazy.nastav_novy(novy_prikaz);
|
||||
delete prikazy.prikaz[stary_prikaz.jmeno];
|
||||
prikazy.prikaz[novy_prikaz.jmeno] = novy_prikaz;
|
||||
|
||||
var stary_id = prikazy.id_prefix+stary_prikaz.jmeno;
|
||||
var stary_nazev = prikazy.nazev_prefix+stary_prikaz.jmeno;
|
||||
var novy_id = prikazy.id_prefix+novy_prikaz.jmeno;
|
||||
var novy_nazev = prikazy.nazev_prefix+novy_prikaz.jmeno;
|
||||
var novy_prikaz_id = prikazy.prikaz_prefix+novy_prikaz.jmeno;
|
||||
|
||||
// Zjisti, jestli je co upravovat u tlačítek a zobrazení
|
||||
if ( novy_nazev != stary_nazev || novy_id != stary_id
|
||||
|| stary_prikaz.jmeno != novy_prikaz.jmeno ) {
|
||||
|
||||
var element_nazev = document.getElementById(stary_nazev);
|
||||
var element_ikona = document.getElementById(stary_id);
|
||||
var element_maska = tvoric.maska_tlacitka_z_ikony(element_ikona);
|
||||
var element_prikaz = element_nazev.parentNode;
|
||||
|
||||
// Uprav Id
|
||||
element_nazev.id = novy_nazev;
|
||||
element_ikona.id = novy_id;
|
||||
element_prikaz.id = novy_prikaz_id;
|
||||
|
||||
// Uprav název
|
||||
element_nazev.firstChild.firstChild.nodeValue = novy_prikaz.jmeno;
|
||||
|
||||
// Obnov informaci myši
|
||||
tvoric.nastav_udalosti_mysi( element_nazev, "prikazy.mys_prikaz",
|
||||
'\''+novy_nazev+'\'', '\''+novy_prikaz.jmeno+'\'' );
|
||||
tvoric.nastav_udalosti_mysi( element_maska, "prikazy.mys_tlacitko",
|
||||
'\''+novy_id+'\'', '\''+novy_prikaz.jmeno+'\'' );
|
||||
|
||||
// Informace objektu myši, že proběhlo přejmenování
|
||||
ladici_vypis( LADENI, "prikazy.zmen_prikaz",
|
||||
"měním detaily u názvu příkazu" );
|
||||
prikazy.mys_prikaz.prejmenuj(stary_nazev, novy_nazev, novy_prikaz.jmeno);
|
||||
|
||||
ladici_vypis( LADENI, "prikazy.zmen_prikaz",
|
||||
"měním detaily u tlačítka příkazu" );
|
||||
prikazy.mys_tlacitko.prejmenuj(stary_id, novy_id, novy_prikaz.jmeno);
|
||||
}
|
||||
|
||||
this.nahrad_telo( stary_prikaz, novy_prikaz );
|
||||
prikazy.dokonci_smazani( stary_prikaz );
|
||||
}
|
||||
|
||||
// Smaž příkaz (i z těl příkazů) a obnov zobrazenou informaci
|
||||
prikazy.proved_smazani = function (prikaz)
|
||||
{
|
||||
ladici_vypis( DETAIL, "prikazy.proved_smazani", "mažu příkaz " +
|
||||
prikaz.jmeno );
|
||||
var nazev = prikazy.nazev_prefix+prikaz.jmeno;
|
||||
|
||||
// Informace objektu myši, že proběhlo přejmenování
|
||||
ladici_vypis( LADENI, "prikazy.proved_smazani",
|
||||
"mažu detaily u názvu příkazu" );
|
||||
prikazy.mys_prikaz.smaz(nazev, prikaz.jmeno);
|
||||
|
||||
ladici_vypis( LADENI, "prikazy.proved_smazani",
|
||||
"mažu detaily u tlačítka příkazu" );
|
||||
prikazy.mys_tlacitko.smaz(nazev, prikaz.jmeno);
|
||||
|
||||
// Vymaž příkaz z těl ostatních příkazů
|
||||
this.nahrad_telo( prikaz );
|
||||
|
||||
// Vymaž příkaz ze známých příkazů
|
||||
this.zmen_seznam( prikaz );
|
||||
|
||||
// Smaž příkaz ze zobrazeného seznamu příkazů
|
||||
this.zrus( prikaz );
|
||||
}
|
||||
|
||||
prikazy.obsahuje_prikaz = function (ktery_prikaz)
|
||||
{
|
||||
var seznam = new Array();
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( !prikaz.systemovy && prikaz != ktery_prikaz ) {
|
||||
for ( var j = 0; j < prikaz.telo.length; j++ ) {
|
||||
if ( prikaz.telo[j][0] == ktery_prikaz ) {
|
||||
seznam.push(prikaz.jmeno);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return seznam;
|
||||
}
|
||||
|
||||
prikazy.smaz_prikaz = function (prikaz)
|
||||
{
|
||||
if ( !prikazy.test_spusteni() ) return;
|
||||
var obsahuje = prikazy.obsahuje_prikaz(prikaz);
|
||||
var detail = "";
|
||||
if ( obsahuje.length ) {
|
||||
var detail_prikaz;
|
||||
if ( obsahuje.length == 1 ) {
|
||||
detail_prikaz = "příkazu ";
|
||||
} else {
|
||||
detail_prikaz = "příkazech ";
|
||||
}
|
||||
detail = "\n\nPříkaz je obsažen v " + detail_prikaz + obsahuje.join(", ") +
|
||||
".";
|
||||
}
|
||||
var uzivatel_chce = window.confirm( "Opravdu si přejete smazat příkaz " +
|
||||
prikaz.jmeno + "?" + detail );
|
||||
if ( uzivatel_chce ) {
|
||||
prikazy.proved_smazani(prikaz);
|
||||
editor.smaz_prikaz(prikaz);
|
||||
}
|
||||
}
|
||||
|
||||
// Smaž celý slovník
|
||||
prikazy.smaz_vse = function (bez_kontroly, bez_noveho_prikazu)
|
||||
{
|
||||
if ( !prikazy.test_spusteni() ) return;
|
||||
if ( prikazy.je_slovnik_prazdny() ) {
|
||||
if ( !bez_noveho_prikazu ) {
|
||||
if ( editor.nastav_zmenu() && !nastaveni.zachovej_zobrazeny_prikaz ) {
|
||||
if ( bez_kontroly
|
||||
|| !bez_kontroly && window.confirm( "Slovník je prázdný. " +
|
||||
"Přejete si začít novým příkazem?" ) ) {
|
||||
editor.prikaz_novy(true);
|
||||
}
|
||||
} else {
|
||||
if ( !bez_kontroly ) alert( "Slovník je prázdný." );
|
||||
editor.prikaz_novy(true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ( bez_kontroly || !bez_kontroly
|
||||
&& window.confirm( "Opravdu si přejete smazat všechny příkazy?" ) ) {
|
||||
var i = prikazy.seznam.length-1;
|
||||
while ( i >= 0 && !prikazy.seznam[i].systemovy ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
prikazy.proved_smazani(prikaz);
|
||||
if ( nastaveni.zachovej_zobrazeny_prikaz ) editor.smaz_prikaz(prikaz);
|
||||
i--;
|
||||
}
|
||||
if ( !bez_noveho_prikazu ) {
|
||||
if ( !editor.nastav_zmenu() || !nastaveni.zachovej_zobrazeny_prikaz ) {
|
||||
editor.prikaz_novy(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Obnov ikonu přehrání a tooltip
|
||||
prikazy.obnov_stav = function (probiha)
|
||||
{
|
||||
var element = document.getElementById('zobrazene');
|
||||
if ( probiha ) {
|
||||
element.className = "zastavit";
|
||||
} else {
|
||||
element.className = "spustit";
|
||||
}
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( prikaz.zobrazit ) {
|
||||
var element_ikona = document.getElementById(prikazy.id_prefix+prikaz.jmeno);
|
||||
var element_maska = element_ikona.parentNode.nextSibling;
|
||||
}
|
||||
}
|
||||
prikazy.mys_tlacitko.tooltip.prekresli();
|
||||
}
|
||||
|
||||
// Nahrání nového slovníku
|
||||
prikazy.nahraj_slovnik = function (novy_slovnik)
|
||||
{
|
||||
if ( !novy_slovnik.length ) return;
|
||||
if ( !window.confirm(
|
||||
"Opravdu si přejete nahrát příkazy?\n\n" +
|
||||
"Všechny současné příkazy budou ztraceny. Mám pokračovat?" ) ) return;
|
||||
if ( !prikazy.test_spusteni() ) return;
|
||||
|
||||
prikazy.smaz_vse(true, true);
|
||||
for ( var i = 0; i < novy_slovnik.length; i++ ) {
|
||||
var prikaz = novy_slovnik[i];
|
||||
prikazy.pridej_novy( prikaz );
|
||||
}
|
||||
if ( editor.nastav_zmenu() ) {
|
||||
if ( !nastaveni.zachovej_zobrazeny_prikaz ) {
|
||||
editor.prikaz_novy(true);
|
||||
}
|
||||
} else {
|
||||
editor.prikaz_novy(true);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Práce myši ~============================================================
|
||||
|
||||
prikazy.mys_tlacitko.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
prikazy.mys_tlacitko.prekresli_stav = function(info, detail, zvyraznen,
|
||||
stisknut, vybran)
|
||||
{
|
||||
tvoric.zvyraznovac(info, zvyraznen, stisknut, vybran);
|
||||
}
|
||||
|
||||
prikazy.mys_tlacitko.proved_vyber = function(info, detail)
|
||||
{
|
||||
var vysledek = prikazy.jadro.proved_nebo_zastav(detail);
|
||||
vysledek.zobraz_chybu();
|
||||
return false;
|
||||
}
|
||||
|
||||
prikazy.mys_prikaz.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
prikazy.mys_prikaz.proved_vyber = function(info, detail)
|
||||
{
|
||||
var element = document.getElementById('vybrany-prikaz');
|
||||
element.lastChild.nodeValue = detail;
|
||||
return true;
|
||||
}
|
||||
|
||||
prikazy.mys_prikaz.zrus_vyber = function(info, detail)
|
||||
{
|
||||
var element = document.getElementById('vybrany-prikaz');
|
||||
element.lastChild.nodeValue = prikazy.zadny_prikaz;
|
||||
return true;
|
||||
}
|
||||
|
||||
prikazy.mys_prikaz.smaz_vyber = function(info, detail)
|
||||
{
|
||||
this.zrus_vyber(info, detail);
|
||||
}
|
||||
|
||||
prikazy.mys_prikaz.prekresli_stav = function(info, detail, zvyraznen, stisknut,
|
||||
vybran)
|
||||
{
|
||||
var element = document.getElementById(info);
|
||||
var vybrany = (vybran?"-vybrany":"");
|
||||
var zvyrazneny = (zvyraznen?"-zvyrazneny":"");
|
||||
if ( stisknut ) {
|
||||
element.className = "nazev"+vybrany+"-stisknuty";
|
||||
} else {
|
||||
element.className = "nazev"+vybrany+zvyrazneny;
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.mys_nastroje.proved_zvyrazneni = function(info, detail)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
prikazy.mys_nastroje.prekresli_stav = function(nastroj, detail, zvyraznen,
|
||||
stisknut, vybran)
|
||||
{
|
||||
tvoric.zvyraznovac(prikazy.nastroje.id_prefix+nastroj, zvyraznen, stisknut,
|
||||
vybran);
|
||||
}
|
||||
|
||||
prikazy.mys_nastroje.proved_vyber = function(nastroj, detail)
|
||||
{
|
||||
switch (nastroj) {
|
||||
case "zobraz":
|
||||
case "smaz": {
|
||||
// Kontrola vybraného příkazu
|
||||
var jmeno = prikazy.vybrany_prikaz();
|
||||
if ( jmeno && prikazy.prikaz[jmeno] ) {
|
||||
prikazy.zobraz_nebo_smaz( nastroj, jmeno );
|
||||
} else {
|
||||
alert( "Není vybrán žádný příkaz.\n\n" +
|
||||
"Příkaz vyberte klepnutím myši." );
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "smaz-vse": {
|
||||
prikazy.smaz_vse();
|
||||
break;
|
||||
}
|
||||
case "ulozit":
|
||||
case "exportovat-12":
|
||||
case "exportovat-k99": {
|
||||
if ( editor.kontrola_zmeny() ) {
|
||||
if ( nastroj != "exportovat-k99" ) {
|
||||
data.ukladani.uloz_slovnik(
|
||||
(nastroj == "ulozit"?data.FORMAT_20:data.FORMAT_12) );
|
||||
} else {
|
||||
data.ukladani.export_slovnik_k99();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "nacist": {
|
||||
data.nacitani.nacti();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Zobraz nebo smaž vybraný příkaz
|
||||
prikazy.zobraz_nebo_smaz = function(akce, jmeno)
|
||||
{
|
||||
var prikaz = prikazy.prikaz[jmeno];
|
||||
if ( !prikaz.systemovy ) {
|
||||
if ( akce == "zobraz" ) {
|
||||
editor.zobraz_vybrany_prikaz();
|
||||
} else {
|
||||
prikazy.smaz_prikaz(prikaz);
|
||||
}
|
||||
} else {
|
||||
if ( akce == "zobraz" ) {
|
||||
alert( "Nelze prohližet systémový příkaz." );
|
||||
// TODO: Nápověda k systémovým příkazům?
|
||||
} else {
|
||||
alert( "Nelze smazat systémový příkaz." );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Který příkaz je vybraný
|
||||
prikazy.vybrany_prikaz = function()
|
||||
{
|
||||
return this.mys_prikaz.vybran.detail;
|
||||
}
|
||||
|
||||
// Vyber konkrétní příkaz
|
||||
prikazy.vyber_prikaz = function(nazev)
|
||||
{
|
||||
var prikaz = prikazy.prikaz[nazev];
|
||||
if ( prikaz && prikaz.zobrazit ) {
|
||||
this.mys_prikaz.vyber(prikazy.nazev_prefix+nazev, prikaz.jmeno);
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "prikazy.vyber_prikaz", nazev,
|
||||
"výběr neexistujícího příkazu");
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Tooltipy ~==============================================================
|
||||
|
||||
prikazy.text_tooltipu = function (jmeno)
|
||||
{
|
||||
var tooltip = new Object();
|
||||
if ( prikazy.jadro.probiha() ) {
|
||||
tooltip.nadpis = prikazy.tooltip["zastavit"];
|
||||
} else {
|
||||
tooltip.nadpis = prikazy.tooltip["spustit"]+" "+jmeno;
|
||||
if ( prikazy.prikaz[jmeno] instanceof Object ) {
|
||||
var prikaz = prikazy.prikaz[jmeno];
|
||||
if ( prikaz.tooltip ) {
|
||||
tooltip.popis = prikaz.tooltip;
|
||||
} else if ( prikaz.telo ) {
|
||||
var radka = prikaz.telo[0];
|
||||
if ( radka && radka[0] == prikazy.HLAVICKA_KOMENTAR ) {
|
||||
tooltip.popis = radka[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return tooltip;
|
||||
}
|
||||
|
||||
prikazy.mys_tlacitko.tooltip.muzu_zobrazit = function (info, detail)
|
||||
{
|
||||
return ( prikazy.prikaz[detail] ? true : false );
|
||||
}
|
||||
|
||||
prikazy.mys_tlacitko.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
var obsah = prikazy.text_tooltipu(detail);
|
||||
tvoric.obnov_tooltip(tooltip, "", obsah.nadpis, obsah.popis);
|
||||
}
|
||||
|
||||
prikazy.mys_tlacitko.tooltip.zjisti_rozmery = function (objekt)
|
||||
{
|
||||
var rozmery = zjisti_rozmery(objekt);
|
||||
var element = document.getElementById('zobrazene');
|
||||
if ( element.scrollTop ) {
|
||||
rozmery = posun_y(rozmery, -element.scrollTop);
|
||||
}
|
||||
return rozmery;
|
||||
}
|
||||
|
||||
prikazy.mys_nastroje.tooltip.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
tvoric.obnov_tooltip(tooltip, detail.ikona, detail.nadpis, detail.popis);
|
||||
}
|
||||
@@ -0,0 +1,813 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - vykonávání příkazů
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální nastavení ~====================================================
|
||||
|
||||
// Největší počet příkazů provedených v jedné smyčce
|
||||
nastaveni.maximum_prikazu_smycky = 10;
|
||||
|
||||
// Maximální délka smyčky v milisekundách
|
||||
nastaveni.maximalni_delka_smycky = 25;
|
||||
|
||||
// Prodleva mezi vykonáváním příkazů
|
||||
// nastaveni.prodleva = 500; // Nyní definováno v souboru nastaveni-funkce.js
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Informace a data o příkazech
|
||||
prikazy = new Object();
|
||||
|
||||
// Jádro vykonávající příkazy
|
||||
//
|
||||
// Každá funkce pro jednotlivé příkazy je navržena tak, aby byla schopna jak
|
||||
// vykonat příkaz, tak rozpoznat případné chyby syntaxe. Režim práce je předán
|
||||
// v parametru syntaxe, který při hodnotě true rozhodne pouze o syntaxi a při
|
||||
// hodnotě false vykoná příkaz.
|
||||
prikazy.jadro = new Object();
|
||||
|
||||
// Verzování
|
||||
prikazy.VERZE_10 = 1;
|
||||
prikazy.VERZE_11 = 2;
|
||||
prikazy.VERZE_12 = 4;
|
||||
prikazy.VERZE_20 = 8;
|
||||
prikazy.min_VERZE_20 = prikazy.VERZE_20;
|
||||
prikazy.min_VERZE_12 = prikazy.min_VERZE_20 | prikazy.VERZE_12;
|
||||
prikazy.min_VERZE_11 = prikazy.min_VERZE_12 | prikazy.VERZE_11;
|
||||
prikazy.min_VERZE_10 = prikazy.min_VERZE_11 | prikazy.VERZE_10;
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Formátování chyby provádění ~===========================================
|
||||
|
||||
prikazy.formatuj_chybu_provadeni = function (jmeno, cislo_radky, telo, text)
|
||||
{
|
||||
if ( jmeno ) {
|
||||
var prikaz_radky = "";
|
||||
if ( cislo_radky < telo.length ) {
|
||||
prikaz_radky = ": " +
|
||||
prikazy.formatovac.zformatuj_jednu_radku(telo[cislo_radky]);
|
||||
}
|
||||
return "Chyba při provádění příkazu " + jmeno + " na řádce " +
|
||||
(cislo_radky+1) + prikaz_radky + ".\n\n" + text;
|
||||
} else {
|
||||
return "Chyba při provádění příkazu.\n\n" + text;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Testy ~=================================================================
|
||||
|
||||
// Test spuštění. Vrací true, jestli se může pokračovat
|
||||
prikazy.test_spusteni = function ()
|
||||
{
|
||||
var prikaz = prikazy.jadro.probiha();
|
||||
if ( prikaz ) {
|
||||
var uzivatel_chce = window.confirm( "Právě je prováděn příkaz " + prikaz.jmeno + ".\n\n" +
|
||||
"Pro pokračování je nutné provádění ukončit.\n" +
|
||||
"Mám příkaz ukončit?" );
|
||||
if ( uzivatel_chce ) {
|
||||
prikazy.jadro.zastav();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Stav provádění příkazů ~================================================
|
||||
|
||||
prikazy.Stav = function (prikaz)
|
||||
{
|
||||
this.probiha = false;
|
||||
this.casovac = { id: null };
|
||||
this.doplnit_konec = true;
|
||||
this.rychle = 0;
|
||||
this.byla_rychla_akce = false;
|
||||
this.historie = new Array();
|
||||
this.pozice = new Object();
|
||||
if ( prikaz ) {
|
||||
this.prikaz = prikaz;
|
||||
} else {
|
||||
this.syntaxe = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Funkce najde odpovídající přikaz KONEC, případně KONEC, JINAK, nebo AŽ. Vrací
|
||||
// objekt Vysledek s nastavenou chybou, pokud k nějaké došlo. Kontroluje
|
||||
// syntaxi a jako jediná funkce není omezená na počet kroků. Po návratu je
|
||||
// příkaz připraven na další krok.
|
||||
prikazy.Stav.prototype.najdi_konec = function ()
|
||||
{
|
||||
var stara_syntaxe = this.syntaxe;
|
||||
this.syntaxe = true;
|
||||
var vysledek = new Vysledek();
|
||||
|
||||
if ( ! this.historie.length || this.historie.length < 1 ) {
|
||||
ladici_vypis(CHYBA, "stav.najdi_konec",
|
||||
"nebyl spuštěn žádný příkaz, nebo už skončil");
|
||||
this.syntaxe = stara_syntaxe;
|
||||
return vysledek;
|
||||
}
|
||||
var historie_pozice = this.historie.length - 1;
|
||||
var konec_jinak =
|
||||
( this.historie[historie_pozice][0] != prikazy.KONEC_JINAK );
|
||||
if ( konec_jinak ) {
|
||||
ladici_vypis(DETAIL, "stav.najdi_konec",
|
||||
"přeskakuji na další KONEC nebo KONEC, JINAK")
|
||||
} else {
|
||||
ladici_vypis(DETAIL, "stav.najdi_konec",
|
||||
"přeskakuji na další KONEC")
|
||||
}
|
||||
|
||||
while ( !vysledek.byla_chyba() && historie_pozice < this.historie.length
|
||||
&& ( !konec_jinak
|
||||
|| konec_jinak && this.historie[historie_pozice][0] != prikazy.KONEC_JINAK) ) {
|
||||
vysledek.nastav( this.krok() );
|
||||
}
|
||||
|
||||
this.syntaxe = stara_syntaxe;
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
prikazy.Stav.prototype.dotaz_na_doplneni = function (dotaz, doplneni, text)
|
||||
{
|
||||
if ( this.doplnit_konec && window.confirm(dotaz) ) {
|
||||
if ( doplneni instanceof Array ) {
|
||||
for ( var i = 0; i < doplneni.length; i++ ) {
|
||||
ladici_vypis( DETAIL, "stav.dotaz_na_doplneni",
|
||||
this.pozice.prikaz.jmeno, "doplňuji na konec příkaz " +
|
||||
doplneni[i].jmeno );
|
||||
this.pozice.prikaz.telo.push( [doplneni[i]] );
|
||||
}
|
||||
} else {
|
||||
ladici_vypis( DETAIL, "stav.dotaz_na_doplneni",
|
||||
this.pozice.prikaz.jmeno, "doplňuji na konec příkaz " +
|
||||
doplneni.jmeno );
|
||||
this.pozice.prikaz.telo.push( [doplneni] );
|
||||
}
|
||||
return new Vysledek( false, Vysledek.BYL_UPRAVEN );
|
||||
} else {
|
||||
return new Vysledek( new Chyba(true, text) );
|
||||
}
|
||||
}
|
||||
|
||||
// Doplnění příkazů KONEC a KONEC, JINAK pro všechny cykly a podmínky. Vrací
|
||||
// objekt Vysledek, pokud došlo k chybě. Vrací null, pokud nemohlo být doplnění
|
||||
// provedeno
|
||||
prikazy.Stav.prototype.dopln_konec = function (posledni)
|
||||
{
|
||||
var obecna_chyba = new Vysledek( new Chyba( true,
|
||||
"Na konci chybí příkaz KONEC.\n" +
|
||||
"Zkontrolujte příkazy podmínek, opakování a rychlých bloků." ) );
|
||||
|
||||
// Nejdříve kontrola, jestli historie vůbec něco obsahuje a jestli náhodou
|
||||
// neobsahuje další volání - v tom případě se vrátíme bez jakékoliv úpravy
|
||||
if ( !this.historie || this.historie && !this.historie.length )
|
||||
return obecna_chyba;
|
||||
if ( !this.pozice || this.pozice && !this.pozice.prikaz )
|
||||
return obecna_chyba;
|
||||
if ( this.doplnit_konec ) {
|
||||
var prikaz_doplneni = false; // Jestli je poslední příkaz pro doplnění
|
||||
for ( var i = 0; i < this.historie.length; i++ ) {
|
||||
if ( ! this.historie[i][0].systemovy ) {
|
||||
prikaz_doplneni = ( this.historie[i][0] == this.pozice.prikaz );
|
||||
}
|
||||
}
|
||||
if ( !prikaz_doplneni ) return obecna_chyba;
|
||||
}
|
||||
|
||||
var stara_historie = new Array();
|
||||
if ( !posledni ) {
|
||||
posledni = this.historie.pop();
|
||||
stara_historie.unshift(posledni);
|
||||
}
|
||||
|
||||
var vysledek = new Vysledek();
|
||||
do {
|
||||
if ( !posledni[0].systemovy ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Příkaz " + this.pozice.prikaz.jmeno +
|
||||
" není ukončen příkazem KONEC.\n\nDoplnit?",
|
||||
prikazy.KONEC,
|
||||
"Příkaz není ukončen příkazem KONEC.\n" +
|
||||
"Prosím ukončete svůj příkaz slovem KONEC.") );
|
||||
} else if ( posledni[0] == prikazy.KDYZ ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Podmínka KDYŽ není ukončena sérií příkazů KONEC, JINAK a KONEC.\n\n" +
|
||||
"Doplnit?",
|
||||
[ prikazy.KONEC_JINAK, prikazy.KONEC ],
|
||||
"Podmínka KDYŽ není ukončena alespoň příkazem KONEC.\n\n" +
|
||||
"Prosím ukončete podmínku KDYŽ slovem KONEC.") );
|
||||
} else if ( posledni[0] == prikazy.KONEC_JINAK ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Podmínka KDYŽ není ukončena příkazem KONEC.\n\n" +
|
||||
"Doplnit?",
|
||||
prikazy.KONEC,
|
||||
"Podmínka KDYŽ je ukončena pouze slovem KONEC, JINAK.\n\n" +
|
||||
"Prosím ukončete podmínku KDYŽ slovem KONEC.") );
|
||||
} else if ( posledni[0] == prikazy.DOKUD ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Cyklus DOKUD není ukončen příkazem KONEC, nebo AŽ.\n\n" +
|
||||
"Doplnit příkaz KONEC?",
|
||||
prikazy.KONEC,
|
||||
"Ukončení cyklu DOKUD není ukončeno alespoň příkazem KONEC.\n\n" +
|
||||
"Prosím ukončete cyklus DOKUD slovem KONEC.") );
|
||||
} else if ( posledni[0] == prikazy.OPAKUJ ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Cyklus OPAKUJ není ukončen příkazem KONEC, nebo AŽ.\n\n" +
|
||||
"Doplnit příkaz KONEC?",
|
||||
prikazy.KONEC,
|
||||
"Cyklus OPAKUJ není ukončen alespoň příkazem KONEC.\n\n" +
|
||||
"Prosím ukončete cyklus OPAKUJ slovem KONEC.") );
|
||||
} else if ( posledni[0] == prikazy.RYCHLE ) {
|
||||
vysledek.nastav( this.dotaz_na_doplneni(
|
||||
"Blok RYCHLE není ukončen příkazem POMALU.\n\n" +
|
||||
"Doplnit?",
|
||||
prikazy.POMALU,
|
||||
"Rychlý blok RYCHLE není ukončen slovem POMALU, nebo KONEC.\n\n" +
|
||||
"Prosím ukončete bloku rychlého provádění slovem POMALU.") );
|
||||
} else {
|
||||
vysledek = obecna_chyba;
|
||||
break;
|
||||
}
|
||||
if ( this.doplnit_konec ) {
|
||||
posledni = this.historie.pop();
|
||||
if ( posledni ) stara_historie.unshift(posledni);
|
||||
}
|
||||
} while ( this.doplnit_konec && !vysledek.byla_chyba() && posledni );
|
||||
|
||||
if ( this.historie.length > 0 ) {
|
||||
this.historie = this.historie.concat(stara_historie);
|
||||
} else {
|
||||
this.historie = stara_historie;
|
||||
}
|
||||
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Proveď kontrolu syntaxe a vrať výsledek
|
||||
prikazy.Stav.prototype.kontrola_syntaxe = function (prikaz, doplnit_konec)
|
||||
{
|
||||
this.syntaxe = true;
|
||||
this.doplnit_konec = doplnit_konec;
|
||||
this.historie = new Array();
|
||||
this.prikaz = prikaz;
|
||||
delete this.pozice;
|
||||
this.rychle = 0;
|
||||
var vysledek = this.proved_volani( prikaz );
|
||||
this.pozice = vysledek.hodnota;
|
||||
while ( !vysledek.byla_chyba() && this.historie.length > 0 ) {
|
||||
vysledek.nastav( this.krok() );
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Proveď (první) příkaz
|
||||
prikazy.Stav.prototype.proved_volani = function (prikaz)
|
||||
{
|
||||
var cislo_radky = 0;
|
||||
while ( cislo_radky < prikaz.telo.length
|
||||
&& prikaz.telo[cislo_radky][0].ignoruj ) {
|
||||
cislo_radky++;
|
||||
}
|
||||
if ( this.pozice instanceof Object && this.pozice.prikaz ) {
|
||||
// Kam se vrátit
|
||||
this.historie.push( [ this.pozice.prikaz, this.pozice.cislo_radky + 1 ] );
|
||||
} else {
|
||||
// První nastavení - nikam se nevracíme
|
||||
this.historie.push( [ this.prikaz ] );
|
||||
}
|
||||
return new Vysledek( false, Vysledek.NIC,
|
||||
{ prikaz: prikaz, cislo_radky: cislo_radky } );
|
||||
}
|
||||
|
||||
// Rychlé vykonávání příkazů
|
||||
prikazy.Stav.prototype.proved_rychle = function (prikaz)
|
||||
{
|
||||
this.rychle++;
|
||||
ladici_vypis( DETAIL, "stav.proved_rychle",
|
||||
"rychlé provádění, počet volání: " + this.rychle );
|
||||
}
|
||||
|
||||
// Rychlé vykonávání příkazů
|
||||
prikazy.Stav.prototype.proved_pomalu = function (prikaz)
|
||||
{
|
||||
var provedl_akci = false;
|
||||
if ( this.rychle ) this.rychle--;
|
||||
if ( this.rychle ) {
|
||||
ladici_vypis( DETAIL, "stav.proved_pomalu",
|
||||
"zůstává rychlé provádění, počet volání: " + this.rychle );
|
||||
} else {
|
||||
provedl_akci = this.byla_rychla_akce;
|
||||
ladici_vypis( DETAIL, "stav.proved_pomalu",
|
||||
"nastaveno pomalé (normální) provádění, akce " +
|
||||
(provedl_akci?"byla":"nebyla") + " provedena" );
|
||||
this.byla_rychla_akce = false;
|
||||
}
|
||||
if ( provedl_akci ) {
|
||||
return new Vysledek( false, Vysledek.PROVEDL_AKCI );
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
// Spusť vykonávání příkazu
|
||||
prikazy.Stav.prototype.spust = function ()
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
if ( this.prikaz.systemovy ) {
|
||||
vysledek.nastav( this.prikaz.spust() );
|
||||
this.probiha = false;
|
||||
} else {
|
||||
prikazy.obnov_stav( true );
|
||||
this.probiha = true;
|
||||
vysledek.nastav( this.proved_volani(this.prikaz) );
|
||||
|
||||
if ( !vysledek.je_konec() ) {
|
||||
var pozice = this.pozice = vysledek.hodnota;
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return prikazy.formatuj_chybu_provadeni(pozice.jmeno,
|
||||
pozice.cislo_radky, prikazy.prikaz[pozice.jmeno].telo, text);
|
||||
}
|
||||
vysledek.nastav( this.dalsi_krok(0) );
|
||||
}
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Vynulování časovače
|
||||
prikazy.Stav.prototype.nuluj_casovac = function ()
|
||||
{
|
||||
if ( this.casovac && this.casovac.id ) {
|
||||
clearTimeout(this.casovac.id);
|
||||
this.casovac.id = null;
|
||||
delete this.casovac.cas;
|
||||
delete this.casovac.prodleva;
|
||||
delete this.casovac.funkce;
|
||||
}
|
||||
}
|
||||
|
||||
// Nastav časovač
|
||||
prikazy.Stav.prototype.nastav_casovac = function (funkce, prodleva)
|
||||
{
|
||||
this.nuluj_casovac();
|
||||
this.casovac.cas = new Date();
|
||||
this.casovac.prodleva = prodleva;
|
||||
this.casovac.funkce = funkce;
|
||||
this.casovac.id = setTimeout( funkce, prodleva );
|
||||
}
|
||||
|
||||
// Přenastav časovač
|
||||
prikazy.Stav.prototype.prenastav_casovac = function (prodleva)
|
||||
{
|
||||
if ( this.casovac && this.casovac.id ) {
|
||||
clearTimeout(this.casovac.id);
|
||||
var cas = new Date();
|
||||
var rozdil = cas-this.casovac.cas;
|
||||
if ( rozdil >= prodleva ) {
|
||||
prodleva = 0;
|
||||
} else {
|
||||
prodleva -= rozdil;
|
||||
}
|
||||
this.casovac.cas = cas;
|
||||
this.casovac.prodleva = prodleva;
|
||||
this.casovac.id = setTimeout( this.casovac.funkce, prodleva );
|
||||
}
|
||||
}
|
||||
|
||||
// Zastav vykonávání příkazů
|
||||
prikazy.Stav.prototype.zastav = function ()
|
||||
{
|
||||
if ( this.probiha ) {
|
||||
this.probiha = false;
|
||||
prikazy.obnov_stav( this.probiha );
|
||||
this.nuluj_casovac();
|
||||
}
|
||||
return new Vysledek(new Chyba(), Vysledek.KONEC);
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Opakované provádění příkazů ~===========================================
|
||||
|
||||
prikazy.Stav.prototype.dalsi_krok = function (pocet_prikazu)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
|
||||
if ( pocet_prikazu == undefined ) {
|
||||
pocet_prikazu = nastaveni.maximum_prikazu_smycky;
|
||||
}
|
||||
|
||||
this.nuluj_casovac();
|
||||
|
||||
var start = new Date();
|
||||
var i = 0;
|
||||
while ( i < pocet_prikazu
|
||||
&& ((new Date())-start) <= nastaveni.maximalni_delka_smycky ) {
|
||||
vysledek.nastav( this.krok() );
|
||||
if ( vysledek.byl_upraven() && this.pozice.prikaz ) {
|
||||
editor.prikaz_upraven( this.pozice.prikaz );
|
||||
}
|
||||
if ( vysledek.je_konec() || !this.rychle && vysledek.byla_akce() ) {
|
||||
break;
|
||||
}
|
||||
if ( this.rychle && vysledek.byla_akce() ) {
|
||||
this.byla_rychla_akce = true;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if ( vysledek.je_konec() ) {
|
||||
this.zastav();
|
||||
var pozice = this.pozice;
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return prikazy.formatuj_chybu_provadeni(pozice.prikaz.jmeno,
|
||||
pozice.cislo_radky, pozice.prikaz.telo, text);
|
||||
}
|
||||
vysledek.zobraz_chybu();
|
||||
} else {
|
||||
var interval = nastaveni.prodleva;
|
||||
if ( i == pocet_prikazu || this.rychle || pocet_prikazu == 0 ) {
|
||||
interval = 0;
|
||||
}
|
||||
this.nastav_casovac( prikazy.dalsi_krok, interval );
|
||||
}
|
||||
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Proveď jeden krok příkazu. Vrací objekt Vysledek
|
||||
prikazy.Stav.prototype.krok = function ()
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
var cislo_radky = this.pozice.cislo_radky;
|
||||
if ( cislo_radky >= this.pozice.prikaz.telo.length ) {
|
||||
ladici_vypis( DETAIL, "stav.krok", this.pozice.prikaz.jmeno,
|
||||
"příkaz není správně ukončen" );
|
||||
vysledek.nastav( this.dopln_konec() );
|
||||
if ( vysledek.je_konec() ) {
|
||||
// Aktualizace čísla řádku
|
||||
this.pozice.cislo_radky = this.pozice.prikaz.telo.length;
|
||||
}
|
||||
// Aktualizuj pozici chyby
|
||||
vysledek.nastav( false, vysledek.stav, this.pozice );
|
||||
} else {
|
||||
var radka = this.pozice.prikaz.telo[cislo_radky];
|
||||
if ( !this.syntaxe || this.syntaxe && radka[0].syntaxe ) {
|
||||
if ( !radka[0].ignoruj ) {
|
||||
vysledek.nastav( radka[0].spust(radka, this) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( vysledek.hodnota ) {
|
||||
this.pozice = vysledek.hodnota;
|
||||
} else if ( !vysledek.je_konec() ) {
|
||||
this.pozice.cislo_radky++;
|
||||
} else if( vysledek.byla_chyba() ) {
|
||||
// Byla chyba, ale nebyla nastavena řádka chyby - aktualizuj
|
||||
vysledek.nastav( false, vysledek.stav, this.pozice );
|
||||
}
|
||||
|
||||
if ( vysledek.ma_preskocit() ) {
|
||||
vysledek.nastav( this.najdi_konec() );
|
||||
}
|
||||
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní systémové funkce ~=============================================
|
||||
|
||||
prikazy.jadro.KROK = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "KROK");
|
||||
return mesto.proved_krok();
|
||||
}
|
||||
|
||||
prikazy.jadro.VLEVO_VBOK = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "VLEVO-VBOK");
|
||||
return mesto.proved_vlevo_vbok();
|
||||
}
|
||||
|
||||
prikazy.jadro.POLOZ = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "POLOŽ");
|
||||
return mesto.proved_poloz();
|
||||
}
|
||||
|
||||
prikazy.jadro.ZVEDNI = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "ZVEDNI");
|
||||
return mesto.proved_zvedni();
|
||||
}
|
||||
|
||||
prikazy.jadro.STOP = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "STOP");
|
||||
if ( !stav.syntaxe ) {
|
||||
var vysledek = new Vysledek( new Chyba(true, "Bohužel musím končit.\n\n" +
|
||||
"Narazil jsem na příkaz STOP.") );
|
||||
vysledek.zobraz_chybu();
|
||||
return vysledek;
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.RYCHLE = function (radka, stav)
|
||||
{
|
||||
stav.historie.push( radka );
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "RYCHLE");
|
||||
if ( !stav.syntaxe ) stav.proved_rychle();
|
||||
return new Vysledek();
|
||||
}
|
||||
|
||||
prikazy.jadro.POMALU = function (radka, stav)
|
||||
{
|
||||
var posledni = stav.historie.pop();
|
||||
if ( !posledni || posledni && posledni[0] != prikazy.RYCHLE ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen příkaz POMALU bez odpovídajícího RYCHLE." ) );
|
||||
}
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "POMALU");
|
||||
if ( !stav.syntaxe ) {
|
||||
return stav.proved_pomalu();
|
||||
}
|
||||
return new Vysledek();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Konce ~=================================================================
|
||||
|
||||
prikazy.jadro.KONEC_JINAK = function (radka, stav)
|
||||
{
|
||||
var posledni = stav.historie.pop();
|
||||
if ( !stav.syntaxe ) ladici_vypis(INFORMACE, "prikazy.jadro", "KONEC, JINAK");
|
||||
if ( !posledni || posledni && posledni[0] != prikazy.KDYZ ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen příkaz KONEC, JINAK bez odpovídající podmínky KDYŽ.\n" +
|
||||
"Na příkaz KDYŽ a KONEC, JINAK se prosím koukněte do nápovědy." ) );
|
||||
}
|
||||
stav.historie.push( radka );
|
||||
if ( !stav.syntaxe ) {
|
||||
// Přeskoč až na další konec
|
||||
return new Vysledek(false, Vysledek.PRESKOC_KONEC);
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
// Vyhodnotí konec opakování příkazu OPAKUJ
|
||||
prikazy.jadro.konec_OPAKUJ = function (radka, stav, posledni)
|
||||
{
|
||||
// Opakování příkazu
|
||||
if ( posledni.length == 2 || (posledni.length == 3 && posledni[1] > 0) ) {
|
||||
if ( posledni.length == 3 ) {
|
||||
ladici_vypis(DETAIL, "prikazy.jadro", "nový test cyklu OPAKUJ, " +
|
||||
"počet opakování:" + posledni[1]);
|
||||
posledni[1]--;
|
||||
} else {
|
||||
ladici_vypis(DETAIL, "prikazy.jadro", "zpět na cyklus OPAKUJ, " +
|
||||
"nekonečný počet opakování");
|
||||
}
|
||||
stav.historie.push( posledni );
|
||||
return new Vysledek(false, Vysledek.NIC,
|
||||
{ prikaz: stav.pozice.prikaz, cislo_radky: posledni[posledni.length-1] });
|
||||
} else {
|
||||
ladici_vypis(DETAIL, "prikazy.jadro", "nový test cyklu OPAKUJ, " +
|
||||
"konec opakování");
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
// Vyhodnotí konec opakování příkazu DOKUD
|
||||
prikazy.jadro.konec_DOKUD = function (radka, stav, posledni)
|
||||
{
|
||||
// Cyklus DOKUD
|
||||
ladici_vypis(DETAIL, "prikazy.jadro", "nový test příkazu DOKUD");
|
||||
if ( prikazy.jadro.podminka(posledni) ) {
|
||||
// Podmínka je splněna, posuň se zpět za příkaz DOKUD
|
||||
stav.historie.push(posledni);
|
||||
return new Vysledek( false, Vysledek.NIC,
|
||||
{ prikaz: stav.pozice.prikaz, cislo_radky: posledni[2] } );
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.KONEC = function (radka, stav)
|
||||
{
|
||||
var posledni = stav.historie.pop();
|
||||
if ( !stav.syntaxe ) ladici_vypis(INFORMACE, "prikazy.jadro", "KONEC");
|
||||
if ( !posledni || posledni
|
||||
&& posledni[0].systemovy && posledni[0] != prikazy.KDYZ
|
||||
&& posledni[0] != prikazy.KONEC_JINAK && posledni[0] != prikazy.DOKUD
|
||||
&& posledni[0] != prikazy.OPAKUJ && posledni[0] != prikazy.RYCHLE ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen příkaz KONEC, který neukončuje ani uživatelský příkaz, "+
|
||||
"ani podmínku, ani opakování.\n" +
|
||||
"Na ukončování příkazů se prosím koukněte do nápovědy.") );
|
||||
}
|
||||
|
||||
if ( !posledni[0].systemovy ) {
|
||||
// Konec příkazu
|
||||
var prikaz = stav.pozice.prikaz;
|
||||
var prazdny = true;
|
||||
var dalsi_cislo_radky = stav.pozice.cislo_radky+1;
|
||||
if ( dalsi_cislo_radky < prikaz.telo.length ) {
|
||||
var dalsi_prikaz = prikaz.telo[dalsi_cislo_radky][0];
|
||||
stav.historie.push(posledni);
|
||||
if ( !dalsi_prikaz.ignoruj ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen příkaz za posledním příkazem KONEC. " +
|
||||
"Pravděpodobně nějaká podmínka nebo cyklus byl špatně " +
|
||||
"ukončen." ),
|
||||
Vysledek.NIC,
|
||||
{ prikaz: prikaz, cislo_radky: dalsi_cislo_radky } );
|
||||
} else {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen " + dalsi_prikaz.jmeno +
|
||||
" za posledním příkazem KONEC, který ukončuje popis " +
|
||||
"celého příkazu." ),
|
||||
Vysledek.NIC,
|
||||
{ prikaz: prikaz, cislo_radky: dalsi_cislo_radky } );
|
||||
}
|
||||
}
|
||||
if ( stav.historie.length == 0 ) {
|
||||
return new Vysledek(false, Vysledek.KONEC);
|
||||
} else {
|
||||
return new Vysledek(false, Vysledek.NIC,
|
||||
{ prikaz:posledni[0], cislo_radky: posledni[1] } );
|
||||
}
|
||||
} else if ( posledni[0] == prikazy.OPAKUJ && !stav.syntaxe ) {
|
||||
// Cyklus OPAKUJ
|
||||
return prikazy.jadro.konec_OPAKUJ(radka, stav, posledni);
|
||||
} else if ( posledni[0] == prikazy.DOKUD && !stav.syntaxe ) {
|
||||
// Cyklys DOKUD
|
||||
return prikazy.jadro.konec_DOKUD(radka, stav, posledni);
|
||||
} else if ( posledni[0] == prikazy.RYCHLE ) {
|
||||
// Konec rychlého bloku
|
||||
return stav.proved_pomalu();
|
||||
} // Všechno ostatní prostě skončí (KDYŽ-KONEC, KDYŽ-KONEC_JINAK-KONEC)
|
||||
|
||||
return new Vysledek();
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Podmínky a cykly ~======================================================
|
||||
|
||||
prikazy.jadro.podminka = function (radka)
|
||||
{
|
||||
var vysledek = prikazy.podminky[Math.abs(radka[1])-1].test();
|
||||
if ( radka[1] < 0 ) vysledek = !vysledek;
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "podmínka " +
|
||||
prikazy.formatuj_podminku(radka) + " " +
|
||||
(vysledek?"je":"není") + " pravdivá" );
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
prikazy.jadro.KDYZ = function (radka, stav)
|
||||
{
|
||||
stav.historie.push( radka );
|
||||
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
|
||||
return new Vysledek( false, Vysledek.PRESKOC_KONEC );
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.DOKUD = function (radka, stav)
|
||||
{
|
||||
stav.historie.push( radka.concat(stav.pozice.cislo_radky+1) );
|
||||
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
|
||||
return new Vysledek( false, Vysledek.PRESKOC_KONEC );
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.OPAKUJ = function (radka, stav)
|
||||
{
|
||||
var historie = radka.concat(stav.pozice.cislo_radky+1);
|
||||
if ( !stav.syntaxe && radka.length == 2 && radka[1] == 0 ) {
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro",
|
||||
"cyklus OPAKUJ s nulovým počtem opakování" );
|
||||
stav.historie.push( historie );
|
||||
return new Vysledek(false, Vysledek.PRESKOC_KONEC);
|
||||
} else {
|
||||
if ( historie.length == 3 ) {
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro",
|
||||
"cyklus OPAKUJ, počet opakování:" + historie[1]);
|
||||
historie[1]--;
|
||||
} else {
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro",
|
||||
"cyklus OPAKUJ, nekonečný počet opakování");
|
||||
}
|
||||
stav.historie.push( historie );
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.AZ = function (radka, stav)
|
||||
{
|
||||
var posledni = stav.historie.pop();
|
||||
if ( !posledni || posledni
|
||||
&& posledni[0] != prikazy.OPAKUJ && posledni[0] != prikazy.DOKUD ) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Nalezen příkaz AŽ, který neukončuje opakování OPAKUJ nebo DOKUD.\n" +
|
||||
"Na příkaz AŽ se prosím koukněte do nápovědy." ) );
|
||||
}
|
||||
if ( !stav.syntaxe && !prikazy.jadro.podminka(radka) ) {
|
||||
if ( posledni[0] == prikazy.OPAKUJ ) {
|
||||
return prikazy.jadro.konec_OPAKUJ(radka, stav, posledni);
|
||||
} else {
|
||||
return prikazy.jadro.konec_DOKUD(radka, stav, posledni);
|
||||
}
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Uživatelské příkazy ~===================================================
|
||||
|
||||
prikazy.jadro.UZIVATELSKY = function (radka, stav)
|
||||
{
|
||||
ladici_vypis(INFORMACE, "prikazy.jadro", "Uživatelský příkaz " +
|
||||
radka[0].jmeno );
|
||||
if ( !stav.syntaxe ) {
|
||||
// TODO: Optimalizace rekurze, pokud za voláním následuje KONEC (případně
|
||||
// nějaký ignorovaný příkaz) - neukládat volání jako nové volání. Ale pouze
|
||||
// v případě, pokud je poslední příkaz v historii ten samý - nastavit první
|
||||
// parametr na počet vnoření
|
||||
return stav.proved_volani( radka[0] );
|
||||
} else {
|
||||
return new Vysledek();
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Provádení příkazů ~=====================================================
|
||||
|
||||
prikazy.dalsi_krok = function ()
|
||||
{
|
||||
if ( prikazy.stav ) {
|
||||
prikazy.stav.dalsi_krok();
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.proved = function (jmeno)
|
||||
{
|
||||
prikazy.stav = new prikazy.Stav( prikazy.prikaz[jmeno] );
|
||||
return prikazy.stav.spust();
|
||||
}
|
||||
|
||||
prikazy.jadro.zastav = function ()
|
||||
{
|
||||
if ( prikazy.stav ) {
|
||||
var vysledek = prikazy.stav.zastav();
|
||||
delete prikazy.stav;
|
||||
return vysledek;
|
||||
} else {
|
||||
return new Vysledek(false, Vysledek.KONEC);
|
||||
}
|
||||
}
|
||||
|
||||
// Zjisti, jestli nějaký příkaz zrovna probíhá
|
||||
prikazy.jadro.probiha = function ()
|
||||
{
|
||||
var spusteno = ( prikazy.stav && prikazy.stav.probiha );
|
||||
if ( spusteno ) {
|
||||
return prikazy.stav.prikaz;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.proved_nebo_zastav = function(jmeno)
|
||||
{
|
||||
if ( prikazy.stav && prikazy.stav.probiha ) {
|
||||
return prikazy.jadro.zastav();
|
||||
} else {
|
||||
return prikazy.jadro.proved(jmeno);
|
||||
}
|
||||
}
|
||||
|
||||
prikazy.jadro.prenastav_casovac = function(prodleva)
|
||||
{
|
||||
if ( prikazy.stav && prikazy.stav.probiha ) {
|
||||
prikazy.stav.prenastav_casovac(prodleva);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,792 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - formátování a rozpoznávání příkazů
|
||||
|
||||
// POZNÁMKA: Řetězec načtený z příkazového pole je vnitřně udržován ve formě
|
||||
// escape(), protože Konqueror (KDE JavaScript) neumí pracovat s Unicode.
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Rozpoznávání příkazů
|
||||
//
|
||||
// Všechny rozpoznávače předpokládají odstarnění přebytečných mezer na začátku
|
||||
// i na konci textového řetězce!
|
||||
//
|
||||
// Jednotlivé rozpoznávače pracují ve dvou režimech:
|
||||
// * Hlavička příkazu. Zkontroluje se název, pokud nekoliduje s některým z
|
||||
// (systémových) příkazů. Vrací nový objekt s nastaveným atributem chyba a
|
||||
// pokud chyba opravdu nastala, popis je uložen v atributu text. Pokud
|
||||
// byl rozpoznán příkaz z hlavičky (ještě před názvem), je vrácen tento
|
||||
// příkaz - všechny takové příkazy patří před název do hlavičky a musí mít
|
||||
// nastaveny atribut hlavicka na true. Pokud je to název a s ničím nekoliduje,
|
||||
// je vrácen null.
|
||||
// * Tělo příkazu. Vrací nový objekt s novým příkazem v atributu prikaz.
|
||||
// Případné parametry jsou v atributu parametry. Pokud nastala chyba, je
|
||||
// signalizována v atributu chyba a popis je v atributu text. Pokud nebyl
|
||||
// příkaz rozpoznán, vrátí se pouze atribut chyba s hodnotou false.
|
||||
prikazy.rozpoznavac = new Object();
|
||||
|
||||
// Formátování příkazů
|
||||
prikazy.formatovac = new Object();
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Objekt vracející jednotlivé řádky ~=====================================
|
||||
|
||||
Radkovac = function (obsah)
|
||||
{
|
||||
this.obsah = obsah.split( "%0A" );
|
||||
this.obsah_index = 0;
|
||||
this.obsah_chyba = undefined;
|
||||
this.radky = new Array();
|
||||
this.radky_index = 0;
|
||||
this.radka = 0;
|
||||
this.radka_chyby = undefined;
|
||||
}
|
||||
|
||||
// Vrátí číslo posledně zpracovávané řádky v původním obsahu. Buď vrátní
|
||||
// undefined, nebo číslo řádky (počítáno od 0)
|
||||
Radkovac.prototype.puvodni_cislo_radky = function ()
|
||||
{
|
||||
if ( this.obsah_chyba != undefined ) {
|
||||
if ( this.obsah_chyba > 0 ) {
|
||||
return this.obsah_chyba-1;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
} else {
|
||||
if ( this.obsah_index ) {
|
||||
return this.obsah_index-1;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Vrátí číslo posledně zpracovávané řádky v novém obsahu. Buď vrátní
|
||||
// undefined, nebo číslo řádky (počítáno od 0)
|
||||
Radkovac.prototype.nove_cislo_radky = function ()
|
||||
{
|
||||
if ( this.radka_chyby != undefined ) {
|
||||
if ( this.radka_chyby > 0 ) {
|
||||
return this.radka_chyby-1;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
} else {
|
||||
if ( this.radka ) {
|
||||
return this.radka-1;
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Označí řádku, na které nastala chyba
|
||||
Radkovac.prototype.nastala_chyba = function ()
|
||||
{
|
||||
if ( this.radka_chyby == undefined ) {
|
||||
this.radka_chyby = this.radka;
|
||||
this.obsah_chyba = this.obsah_index;
|
||||
}
|
||||
}
|
||||
|
||||
// Převede řádku do velkých písmen. Důležité, protože Konqueror to nezvládá.
|
||||
// Vstup a výstup je ve formě unescape().
|
||||
Radkovac.prototype.velka_pismena = function (text)
|
||||
{
|
||||
var pismena = text.split("");
|
||||
for ( var i = 0; i < pismena.length; i++ ) {
|
||||
// Při zběžném pohledu do Unicode tabulky existují tři typy metod získání
|
||||
// velkého písmena:
|
||||
// * posun kódu o 32 méně;
|
||||
// * posun kódu o 1 méně;
|
||||
// * posun kódu úplně někam jinam.
|
||||
var kod = text.charCodeAt(i);
|
||||
|
||||
if (
|
||||
kod >= 0x0061 && kod <= 0x007A ||
|
||||
kod >= 0x00E0 && kod <= 0x00F6 ||
|
||||
kod >= 0x00F8 && kod <= 0x00FE
|
||||
) {
|
||||
// Posun kódu o 32 méně
|
||||
pismena[i] = String.fromCharCode( kod - 0x0020 );
|
||||
} else if (
|
||||
kod >= 0x0100 && kod <= 0x012F ||
|
||||
kod >= 0x0132 && kod <= 0x0137 ||
|
||||
kod >= 0x014A && kod <= 0x0177
|
||||
) {
|
||||
// Posun kódu o 1 méně
|
||||
pismena[i] = String.fromCharCode( kod & 0xFFFE );
|
||||
} else if (
|
||||
kod >= 0x0139 && kod <= 0x0148 ||
|
||||
kod >= 0x0179 && kod <= 0x017E
|
||||
) {
|
||||
// Posun kódu o 1 méně
|
||||
pismena[i] = String.fromCharCode( ((kod-1)&0xFFFE)+1 );
|
||||
} else if (
|
||||
kod == 0x00DF
|
||||
) {
|
||||
// Německé ß má velkou variantu SS
|
||||
pismena[i] = "SS";
|
||||
} else if (
|
||||
kod == 0x00FF
|
||||
) {
|
||||
// Malé ÿ
|
||||
pismena[i] = "\u0178";
|
||||
}
|
||||
}
|
||||
return pismena.join("");
|
||||
}
|
||||
|
||||
// Úprava řádky pro rozpoznávání. Vstup je textová řádka ve formě escape(),
|
||||
// návratová hodnota je pole nových řádek ve formě unescape()
|
||||
Radkovac.prototype.uprav_radku = function (text)
|
||||
{
|
||||
text = text.replace( /^(%09|%0A|%0D|%20)+/, "" );
|
||||
text = text.replace( /(%09|%0A|%0D|%20)+$/, "" );
|
||||
|
||||
// Rozpoznání komentáře na řádce. Přesune komentář na samostatnou řádku
|
||||
var strednik = text.search( "%3B" ); // %3B je znak ';'
|
||||
if ( strednik > 0 ) {
|
||||
var text1 = text.slice(0, strednik).replace(/(%09|%0A|%0D|%20)+$/, "");
|
||||
var text2 = text.slice(strednik);
|
||||
text1 = unescape( text1.replace( /(%09|%0A|%0D|%20)+/g, "%20" ) );
|
||||
text2 = unescape( text2 );
|
||||
if ( text2.length > 1 ) {
|
||||
return [ this.velka_pismena(text1), text2 ];
|
||||
} else {
|
||||
return [ this.velka_pismena(text1) ];
|
||||
}
|
||||
} else {
|
||||
if ( strednik < 0 ) {
|
||||
text = unescape( text.replace( /(%09|%0A|%0D|%20)+/g, "%20" ) );
|
||||
return [ this.velka_pismena(text) ];
|
||||
} else {
|
||||
// Na řádce je pouze komentář (strednik == 0)
|
||||
text = unescape( text );
|
||||
return [ text ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Vrátí true, pokud je nějaká řádka k dispozici
|
||||
Radkovac.prototype.je_dalsi_radka = function ()
|
||||
{
|
||||
return ( this.obsah_index < this.obsah.length
|
||||
|| this.radky_index < this.radky.length );
|
||||
}
|
||||
|
||||
//.Vrací další řádku, výsledek je řádka po unescape()
|
||||
Radkovac.prototype.dalsi_radka = function ()
|
||||
{
|
||||
if ( this.radky_index < this.radky.length ) {
|
||||
var text = this.radky[this.radky_index];
|
||||
this.radky_index++;
|
||||
this.radka++;
|
||||
return text;
|
||||
} else if ( this.obsah_index < this.obsah.length ) {
|
||||
this.radky = this.uprav_radku( this.obsah[this.obsah_index] );
|
||||
this.obsah_index++;
|
||||
this.radky_index = 1;
|
||||
this.radka++;
|
||||
return this.radky[0];
|
||||
} else {
|
||||
ladici_vypis( LADENI, "Radkovac.dalsi_radka", "není žádná další řádka" );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Zformátovaný obsah příkazu ~============================================
|
||||
|
||||
Obsah = function (prikaz)
|
||||
{
|
||||
this.text = "";
|
||||
this.chyba = false;
|
||||
this.prikaz = prikaz;
|
||||
this.odsazeni = "";
|
||||
}
|
||||
|
||||
// Vrátí momentální úroveň odsazení s přihlédnutím k chybě
|
||||
Obsah.prototype.pridej = function (radka)
|
||||
{
|
||||
if ( this.chyba ) {
|
||||
this.text += radka + "\n";
|
||||
} else {
|
||||
this.text += this.odsazeni + radka + "\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Přidá jednu úroveň odsazení
|
||||
Obsah.prototype.odsad = function ()
|
||||
{
|
||||
this.odsazeni += " ";
|
||||
}
|
||||
|
||||
// Zruší jednu úroveň odsazení
|
||||
Obsah.prototype.predsad = function ()
|
||||
{
|
||||
this.odsazeni = this.odsazeni.slice(0, -2);
|
||||
}
|
||||
|
||||
// Zapnutí režimu chyby
|
||||
Obsah.prototype.nastala_chyba = function ()
|
||||
{
|
||||
this.chyba = true;
|
||||
}
|
||||
|
||||
// Pravý obsah. Výstup je ve formátu escape()
|
||||
Obsah.prototype.obsah = function ()
|
||||
{
|
||||
var obsah = escape(this.text);
|
||||
return obsah.replace( /%0A$/, "" );
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Formátování chyb ~======================================================
|
||||
|
||||
prikazy.formatuj_chybu_rozpoznani = function (text, rezim_hlavicka)
|
||||
{
|
||||
var ukonceno = "";
|
||||
if ( !rezim_hlavicka ) {
|
||||
ukonceno = "(V místě chyby je ukončeno formátování.)\n";
|
||||
}
|
||||
return ukonceno + "\n" + text;
|
||||
}
|
||||
|
||||
prikazy.formatuj_chybu_syntaxe = function (text, pocet_radek, radka_chyby)
|
||||
{
|
||||
var ukonceno;
|
||||
if ( radka_chyby < pocet_radek ) {
|
||||
ukonceno = "(V místě chyby je ukončeno formátování.)\n";
|
||||
} else {
|
||||
ukonceno = "(Chyba je na konci příkazu.)\n";
|
||||
}
|
||||
return ukonceno + "\n" + text;
|
||||
}
|
||||
|
||||
prikazy.vrat_chybu_jmena = function (text, detail) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Jméno příkazu nemůže být " + text + ".\n" + detail ) );
|
||||
}
|
||||
|
||||
prikazy.vrat_chybu_radky = function (text, detail) {
|
||||
return new Vysledek( new Chyba( true,
|
||||
"Na řádce se vyskytl chybný příkaz " + text + ".\n" + detail ) );
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce rozpoznávání příkazů ~===========================================
|
||||
|
||||
// Rozpoznání příkazu podle vstupní řádky. Návrat je nový příkaz, který navíc
|
||||
// obsahuje upravený obsah v atributu obsah a informaci o chybě v atributu
|
||||
// chyba a číslo poslední zpracovávané řádky. Pokud se v rozpoznávaném příkazu
|
||||
// najde stary_prikaz, bude považován za chybu v případě, že se název starého
|
||||
// a načítaného příkazu liší.
|
||||
prikazy.rozpoznavac.rozpoznej = function (text, stary_prikaz)
|
||||
{
|
||||
// Odstraň (dlouhé) pomlčky a nahraď je znakem minus, zruš mezery před
|
||||
// příkazem a nech pouze jednu volnou řádku, pokud jich je víc za sebou
|
||||
text = text.replace( /(%u2013|%u2014|%u2015)/g, "-" );
|
||||
text = text.replace( /^(%09|%0A|%0D|%20)+/g, "" );
|
||||
text = text.replace( /%0A((%09|%0A|%0D|%20)*%0A){2,}/g, "%0A%0A" );
|
||||
text = text.replace( /(%0A)+$/g, "" );
|
||||
|
||||
var novy_prikaz = new Object();
|
||||
var nove_telo;
|
||||
|
||||
var radkovac = new Radkovac(text);
|
||||
var rozpoznano = new Vysledek();
|
||||
var obsah = new Obsah();
|
||||
|
||||
// Nejprve najdi název
|
||||
rozpoznano.nastav( this.zpracuj_hlavicku(radkovac, obsah) );
|
||||
if ( rozpoznano.byla_chyba() ) {
|
||||
rozpoznano.chyba.formatuj = function (text) {
|
||||
return prikazy.formatuj_chybu_rozpoznani(text, true);
|
||||
}
|
||||
rozpoznano.nastav( false, Vysledek.NIC,
|
||||
{ obsah: text,
|
||||
cislo_radky: radkovac.puvodni_cislo_radky(),
|
||||
prikaz: novy_prikaz
|
||||
} );
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
novy_prikaz.jmeno = rozpoznano.hodnota.jmeno;
|
||||
nove_telo = rozpoznano.hodnota.telo;
|
||||
|
||||
// Přidej speciální příkaz názvu
|
||||
nove_telo.push( [ prikazy.NAZEV, novy_prikaz ] );
|
||||
|
||||
// Najdi tělo
|
||||
rozpoznano.nastav( this.zpracuj_telo(radkovac, obsah,
|
||||
novy_prikaz, stary_prikaz) );
|
||||
|
||||
if ( rozpoznano.byla_chyba() ) {
|
||||
rozpoznano.chyba.formatuj = function (text) {
|
||||
return prikazy.formatuj_chybu_rozpoznani(text, false);
|
||||
}
|
||||
rozpoznano.nastav( false, Vysledek.NIC,
|
||||
{ obsah: obsah.obsah(),
|
||||
cislo_radky: radkovac.nove_cislo_radky(),
|
||||
prikaz: novy_prikaz
|
||||
} );
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// Přidej nalezené tělo k hlavičce
|
||||
novy_prikaz.telo = nove_telo.concat( rozpoznano.hodnota.telo );
|
||||
rozpoznano.nastav( false, Vysledek.NIC,
|
||||
{ obsah: obsah.obsah(), prikaz: novy_prikaz } );
|
||||
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// Kontrola jména
|
||||
prikazy.rozpoznavac.kontrola_jmena = function (jmeno)
|
||||
{
|
||||
return this.najdi_prikaz( true, jmeno );
|
||||
}
|
||||
|
||||
// Najdi příkaz
|
||||
prikazy.rozpoznavac.najdi_prikaz = function (rezim_hlavicka, text)
|
||||
{
|
||||
var rozpoznano = new Vysledek();
|
||||
|
||||
// Rozdělení na jednotlivá slova
|
||||
var rozdel_text = escape(text);
|
||||
var slova = rozdel_text.split( /(?:%09|%0A|%0D|%20)+/ );
|
||||
for ( var j = 0; j < slova.length; j++ ) {
|
||||
slova[j] = unescape(slova[j]);
|
||||
}
|
||||
|
||||
for ( var i = 0; i < prikazy.seznam.length ; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( (rezim_hlavicka && prikaz.systemovy)
|
||||
|| !rezim_hlavicka ) {
|
||||
// Rozpoznání
|
||||
if ( prikaz.rozpoznavac ) {
|
||||
rozpoznano.nastav(
|
||||
prikaz.rozpoznavac(rezim_hlavicka, prikaz, text, slova) );
|
||||
} else {
|
||||
rozpoznano.nastav(
|
||||
prikazy.rozpoznavac.obecny(rezim_hlavicka, prikaz, text, slova) );
|
||||
}
|
||||
if ( rozpoznano.je_hodnota() || rozpoznano.byla_chyba() ) break;
|
||||
}
|
||||
}
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// Zpracování hlavičky
|
||||
prikazy.rozpoznavac.zpracuj_hlavicku = function (radkovac, obsah)
|
||||
{
|
||||
var rozpoznano = new Vysledek();
|
||||
var telo = new Array();
|
||||
while ( radkovac.je_dalsi_radka() ) {
|
||||
var text = radkovac.dalsi_radka();
|
||||
|
||||
rozpoznano.nastav( this.najdi_prikaz(true, text) );
|
||||
if ( rozpoznano.je_konec() ) {
|
||||
radkovac.nastala_chyba();
|
||||
return rozpoznano;
|
||||
}
|
||||
if ( rozpoznano.je_hodnota() ) {
|
||||
// Nalezen příkaz hlavičky
|
||||
ladici_vypis( LADENI, "prikazy.rozpoznavac.zpracuj_hlavicku",
|
||||
"nalezen příkaz před hlavičkou: " + rozpoznano.hodnota[0] );
|
||||
telo.push( rozpoznano.hodnota );
|
||||
prikazy.formatovac.zformatuj_radku( rozpoznano.hodnota, obsah );
|
||||
} else if ( text.length > 0 ) {
|
||||
// Nalezen název příkazu
|
||||
rozpoznano.nastav(false, Vysledek.NIC, { jmeno: text, telo: telo });
|
||||
obsah.pridej( text );
|
||||
obsah.odsad();
|
||||
return rozpoznano;
|
||||
}
|
||||
}
|
||||
ladici_vypis( CHYBA, "prikazy.rozpoznavac.zpracuj_hlavicku",
|
||||
"nenalezen název příkazu" );
|
||||
rozpoznano.nastav(new Chyba(true,
|
||||
"Nebyl nalezen žádný příkaz, který bych mohl uložit."));
|
||||
rozpoznano.zobraz_chybu();
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// Zpracování těla
|
||||
prikazy.rozpoznavac.zpracuj_telo = function (radkovac, obsah,
|
||||
tento_prikaz, stary_prikaz)
|
||||
{
|
||||
var rozpoznano = new Vysledek();
|
||||
var telo = new Array();
|
||||
while ( radkovac.je_dalsi_radka() ) {
|
||||
var text = radkovac.dalsi_radka();
|
||||
|
||||
if ( !rozpoznano.je_konec() ) {
|
||||
if ( text == tento_prikaz.jmeno ) {
|
||||
// Upřednostnění rekurze
|
||||
telo.push( [ tento_prikaz ] );
|
||||
obsah.pridej( text );
|
||||
} else {
|
||||
rozpoznano.nastav( this.zpracuj_radku_tela(text, tento_prikaz, stary_prikaz) );
|
||||
if ( rozpoznano.je_konec() ) {
|
||||
obsah.nastala_chyba();
|
||||
radkovac.nastala_chyba();
|
||||
obsah.pridej( text );
|
||||
continue;
|
||||
} else if ( rozpoznano.je_hodnota() ) {
|
||||
// Nalezený příkaz
|
||||
telo.push( rozpoznano.hodnota );
|
||||
prikazy.formatovac.zformatuj_radku( rozpoznano.hodnota, obsah );
|
||||
} else {
|
||||
// Vnitřní chyba.
|
||||
// Příkaz má buď hodnotu, nebo je konec (kvůli chybě), ale nic mezi tím
|
||||
ladici_vypis( CHYBA, "formatovac.zpracuj_telo", rozpoznano,
|
||||
"vnitřní chyba při zpracování řádky příkazu" );
|
||||
alert( "Vnitřní chyba.\n\n" +
|
||||
"Nemá být konec rozpoznávání, ale příkaz se nepodařilo rozpoznat.\n" +
|
||||
"Informujte prosím autora o této chybě, nejlépe i o postupu " +
|
||||
"vzniku této chyby." );
|
||||
}
|
||||
} // end if ( text == tento_prikaz.jmeno)
|
||||
} else { // else if ( rozpoznano.byla_chyba() )
|
||||
obsah.pridej(text);
|
||||
} // end if ( !rozpoznano.byla_chyba() )
|
||||
}
|
||||
rozpoznano.nastav(false, Vysledek.NIC, { telo: telo });
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// Zpracování jedné řádky těla příkazu
|
||||
prikazy.rozpoznavac.zpracuj_radku_tela = function (text, tento_prikaz, stary_prikaz)
|
||||
{
|
||||
var rozpoznano = new Vysledek();
|
||||
rozpoznano.nastav( this.najdi_prikaz(false, text) );
|
||||
if ( !rozpoznano.je_konec() ) {
|
||||
if ( rozpoznano.je_hodnota() ) {
|
||||
// Nalezený příkaz
|
||||
if ( rozpoznano.hodnota[0] == stary_prikaz ) {
|
||||
// Nový příkaz má jiný název, než původní, a rekurze
|
||||
// používá starý název
|
||||
ladici_vypis( LADENI, "prikazy.rozpoznavac.rozpoznej",
|
||||
"rekurze s původním názvem: " + text );
|
||||
rozpoznano.nastav( new Chyba(true,
|
||||
"Příkaz volá sám sebe původním názvem " + text + ".") );
|
||||
}
|
||||
} else {
|
||||
// Neznámý příkaz
|
||||
ladici_vypis( LADENI, "prikazy.rozpoznavac.rozpoznej",
|
||||
"nalezen neznámý příkaz: " + text );
|
||||
var uzivatel_chce = window.confirm(
|
||||
"Při čtení příkazu " + tento_prikaz.jmeno +
|
||||
" byl nalezen neznámý příkaz " + text + ".\n\n" +
|
||||
"Přejete si ho vytvořit?");
|
||||
if ( uzivatel_chce ) {
|
||||
var novy_prikaz = prikazy.pridej_novy(text);
|
||||
rozpoznano.nastav( false, Vysledek.NIC, [ novy_prikaz ] );
|
||||
} else {
|
||||
rozpoznano.nastav(
|
||||
new Chyba(true, "Nalezen neznámý příkaz " + text + ".") );
|
||||
}
|
||||
}
|
||||
}
|
||||
return rozpoznano;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Jednotlivé rozpoznávače příkazů ~=======================================
|
||||
|
||||
// Obecný rozpoznávač
|
||||
prikazy.rozpoznavac.obecny = function (rezim_hlavicka, prikaz, text, slova)
|
||||
{
|
||||
if ( text == prikaz.jmeno ) {
|
||||
if ( rezim_hlavicka ) {
|
||||
if ( prikaz.systemovy ) {
|
||||
if ( ! prikaz.ignoruj ) {
|
||||
var detail;
|
||||
if ( prikaz == prikazy.KONEC || prikaz == prikazy.KONEC_JINAK ) {
|
||||
detail = "KONEC a KONEC, JINAK se používají "+
|
||||
"v podmínkách a cyklech.";
|
||||
} else {
|
||||
detail = "Jedná se o systémový příkaz.";
|
||||
}
|
||||
return prikazy.vrat_chybu_jmena( text, detail );
|
||||
} else if ( prikaz.hlavicka ) {
|
||||
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Rozpoznávač prázdné řádky
|
||||
prikazy.rozpoznavac.prazdna_radka = function (rezim_hlavicka, prikaz, text,
|
||||
slova)
|
||||
{
|
||||
if ( text == "" ) {
|
||||
return new Vysledek( false, Vysledek.NIC, [ prikaz ] );
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Rozpoznávač komentáře
|
||||
prikazy.rozpoznavac.komentar = function (rezim_hlavicka, prikaz, text, slova)
|
||||
{
|
||||
if ( text.charAt(0) == ';' ) {
|
||||
if (
|
||||
rezim_hlavicka && prikaz.hlavicka ||
|
||||
!rezim_hlavicka && !prikaz.hlavicka
|
||||
) {
|
||||
return new Vysledek( false, Vysledek.NIC,
|
||||
[ prikaz, text.slice(1) ] );
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Rozpoznání názvu
|
||||
prikazy.rozpoznavac.nazev = function (rezim_hlavicka, prikaz, text, slova)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Rozpoznání podmínky v příkazech KDYŽ, DOKUD a AŽ
|
||||
prikazy.rozpoznavac.podminka = function (rezim_hlavicka, prikaz, text, slova)
|
||||
{
|
||||
if ( slova[0] != prikaz.jmeno ) return null;
|
||||
|
||||
var detail;
|
||||
if ( prikaz == prikazy.DOKUD ) {
|
||||
detail = [ "cyklus", "Cyklus", "správný", " cyklu" ];
|
||||
} else {
|
||||
detail = [ "podmínka", "Podmínka", "správná", "" ];
|
||||
}
|
||||
|
||||
// Kontrola v názvu příkazu a základní kontrola syntaxe
|
||||
if ( rezim_hlavicka ) {
|
||||
return prikazy.vrat_chybu_jmena( text,
|
||||
"Příkaz " + prikaz.jmeno + " se používá jako " + detail[0] + "." );
|
||||
} else if ( slova.length < 2 || slova.length > 3 ) {
|
||||
return prikazy.vrat_chybu_radky(text,
|
||||
detail[1] + " není " + detail[2] + ". " +
|
||||
"Na příkaz " + prikaz.jmeno + " se prosím koukněte do nápovědy." );
|
||||
} else if ( slova.length == 3 && slova[1] != prikazy.JE
|
||||
&& slova[1] != prikazy.NENI ) {
|
||||
return prikazy.vrat_chybu_radky(text,
|
||||
"Druhé slovo v podmínce " + detail[3] + " (pokud je přítomno) musí být " +
|
||||
prikazy.JE + " nebo " + prikazy.NENI + ", nikoliv " + slova[1] + "." );
|
||||
}
|
||||
|
||||
// Převedení podmínky na číslo
|
||||
var podminka = slova.pop();
|
||||
for ( var i = 0; i < prikazy.podminky.length; i++ ) {
|
||||
if ( prikazy.podminky[i].jmeno == podminka ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( i == prikazy.podminky.length ) {
|
||||
return prikazy.vrat_chybu_radky(text, "Příkaz obsahuje neznámou podmínku.");
|
||||
}
|
||||
|
||||
// Podmínka je nenulová. Negace podmínky je vyjádřená záporným číslem
|
||||
i++;
|
||||
if ( slova.length == 2 && slova[1] == prikazy.NENI ) i *= -1;
|
||||
|
||||
return new Vysledek(false, Vysledek.NIC, [prikaz, i] );
|
||||
}
|
||||
|
||||
// Rozpoznání podmínky
|
||||
prikazy.rozpoznavac.cyklus = function (rezim_hlavicka, prikaz, text, slova)
|
||||
{
|
||||
if ( slova[0] != prikaz.jmeno ) return null;
|
||||
if ( rezim_hlavicka ) {
|
||||
return prikazy.vrat_chybu_jmena( text,
|
||||
"Příkaz " + prikaz.jmeno + " se používá jako cyklus." );
|
||||
}
|
||||
|
||||
var vyraz = new RegExp(
|
||||
"^" + escape(prikaz.jmeno) +
|
||||
"((%09|%0A|%0D|%20)(-?\\d+)(%09|%0A|%0D|%20)?-?(%09|%0A|%0D|%20)?(" +
|
||||
prikazy.KRAT_text + ")?)?$" );
|
||||
var rozpoznano = vyraz.exec(escape(text));
|
||||
if ( ! rozpoznano ) {
|
||||
return prikazy.vrat_chybu_radky(text, "Za příkazem " + prikaz.jmeno +
|
||||
" by měl následovat počet opakování jako počet-KRÁT " +
|
||||
"(-KRÁT může být vynecháno).\n" +
|
||||
"Bez uvedení počtu opakování se opakují příkazy po odpovídající " +
|
||||
"AŽ nebo KONEC.");
|
||||
} else if ( rozpoznano[3] < 0 ) {
|
||||
return prikazy.vrat_chybu_radky(text, "Počet opakování musí být kladný." );
|
||||
}
|
||||
if ( rozpoznano[3] == undefined || rozpoznano[3].length == 0 ) {
|
||||
return new Vysledek(false, Vysledek.NIC, [prikaz]);
|
||||
} else {
|
||||
return new Vysledek(false, Vysledek.NIC, [prikaz, rozpoznano[3]]);
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Řízení kontroly syntaxe ~===============================================
|
||||
|
||||
// Kontrola syntaxe. Vrací objekt Vysledek s nastavenou hodnotou - řádkou chyby
|
||||
prikazy.formatovac.kontrola_syntaxe = function (prikaz)
|
||||
{
|
||||
var stav = new prikazy.Stav;
|
||||
var vysledek = new Vysledek();
|
||||
vysledek.nastav( stav.kontrola_syntaxe( prikaz, true ) );
|
||||
if ( !vysledek.byla_chyba() ) {
|
||||
vysledek.nastav( false, Vysledek.NIC, stav.pozice );
|
||||
}
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Funkce formátování příkazů ~============================================
|
||||
|
||||
// Formátovač příkazu pro ostatní moduly. Vrací syntaktickou chybu
|
||||
prikazy.formatovac.zformatuj_prikaz = function (prikaz, obsah)
|
||||
{
|
||||
var vysledek = new Vysledek();
|
||||
var radka_chyby = undefined;
|
||||
vysledek.nastav( this.kontrola_syntaxe( prikaz ) );
|
||||
if ( vysledek.byla_chyba() ) {
|
||||
if ( vysledek.hodnota && vysledek.hodnota.prikaz == prikaz ) {
|
||||
radka_chyby = vysledek.hodnota.cislo_radky;
|
||||
ladici_vypis( CHYBA, "formatovac.zformatuj_prikaz", prikaz.jmeno,
|
||||
"syntaktická chyba na řádce " + (radka_chyby+1) );
|
||||
vysledek.chyba.formatuj = function (text) {
|
||||
return prikazy.formatuj_chybu_syntaxe( text, prikaz.telo.length,
|
||||
radka_chyby );
|
||||
}
|
||||
} else {
|
||||
ladici_vypis( CHYBA, "formatovac.zformatuj_prikaz", vysledek.hodnota,
|
||||
"vnitřní chyba po syntaktické kontrole" );
|
||||
alert( "Vnitřní chyba.\n\n" +
|
||||
"Nalezena syntaktická chyba, ale nejsou o ní informace.\n" +
|
||||
"Informujte prosím autora o této chybě, nejlépe i o postupu " +
|
||||
"vzniku této chyby." );
|
||||
}
|
||||
}
|
||||
|
||||
vysledek.nastav( this.zformatuj_telo( prikaz, obsah, radka_chyby ) );
|
||||
return vysledek;
|
||||
}
|
||||
|
||||
// Hlavní formátovač těla příkazu
|
||||
prikazy.formatovac.zformatuj_telo = function (prikaz, obsah, radka_chyby)
|
||||
{
|
||||
for ( var i = 0; i < prikaz.telo.length; i++ ) {
|
||||
if ( radka_chyby == i ) obsah.nastala_chyba();
|
||||
this.zformatuj_radku( prikaz.telo[i], obsah );
|
||||
}
|
||||
return new Vysledek(false, Vysledek.NIC, { cislo_radky: (radka_chyby+1) });
|
||||
}
|
||||
|
||||
// Formátování jedné řádky
|
||||
prikazy.formatovac.zformatuj_radku = function (radka, obsah)
|
||||
{
|
||||
if ( radka[0].formatovac ) {
|
||||
radka[0].formatovac( obsah, radka );
|
||||
} else {
|
||||
prikazy.formatovac.obecny( obsah, radka );
|
||||
}
|
||||
}
|
||||
|
||||
// Speciální formátování jednoho příkazu. Výstup je ve formátu unescape()
|
||||
prikazy.formatovac.zformatuj_jednu_radku = function (radka)
|
||||
{
|
||||
var obsah = new Obsah();
|
||||
this.zformatuj_radku(radka, obsah);
|
||||
return unescape(obsah.obsah());
|
||||
}
|
||||
|
||||
// Obecný formátovač (běžné příkazy a prázdná řádka)
|
||||
prikazy.formatovac.obecny = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej(radka[0].jmeno);
|
||||
}
|
||||
|
||||
// Formátovač prázdné řádky
|
||||
prikazy.formatovac.prazdna_radka = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej("");
|
||||
}
|
||||
|
||||
// Formátovač komentáře
|
||||
prikazy.formatovac.komentar = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej(";" + radka[1]);
|
||||
}
|
||||
|
||||
// Formátovač s odsazením
|
||||
prikazy.formatovac.odsazeni = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej(radka[0].jmeno);
|
||||
obsah.odsad();
|
||||
}
|
||||
|
||||
// Formátovač s předsazením
|
||||
prikazy.formatovac.predsazeni = function (obsah, radka)
|
||||
{
|
||||
obsah.predsad();
|
||||
obsah.pridej(radka[0].jmeno);
|
||||
}
|
||||
|
||||
// Jádro formátovače podmínky
|
||||
prikazy.formatuj_podminku = function (radka)
|
||||
{
|
||||
var je_neni = (radka[1] > 0?prikazy.JE:prikazy.NENI);
|
||||
return radka[0].jmeno + " " + je_neni + " " +
|
||||
prikazy.podminky[Math.abs(radka[1])-1].jmeno;
|
||||
}
|
||||
|
||||
// Formátovač podmínky
|
||||
prikazy.formatovac.podminka = function (obsah, radka)
|
||||
{
|
||||
if ( radka[0] == prikazy.AZ ) obsah.predsad();
|
||||
obsah.pridej( prikazy.formatuj_podminku(radka) );
|
||||
if ( radka[0] != prikazy.AZ ) obsah.odsad();
|
||||
}
|
||||
|
||||
// Jádro formátovače podmínky
|
||||
prikazy.formatuj_cyklus = function (radka)
|
||||
{
|
||||
var pocet = (radka.length == 2? " "+radka[1]+prikazy._KRAT :"");
|
||||
return radka[0].jmeno + pocet;
|
||||
}
|
||||
|
||||
// Formátovač cyklu
|
||||
prikazy.formatovac.cyklus = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej( prikazy.formatuj_cyklus(radka) );
|
||||
obsah.odsad();
|
||||
}
|
||||
|
||||
// Formátovač konců
|
||||
prikazy.formatovac.konec = function (obsah, radka)
|
||||
{
|
||||
obsah.predsad();
|
||||
obsah.pridej( radka[0].jmeno );
|
||||
if ( radka[0] == prikazy.KONEC_JINAK ) obsah.odsad();
|
||||
}
|
||||
|
||||
// Formátovač názvu
|
||||
prikazy.formatovac.nazev = function (obsah, radka)
|
||||
{
|
||||
obsah.pridej( radka[1].jmeno );
|
||||
obsah.odsad();
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar editoru příkazů
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování editoru příkazů ~==========================================
|
||||
|
||||
document.write('<div class="editor">');
|
||||
|
||||
document.write('<div class="nadpis">Příkazové pole</div>');
|
||||
|
||||
document.write('<div class="nastroje">');
|
||||
for ( var i = 0; i < editor.nastroje.length; i++ ) {
|
||||
var nastroj = editor.nastroje[i];
|
||||
if ( nastroj != null ) {
|
||||
tvoric.zapis_tlacitko(false, editor.nastroje.id_prefix+nastroj[0],
|
||||
editor.nastroje.mys, '\''+nastroj[0]+'\'',
|
||||
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
|
||||
} else {
|
||||
tvoric.zapis_tlacitko(true);
|
||||
}
|
||||
}
|
||||
document.write('</div>');
|
||||
document.write('<span class="zobrazeny">Zobrazený příkaz:</span>');
|
||||
document.write('<span id="zobrazeny-prikaz">');
|
||||
document.write('<span id="zmeneny-prikaz"></span></span>');
|
||||
|
||||
document.write('<div class="ramecek">');
|
||||
document.write('<div class="textarea">');
|
||||
document.write('<textarea rows="16" cols="50" id="editace" wrap="off" ');
|
||||
document.write('onchange=\'editor.nastav_zmenu();\'></textarea>');
|
||||
document.write('</div>');
|
||||
document.write('</div>');
|
||||
|
||||
document.write('</div>');
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení editoru ~============================================
|
||||
|
||||
editor.prikaz_novy(true);
|
||||
|
||||
// Kvůli Konqueroru, který obnovuje obsahy textových polí po svém...
|
||||
po_spusteni( function() { editor.prikaz_novy(true); } );
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar slovníku
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování slovníku ~=================================================
|
||||
|
||||
document.write('<div class="slovnik">');
|
||||
|
||||
document.write('<div class="nadpis">Slovník (Karel verze ' +
|
||||
verze_karla + ')</div>');
|
||||
document.write('<div class="ramecek">' +
|
||||
'<div id="zobrazene" class="spustit"></div></div>');
|
||||
|
||||
document.write('<div class="nastroje">');
|
||||
for ( var i = 0; i < prikazy.nastroje.length; i++ ) {
|
||||
var nastroj = prikazy.nastroje[i];
|
||||
if ( nastroj != null ) {
|
||||
tvoric.zapis_tlacitko(false, prikazy.nastroje.id_prefix+nastroj[0],
|
||||
prikazy.nastroje.mys, '\''+nastroj[0]+'\'',
|
||||
'{ikona:\''+nastroj[1]+'\',nadpis:\''+nastroj[2]+'\',popis:\''+nastroj[3]+'\'}');
|
||||
} else {
|
||||
tvoric.zapis_tlacitko(true);
|
||||
}
|
||||
}
|
||||
document.write('</div>');
|
||||
document.write('<span class="vybrany">Vybraný příkaz:</span>');
|
||||
document.write('<span id="vybrany-prikaz">'+prikazy.zadny_prikaz+'</span>');
|
||||
|
||||
document.write('</div>');
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení slovníku ~===========================================
|
||||
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if ( prikaz.zobrazit ) {
|
||||
prikazy.pridej( prikaz );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - slovník
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Příkazy
|
||||
//
|
||||
// Každý příkaz má následující vlastnosti:
|
||||
//
|
||||
// jmeno jméno příkazu
|
||||
// systemovy true, pokud se jedná o systémový příkaz
|
||||
// zobrazit true, pokud má být příkaz zobrazen
|
||||
// ignoruj true, pokud příkaz neprovádí žádnou činnost
|
||||
// hlavicka true, pokud se příkaz může vyskytovat v hlavičce (před
|
||||
// názvem příkazu)
|
||||
// telo pole jednotlivých řádek. Jedna řádka příkazu je pole dvou
|
||||
// hodnot - příkazu a parametrů
|
||||
// syntaxe true, pokud příkaz vyžaduje kontrolu syntaxe (všechny
|
||||
// příkazy, které neprovádí žádnou činnost)
|
||||
// tooltip text nápovědy (není povinné)
|
||||
// spust vykonání příkazu, provádí i kontrolu syntaxe (když je
|
||||
// atribut syntaxe nastaven na true)
|
||||
// formatovac formátování příkazu. Pokud chybí, použije se obecný
|
||||
// formátovač
|
||||
// rozpoznavac rozpoznání příkazu. Pokud chybí, použije se obecný
|
||||
// rozpoznávač
|
||||
// ukladac ukládání příkazu. Pokud chybí, použije se obecní funkce
|
||||
// ukládání
|
||||
// kompatibilita verze, které příkaz znají
|
||||
// verze_ulozeni verze, ve kterých se příkaz ukládá. Pokud se v dané verzi
|
||||
// neukládá, je zobrazeno varování. Pokud se má uložit, ale
|
||||
// příkaz není s verzí kompatibilní, je zobrazena chyba. Pokud
|
||||
// se má uložit a je s verzí kompatibilní, pak se ukládá
|
||||
// prikaz true, pokud se jedná o příkaz. Pouze pro systémové příkazy
|
||||
// a to jen pro zobrazení v chybové hlášce
|
||||
//
|
||||
// Navíc existuje pro každý příkaz prikazy.prikaz["PŘÍKAZ"]
|
||||
//
|
||||
prikazy.seznam = new Array(
|
||||
{ jmeno: "prázdná řádka", systemovy: true, zobrazit: false, ignoruj: true,
|
||||
hlavicka: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.prazdna_radka,
|
||||
formatovac: prikazy.formatovac.prazdna_radka,
|
||||
kompatibilita: prikazy.min_VERZE_20,
|
||||
verze_ulozeni: prikazy.min_VERZE_20
|
||||
},
|
||||
{ jmeno: "komentář", systemovy: true, zobrazit: false, ignoruj: true,
|
||||
hlavicka: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.komentar,
|
||||
formatovac: prikazy.formatovac.komentar,
|
||||
ukladac: data.ukladani.uloz_komentar,
|
||||
nacitac: data.nacitani.nacti_komentar,
|
||||
kompatibilita: prikazy.min_VERZE_20,
|
||||
verze_ulozeni: prikazy.min_VERZE_20
|
||||
},
|
||||
{ jmeno: "název příkazu", systemovy: true, zobrazit: false, ignoruj: true,
|
||||
hlavicka: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.nazev,
|
||||
formatovac: prikazy.formatovac.nazev,
|
||||
ukladac: data.ukladani.uloz_nazev,
|
||||
nacitac: data.nacitani.nacti_nazev,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_20
|
||||
},
|
||||
{ jmeno: "prázdná řádka", systemovy: true, zobrazit: false, ignoruj: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.prazdna_radka,
|
||||
formatovac: prikazy.formatovac.prazdna_radka,
|
||||
kompatibilita: prikazy.min_VERZE_20,
|
||||
verze_ulozeni: prikazy.min_VERZE_20
|
||||
},
|
||||
{ jmeno: "komentář", systemovy: true, zobrazit: false, ignoruj: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.komentar,
|
||||
formatovac: prikazy.formatovac.komentar,
|
||||
ukladac: data.ukladani.uloz_komentar,
|
||||
nacitac: data.nacitani.nacti_komentar,
|
||||
kompatibilita: prikazy.min_VERZE_20,
|
||||
verze_ulozeni: prikazy.min_VERZE_20
|
||||
},
|
||||
{ jmeno: "KONEC, JINAK", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.KONEC_JINAK,
|
||||
syntaxe: true,
|
||||
formatovac: prikazy.formatovac.konec,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "KONEC", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.KONEC,
|
||||
syntaxe: true,
|
||||
formatovac: prikazy.formatovac.konec,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "KDYŽ", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.KDYZ,
|
||||
syntaxe: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.podminka,
|
||||
formatovac: prikazy.formatovac.podminka,
|
||||
nacitac: data.nacitani.nacti_podminku,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "DOKUD", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.DOKUD,
|
||||
syntaxe: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.podminka,
|
||||
formatovac: prikazy.formatovac.podminka,
|
||||
nacitac: data.nacitani.nacti_podminku,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "OPAKUJ", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.OPAKUJ,
|
||||
syntaxe: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.cyklus,
|
||||
formatovac: prikazy.formatovac.cyklus,
|
||||
ukladac: data.ukladani.uloz_OPAKUJ,
|
||||
nacitac: data.nacitani.nacti_OPAKUJ,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "AŽ", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.AZ,
|
||||
syntaxe: true,
|
||||
rozpoznavac: prikazy.rozpoznavac.podminka,
|
||||
formatovac: prikazy.formatovac.podminka,
|
||||
nacitac: data.nacitani.nacti_podminku,
|
||||
kompatibilita: prikazy.min_VERZE_11,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "RYCHLE", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.RYCHLE,
|
||||
syntaxe: true,
|
||||
formatovac: prikazy.formatovac.odsazeni,
|
||||
kompatibilita: prikazy.min_VERZE_12,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "POMALU", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.POMALU,
|
||||
syntaxe: true,
|
||||
formatovac: prikazy.formatovac.predsazeni,
|
||||
kompatibilita: prikazy.min_VERZE_12,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "STOP", systemovy: true, zobrazit: false,
|
||||
spust: prikazy.jadro.STOP,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true
|
||||
},
|
||||
{ jmeno: "KROK", systemovy: true, zobrazit: true,
|
||||
spust: prikazy.jadro.KROK,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true,
|
||||
tooltip: "Posune Karla o jedno políčko dopředu"
|
||||
},
|
||||
{ jmeno: "VLEVO-VBOK", systemovy: true, zobrazit: true,
|
||||
spust: prikazy.jadro.VLEVO_VBOK,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true,
|
||||
tooltip: "Otočí Karla jednou vlevo"
|
||||
},
|
||||
{ jmeno: "POLOŽ", systemovy: true, zobrazit: true,
|
||||
spust: prikazy.jadro.POLOZ,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true,
|
||||
tooltip: "Karel položí jednu značku, pokud je na políčku místo"
|
||||
},
|
||||
{ jmeno: "ZVEDNI", systemovy: true, zobrazit: true,
|
||||
spust: prikazy.jadro.ZVEDNI,
|
||||
kompatibilita: prikazy.min_VERZE_10,
|
||||
verze_ulozeni: prikazy.min_VERZE_10,
|
||||
prikaz: true,
|
||||
tooltip: "Karel zvedne jednu značku, pokud na políčku nějaká je"
|
||||
}
|
||||
);
|
||||
|
||||
// Příkazy přístupné podle jména
|
||||
prikazy.prikaz = new Object();
|
||||
|
||||
// Textové řetězce spojené s příkazy
|
||||
prikazy.JE = "JE";
|
||||
prikazy.NENI = "NENÍ";
|
||||
prikazy.KRAT = "KRÁT";
|
||||
prikazy.KRAT_text = escape(prikazy.KRAT);
|
||||
prikazy._KRAT = "-" + prikazy.KRAT;
|
||||
prikazy.podminky = [
|
||||
{ jmeno: "ZEĎ", test: mesto.JE_ZED },
|
||||
{ jmeno: "ZNAČKA", test: mesto.JE_ZNACKA },
|
||||
{ jmeno: "DOMOV", test: mesto.JE_DOMOV },
|
||||
{ jmeno: "VÝCHOD", test: mesto.JE_VYCHOD },
|
||||
{ jmeno: "SEVER", test: mesto.JE_SEVER },
|
||||
{ jmeno: "ZÁPAD", test: mesto.JE_ZAPAD },
|
||||
{ jmeno: "JIH", test: mesto.JE_JIH }
|
||||
];
|
||||
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
for ( var i = 0; i < prikazy.seznam.length; i++ ) {
|
||||
var prikaz = prikazy.seznam[i];
|
||||
if (! (prikaz.jmeno in prikazy.prikaz)) {
|
||||
prikazy.prikaz[prikaz.jmeno] = prikaz;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Příkazové konstanty ~===================================================
|
||||
|
||||
prikazy.HLAVICKA_KOMENTAR = prikazy.prikaz["komentář"];
|
||||
prikazy.HLAVICKA_PRAZDNA_RADKA = prikazy.prikaz["prázdná řádka"];
|
||||
prikazy.NAZEV = prikazy.prikaz["název příkazu"];
|
||||
prikazy.KONEC_JINAK = prikazy.prikaz["KONEC, JINAK"];
|
||||
prikazy.KONEC = prikazy.prikaz["KONEC"];
|
||||
prikazy.KDYZ = prikazy.prikaz["KDYŽ"];
|
||||
prikazy.DOKUD = prikazy.prikaz["DOKUD"];
|
||||
prikazy.OPAKUJ = prikazy.prikaz["OPAKUJ"];
|
||||
prikazy.AZ = prikazy.prikaz["AŽ"];
|
||||
prikazy.RYCHLE = prikazy.prikaz["RYCHLE"];
|
||||
prikazy.POMALU = prikazy.prikaz["POMALU"];
|
||||
prikazy.STOP = prikazy.prikaz["STOP"];
|
||||
prikazy.KROK = prikazy.prikaz["KROK"];
|
||||
prikazy.VLEVO_VBOK = prikazy.prikaz["VLEVO_VBOK"];
|
||||
prikazy.POLOZ = prikazy.prikaz["POLOŽ"];
|
||||
prikazy.ZVEDNI = prikazy.prikaz["ZVEDNI"];
|
||||
@@ -0,0 +1,404 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - funkce pro práci se styly
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Tovární nastavení ~=====================================================
|
||||
|
||||
// Styl nastavený uživatelem
|
||||
nastaveni.styl = hodnota_cookie("styl");
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Názvy alternativních stylů
|
||||
styly = new Array();
|
||||
|
||||
// Všechny pojmenované styly
|
||||
styly.pojmenovane_styly = new Array();
|
||||
|
||||
// Všechny obrázky ve všech stylech
|
||||
styly.obrazky = new Array();
|
||||
styly.posledni_obrazek = undefined;
|
||||
styly.pridane_obrazky = " ";
|
||||
|
||||
// Stav nahrávání
|
||||
styly.NAHRANO = 0;
|
||||
styly.CHYBA = 1;
|
||||
styly.ZRUSENO = 2;
|
||||
|
||||
// Všechny soubory se styly, pokud se nepodařilo zjistit obrázky
|
||||
styly.soubory = new Array();
|
||||
styly.posledni_soubor = undefined;
|
||||
styly.pridane_soubory = " ";
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
// Zjisti všechny styly v dokumentu
|
||||
var linky = document.getElementsByTagName("link");
|
||||
var link_styly = new Array();
|
||||
var nacteno = " ";
|
||||
for ( var i = 0; i < linky.length; i++ ) {
|
||||
if ( linky[i].getAttribute("rel").indexOf("stylesheet") != -1 ) {
|
||||
link_styly.push( linky[i] );
|
||||
var jmeno;
|
||||
if ( (jmeno=linky[i].getAttribute("title")) ) {
|
||||
styly.pojmenovane_styly.push( linky[i] );
|
||||
var jmeno_esc = escape(jmeno);
|
||||
if ( nacteno.indexOf(" "+jmeno_esc+" ") == -1 ) {
|
||||
var id=linky[i].getAttribute("id");
|
||||
if ( nastaveni.styl == null ) {
|
||||
nastaveni.styl = jmeno;
|
||||
}
|
||||
styly.push( {jmeno:jmeno, trida:id} );
|
||||
nacteno += jmeno_esc+" ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Načti všechny obrázky ~=================================================
|
||||
|
||||
// Přidá obrázek do fronty, pokud ještě nebyl přidán
|
||||
styly.pridej_obrazek = function (obrazek)
|
||||
{
|
||||
var escape_url = escape(obrazek.url);
|
||||
if ( styly.pridane_obrazky.indexOf(" "+escape_url+" ") == -1 ) {
|
||||
styly.obrazky.push(obrazek);
|
||||
styly.pridane_obrazky += escape_url + " ";
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Připraví obrázek na automatické stažení na pozadí
|
||||
styly.priprav_obrazek = function (url)
|
||||
{
|
||||
var obrazek = new Image();
|
||||
obrazek.onload = function () {
|
||||
window.setTimeout(function () { styly.dalsi_obrazek(styly.NAHRANO); }, 0);
|
||||
}
|
||||
obrazek.onerror = function () {
|
||||
window.setTimeout(function () { styly.dalsi_obrazek(styly.CHYBA); }, 0);
|
||||
}
|
||||
obrazek.onabort = function () {
|
||||
window.setTimeout(function () { styly.dalsi_obrazek(styly.ZRUSENO); }, 0);
|
||||
}
|
||||
return { url: url, obrazek: obrazek };
|
||||
}
|
||||
|
||||
// Spouští stahování obrázku (dalšího) na pozadí
|
||||
styly.dalsi_obrazek = function (posledni_stav)
|
||||
{
|
||||
if ( this.posledni_obrazek == undefined ) {
|
||||
if ( !this.obrazky.length ) {
|
||||
return;
|
||||
}
|
||||
this.posledni_obrazek = 0;
|
||||
} else {
|
||||
if ( posledni_stav == styly.NAHRANO ) {
|
||||
ladici_vypis(DETAIL, "styly.dalsi_obrazek",
|
||||
this.obrazky[this.posledni_obrazek].url, "nahráno");
|
||||
this.posledni_obrazek++;
|
||||
} else {
|
||||
if ( posledni_stav == styly.CHYBA ) {
|
||||
ladici_vypis(CHYBA, "styly.dalsi_obrazek",
|
||||
this.obrazky[this.posledni_obrazek].url,
|
||||
"nepodařilo se nahrát obrázek");
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "styly.dalsi_obrazek",
|
||||
this.obrazky[this.posledni_obrazek].url, "zrušeno");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( this.posledni_obrazek >= this.obrazky.length ) {
|
||||
if ( this.obrazky.length ) {
|
||||
ladici_vypis(INFORMACE, "styly.dalsi_obrazek", "nahráno " +
|
||||
this.obrazky.length + " obrázků do vyrovnávací paměti");
|
||||
}
|
||||
return;
|
||||
}
|
||||
var obrazek = this.obrazky[this.posledni_obrazek];
|
||||
if ( ! obrazek ) return;
|
||||
obrazek.obrazek.src = obrazek.url;
|
||||
}
|
||||
|
||||
styly.notifikace_nahravace = function ()
|
||||
{
|
||||
if ( styly.posledni_soubor >= styly.soubory.length ) return;
|
||||
|
||||
var soubor = styly.soubory[styly.posledni_soubor];
|
||||
if ( soubor.notifikovano ) return;
|
||||
|
||||
var nahravac = styly.soubory[styly.posledni_soubor].nahravac;
|
||||
if ( nahravac.readyState == 4 ) {
|
||||
soubor.notifikovano = true;
|
||||
if ( nahravac.status == 200 || nahravac.status == 304
|
||||
|| ( nahravac.status == 0 && nahravac.responseText ) ) {
|
||||
setTimeout( function() { styly.dalsi_soubor(styly.NAHRANO); }, 0 );
|
||||
} else {
|
||||
setTimeout( function() { styly.dalsi_soubor(styly.CHYBA); }, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vlastní zpracování CSS ~================================================
|
||||
|
||||
// Přidá soubor do fronty, pokud ještě nebyl přidán
|
||||
styly.pridej_soubor = function (url)
|
||||
{
|
||||
var escape_url = escape(url);
|
||||
if ( styly.pridane_soubory.indexOf(" "+escape_url+" ") == -1 ) {
|
||||
styly.soubory.push( { url: url } );
|
||||
styly.pridane_soubory += escape_url + " ";
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Započítej soubor do souborů ve frontě
|
||||
styly.zapocitej_soubor = function (url)
|
||||
{
|
||||
var escape_url = escape(url);
|
||||
if ( styly.pridane_soubory.indexOf(" "+escape_url+" ") == -1 ) {
|
||||
styly.pridane_soubory += escape_url + " ";
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Spouští stahování obrázku (dalšího) na pozadí
|
||||
styly.dalsi_soubor = function (posledni_stav)
|
||||
{
|
||||
if ( this.posledni_soubor == undefined ) {
|
||||
this.posledni_soubor = 0;
|
||||
} else {
|
||||
var soubor = this.soubory[this.posledni_soubor];
|
||||
var url = soubor.url.slice(soubor.url.indexOf("style/"));
|
||||
var nahravac = soubor.nahravac;
|
||||
if ( posledni_stav == styly.NAHRANO ) {
|
||||
ladici_vypis(DETAIL, "styly.dalsi_soubor", url, "nahráno");
|
||||
this.zpracuj_soubor( url, nahravac.responseText );
|
||||
this.posledni_soubor++;
|
||||
delete soubor.nahravac;
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "styly.dalsi_soubor",
|
||||
soubor.url, "nepodařilo se nahrát");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( this.posledni_soubor >= this.soubory.length ) {
|
||||
if ( this.obrazky.length == 0 ) {
|
||||
ladici_vypis(CHYBA, "styly-funkce",
|
||||
"vyrovnávací paměť obrázků je prázdná, očekávejte různá zpoždění");
|
||||
if ( /^https?:[\/][\/]/.exec(document.URL) ) {
|
||||
alert(
|
||||
"Nelze dopředu načíst všechny obrázky, " +
|
||||
"nenalezena vhodná metoda.\n\nOčekávejte různá zpoždění." );
|
||||
}
|
||||
} else {
|
||||
this.dalsi_obrazek();
|
||||
}
|
||||
return;
|
||||
}
|
||||
var soubor = this.soubory[this.posledni_soubor];
|
||||
if ( soubor && soubor.url ) {
|
||||
soubor.nahravac = ajax.vrat_nahravac();
|
||||
ajax.nahraj_soubor_pozdeji(soubor.nahravac, soubor.url,
|
||||
styly.notifikace_nahravace);
|
||||
}
|
||||
}
|
||||
|
||||
// Zpracování obsahu souboru se styly
|
||||
styly.zpracuj_soubor = function (soubor, obsah)
|
||||
{
|
||||
var pridano = 0;
|
||||
var url_obrazku;
|
||||
var regex = /(-image|filter:progid):[^"']*['"]\.\.\/([^'"]+)['"]/g; // "
|
||||
while ( url_obrazku = regex.exec(obsah) ) {
|
||||
var obrazek = styly.priprav_obrazek( url_obrazku[2] );
|
||||
if ( styly.pridej_obrazek(obrazek) ) {
|
||||
pridano++;
|
||||
}
|
||||
}
|
||||
ladici_vypis(LADENI, "styly.zpracuj_soubor", soubor, "přidáno " + pridano + " obrázků");
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Zjisti všechny obrázky ~================================================
|
||||
|
||||
styly.nahraj_obrazky = function ()
|
||||
{
|
||||
// Které linky byly analyzovány
|
||||
var pocet_analyzovano = 0;
|
||||
|
||||
// Projdi všechny styly a najdi background-image
|
||||
if ( document.styleSheets ) {
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším metodu document.styleSheets");
|
||||
for ( var i = 0; i < document.styleSheets.length; i++ ) {
|
||||
var styleSheet = document.styleSheets[i];
|
||||
var rules = new Array();
|
||||
if ( styleSheet.rules ) rules = styleSheet.rules;
|
||||
if ( !rules && styleSheet.cssRules ) rules = styleSheet.cssRules;
|
||||
if ( !rules ) continue;
|
||||
var nacteno = 0;
|
||||
for ( var j = 0; j < rules.length; j++ ) {
|
||||
var cssRule = rules[j];
|
||||
var style = cssRule.style;
|
||||
if ( typeof(style) != "object" ) continue;
|
||||
|
||||
var url = undefined;
|
||||
if ( style.backgroundImage && style.backgroundImage != "none" ) {
|
||||
url = style.backgroundImage;
|
||||
} else if ( style.filter ) {
|
||||
url = style.filter;
|
||||
}
|
||||
|
||||
if ( url && url.length > 4 ) {
|
||||
url = url.slice(url.indexOf('images/'));
|
||||
url = url.slice(0, url.indexOf('"'));
|
||||
var obrazek = styly.priprav_obrazek( url );
|
||||
if ( styly.pridej_obrazek(obrazek) ) {
|
||||
nacteno++;
|
||||
}
|
||||
}
|
||||
}
|
||||
var styl = styleSheet.href.slice(styleSheet.href.indexOf('style/'));
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", styl, "nalezeno " + nacteno + " obrázků");
|
||||
|
||||
if ( nacteno && styly.zapocitej_soubor(styleSheet.href) ) {
|
||||
pocet_analyzovano++;
|
||||
}
|
||||
}
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky",
|
||||
"nalezeno " + pocet_analyzovano + " stylových souborů prohlížeče");
|
||||
} else {
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", "metoda document.styleSheets není dostupná");
|
||||
}
|
||||
|
||||
// Alternativní metoda - XMLHttpRequest
|
||||
if ( styly.obrazky.length == 0 || pocet_analyzovano < link_styly.length ) {
|
||||
// Načti všechny styly ručně a najdi v nich background-image
|
||||
if ( ajax.je_funkcni() ) {
|
||||
if ( styly.obrazky.length > 0 ) {
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším dočíst styly metodou XMLHttpRequest");
|
||||
} else {
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", "zkouším metodu XMLHttpRequest");
|
||||
}
|
||||
for ( var i = 0; i < link_styly.length; i++ ) {
|
||||
var url = link_styly[i].href;
|
||||
if ( styly.pridej_soubor(url) ) {
|
||||
var styl = url.slice(url.indexOf('style/'));
|
||||
ladici_vypis(LADENI, "styly.nahraj_obrazky", styl, "bude načten");
|
||||
pocet_analyzovano++;
|
||||
}
|
||||
}
|
||||
ladici_vypis(INFORMACE, "styly.nahraj_obrazky",
|
||||
"nalezeno celkem " + pocet_analyzovano + " stylových souborů");
|
||||
} else {
|
||||
if ( pocet_analyzovano == 0 ) {
|
||||
ladici_vypis(CHYBA, "styly.nahraj_obrazky",
|
||||
"nenalezena metoda pro načtení všech obrázků");
|
||||
} else {
|
||||
ladici_vypis(CHYBA, "styly.nahraj_obrazky",
|
||||
"nenalezena metoda pro dočtení zbylých stylových souborů");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ladici_vypis(INFORMACE, "styly.nahraj_obrazky",
|
||||
"nalezeno celkem " + pocet_analyzovano + " stylových souborů");
|
||||
}
|
||||
|
||||
setTimeout( function() { styly.dalsi_soubor(); }, 0 );
|
||||
}
|
||||
|
||||
po_spusteni( function() { styly.nahraj_obrazky(); } );
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Aktivuj správný styl ~==================================================
|
||||
|
||||
for ( var i = 0; i < styly.pojmenovane_styly.length; i++ ) {
|
||||
var link = styly.pojmenovane_styly[i];
|
||||
var jmeno = link.getAttribute("title");
|
||||
if ( jmeno != nastaveni.styl ) {
|
||||
link.disabled = true;
|
||||
} else {
|
||||
link.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro práci se styly ~====================================
|
||||
|
||||
styly.zmen_styl = function(styl, povolit)
|
||||
{
|
||||
for ( var i = 0; i < styly.pojmenovane_styly.length; i++ ) {
|
||||
var link = styly.pojmenovane_styly[i];
|
||||
if ( (povolit && link.title == styl) ||
|
||||
(!povolit && link.title != styl) ) {
|
||||
link.disabled = !povolit;
|
||||
ladici_vypis(LADENI, "styly.zmen_styl", link.href.match(/style.*/)[0],
|
||||
"vybraný:"+formatuj_text(!link.disabled));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Vyber styl po puštění klávesy
|
||||
styly.vyber_klavesou = function()
|
||||
{
|
||||
var styl;
|
||||
ladici_vypis(LADENI, "styly.vyber_klavesou", "hledám vybraný styl");
|
||||
for ( var i = 0; i < styly.length; i++ ) {
|
||||
var element = document.getElementById('styl-'+i);
|
||||
if ( element && element.checked ) {
|
||||
styl = styly[i].jmeno;
|
||||
ladici_vypis(LADENI, "styly.vyber_klavesou", "nalezen styl "+styl);
|
||||
}
|
||||
}
|
||||
|
||||
if ( !styl ) {
|
||||
ladici_vypis(CHYBA, "styly.vyber_klavesou", "nenalezen vybraný styl");
|
||||
return false;
|
||||
} else {
|
||||
this.vyber(styl);
|
||||
}
|
||||
}
|
||||
|
||||
// Vyber styl
|
||||
styly.vyber = function(styl)
|
||||
{
|
||||
if ( styl == nastaveni.styl ) {
|
||||
ladici_vypis(LADENI, "styly.vyber", "žádná změna stylu, zůstává "+styl);
|
||||
return true;
|
||||
} else {
|
||||
ladici_vypis(LADENI, "styly.vyber", "změna stylu na "+styl);
|
||||
}
|
||||
|
||||
// Nejdříve povolíme
|
||||
this.zmen_styl( styl, true );
|
||||
|
||||
// Potom zakážeme
|
||||
this.zmen_styl( styl, false );
|
||||
|
||||
nastav_cookie("styl", styl, 365);
|
||||
if ( hodnota_cookie("styl") != styl ) {
|
||||
ladici_vypis(CHYBA, "styly.vyber", "nepodařilo se nastavit cookie");
|
||||
}
|
||||
nastaveni.styl = styl;
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - základní tvar panelu stylů
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování seznamu stylů ~============================================
|
||||
|
||||
document.write('<form action="#">');
|
||||
|
||||
document.write('<div class="styly">Styl zobrazení');
|
||||
for ( var i = 0; i < styly.length; i++ ) {
|
||||
document.write(
|
||||
'<div><input name="styl" value="styl-'+i+'" id="styl-'+i+'" ' +
|
||||
'type="radio" alt="Nastavení stylu '+styly[i].jmeno+'" ' +
|
||||
'onclick="return styly.vyber(\''+styly[i].jmeno+'\');" ' +
|
||||
'onkeyup="return styly.vyber_klavesou();" ' +
|
||||
(styly[i].jmeno == nastaveni.styl?'checked="checked"':'') +
|
||||
'/>');
|
||||
|
||||
if (ie_hack) {
|
||||
document.write(
|
||||
'<label for="styl-'+i+'">' +
|
||||
'<span class="ikona"><span></span><div class="' + styly[i].trida + '"></div>' +
|
||||
'</span>');
|
||||
} else {
|
||||
document.write(
|
||||
'<label for="styl-'+i+'" class="' + styly[i].trida + '">');
|
||||
}
|
||||
document.write(
|
||||
styly[i].jmeno+
|
||||
'</label></div>');
|
||||
}
|
||||
document.write('</div>');
|
||||
|
||||
document.write('</form>');
|
||||
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - objekt pro zobrazování nástrojových tipů a nápovědy
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Třída nástrojových tipů ~===============================================
|
||||
|
||||
// Konstruktor
|
||||
function Tooltip()
|
||||
{
|
||||
// Prodleva od posledního zobrazení, kdy se tooltip ukáže okamžitě
|
||||
this.prejeti_mysi = 100;
|
||||
|
||||
// Čas před plným zobrazením tooltipu
|
||||
this.plne_zobrazeni = 500;
|
||||
|
||||
// Objekt, nad kterým je myš
|
||||
this.objekt = null;
|
||||
|
||||
// Informace použitá pro jednoznačné rozpoznání objektu (např. #id)
|
||||
this.info = null;
|
||||
|
||||
// Detaily k objektu, jako je např. obsah tooltipu
|
||||
this.detail = null;
|
||||
|
||||
// Tooltip je momentálně zobrazen
|
||||
this.zobrazen = false;
|
||||
|
||||
// Čas ukrytí tooltipu
|
||||
this.cas_skryti = null;
|
||||
|
||||
// Časovač spuštěný před prvním zobrazením
|
||||
this.casovac_zobrazeni = null;
|
||||
|
||||
// Objekt tooltipu, jehož obsah se obnovuje při každém zobrazení tooltipu
|
||||
this.tooltip = null;
|
||||
}
|
||||
|
||||
// Myš je nad objektem - zobraz tooltip, pokud to je nutné
|
||||
Tooltip.prototype.pres = function (objekt, info, detail)
|
||||
{
|
||||
// - Pokud nezobrazuji tooltip, zavolej this.pryc
|
||||
// - Jinak:
|
||||
// * Když nebyl tooltip nikdy zobrazen, spusť časovač. Časovač spusť, i když
|
||||
// je doba od posledního skrytí větší, než nastavení. Restartuj časovač,
|
||||
// pokud objekt není ten samý a časovač už byl spuštěn.
|
||||
// * Když je tooltip skryt a čas od posledního skrytí je menší, než
|
||||
// nastavení, zobraz tooltip.
|
||||
|
||||
if ( ! this.muzu_zobrazit(info, detail) ) {
|
||||
ladici_vypis(LADENI, "tooltip.pres", info, "nezobrazuji");
|
||||
this.pryc(objekt, info, detail);
|
||||
} else {
|
||||
var cas = new Date();
|
||||
var rozdil_casu;
|
||||
if ( this.cas_skryti ) {
|
||||
rozdil_casu = cas-this.cas_skryti;
|
||||
} else {
|
||||
rozdil_casu = 0;
|
||||
}
|
||||
if ( this.cas_skryti == null ||
|
||||
this.cas_skryti && rozdil_casu >= this.prejeti_mysi ||
|
||||
!jsou_shodne(info, this.info) && this.casovac_zobrazeni
|
||||
) {
|
||||
this.objekt = objekt;
|
||||
this.info = info;
|
||||
this.detail = detail;
|
||||
this.zastav_zobrazovani(info, detail);
|
||||
|
||||
var tento_objekt = this;
|
||||
this.casovac_zobrazeni = setInterval(
|
||||
function() { tento_objekt.zobraz(objekt, info, detail); },
|
||||
this.plne_zobrazeni
|
||||
);
|
||||
|
||||
ladici_vypis(LADENI, "tooltip.pres", info, "nastavení časovače na "+
|
||||
this.plne_zobrazeni+"ms");
|
||||
} else if ( this.cas_skryti && rozdil_casu < this.prejeti_mysi ) {
|
||||
this.zobraz(objekt, info, detail);
|
||||
} else {
|
||||
ladici_vypis(LADENI, "tooltip.pres", info, "žádná změna");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Myš opustila objekt - skryj tooltip, pokud to je potřeba
|
||||
Tooltip.prototype.pryc = function (objekt, info, detail)
|
||||
{
|
||||
// Pokud byl nastaven časovač, ale tooltip ještě nebyl zobrazen, zastav
|
||||
// zobrazování. Pokud už byl zobrazen stejný objekt, skryj ho.
|
||||
var shodne = jsou_shodne(info, this.info);
|
||||
if ( this.casovac_zobrazeni || shodne ) {
|
||||
if ( shodne ) {
|
||||
ladici_vypis(LADENI, "tooltip.pryc", info, "myš úplně opustila tooltip");
|
||||
this.objekt = null;
|
||||
this.info = null;
|
||||
this.detail = null;
|
||||
this.skryj(objekt, info, detail);
|
||||
}
|
||||
this.zastav_zobrazovani(info, detail);
|
||||
} else {
|
||||
ladici_vypis(LADENI, "tooltip.pryc", info, "žádná změna");
|
||||
}
|
||||
}
|
||||
|
||||
Tooltip.prototype.zrus = function (objekt, info, detail)
|
||||
{
|
||||
// Skryj tooltip
|
||||
ladici_vypis(LADENI, "tooltip.zrus", info, "zrušení tooltipu");
|
||||
this.skryj(objekt, info, detail);
|
||||
this.cas_skryti = null;
|
||||
}
|
||||
|
||||
// Zastav zobrazování
|
||||
Tooltip.prototype.zastav_zobrazovani = function (info, detail)
|
||||
{
|
||||
if ( this.casovac_zobrazeni ) {
|
||||
ladici_vypis(LADENI, "tooltip.zastav_zobrazovani", info, "zrušení časovače");
|
||||
clearInterval( this.casovac_zobrazeni );
|
||||
this.casovac_zobrazeni = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Skryj tooltip
|
||||
Tooltip.prototype.skryj = function (objekt, info, detail)
|
||||
{
|
||||
this.zastav_zobrazovani(info, detail);
|
||||
ladici_vypis(LADENI, "tooltip.skryj", info, "skrytí tooltipu");
|
||||
if ( this.zobrazen ) {
|
||||
if ( this.tooltip ) {
|
||||
this.tooltip.style.display = "none";
|
||||
this.tooltip.style.visibility = "hidden";
|
||||
}
|
||||
this.cas_skryti = new Date();
|
||||
}
|
||||
this.zobrazen = false;
|
||||
}
|
||||
|
||||
// Zobraz tooltip
|
||||
Tooltip.prototype.zobraz = function (objekt, info, detail)
|
||||
{
|
||||
this.objekt = objekt;
|
||||
this.info = info;
|
||||
this.detail = detail;
|
||||
this.zastav_zobrazovani(info, detail);
|
||||
this.zobrazen = true;
|
||||
|
||||
if ( ! this.tooltip ) this.tooltip = this.vytvor(info, detail);
|
||||
if ( this.tooltip ) {
|
||||
this.tooltip.style.zIndex = -1;
|
||||
this.tooltip.style.left = this.tooltip.style.top = "0";
|
||||
this.tooltip.style.visibility = "hidden";
|
||||
this.tooltip.style.display = "block";
|
||||
|
||||
this.obnov(this.tooltip, info, detail);
|
||||
this.pozicuj(this.tooltip, objekt, info, detail);
|
||||
|
||||
this.tooltip.style.display = "block";
|
||||
this.tooltip.style.zIndex = 1;
|
||||
this.tooltip.style.visibility = "visible";
|
||||
}
|
||||
|
||||
ladici_vypis(LADENI, "tooltip.zobraz", info, "zobrazení tooltipu");
|
||||
}
|
||||
|
||||
// Změň pozici tooltipu
|
||||
Tooltip.prototype.pozicuj = function (tooltip, objekt, info, detail)
|
||||
{
|
||||
this.uprav_rozmery(tooltip);
|
||||
|
||||
var rozmery = this.vypocti_pozici(tooltip, objekt, true);
|
||||
if ( ! rozmery.uspech ) {
|
||||
var nove_rozmery =
|
||||
this.vypocti_pozici(tooltip, objekt, false);
|
||||
if ( nove_rozmery.uspech ) {
|
||||
rozmery = nove_rozmery;
|
||||
}
|
||||
}
|
||||
|
||||
tooltip.style.left = rozmery.levy+"px";
|
||||
tooltip.style.top = rozmery.horni+"px";
|
||||
}
|
||||
|
||||
// Vypočti pozici tooltipu
|
||||
Tooltip.prototype.vypocti_pozici = function (tooltip, objekt, dole)
|
||||
{
|
||||
var rozmery_objektu = this.zjisti_rozmery(objekt);
|
||||
ladici_vypis(LADENI, "tooltip.vypocti_pozici", rozmery_objektu, "objekt");
|
||||
|
||||
var rozmery = zjisti_rozmery();
|
||||
|
||||
var tooltip_velikost = zjisti_velikost(tooltip.element_tooltip);
|
||||
|
||||
var tooltip_rozmery = {
|
||||
levy: rozmery_objektu.levy,
|
||||
pravy: rozmery_objektu.levy + tooltip_velikost.x
|
||||
};
|
||||
|
||||
if ( dole ) {
|
||||
tooltip_rozmery.horni = rozmery_objektu.dolni;
|
||||
tooltip_rozmery.dolni = rozmery_objektu.dolni + tooltip_velikost.y;
|
||||
} else {
|
||||
tooltip_rozmery.horni = rozmery_objektu.horni - tooltip_velikost.y;
|
||||
tooltip_rozmery.dolni = rozmery_objektu.horni;
|
||||
}
|
||||
|
||||
/* Pozice X:
|
||||
* Levá pozice se shoduje s objektem
|
||||
-> Když pravý okraj přesahuje okno, posuň nadoraz
|
||||
-> Když levý okraj přesahuje okno, posuň nadoraz
|
||||
-> Když pravý okraj přesahuje stránku, posuň nadoraz
|
||||
-> Když levý okraj přesahuje stránku, posuň na nulu
|
||||
*/
|
||||
|
||||
if ( tooltip_rozmery.pravy > rozmery.okno.pravy ) {
|
||||
tooltip_rozmery = posun_x( tooltip_rozmery,
|
||||
rozmery.okno.pravy-tooltip_rozmery.pravy);
|
||||
}
|
||||
if ( tooltip_rozmery.levy < rozmery.okno.levy ) {
|
||||
tooltip_rozmery = posun_x( tooltip_rozmery,
|
||||
rozmery.okno.levy-tooltip_rozmery.levy);
|
||||
}
|
||||
if ( tooltip_rozmery.pravy > rozmery.stranka.pravy ) {
|
||||
tooltip_rozmery = posun_x( tooltip_rozmery,
|
||||
rozmery.stranka.pravy-tooltip_rozmery.pravy);
|
||||
}
|
||||
if ( tooltip_rozmery.levy < rozmery.stranka.levy ) {
|
||||
tooltip_rozmery = posun_x( tooltip_rozmery,
|
||||
rozmery.stranka.levy-tooltip_rozmery.levy);
|
||||
}
|
||||
|
||||
tooltip_rozmery.uspech = (
|
||||
tooltip_rozmery.levy >= rozmery.okno.levy &&
|
||||
tooltip_rozmery.pravy <= rozmery.okno.pravy &&
|
||||
tooltip_rozmery.horni >= rozmery.okno.horni &&
|
||||
tooltip_rozmery.dolni <= rozmery.okno.dolni
|
||||
);
|
||||
|
||||
ladici_vypis(LADENI, "tooltip.vypocti_pozici", tooltip_rozmery,
|
||||
"rozměry tooltipu");
|
||||
|
||||
return tooltip_rozmery;
|
||||
}
|
||||
|
||||
// Uprav rozměry tooltipu
|
||||
Tooltip.prototype.uprav_rozmery = function (tooltip)
|
||||
{
|
||||
// Zjisti aktuální velikosti
|
||||
var rozmery = zjisti_rozmery();
|
||||
|
||||
// Šířka maximálně 30% velikosti okna, ale při zmenšení ne méně než 250px,
|
||||
// ale rozhorně ne více, než jsou rozměry stránky (ať už to znamená cokoliv
|
||||
// pro IE)
|
||||
var max;
|
||||
max = Math.max( 250, Math.floor(0.3*(rozmery.okno.pravy-rozmery.okno.levy)));
|
||||
max = Math.min( max, rozmery.stranka.pravy-rozmery.stranka.levy );
|
||||
|
||||
// Největší velikost tooltipu
|
||||
tooltip.style.width = max+"px";
|
||||
|
||||
var tooltip_velikost = zjisti_velikost(tooltip.element_tooltip);
|
||||
tooltip.style.width = tooltip_velikost.x+"px";
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Veřejně dostupné funkce ~===============================================
|
||||
|
||||
Tooltip.prototype.prekresli = function ()
|
||||
{
|
||||
if ( this.zobrazen ) {
|
||||
if ( this.tooltip ) {
|
||||
if ( this.muzu_zobrazit( info, detail ) ) {
|
||||
ladici_vypis(LADENI, "tooltip.prekresli", info, "překreslení tooltipu");
|
||||
this.zobraz( this.objekt, this.info, this.detail );
|
||||
} else {
|
||||
ladici_vypis(LADENI, "tooltip.prekresli", info,
|
||||
"nemůže být zobrazen, skrývám");
|
||||
this.skryj( this.objekt, this.info, this.detail );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Veřejně editovatelné funkce ~===========================================
|
||||
|
||||
// Jestli zobrazit tooltip
|
||||
Tooltip.prototype.muzu_zobrazit = function (info, detail)
|
||||
{
|
||||
var muzu = ( detail != undefined && detail != null );
|
||||
if ( ! muzu ) {
|
||||
ladici_vypis(LADENI, "tooltip.muzu_zobrazit", info,
|
||||
"nemůžu zobrazit, detail:"+formatuj_text(detail));
|
||||
}
|
||||
return muzu;
|
||||
}
|
||||
|
||||
// Zjisti rozměry objektu pro zobrazení tooltipu
|
||||
Tooltip.prototype.zjisti_rozmery = function (objekt)
|
||||
{
|
||||
return zjisti_rozmery(objekt);
|
||||
}
|
||||
|
||||
// Obnov obsah tooltipu
|
||||
Tooltip.prototype.obnov = function (tooltip, info, detail)
|
||||
{
|
||||
}
|
||||
|
||||
// Vytvoř objekt tooltipu
|
||||
Tooltip.prototype.vytvor = function (info, detail)
|
||||
{
|
||||
var tooltip = tvoric.tooltip();
|
||||
var element = document.getElementById('stranka');
|
||||
element.insertBefore(tooltip, element.firstChild);
|
||||
return tooltip;
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - tvořicí funkce pro HTML
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
tvoric = new Object();
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Vygenerování nástrojů ~=================================================
|
||||
|
||||
// Vytvoř nové tlačítko zápisem do dokumentu. Všechny parametry jsou řetězce
|
||||
tvoric.zapis_tlacitko = function (vytvor_mezeru, id, mys, mys_info, mys_detail)
|
||||
{
|
||||
if ( ! vytvor_mezeru ) {
|
||||
var detail = '';
|
||||
if ( mys_detail ) {
|
||||
detail = ','+mys_detail;
|
||||
}
|
||||
document.write('<div class="tlacitko">'+
|
||||
'<div class="tlacitko-nastroj"><div class="ikona" id="'+id+'">'+
|
||||
'</div></div>'+
|
||||
'<div class="tlacitko-maska" '+
|
||||
'onmouseover="return '+mys+'.pres(event,'+mys_info+detail+');" ' +
|
||||
'onmouseout="return '+mys+'.pryc(event,'+mys_info+detail+');" '+
|
||||
'onmousedown="return '+mys+'.stisk(event,'+mys_info+detail+');" '+
|
||||
'onmouseup="return '+mys+'.pust(event,'+mys_info+detail+');"');
|
||||
document.write('></div></div>');
|
||||
} else {
|
||||
document.write('<div class="tlacitko-mezera">'+
|
||||
'<div class="nastroje-mezera"></div></div>');
|
||||
}
|
||||
}
|
||||
|
||||
tvoric.nastav_udalosti_mysi = function (element, mys, mys_info, mys_detail)
|
||||
{
|
||||
var detail = '';
|
||||
if ( mys_detail ) {
|
||||
detail = ','+mys_detail;
|
||||
}
|
||||
|
||||
// Události
|
||||
element.onmouseover = new Function( "e",
|
||||
'return '+mys+'.pres(e,'+mys_info+detail+');' );
|
||||
element.onmouseout = new Function( "e",
|
||||
'return '+mys+'.pryc(e,'+mys_info+detail+');' );
|
||||
element.onmousedown = new Function( "e",
|
||||
'return '+mys+'.stisk(e,'+mys_info+detail+');' );
|
||||
element.onmouseup = new Function( "e",
|
||||
'return '+mys+'.pust(e,'+mys_info+detail+');' );
|
||||
}
|
||||
|
||||
tvoric.vytvor_tlacitko = function (vytvor_mezeru, id, mys, mys_info, mys_detail)
|
||||
{
|
||||
if ( ! vytvor_mezeru ) {
|
||||
// Vytvoř tlačítko
|
||||
|
||||
// Elementy
|
||||
var element_tlacitko = document.createElement('DIV');
|
||||
var element_tlacitko_nastroj = element_tlacitko.cloneNode(false);
|
||||
var element_tlacitko_ikona = element_tlacitko.cloneNode(false);
|
||||
var element_tlacitko_maska = element_tlacitko.cloneNode(false);
|
||||
|
||||
// Události
|
||||
tvoric.nastav_udalosti_mysi(element_tlacitko_maska, mys,
|
||||
mys_info, mys_detail);
|
||||
|
||||
// Styly
|
||||
element_tlacitko.className = "tlacitko";
|
||||
element_tlacitko_nastroj.className = "tlacitko-nastroj";
|
||||
element_tlacitko_ikona.className = "ikona";
|
||||
element_tlacitko_ikona.id = id;
|
||||
element_tlacitko_maska.className = "tlacitko-maska";
|
||||
|
||||
// Tvar
|
||||
element_tlacitko_nastroj.appendChild( element_tlacitko_ikona );
|
||||
element_tlacitko.appendChild( element_tlacitko_nastroj );
|
||||
element_tlacitko.appendChild( element_tlacitko_maska );
|
||||
|
||||
return element_tlacitko;
|
||||
} else {
|
||||
// Vytvoř mezeru
|
||||
|
||||
// Elementy
|
||||
var element_tlacitko_mezera = document.createElement('DIV');
|
||||
var element_nastroje_mezera = element_tlacitko_mezera.cloneNode(false);
|
||||
|
||||
// Styly
|
||||
element_tlacitko_mezera.className = "tlacitko-mezera";
|
||||
element_nastroje_mezera.className = "nastroje-mezera";
|
||||
|
||||
// Tvar
|
||||
element_tlacitko_mezera.appendChild(element_nastroje_mezera);
|
||||
|
||||
return element_tlacitko_mezera;
|
||||
}
|
||||
}
|
||||
|
||||
tvoric.maska_tlacitka_z_ikony = function (element_ikona)
|
||||
{
|
||||
return element_ikona.parentNode.nextSibling;
|
||||
}
|
||||
|
||||
// Zvýrazňování tlačítek
|
||||
tvoric.zvyraznovac = function(id, zvyraznen, stisknut, vybran)
|
||||
{
|
||||
var element = document.getElementById(id);
|
||||
var parent = element.parentNode;
|
||||
if ( vybran || stisknut )
|
||||
{
|
||||
parent.className = "tlacitko-dole";
|
||||
} else if ( zvyraznen ) {
|
||||
parent.className = "tlacitko-nahore";
|
||||
} else {
|
||||
parent.className = "tlacitko-nastroj";
|
||||
}
|
||||
}
|
||||
|
||||
// Tvar nástrojových tipů
|
||||
tvoric.tooltip = function()
|
||||
{
|
||||
/* Struktura tooltipu
|
||||
|
||||
<div class=tooltip-hranice>
|
||||
<div class=tooltip>
|
||||
<div class=horni>
|
||||
<div class=margin-5><div class=pixel></div></div>
|
||||
<div class=margin-3><div class=margin-2><div class=pixel></div></div></div>
|
||||
<div class=margin-2><div class=margin-1><div class=pixel></div></div></div>
|
||||
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
|
||||
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
|
||||
</div>
|
||||
<div class=stred>
|
||||
<div class=vypln><div></div></div>
|
||||
<div class=ikona><div></div></div>
|
||||
<div class=nadpis></div>
|
||||
<div class=popis></div>
|
||||
<div class=vypln><div></div></div>
|
||||
</div>
|
||||
<div class=spodni>
|
||||
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
|
||||
<div class=margin-1><div class=margin-1><div class=pixel></div></div></div>
|
||||
<div class=margin-2><div class=margin-1><div class=pixel></div></div></div>
|
||||
<div class=margin-3><div class=margin-2><div class=pixel></div></div></div>
|
||||
<div class=margin-5><div class=pixel></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
*/
|
||||
|
||||
// Elementy
|
||||
var tooltip_hranice = document.createElement('DIV')
|
||||
var tooltip = tooltip_hranice.cloneNode(false);
|
||||
var horni = tooltip.cloneNode(false);
|
||||
var pixel = tooltip.cloneNode(false);
|
||||
var margin_5 = tooltip.cloneNode(false);
|
||||
var margin_3 = tooltip.cloneNode(false);
|
||||
var margin_2 = tooltip.cloneNode(false);
|
||||
var margin_1 = tooltip.cloneNode(false);
|
||||
var stred = tooltip.cloneNode(false);
|
||||
var ikona = tooltip.cloneNode(false);
|
||||
var nadpis = tooltip.cloneNode(false);
|
||||
var popis = tooltip.cloneNode(false);
|
||||
var vypln = tooltip.cloneNode(false);
|
||||
var prazdny = tooltip.cloneNode(false);
|
||||
var spodni = tooltip.cloneNode(false);
|
||||
|
||||
// Styly
|
||||
tooltip_hranice.className = 'tooltip-hranice';
|
||||
tooltip.className = 'tooltip';
|
||||
horni.className = 'horni';
|
||||
pixel.className = 'pixel';
|
||||
margin_5.className = 'margin-5';
|
||||
margin_3.className = 'margin-3';
|
||||
margin_2.className = 'margin-2';
|
||||
margin_1.className = 'margin-1';
|
||||
stred.className = 'stred';
|
||||
ikona.className = 'ikona';
|
||||
nadpis.className = 'nadpis';
|
||||
popis.className = 'popis';
|
||||
vypln.className = 'vypln';
|
||||
spodni.className = 'spodni';
|
||||
|
||||
// Tvar
|
||||
tooltip_hranice.appendChild(tooltip);
|
||||
tooltip.appendChild(horni);
|
||||
horni.appendChild(margin_5.cloneNode(false));
|
||||
horni.lastChild.appendChild(pixel.cloneNode(false));
|
||||
horni.appendChild(margin_3.cloneNode(false));
|
||||
horni.lastChild.appendChild(margin_2.cloneNode(false));
|
||||
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
horni.appendChild(margin_2.cloneNode(false));
|
||||
horni.lastChild.appendChild(margin_1.cloneNode(false));
|
||||
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
horni.appendChild(margin_1.cloneNode(false));
|
||||
horni.lastChild.appendChild(margin_1.cloneNode(false));
|
||||
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
horni.appendChild(margin_1.cloneNode(false));
|
||||
horni.lastChild.appendChild(margin_1.cloneNode(false));
|
||||
horni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
tooltip.appendChild(stred);
|
||||
stred.appendChild(vypln.cloneNode(false));
|
||||
stred.lastChild.appendChild(prazdny.cloneNode(false));
|
||||
stred.appendChild(ikona);
|
||||
ikona.appendChild(prazdny.cloneNode(false));
|
||||
stred.appendChild(nadpis);
|
||||
nadpis.appendChild(document.createTextNode(""));
|
||||
stred.appendChild(popis);
|
||||
popis.appendChild(document.createTextNode(""));
|
||||
stred.appendChild(vypln);
|
||||
stred.lastChild.appendChild(prazdny);
|
||||
tooltip.appendChild(spodni);
|
||||
spodni.appendChild(margin_1.cloneNode(false));
|
||||
spodni.lastChild.appendChild(margin_1.cloneNode(false));
|
||||
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
spodni.appendChild(margin_1.cloneNode(false));
|
||||
spodni.lastChild.appendChild(margin_1.cloneNode(false));
|
||||
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
spodni.appendChild(margin_2.cloneNode(false));
|
||||
spodni.lastChild.appendChild(margin_1);
|
||||
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
spodni.appendChild(margin_3);
|
||||
spodni.lastChild.appendChild(margin_2);
|
||||
spodni.lastChild.lastChild.appendChild(pixel.cloneNode(false));
|
||||
spodni.appendChild(margin_5);
|
||||
spodni.lastChild.appendChild(pixel);
|
||||
|
||||
// Některé zvláštní vlastnosti
|
||||
tooltip_hranice.element_ikona = ikona.firstChild;
|
||||
tooltip_hranice.element_nadpis = nadpis.firstChild;
|
||||
tooltip_hranice.element_popis = popis.firstChild;
|
||||
tooltip_hranice.element_tooltip = tooltip_hranice.firstChild;
|
||||
|
||||
return tooltip_hranice;
|
||||
}
|
||||
|
||||
// Nastav vlastnosti tooltipu
|
||||
tvoric.obnov_tooltip = function (tooltip, ikona, nadpis, popis)
|
||||
{
|
||||
if ( ! tooltip ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !ikona ) { ikona = ""; }
|
||||
tooltip.element_ikona.className = ikona;
|
||||
|
||||
if ( !nadpis ) { nadpis = ""; }
|
||||
tooltip.element_nadpis.nodeValue = nadpis;
|
||||
|
||||
if ( !popis ) { popis = ""; }
|
||||
tooltip.element_popis.nodeValue = popis;
|
||||
|
||||
// Nastav mezeru mezi nadpisem a popisem
|
||||
if ( nadpis.length > 0 && popis.length > 0 ) {
|
||||
tooltip.element_nadpis.parentNode.style.marginBottom = "1em";
|
||||
} else {
|
||||
tooltip.element_nadpis.parentNode.style.marginBottom = "0";
|
||||
}
|
||||
|
||||
var margin = "0px";
|
||||
if ( ikona.length > 0 ) {
|
||||
var velikost = zjisti_velikost(tooltip.element_ikona);
|
||||
margin = (velikost.x+8)+"px";
|
||||
}
|
||||
tooltip.element_nadpis.parentNode.style.marginLeft = margin;
|
||||
tooltip.element_popis.parentNode.style.marginLeft = margin;
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* [Česky]
|
||||
* Projekt: Robot Karel
|
||||
* Copyright: Viz KOPIROVANI v kořenovém adresáři projektu
|
||||
*
|
||||
* [English]
|
||||
* Project: Karel, the Robot
|
||||
* Copyright: See COPYING in the top level directory
|
||||
*/
|
||||
|
||||
// JavaScript - funkce pro práci s různými velikostmi Karla
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Tovární nastavení ~=====================================================
|
||||
|
||||
// Styl nastavený uživatelem
|
||||
nastaveni.velikost = hodnota_cookie("velikost");
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Globální proměnné ~=====================================================
|
||||
|
||||
// Názvy různých velikostí
|
||||
velikosti = [
|
||||
{jmeno: "Normální", trida: "velikost-normalni"},
|
||||
{jmeno: "Malý", trida: "velikost-maly"}
|
||||
];
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní nastavení ~====================================================
|
||||
|
||||
if ( nastaveni.velikost == null ) {
|
||||
nastaveni.velikost = velikosti[0].jmeno;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Základní funkce pro práci se styly ~====================================
|
||||
|
||||
velikosti.zmen_velikost = function(velikost)
|
||||
{
|
||||
}
|
||||
|
||||
// Vyber styl po puštění klávesy
|
||||
velikosti.vyber_klavesou = function()
|
||||
{
|
||||
var velikost;
|
||||
ladici_vypis(LADENI, "velikosti.vyber_klavesou", "hledám vybranou velikost");
|
||||
for ( var i = 0; i < velikosti.length; i++ ) {
|
||||
var element = document.getElementById('velikost-'+i);
|
||||
if ( element && element.checked ) {
|
||||
velikost = velikosti[i].jmeno;
|
||||
ladici_vypis(LADENI, "velikosti.vyber_klavesou", "nalezena velikost "+velikost);
|
||||
}
|
||||
}
|
||||
|
||||
if ( !velikost ) {
|
||||
ladici_vypis(CHYBA, "velikost.vyber_klavesou", "nenalezena vybraná velikost");
|
||||
return false;
|
||||
} else {
|
||||
this.vyber(velikost);
|
||||
}
|
||||
}
|
||||
|
||||
// Vyber styl
|
||||
velikosti.vyber = function(velikost)
|
||||
{
|
||||
if ( velikost == nastaveni.velikost ) {
|
||||
ladici_vypis(LADENI, "velikost.vyber", "žádná změna velikosti, zůstává "+velikost);
|
||||
return true;
|
||||
} else {
|
||||
ladici_vypis(LADENI, "velikost.vyber", "změna velikosti na "+velikost);
|
||||
}
|
||||
|
||||
// Nejdříve povolíme
|
||||
this.zmen_velikost( velikost );
|
||||
|
||||
nastav_cookie("velikost", velikost, 365);
|
||||
if ( hodnota_cookie("velikost") != velikost ) {
|
||||
ladici_vypis(CHYBA, "velikosti.vyber", "nepodařilo se nastavit cookie");
|
||||
}
|
||||
nastaveni.velikost = velikost;
|
||||
return true;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
// =~ Aktivuj správnou velikost ~=============================================
|
||||
|
||||
velikosti.zmen_velikost(nastaveni.velikost);
|
||||
Reference in New Issue
Block a user