Widgety postavené na knihovně JAK
- Kalendář
- Hodnotící prvek
- Editor
- Vyskakovací okno
- Prohlížeč obrázků
- LightBox - prohlížeč obrázků
- Ořez obrázků
- Záložky
- Výběr barvy
- Výběr
- Řazení
- Konzole
- Slider
- Tree
Na této stránce jsou zobrazeny ukázky widgetů (miniaplikací), které jsou postaveny nad knihovnou JAK.
Kalendář
Widget kalendáře je jednoduše připojitelný na libovolný počet textových inputů. Např.
<input type="text" id="calendar_value" name="calendar_value" />
<script type="text/javascript">
SZN.Calendar.setup("calendar_icon.gif", "[vybrat datum]", {}, "calendar_value");
</script>
V příkladu je vidět nastavení kalendáře. Přebírá 4 a více parametrů:
- imageUrl - cesta k obrázku, který bude za input polem zobrazen. pokud není zadán, bude vygenerováno tlačítko
- label - alt pro obrázek, nebo název tlačítka
- optObj - asociativní pole parametrů nastavující kalendář
- id1..N - libovolný počet ID html input elementů, na které bude kalendář navázán.
Nastavující objekt optObj má tuto strukturu volitelných parametrů:
- defaultFormat - formátovací řetězec pro datum, zadává se ve stejném tvaru jako pro JavaScriptovou funkci Date(), výchozí hodnota je "j.n.Y"
- today - řetězec označující dnešek, výchozí hodnota je "Dnes"
- rollerDelay - čas (msec), po kterém se zobrazí roletky na výber měsice/roku, výchozí hodnota je 200
- lockWindow - má-li se okno kalendáře bránit vytažení mimo okno prohlížeče (nahoře, vlevo), defaultně je false
- monthNames - pole názvů měsíců
- monthNamesShort - pole zkrácených (tří písmenných) názvů měsíců
- dayNames - pole nazvů dní v týdnu
- pickTime - určuje, zda je možné v kalendáři nastavovat čas, výchozí hodnota je false
Pokročilé datum složené z inputu pro datum a čas je možné obsluhovat kalendářem, který je vyvolán takto:
<input type="text" id="calendar_value" name="calendar_value" />
<script type="text/javascript">
SZN.Calendar.setup( "/img/widgets/calendar/calendar_icon.gif",
"vybrat datum",
{ pickTime: true,
defaultFormat: ['j.n.Y', 'H:i']
},
["cdate", "ctime"]);
</script>
Nejprve nastavíme parametrem pickTime, že chceme vybírat čas a poté v jakém formátu bude vloženo datum do našich dvou inputů. Místo názvu inputu vkládáme pole s názvy jako třetí parametr. Nicméně si můžeme všimnout, že pokud do pole času vložíme správný řetězec, např.: 13:51, kalendář si tento čas nenačte a bude ukazovat čas aktuální. To je z toho důvodu, že kombinací jak z inputů složit řetězec reprezentující datum je nekonečně mnoho. Proto si musíme napsat vlastní inicializaci kalendáře (převzít jeho statické inicializační metody) a tu použít. Vzorová inicializace pro dva a tři inputy je ve statické třídě SZN.Calendar.Setup. Zde je zejména přepsaná soukromá metoda click v metodě manage, která se stará o složení řetězce udávající datum z obsahů jednotlivých inputů.
Mějme tři inputy na datum, hodinu a čas: : vytvoříme pro ně kalendář pomocí zmíněné třídy. Ta umožňuje čtení dvou a tří inputů v konfiguraci [datum] a [čas], nebo [datum], [hodina] a [minuta]. Použití výchozí třídy vypadá takto:
<input type="text" id="calendar_value" name="calendar_value" />
<script type="text/javascript">
SZN.Calendar.Setup.setup("calendar_icon.gif", "vybrat datum", {pickTime: true, defaultFormat:["j.n.Y", "H","i"]}, ["cd","ch","cm"]);
</script>
Kalendář navíc vysílá tři signály:
- calendarShow - při otevření kalendáře
- calendarHide - při zavření kalendáře
- datepick - při výběru datumu
Signál datepick je vyvolán dřív než calendarHide.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
Stáhnout widget calendar.zip.
Hodnotící prvek
Web 2.0 je hlavně o obsahu tvořeným komunitou a tento obsah je velice často potřeba různě známkovat a hodnotit. Pro tento účel je vytvořen tento widget. Hodnotící widget rozšiřuje základní funkčnost odkazů v jednom kontejneru. Obaluje je možností volat jejich URL pomocí HTTPXMLREQESTu a přiřazovat dynamicky prvkům třídy pro jejich zvýrazňování. Pokud pomocí reqestu vrátíme i aktuální údaj o celkovém hodnocení, widget ho zpracuje a přídá prvkům třídu pro jejich zvýraznění. Widget počítá s tím, že v obalujícím prvku (kontejner) jsou odkazy (element A), které widget obaluje svoji funkčností.
Při vytváření widget přejímá 2 parametry:
- id - id obalujícího elementu, či vlastní DOM element
- settings - nepovinný objekt s nastavením
- ajax - boolean hodnota, určující zda hodnocení bude prováděno ajaxem, či nikoli, výchozí hodnota je false
- post - boolean hodnota, určující typ odesílání (GET, POST), výchozí hodnota je false
- selectedClass - po hodnocení requestem, může být vrácen json string s objektem, který má jedinou vlastnost "rating" a jeho hodnotou je číslo. Toto číslo určuje celkové hodnocení. Potom všem prvkům splňujícím toho hodnocení bude přiřazena tato třída. Výchozí je "selected".
<p id="ranker"><a href="/req_rank.txt?1"><span>1</span></a><a href="/req_rank.txt?2"><span>2</span></a><a href="/req_rank.txt?3"><span>3</span></a><a href="/req_rank.txt?4"><span>4</span></a><a href="/req_rank.txt?5"><span>5</span></a></p>
<script type="text/javascript">
new SZN.Rank("ranker", {ajax: true, post: false,selectedClass:"selected"});
</script>
Hodnotící objekt propaguje na kontejner a elementy v kontejneru tyto třídy:
- [kontejner].rank-active - kontejner získává tuto třídu, pokud uživatel najede myší nad kontejner, potažmo jeho děti
- [element].rank-active - element získává tuto třídu, pokud uživatel najede nad konkrétní element myší
- [element].disabled - všechny elementy kontejneru (děti) získávají tuto třídu po získání výsledků z HTTPXMLREQUESTU.
CSS styly k příkladu vypadají takto:
#ranker {display: block; height: 17px; width: 110px;}
#ranker a {display: block; width: 17px; height: 17px; border: 1px solid gray; text-decoration: none; float: left; margin-left: 3px;}
#ranker a span {margin-left: 5px;}
p#ranker a.rank-active {background-color: #cc33cc;}
p#ranker a.disabled {color: black; }
p#ranker a.selected {background-color: gold;}
p.rank-active a {background-color: #ffccff;}
Pokud chceme plně využít hodnotící prvek, je nutné doprogramovat serverovou část. Hodnotící prvek převezme odkazy z linků a ty použije pro XMLHTTPRequest. Odkaz může vypadat např. takto: rank.php?number=3. Pak serverový skript rank.php musí očekávat vstup se jménem number. Dále je vhodné aby si uložil tuto hodnotu k ostatním, udělal z nich průměr a tento průměr vrátil jako odpověď v JSON formátu:
{
rating: 2
}
V odpovědi výše tedy server vrací průměrnou hodnotu 2, kterou nakonec hodnotící prvek po hlasování zvýrazní.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- request.js
Stáhnout widget rank.zip.
Editor
V dnešní době se již žádná administrace neobejde bez alespoň jednoduchého vizuálního HTML editoru. Jistě každý zná FCKEditor, nebo Tiny MCE, nebo jiné. Vetšinou se jedná o velké balíky, které se mohou pomalu načítat a navíc nevyužívají žádných knihoven a proto při jejich použití vzniká duplikování funkčního kódu. Proto jsme postavili právě nad knihovnou JAK jednoduchý HTML editor.
Editor využívá funkčnosti prohlížečů a tedy generuje kód ve XHTML 1.0 Transitional. Funguje ve všech prohlížečích podporovaných JAKem (IE, FireFox, Opera) vyjma Konqueroru, který nemá podporu pro editaci.
Pro přidání editoru do stránky je nutné vytvořit jednu textareu s vlastním id a vložit do stránky kód v příkladu:
<textarea rows="8" cols="50" id="htmlEditor"></textarea>
<script type="text/javascript">
var formatOpt = [
{innerHTML:"<h1 style='margin:0px;padding:0px;'>Nadpis 1</h1>", value:"h1"},
{innerHTML:"<h2 style='margin:0px;padding:0px;'>Nadpis 2</h2>", value:"h2"},
{innerHTML:"<p style='margin:0px;padding:0px;'>Odstavec</p>", value:"p"}
];
var controls = [
{type:"html",text:"Editovat HTML"},
{type:"bold",text:"Tučné"},
{type:"italic",text:"Kurzíva"},
{type:"underline",text:"Podtržené"},
{type:"strikethrough",text:"Přeškrtnuté"},
{type:"format",text:"Formát", options: formatOpt}
];
var opts = { controls:controls, imagePath:"/img/widgets/editor/" };
var e = new SZN.Editor("htmlEditor",opts);
</script>
Vlastní přidání editoru do stránky je provedeno posledním řádkem kódu, kde je volán konstruktor editoru. Ten přebírá dva paremetry:
- ID - id textarey, která má být nahrazena HTML editorem
- options - konfigurační objekt
Tento kód přidá jednoduchý editor. Popis pokročilých voleb a pluginů je na samostatné stránce.
Upozornění: Na fóru se množí dotazy na použití editoru v tabulkovém designu, zejména v Internet Exploreru. Internet Explorer renderuje tabulky vždy celé, tedy až dojde ke koncové značce table. Iniciallizační skript editoru tedy musí být vždy až za tabulkou, ve které se nachází textarea, kterou má nahradit! Pokud jsou tabulky zanořené, tak samozřejmě musí být až za vnější tabulkou. V opačném případě není textarea vyrenderovaná, má nulové rozměry a editor ji nemůže nahradit.
Druhou možností jak se tomu vyhnout je volání inicializace editoru obalit do funkce a tu volat pomocí onDomReady události.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- siginterface.js
- signals.js
Stáhnout widget editor.zip.
Vyskakovací okno
Tento widget může být používán pro vyskakovací okna, která mají uživatele aplikace informovat o určitém stavu. Při vytvoření je zobrazeno okno se stíny o předem definované velikosti.
Okno vytvoříme příkazem:
//vytvoreni okna
var params = {};
var w = new SZN.Window(params);
//nastaveni obsahu
var txt = SZN.cTxt("Ahoj!");
w.content.appendChild(txt);
Když chceme okno zobrazit zavoláme:
document.body.appendChild(w.container);
Konstruktoru okna předáváme asociativní pole s těmito možnými klíči (v závorkách jsou výchozí hodnoty):
- imagePath - cesta k souborům se stíny (/img/shadow-)
- imageFormat - přípona souborů se stíny (png)
- sizes - rozměry stínu v jednotlivých směrech po směru hodinových ručiček ([6,6,6,6])
Názvy obrázků stínů jsou pevně dané a to jako první pismeno směru, či rohové jsou prvním písmenem obou směrů, tedy: t, tl, l, lb, b, rb, r, tr. Vyskakovací okno lze zobrazit po stisknutí .
Widget window vytvoří element div, který je dostupný jako vlastnost objektu container a v něm je vytvořena tabulka o devíti buňkách, kde v krajních jsou stíny a v prostřední je obsah. Obsah je opět propagován jako vlastnost objektu s názvem content. Proto můžeme do obsahu přidávat text přes volání w.content.appendChild().
Dále obalující DIV prvek získává třídu window-container a obsahová buňka získává třídu window-content, přes které je možné okno dostylovat. Jelikož jsou stíny v buňkách tabulky, je nutné mít na paměti, že pokud chceme aby okno mělo border, musíme ho nastavovat contentu a ne containeru.
Viditelnost okna můžeme ovládat metodami show() pro zobrazení a hide() pro schování okna. Obecně pokud vytvoříme okno a připneme ho do DOM stromu pomocí appendChild, bude okno zobrazeno, což může být nežadoucí, proto je vhodnější okno při inicializaci skriptů vytvořit, připnout do DOM stromu a skrýt a až bude okno třeba, tak ho pomocí metody show() zobrazit.
Požadované knihovny:- main.js
- classmaker.js
- dom.js
Stáhnout widget window.zip.
Prohlížeč obrázků
Další často používanou komponentou je prohlížečka obrázků. Tento widget stejně jako hodnotící widget pracuje rozšiřuje základní funkčnost HTML. Tedy nejdříve si vytvoříme prvek s náhledovými obrázky a odkazy na velké obrázky:
<div id="gallery"> <a href="/img/gallery/01.jpg"><img src="/img/gallery/tn01.jpg" alt="Západ slunce" /></a> <a href="/img/gallery/02.jpg"><img src="/img/gallery/tn02.jpg" alt="Praděd" /></a> <a href="/img/gallery/03.jpg"><img src="/img/gallery/tn03.jpg" alt="Klaustrofobie" /></a> <a href="/img/gallery/04.jpg"><img src="/img/gallery/tn04.jpg" alt="Přehlídka armády" /></a> </div>
Dále je nutné informace zkopírovat do javascriptového pole, kde předáme informace o popisce, URL náhledového obrázku a URL velkého obrázku:
var data = [
{alt: 'Západ slunce', small: {url: '/img/gallery/tn01.jpg'}, big: {url: '/img/gallery/01.jpg'} },
{alt: 'Praděd', small: {url: '/img/gallery/tn02.jpg'}, big: {url: '/img/gallery/02.jpg'} },
{alt: 'Klaustrofobie', small: {url: '/img/gallery/tn03.jpg'}, big: {url: '/img/gallery/03.jpg'} },
{alt: 'Přehlídka armády', small: {url: '/img/gallery/tn04.jpg'}, big: {url: '/img/gallery/04.jpg'} }
];
Nyní již můžeme inicializovat objekt galerie:
var g = new SZN.ImageBrowser('gallery', data);
Třetím volitelným argumentem při volání konstruktoru je asociativní pole s další možností nastavení chování galerie (v závorce je výchozí hodnota):
- width - max. šířka velkého obrázku [640]
- height - max. výška velkého obrázku [480]
- thumbWidth - max. šířka náhledového obrázku [100]
- thumbHeight - max. výška náhledového obrázku [75]
- thumbBorder - šířka rámečku okolo náhledu [0]
- zoomLinkId - ID prvku, který otevírá galerii
- mainLinkId - ID obrázku, který otevírá galerii
- imagePath - cesta k obrazkům se stíny [/]
- imageFormat - připona obrazků se stíny (png/gif/jpg) [png]
- showNavigation - true/false, mají-li být zobrazena navigační tlačítka (prev/next) [true]
- useShadow - true/false, má-li se okolo galerie zobrazit stín [false]
- parent - pokud false, pak je galerie centrována nad vším; pokud non-false, pak jde o id/prvek, do kterého se galerie vytvoří [false]
- shadowSizes - velikosti stínu v px, dle směru hodinových ručiček [22,22,22,22]
- fixed - určuje pokud má být galerie fixována v okně, nebo ne. Výchozí hodnota je true - zapnuto
- captionBoxHeight - určuje výšku v px boxu mezi hlavním obrázkem a náhledy, ve kterém bude zobrazen popisek obrázku
var optObj = {imagePath: '/img/imagebrowser/', width: 800, height: 600,thumbWidth: 40, thumbHeight: 40, useShadow: true};
var g = new SZN.ImageBrowser('gallery', data, optObj);
Při povolení použití stínu se využívá widgetu vyskakovacího okna popsaného výše, tedy musí být na stránce tento skript načten také. Galerie níže je jednak se stínem a také s místem na popisek.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
Stáhnout widget imagebrowser.zip.
LightBox
Galerie obrázků na našich službách nám byla na některých službách "těsná", nešla dostatečně konfigurovat tak aby šel měnit dostatečně flexibilně její vzhled. Pro účely Novinek, jsme proto vyvinuli novou verzi galerie, LightBox. Tato galerie je skinovatelná pouze pomocí CSS a je možné její funkčnost ovlivňovat bohatou konfigurací, pokud ani ta není dostačující, je možné doplnit její funkčnost pomocí pluginů.
Chtěli jsme vytvořit galerii, která nebude mít známé vady většiny dostupných galerií, tedy nepřátelské ovládání, které mění svoji pozici při změně obrázku, flexibilní stylování a možnost doplnění funkčnosti jednoduchými zásuvnými moduly.
LightBox se ve výchozím nastavení používá stejně snadno jako předchozí galerie. Pro vložení do stránky lze využít kód níže, který vloží LightBox vypadající jako galerie na Novinkách:
var opt = {
useShadow: true,
galleryId: 'lightBox',
imagePath: '/img/widgets/lightbox/shadow-',
components: {
strip: SZN.LightBox.Strip.Scrollable,
navigation: SZN.LightBox.Navigation.Basic,
anchorage: SZN.LightBox.Anchorage.Fixed,
main: SZN.LightBox.Main.CenteredScaled
}
};
var g = SZN.LightBox.create('gallery3', opt);
Galerie je nastylována tímto kaskádovým stylem:
/*uzivatel musi mit na pameti ze chceme videt scrollbar vzdy, proto je nutne ho mit zapnuty a pocitat s jeho sirkou 17px!!!*/
/*tedy sirka galerie musi byt o 17px vice a sirka thmbus pole take, pokud je vse nalezato tak se jedna o vysku*/
/*rozmery galerie*/
#lightBox {background-color: black; width: 920px; height: 462px; padding-top:10px; padding-left: 10px; padding-right: 10px;}
#lightBox .image-browser-image {width: 800px; height: 450px; border: 1px solid #333; overflow: hidden; padding: 0px; float: left; position: relative;}
/*nahledovy pas*/
#lightBox .image-browser-thumbs {width: 117px;height: 452px; overflow-y:scroll; float: right;}
#lightBox .image-browser-thumbs table {border-collapse:separate; border-spacing:3px 3px;}
#lightBox .image-browser-thumbs td {padding: 0px; border: 1px solid #333;}
#lightBox .image-browser-thumbs .image-browser-thumb-box {height: 55px; width: 100px; margin: 0px; padding: 0px;}
/*ramecek okolo aktivniho nahledu*/
#lightBox .image-browser-active {border: 3px solid red;}
/*zasednuti pod galerii*/
div.image-browser-root { _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/bg.png', sizingMethod='scale' );}
div[class~="image-browser-root"] { background: url(/img/widgets/lightbox/bg.png); }
/*ovladaci tlacitka*/
#lightBox .image-browser-prev { position: absolute; top: 20px; left: 20px; display: block; width: 42px; height: 36px; cursor: pointer; background: url(/img/widgets/lightbox/lb-previous-active.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-previous-active.png'));}
#lightBox .image-browser-prev:hover { background: url(/img/widgets/lightbox/lb-previous-hover.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-previous-hover.png')); }
#lightBox .image-browser-next { position: absolute; top: 20px; left: 66px; display: block; width: 42px; height: 36px; cursor: pointer; background: url(/img/widgets/lightbox/lb-next-active.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-next-active.png')); }
#lightBox .image-browser-next:hover { background: url(/img/widgets/lightbox/lb-next-hover.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-next-hover.png')); }
#lightBox .image-browser-prev-disabled { position: absolute; top: 20px; left: 20px; display: block; width: 42px; height: 36px; cursor: pointer; background: url(/img/widgets/lightbox/lb-previous-inactive.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-previous-inactive.png')); }
#lightBox .image-browser-next-disabled { position: absolute; top: 20px; left: 66px; display: block; width: 42px; height: 36px; cursor: pointer; background: url(/img/widgets/lightbox/lb-next-inactive.png); _background: none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-next-inactive.png')); }
#lightBox .image-browser-close { position: absolute; top: 20px; left: 760px; display: block; width: 42px; height: 36px; cursor: pointer; background: url(/img/widgets/lightbox/lb-close-active.png); _background:none ;_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-close-active.png'));}
#lightBox .image-browser-close:hover { background: url(/img/widgets/lightbox/lb-close-hover.png); _background:none; _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/img/widgets/lightbox/lb-close-hover.png'));}
Jak je vidět z konfigurace, některé položky jsou podobné, jako u předchozí galerie, některé (většina) je nových a definují funkčnost galerie. Co tyto položky znamenají a jak psát rozšířující pluginy pro LightBox, se dozvíte na samostatné stránce věnované Lightboxu. Tato ukázka navíc vyžaduje widget Vyskakovacího okna.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- signals.js
- siginterface.js
- components.js
- window.js
Stáhnout widget lightbox.zip.
Ořez obrázků
V pokročilejších administračních rozhraních je uživateli kromě HTML editoru dána možnost úpravy nahraných obrázků, zejména jejich ořez. Ořez obrázků je možné rozdělit na dvě části a to klientskou a serverovou. Tento widget řeší klientskou část a to konkrétně určení pozice výřezu a jeho rozměry. Vlastní zpracování ořezu na straně serveru je již na konkrétní implementaci a použitém jazyce.
Na následujícím obrázku jsou vytvořeny dva ořezové elementy, jeden pro vytvoření ikony, tedy má nastavené fixní rozměry a lze jen posouvat a druhý je pro vytvoření libovolného čtvercového výřezu o rozměrech 100×100 až 300×300px.
Obrázek, který chceme ořezávat musí být přístupný přes ID. Poté můžeme nastavit cropper např. takto:
var c = new SZN.ImageCropper("imageCropperImage","imageCropperForm",{imagePath: '/img/widgets/imagecropper/'});
//fixni orezavac 50×50px
var sizes = {x:50, y:50}
var v = c.createView("icon", sizes, 0, "#f0f");
c.showView(v);
//orez na 100×100 az 300×300px ctverec
var sizes2 = {x:"100-300", y:"100-", defaultX:150, defaultY:150}
var v2 = c.createView("image", sizes2, 1, "#0ff");
c.showView(v2);
Poslední co musíme nastavit, je vytvoření formuláře s jedinečným ID a na ten nasměrovat ImageCropper, který v něm vytvoří pro každé ořezové okno jedno skryté formulářové pole s názvem ořezového elementu (u nás icon a image) a jeho hodnotou jsou čtyři souřadnice oddělené čárkou. Souřadnice jsou: levý horní roh X,Y, spodní pravý roh X a Y.
Například souřadnice žlutého boxu předávané do skrytého pole:
Objekt ImageCropper očekává tři parametry.
- imageId - ID obrázku, na který bude aplikován ořez
- formId - ID formuláře, kam budou vygenerovány skryté formulářové elementy s hodnotami, může být null, pak nejsou žádné skryté elementy generovány
- params - volitelné asociativní pole, kterým můžeme nastavit:
- imagePath - cestu k obrázkům šipek, které pomáhají v roztahování ořezového okna
- dimensions - boolean hodnota určující, zda se mají nad ořezovým oknem zobrazovat výsledné rozměry
Další nastavení se provádí při vytváření ořezového okna metodou createView. Zde je možno nastavit 4 parametry.
- viewName - název ořezového okna, potažmo název vytvářeného skrytého elementu
- dimensions - asociativní pole rozměrů s těmito atributy:
- x - udává rozměr nebo interval povolených rozměrů pro X souřadnici
- y - udává rozměr nebo interval povolených rozměrů pro Y souřadnici
- defaultX - (volitelný) výchozí rozměr pro X souřadnici
- defaultY - (volitelný) výchozí rozměr pro Y souřadnici
- fixedRatio - boolean hodnota určující, zda má být zachován poměr stran
- color - barva rámečku ořezového okna
Pro souřadnice X a Y je možné zadat pevnou hodnotu, pak nelze okno v daném směru natahovat, nebo interval. Uzavřený interval lze zadat takto: 20-200. Lze zadat i polootevřený interval a to s vynecháním jednoho z čísel, tedy např.: -100 umožní natahovat okno od 1 do 100px, 20- umožní natáhnout okno od 20px do max. rozměru obrázku. Při pevných rozměrech nejsou zobrazeny šipky (pokud jsou povoleny k zobrazení) pro změnu rozměru ořezového okna. Výchozí nastavení velikosti usnadňuje určení velikosti ořezového okna nezávisle na intervalu rozsahu zvětšení okna. Pokud chceme fixní poměr, pak je nutné mít na paměti, že tento poměr se přepočítává k výchozím rozměrům okna a to buď zadaných ve výchozích rozměrech, nebo intervalových rozměrech.
S okny lze manipulovat i programově. Objekt ImageCropper propaguje tyto veřejné metody pro práci s ořezovými okny:
- deleteView(view) - vymaže okno view (view je objekt vrácený metodou createView)
- hideView(view) - schová okno, nicméně jeho rozměry budou odesílány formulářem
- showView(view, hideOthers) - zobrazí okno; druhý parametr udává, zda schovat ostatní okna [true]
- disableView(view) - vypne okno tak, že se souřadnice neodešlou přes formulář
- enableView(view) - zapne okno tak, že se souřadnice pošlou přes formulář
- resizeView(view, x, y) - změní rozměry okna dle rozměrů X a Y; ImageCropper nehlídá správnost rozměrů
- moveView(view, x, y) - přesune okno na zadané souřadníce; ImageCropper nehlídá správnost souřadnic
- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- siginterface.js
- signals.js
Stáhnout widget imagecropper.zip.
Záložky
V moderních stránkách jsou běžné záložky, které jsou vytvořeny nenásilnou formou z již vygenerovaného HTML nebo jejich vytvoření dynamicky za běhu.
- HTML
- Zdrojový kód
Pro vytvoření objektu obsluhující záložky stačí zavolat:
var tabs = new SZN.Tabs("tabContainer");
Poté stačí zadat jednotlivé záložky tak, že voláme metodu addClass které předáme ID záložky a ID obsahu divu:
tabs.addTab("sourceHTMLTab", "sourceHTML");
tabs.addTab("sourceJSTab", "sourceJS");
//jaky tab bude zobrazen
tabs.go(0);
Voláním metody go() určujeme pořadové číslo záložky, která bude zobrazena. Číslujeme od 0.
V HTML je nutné vytvořit seznam (UL), který bude tvořit ouška záložek:
<ul id="testTabs"> <li id="sourceHTMLTab">HTML</li> <li id="sourceJSTab">Zdrojový kód</li> </ul>
a pak obsah nejlépe umístěný v DIVech:
<div id="sourceHTML">Záložka na kterou se díváme</div> <div id="sourceJS">Záložka s JS zdroji</div>
Poslední věc, kterou musíme udělat, je přidat do stránky kontejner, ve kterém budeme zobrazovat obsahové DIVy.
<div id="tabContainer"></div>
Další záložky lze přidávat do stránky i po načtení stránky. Po kliknutí na bude přidána třetí záložka se vzorovým CSS.
Widget přidává všem záložkám třídu tab a vybrané záložce navíc přidává třídu tab-selected.
Dalším způsobem, jak vytvořit záložky, je vytvořit pojmenované obalující prvky záložek (UL) a obsahů (DIV):
<ul id="testTabs"> <li id="sourceHTMLTab">HTML</li> <li id="sourceJSTab">Zdrojový kód</li> </ul> <div id="sources"> <div id="sourceHTML">Záložka na kterou se díváme</div> <div id="sourceJS">Záložka s JS zdroji</div> </div>
Poté stačí přidat všechny prvky naráz pomocí metody:
tabs.addManyTabs("testTabs", "sources");
Požadované knihovny:
- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
Stáhnout widget tabs.zip.
Výběr barvy
Ne uplně častý, ale v HTML editorech docela běžný, je požadavek na snadný výběr barvy uživatelem. Na widget výběru barvy jsou kladeny rozmanité požadavky, je vhodné nabídnout paletu barev pro rychlý výběr, dále pokročilý výběr z duhového přechodu a možnost zadat barvu v různých barevných módech.
Na textové formulářové pole je aplikován widget výběru barvy jednoduchým JavaScriptem:
SZN.ColorPicker.setup("/img/colorpicker.gif", "[vybrat barvu]", {imagePath: "/img/widgets/colorpicker/"}, "mojeUnikatniId");
Metoda setup() je jediná legitimní statická metoda pro vytvoření widgetu. Její parametry jsou:
- image - prvním parametrem je cesta k obrázku, který bude zobrazen u políčka (klikací), pokud false, je vygenerován html button
- alt - textový popisek obrázku
- params - asociativní pole s těmito možnými klíči:
- imagePath - cesta k obrázkům přechodů pro zobrazení duhy ve widgetu [img/]
- windowOptions - asociativní pole s vlastnostmi pro widget Okna, do kterého je tento widget renderován
- paletteSize - počet buněk v řádku a sloupci barevné palety [8]
- labels - pole popisků záložek ["Paleta","Duha"]
- ok - popisek tlačítka [OK]
- cancel - popisek tlačítka [Cancel]
- fieldIds - další parametry funkce jsou Id formulářových prvků, nad kterými bude zobrazován výběr barvy.
Pokud je za textovým inputem vytvořen obrázek, je mu přiřazena CSS třída cp-launcher.
Jestliže potřebujeme získat barvu jinak než jen doplněním její hodnoty do textového pole, můžeme si zaregistrovat posluchače na událost colorselect, kterou instance výběru barvy vyvolává pokud je barva vybrána. Poté je možné přečíst barvu z vlastnosti color vlastnosti data objektu dané události. Je předávána instance třídy SZN.Color. Ukázka využití:
SZN.signals.addListener(window, 'colorselect', 'colorPickerCallback');
function colorPickerCallback(evt) {
alert(evt.data.color.x); //vrátí např. #a2b311
}
Požadované knihovny:
- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- tabs.zip
- siginterface.js
- signals.js
- window.zip
Stáhnout widget colorpicker.zip.
Výběr
Pro výběr jedné z možností se dost často používá formulářový prvek SELECT. Ten ale nelze jednoduše nastylovat. Proto ho můžeme obalit hezčím výběrem, kde nakreslíme obrázek SELECTu, který bude zapadat do našich stránek. Vyskakovací výběr je tvořen widgetem Okna.
Vyberte svůj
Vytvoření výběru lze jednoduše zavoláním:
var b = new SZN.BetterSelect("bSelect", {imagePath: "/img/widgets/window/shadow-"});
Kde první parametr je ID formulářového SELECTu a druhý parametr je asociativní pole s parametry pro widget Okna.
Požadované knihovny:- main.js
- classmaker.js
- browser.js
- events.js
- dom.js
- window.zip
Stáhnout widget betterselect.zip.
Řazení
Dost často se v současných aplikacích využívá změna pořadí, neboli uživatelské řazení. Je nutné umožnit uživateli vizuálně seřadit prvky na stránce a tento stav poté uchovat na serveru. Pro tyto případy je možno využít tento widget.
Na stránce vytvoříme DIV element, který bude obsahovat obrázky a my budeme chtít určit jejich pořadí.



Pořadí obrázků po jejich přehození je: .
Při přetažení obrázků změní polohu i odpovídající DIVy.
Vytvoření objektu je pouze voláním konstruktoru:
new SZN.Reorder("galleryReorder", {}, window, "resultMethod1");
kterému předáváme 4 parametry:
- boxId - ID kontejneru s objekty, které se mají prohazovat
- params - asociativní pole s dalším nepovinným nastavením:
- handleClass - pokud přetahujeme větší objekty, je občas vhodné, aby šlo přetahovat pouze za části obsahu (např. záhlaví), tyto oblasti definujeme společnou stylovou třídou pro tyto elementy [false]
- direction - osy, ve kterých budeme přetahovat [xy]
- ghostProcess - při přetahování vzniká klon původního elementu, pokud je element složitější struktury, je vhodné ho po naklonování zjednodušit. O to se stará předaná callback funkce tímto parametrem.
- callbackObj - objekt, nad kterým budeme volat callbackMethod
- callbackMethod - metoda, kterou widget volá při změně pořadí
Pokud prohodíte první prvek s druhým, vznikne pořadí 1,0,2,3, pokud je prohodíte nazpátek, vrácene pořadí se nezmění, ač se vizuálně prvky prohodí! Proč? Vracené pořadí je vždy pořadí relativní a tak stačí toto pole projít a aplikovat ho jako masku na pole s aktuálním stavem, který si držíme někde uvnitř vlastní aplikace.
Proto můžeme jednoduše měnit pořadí očíslovaných DIVů při změně pořadí obrázků touto metodou:
function resultMethod1(arr) {
SZN.gEl("galleryReorderRank").innerHTML =arr.toString();
var g = SZN.gEl('galleryReorder2');
var elements = g.getElementsByTagName('div');
var elements2 = [];
//zapamatovani si objektu do vlastinho pole, protoze z getElementsByTagName leze divne se chovajici kolekce
for (var i=0; i < elements.length; i++) {
elements2[i] = elements[i];
}
//pak apendujeme elementy do jejich rodice v poradi danem polem arr (append prvku ve stromu je vlastne jeho presunutim)
for( var i = 0; i < arr.length; i++) {
g.appendChild(elements2[arr[i]]);
}
}
Pokud začneme táhnout element tak je tento element zduplikován a označen třídou reorder-dragged. Dále originální element je označen třídou reorder-active. Pokud začneme táhnout element tak je tento element zduplikován a označen třídou reorder-dragged. Dále originální element je označen třídou reorder-active. Jakmile je přesunut nad jiný element, je tato třída předána tomuto elementu.
A na konec příkladů jednoduchá hra s použitím tohoto widgetu.
Požadované knihovny:
- main.js
- classmaker.js
- events.js
- dom.js
- browser.js
Stáhnout widget reorder.zip.
Konzole
Tento widget většinou neuvidí návštěvníci vašich stránek, nicméně vám může ulehčit práci při ladění vašich skriptů. Konzole funguje velice podobně jako konzole v rozšíření Firebug pro FireFox. Umožňuje zadávat příkazy v Javascriptu, obsahuje historii a nápovědu.
Konzoli do stránky přidáme jednoduše přidáním odkazu na její CSS a JS soubory do hlavičky dané stránky:
<link rel="stylesheet" href="console.css" type="text/css"></link> <script src="jak.js" type="text/javascript"></script> <script src="console.js" type="text/javascript"></script>
Jelikož je konzole napsána tak, aby automaticky startovala po načtení stránky, můžete si ji prohlédnout na vlastní stránce. Ve vlastních skriptech již nemusíte používat pro debugovací výpisy alert(), ale stačí volat metodu debug(), která přesměruje výpis právě do konzole, pokud je konzole nastartována.
Požadované knihovny:- main.js
- classmaker.js
- events.js
- dom.js
- browser.js
Stáhnout widget console.zip.
Slider
Tento widget umožňuje uživateli pohodlněji zadat číslo, než jen při použití klasického inputu. Slider umožnuje zadat číslo v určitém rozsahu, popřípadě i určitém kroku.
Základní slider můžeme vidět níže. Umí rozsah od 1 do 100 s krokem 1 a dokáže se nastavit dle zadané hodnoty v inputu:
Slider jde samozřejmě konfigurovat parametry konstruktoru:
- id - ID kontejneru do kterého se slider vykreslí
- params - asociativní pole s dalším nepovinným nastavením:
- width - šířka slideru [100]
- height - výška slideru [15]
- min - dolní mez intervalu výběru [1]
- max - horní mez intervalu výběru [100]
- riderW - šířka jezdce [10]
- riderH - výška jezdce [22]
- step - délka kroku, pokud je 0, je délka 1px (délka slideru / krok) je nejmenší rozlišitelný dílek [0]
- mode - string udávající pozici slideru, jestli se bude renderovat svisle, nebo vodorovně. Hodnoty jsou horizontal / vertical. [horizontal]
- iput - volitelný input element, do kterého jsou zapisovány data, popřípadě z nich může slider číst [null]
- separator - string udávající oddělovač číslic, tedy pokud zadáme čárku, je možné číst a zapisovat česká desetiná čísla [.]
- decimal - počet desetiných míst, která se budou zobrazovat [0]
- mainSliderId - název unikátního ID vytvořeného elementu pro hlavní prvek slideru
- arrowsMoverId - název unikátního ID vytvořeného odkazu, na který jsou navěšeny události pro obsluhování slideru klavesami
- riderSliderId - název unikátního ID vytvořeného jezdce slideru
- plusId - název unikátního ID vytvořeného tlačítka plus
- minusId - název unikátního ID vytvořeného tlačítka minus
- mainSliderClassName - název třídy vytvořeného elementu pro hlavní prvek slideru
- arrowsMoverClassName - název třídy vytvořeného odkazu, na který jsou navěšeny události pro obsluhování slideru klavesami
- riderSliderClassName - název třídy vytvořeného jezdce slideru
- plusClassName - název třídy vytvořeného tlačítka plus
- minusClassName - název třídy vytvořeného tlačítka minus
Příklad výše byl vytvořen jednoduchým voláním konstruktoru s těmito parametry:
var s = new SZN.Slider("sliderDiv",{
input: 'sliderOutput'
});
Slider je možné samozřejmě použít k získání hodnot v jiném intervalu a/nebo jiném kroku. Slider pro interval <1-12> s krokem 0.5 a čtením českého desetiného čísla bychom nastavili takto:
var s2 = new SZN.Slider("sliderDiv2",{
input: 'sliderOutput2',
min: 1,
max: 12,
step: 0.5,
separator: ',',
decimal: 1
});
A styly můžeme nastavit tak, aby slider vypadal dle našich požadavků. Ve výchozím nastavení každý prvek Slideru dostane CSS třídu, nicméně je možné pro každý prvek definovat vlastní CSS třídu i id. Výchozí CSS třídy jsou:
- mainSlider - obalující div arrowsMover - div značící dráhu pro jezdce
- riderSlider - div jezdce
- plus - div se znakem plus
- minus - div se znakem minus
- invalidClassName - třídu dostává připojený input, pokud je v něm chybně zadané číslo
Výchozí nastavení vzhledu je:
.arrowsMover {border: 1px solid gray; background-color: lightgray;}
.horizontal .riderSlider {top: -4px; border: 1px solid black; background-color: darkgray;}
.vertical .riderSlider {left: -4px; border: 1px solid black; background-color: darkgray;}
.invalidClassName {background-color: red;}
A výsledek:
Slider také můžeme jednoduše použít pro změnu velikostí prvků na stránce, nebo jejich umístění.
var s3 = new SZN.Slider("sliderDiv3",{mainSliderClassName: 'graphicsSlider'});
var s4 = new SZN.Slider("sliderDiv4",{mainSliderClassName: 'graphicsSlider', mode: 'vertical', width: 15, height: 100, riderW: 22, riderH: 10});
function resizeHorizontal(o) {
SZN.gEl('resizableBox').style.width = o.target.actualValue+'px';
}
SZN.signals.addListener(window, 'change', 'resizeHorizontal', s3 );
function resizeVertical(o) {
SZN.gEl('resizableBox').style.height = o.target.actualValue+'px';
}
SZN.signals.addListener(window, 'change', 'resizeVertical', s4 );
Mimo jiné byla použita i třída graphicsSlider, která jezdce podbarví obrázkem. Slider také hlavnímu divu dává třídu vertical/horizontal, pomocí které můžeme v CSS definicích rozdělit slidery dle jejich orientace.
Poslední ukázkou je slider s nastylovanými tlačítky [+] a [-]. Pro tuto eventualitu je přichystána výchozí třída buttonSlider.
var s5 = new SZN.Slider("sliderDiv5",{mainSliderClassName: 'buttonSlider'});
Obě třídy jdou samozřejmě kombinovat, tudíž můžeme mít tlačítka plus a mínus a obrázkového jezdce zároveň.
var s6 = new SZN.Slider("sliderDiv6",{mainSliderClassName: 'buttonSlider graphicsSlider', mode: 'vertical', width: 15, height: 100, riderW: 22, riderH: 10});
Požadované knihovny:
- main.js
- classmaker.js
- events.js
- dom.js
- browser.js
- signals.js
- siginterface.js
Stáhnout widget slider.zip.
Tree - strom
Tree je jednoduše použitelný, a dobře rozšiřitelný widget pro zobrazení stromové struktury, tedy např. adresářů a souborů na disku, nebo kategorií a článků v redakčním systému.
Widget se skládá ze tří souborů:
- tree.js - obsahuje základní třídy stromu Node a Leaf pro tvorbu uzlů a listů
- treevis.js - obsahuje třídy pro vizualizaci stromu a základní visualizer "Lines"
- treebuilder.js - volitelný soubor, který obsahuje jednoduchý vytvařeč stromu z předaného předpisu
Připnutí widgetu do stránky:
<link rel="stylesheet" href="tree.css" type="text/css"></link> <script src="jak.js" type="text/javascript"></script> <script src="tree.js" type="text/javascript"></script> <script src="treevis.js" type="text/javascript"></script> <script src="treebuilder.js" type="text/javascript"></script>
Vytvoření stromu ze zdrojových dat:
//data pro vytvoreni stromu
var treedata = {
title:'Kořen kategorií',
id: 'root',
visualizer: 'Lines',
nodeClass: SZN.Tree.Node,
childNodes: [
{
id: 'tst1',
title:'List AAA',
childNodes: [],
nodeClass: SZN.Tree.Leaf
},
{
id: 'tst2',
title:'Kategorie BBB',
nodeClass: SZN.Tree.Node,
childNodes: [
{
id: 'tst3',
title:'uzel v kategorii BBB',
nodeClass: SZN.Tree.Leaf
}
]
},
{
id: 'tst4',
title:'Kategorie CCC',
nodeClass: SZN.Tree.Node,
childNodes: [
{
id: 'tst5',
title:'Uzel 1',
nodeClass: SZN.Tree.Leaf
},
{
id: 'tst6',
title:'Uzel 2',
nodeClass: SZN.Tree.Leaf
}
]
}
]
};
//vytvoření struktury stromu
var treeBuilder = new SZN.Tree.Builder(treedata);
var rootNode = treeBuilder.build();
//vytvoreni HTML struktury a jeji pripnuti do stranky
var n = rootNode.visualize();
SZN.gEl("strom").appendChild(n);
//rozevreni korenove kategorie
rootNode.expand();
a výsledek vizualizace:
Jelikož je widget napsán tak, aby ho bylo možné jednoduše rozšířit, je detailnější popis na vlastní stránce. Na této stránce se dozvíte, jak dekorovat uzly novou funkčností, např. dynamickým donačítáním částí stromů pomocí AJAXu, nebo jak vytvořit třídu pro vlastní vizualizaci stromu.
Požadované knihovny:- main.js
- classmaker.js
- events.js
- dom.js
- browser.js
- signals.js
- sigInterface.js
- decorator.js
Stáhnout widget tree.zip.
