405 lines
12 KiB
JavaScript
405 lines
12 KiB
JavaScript
/*
|
|
* [Č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;
|
|
}
|