{ "version": 3, "sources": ["../../node_modules/@story/story_assets/app/assets/javascripts/utils.js", "../../node_modules/@story/story_assets/app/assets/javascripts/dom_extend.js", "../../node_modules/@story/story_assets/app/assets/javascripts/animations.js", "../../node_modules/@story/story_assets/app/assets/javascripts/slide.js", "../../node_modules/@story/story_assets/app/assets/javascripts/modal/modal.js", "../../node_modules/@story/story_assets/app/assets/javascripts/carousel.js", "../../node_modules/@story/story_assets/app/assets/javascripts/modal/modal_gallery.js"], "sourcesContent": ["/**\n * Equivalent of the jQuery.ready() function.\n * Executes the callback when the document is fully loaded.\n *\n * @param {Function} callback - The function to be executed when the document is ready.\n */\nexport function onDocumentReady(callback) {\n\tif (document.readyState === \"complete\" || (document.readyState !== \"loading\" && !document.documentElement.doScroll)) {\n\t\t// Dokument u\u017E je na\u010Dten\u00FD, tak\u017Ee mus\u00EDme zavolat callback my (ud\u00E1lost DOMContentLoaded\n\t\t// u\u017E nebude prohl\u00ED\u017Ee\u010Dem emitov\u00E1na).\n\t\tcallback();\n\t}\n\telse {\n\t\t// Dokument je\u0161t\u011B nen\u00ED na\u010Dten\u00FD, po\u010Dk\u00E1me na n\u011Bj p\u0159es ud\u00E1lost.\n\t\tdocument.addEventListener(\"DOMContentLoaded\", callback);\n\t}\n}\n\n\n/**\n * Handler for code that is added to the page via snippets.\n * Executes the callback when the document is ready or when a snippet is ready.\n *\n * @param {Function} callback - The function to be executed when the content is ready.\n */\nexport function onContentReady(callback) {\n\tonDocumentReady(function() {\n\t\tcallback(document)\n\t});\n\n\tdocument.addEventListener(\"snippetready\", function(event) {\n\t\tcallback(event.detail.parent);\n\t});\n}\n\n\n/**\n * Simplified way of creating custom events. Events can have their own parameters\n * (available in the handler via event.detail.*), can \"bubble\" upwards, or be \"cancelable\"\n * (both set to false by default).\n *\n * This function is crucial as we use custom events extensively on the web.\n *\n * The function needs to be called using \"apply\" or \"bind\" in the form of\n * triggerEvent.apply(element, eventName, params, bubbles, cancellable).\n * It expects to receive the element on which to trigger the event in \"this\".\n *\n * @param {string} eventName - The name of the event to be triggered.\n * @param {Object} params - The parameters to be passed with the event.\n * @param {boolean} [bubbles=true] - Whether the event should bubble up.\n * @param {boolean} [cancellable=true] - Whether the event should be cancelable.\n */\nexport function triggerEvent(eventName, params, bubbles, cancellable) {\n\t// V\u00FDchoz\u00ED hodnoty pro probubl\u00E1v\u00E1n\u00ED a zru\u0161itelnost.\n\tbubbles = bubbles || true;\n\tcancellable = cancellable || true;\n\n\t// Vytvo\u0159en\u00ED vlastn\u00ED ud\u00E1losti se zvolen\u00FDm n\u00E1zvem.\n\tvar customEvent = new window.CustomEvent(eventName, { bubbles: bubbles, cancellable: cancellable, detail: params })\n\n\t// Vyvol\u00E1n\u00ED ud\u00E1losti na DOM elementu, kter\u00FD n\u00E1m byl p\u0159ed\u00E1n ve form\u011B \"this\" prom\u011Bnn\u00E9.\n\tthis.dispatchEvent(customEvent);\n}\n\n\n/**\n * Is the DOM element visible?\n * The DOM element is passed via \"apply\" as the \"this\" pointer.\n * Function taken from the jQuery library.\n */\nexport function isVisible() {\n\treturn !!(this.offsetWidth || this.offsetHeight || this.getClientRects().length) && this.style.visibility != \"hidden\";\n}\n\n\n/**\n * Return direct descendants of the given element that match the given selector.\n * Unfortunately, IE does not implement the querySelectorAll(\":scope > ...\") option,\n * so we need to find another way.\n * The DOM element is passed via \"apply\" as the \"this\" pointer.\n *\n * @param {string} selector - The CSS selector to match the descendants against.\n * @returns {Array} - An array of matching direct descendant elements.\n */\nexport function querySelectorChildren(selector) {\n\treturn Array.prototype.filter.call(this.children, function(child) {\n\t\treturn child.matches(selector);\n\t});\n};\n\n\n/**\n * Simplifies event capturing that is bound to a specific element (selector).\n *\n * @param {Element} element - The DOM element to bind the event to.\n * @param {string} event - The event type to listen for.\n * @param {string} selector - The CSS selector to match the descendants against.\n * @param {Function} handler - The event handler function.\n */\nexport function addEventSelectorListener(eventNames, selector, callback) {\n\tvar eventNames = eventNames.split(\" \");\n\tfor (var i = 0; i < eventNames.length; ++i) {\n\t\tthis.addEventListener(eventNames[i], function(event) {\n\t\t\t// Dostaneme-li jako event.target objekt document, ten nem\u00E1 metodu closest, a proto mus\u00EDme jej\u00ED p\u0159\u00EDtomnost testovat.\n\t\t\tvar target = event.target.closest ? event.target.closest(selector) : null;\n\t\t\tif (!target) { return; }\n\t\t\tcallback(event, target);\n\t\t});\n\t}\n}\n\n\n/**\n * A relaxed version of addEventSelectorListener, where \"closest\" is not used,\n * but the selector must match directly on the element that triggered the event.\n * This is particularly useful for events like \"change\", where the event source\n * is directly an input element and checking \"closest\" would be unnecessary\n * (it wouldn't be fundamentally wrong, but it would reduce script performance).\n *\n * @param {Element} element - The DOM element to bind the event to.\n * @param {string} event - The event type to listen for.\n * @param {string} selector - The CSS selector to match the event target against.\n * @param {Function} handler - The event handler function.\n */\nexport function addEventMatchesListener(eventName, selector, callback) {\n\tthis.addEventListener(eventName, function(event) {\n\t\tif (event.target.matches(selector)) {\n\t\t\tcallback(event, event.target);\n\t\t}\n\t});\n}\n\n\n/**\n * If it is a link that does not point anywhere or a button that is not \"submit\",\n * it suppresses the action. Useful for suppressing events on links that lead nowhere\n * (href is #), while preserving functionality for elements like radio buttons.\n */\nexport function preventLinkDefault(event, target) {\n\tif (target.getAttribute(\"href\") == \"#\"\n\t\t|| (target.matches(\"button\") && !target.matches(\"button[type='submit'], button[type='reset']\"))\n\t\t|| (target.matches(\"input\") && !target.matches(\"input[type='checkbox'], input[type='radio']\"))) {\n\t\tevent.preventDefault();\n\t}\n}", "import { triggerEvent, isVisible, querySelectorChildren, addEventSelectorListener, addEventMatchesListener } from \"./utils\";\n\n//\n// Tato t\u0159\u00EDda obsahuje k\u00F3d, kter\u00FD je trochu \"kontroverzn\u00ED\" (nen\u00ED to \u00FApln\u011B dobr\u00FD n\u00E1pad).\n// Smyslem je zjednodu\u0161it z\u00E1pis vol\u00E1n\u00ED funkc\u00ED, kter\u00E9 o\u010Dek\u00E1vaj\u00ED element jako sv\u016Fj argument,\n// tj. jde o operace s/nad elementy a tak se roz\u0161\u00ED\u0159en\u00ED jejich prototypu (by\u0165\n// jde o siln\u011B nedoporu\u010Dovan\u00E9 \u0159e\u0161en\u00ED) nab\u00EDz\u00ED. Zde si tuto \"kontroverzi\" m\u016F\u017Eeme dovolit,\n// proto\u017Ee k\u00F3d nen\u00ED rozsh\u00E1hl\u00FD.\n//\n// Pokud by se v budoucnu uk\u00E1zalo, \u017Ee tento p\u0159\u00EDstup opravdu nebyl dobr\u00FD n\u00E1pad,\n// v\u0161echny funkce jsou ps\u00E1ny tak, aby je \u0161lo kdykoliv nahradit vol\u00E1n\u00EDm p\u0159es \"apply\" nebo \"bind\",\n// kde jako prvn\u00ED argument bude v\u017Edy dan\u00FD element.\n//\n\nif (!Element.prototype.trigger && !Document.prototype.trigger && !Element.prototype.isVisible && !Element.prototype.querySelectorChildren && !Document.prototype.addEventSelectorListener && !Element.prototype.addEventSelectorListener && !Document.prototype.addEventMatchesListener && !Element.prototype.addEventMatchesListener) {\n\tElement.prototype.trigger = Document.prototype.trigger = triggerEvent;\n\tElement.prototype.isVisible = isVisible;\n\tElement.prototype.querySelectorChildren = querySelectorChildren;\n\tElement.prototype.addEventSelectorListener = Document.prototype.addEventSelectorListener = addEventSelectorListener;\n\tElement.prototype.addEventMatchesListener = Document.prototype.addEventMatchesListener = addEventMatchesListener;\n}\nelse {\n\tconsole.error(\"N\u011Bkter\u00E9 z metod v t\u0159\u00EDd\u011B \\\"Element\\\" ji\u017E existuj\u00ED. Zkontrolujte \\\"dom_extend.js\\\".\");\n}\n", "import \"./dom_extend\";\n\nexport const Animation = {};\n\n// V\u00FDchoz\u00ED hodnoty\nAnimation.default = {};\nAnimation.default.duration = 500; // [ms]\nAnimation.default.display = \"block\"; // block, inline, inline-block, flex, ... atd.\n\n\n//\n// Pomocn\u00E1 funkce, kter\u00E1 zaji\u0161\u0165uje animaci. Pro animaci vyu\u017E\u00EDv\u00E1me CSS3 transitions. \u00DAkolem\n// javascriptu je nastavit stav p\u0159ed, d\u00E1t prohl\u00ED\u017Ee\u010Di informaci o zm\u011Bn\u011B stavu, nastavit transitions\n// a nastavit stav po. Prohl\u00ED\u017Ee\u010D vykon\u00E1 animaci a na konci po sob\u011B uklid\u00EDme.\n//\n// V\u0161echny animace jdou rozd\u011Blit na kind = \"in\" (prvek chceme zobrazit) a kind = \"out\" (prvek chceme skr\u00FDt),\n// animace pak maj\u00ED f\u00E1ze \"initialize\", \"setUp\", \"run\" a \u00FAklidovou \"tearDown\". Vhodnou volbou t\u00E9to \u010Dtve\u0159ice\n// funkc\u00ED lze vytvo\u0159it r\u016Fzn\u00E9 animace, jako nyn\u00ED implementovan\u00E9 fadeIn/fadeOut a slideDown/slideUp.\n//\n// Funkce vrac\u00ED Promise, tj. nav\u00E1zat na dokon\u010Denou animaci lze standardn\u011B p\u0159es \"then()\".\n//\nfunction animate(elements, kind, initialize, setUp, run, tearDown) {\n\treturn new Promise(function(resolve, reject) {\n\n\t\t// Animujme cel\u00E9 pole prvk\u016F (p\u0159eve\u010Fme proto samostatn\u00FD prvek na jednoprvkov\u00E9 pole).\n\t\t// Pole testujeme p\u0159es existenci metody length, proto\u017Ee querySelectorAll funkce vrac\u00ED svoji kolekci\n\t\t// nikoliv pole jako takov\u00E9 a toto je nejjednodu\u0161\u0161\u00ED zp\u016Fsob, jak otestovat, jestli v ruce dr\u017E\u00EDme\n\t\t// obecn\u011B n\u011Bjakou kolekci nebo ne.\n\t\tif (!(elements instanceof NodeList || elements instanceof Array)) {\n\t\t\telements = [elements];\n\t\t}\n\n\t\t// V p\u0159\u00EDpad\u011B, \u017Ee animace je typu \"in\", tj. budeme element zobrazovat, provedeme preprocessing\n\t\t// na test viditelnosti a nastav\u00EDme CSS vlastnost display.\n\t\tif (kind == \"in\") {\n\t\t\t// Odstra\u0148me z pole ty prvky, kter\u00E9 u\u017E jsou viditeln\u00E9 (abychom je neanimovali znovu).\n\t\t\telements = Array.from(elements).filter(function(element) {\n\t\t\t\treturn !element.isVisible()\n\t\t\t});\n\n\t\t\tfor (var i = 0; i < elements.length; ++i) {\n\t\t\t\tvar element = elements[i];\n\n\t\t\t\t// Odstra\u0148me Bootstrap t\u0159\u00EDdy, kter\u00E9 znemo\u017E\u0148uj\u00ED zobrazen\u00ED prvku.\n\t\t\t\telement.classList.remove(\"d-none\", \"d-sm-none\", \"d-md-none\", \"d-lg-none\", \"d-xl-none\");\n\n\t\t\t\t// Zjist\u011Bme, jak\u00FD display (block, flex, inline-block, ...) m\u00E1 prvek m\u00EDt. Nen\u00ED-li k dispozici, nastavme v\u00FDchoz\u00ED hodnotu.\n\t\t\t\telement.style.removeProperty(\"display\");\n\t\t\t\tvar elementDisplay = getComputedStyle(element).display;\n\t\t\t\tif (elementDisplay == \"none\") {\n\t\t\t\t\telementDisplay = Animation.default.display;\n\t\t\t\t}\n\t\t\t\telement.style.display = elementDisplay;\n\t\t\t\telement.style.visibility = \"visible\";\n\t\t\t}\n\t\t}\n\n\t\t// Samotn\u00E1 animace, kdy nejprve nastav\u00EDme po\u010D\u00E1te\u010Dn\u00ED vlastnosti elementu, vynut\u00EDme v prohl\u00ED\u017Ee\u010Di p\u0159epo\u010Det,\n\t\t// nastav\u00EDme transitions a kone\u010Dn\u00E9 vlatnosti elementu. Prohl\u00ED\u017Ee\u010D pak za n\u00E1s s\u00E1m element animuje.\n\t\tfor (var i = 0; i < elements.length; ++i) {\n\t\t\tvar element = elements[i];\n\n\t\t\t// Dopl\u0148uj\u00EDc\u00ED data, kter\u00E1 mohou f\u00E1ze setUp a run vyu\u017E\u00EDt pro p\u0159enos n\u011Bjak\u00E9 u\u017Eite\u010Dn\u00E9 informace (nap\u0159. v\u00FD\u0161ky prvku p\u0159ed a po animaci).\n\t\t\tvar data = {};\n\n\t\t\t// Prove\u010Fme z\u00E1kladn\u00ED inicializaci animace.\n\t\t\tinitialize(element, data);\n\n\t\t\t// Vyresetujme hodnoty.\n\t\t\tsetUp(element, data);\n\n\t\t\t// P\u0159ipravme prohl\u00ED\u017Ee\u010D na animov\u00E1n\u00ED.\n\t\t\telement.offsetHeight; // Bez tohoto \u0159\u00E1dku animace nefunguje, toto \"donut\u00ED\" prohl\u00ED\u017Ee\u010D p\u0159epo\u010D\u00EDtat vlastnostnosti prvku a spustit pozd\u011Bj\u0161\u00ED animaci.\n\n\t\t\t// Prove\u010Fme animaci\n\t\t\telement.style.transitionDuration = Animation.default.duration + \"ms\";\n\t\t\trun(element, data);\n\t\t}\n\n\t\t// Ukli\u010Fme po sob\u011B.\n\t\tsetTimeout(function() {\n\t\t\tfor (var i = 0; i < elements.length; ++i) {\n\t\t\t\tvar element = elements[i];\n\n\t\t\t\t// Odstra\u0148me CSS vlastnosti, p\u0159es kter\u00E9 jsme animovali.\n\t\t\t\telement.style.removeProperty(\"transition-duration\");\n\t\t\t\telement.style.removeProperty(\"transition-property\");\n\n\t\t\t\t// V p\u0159\u00EDpad\u011B skr\u00FDvac\u00ED animace nastavme CSS display vlastnost.\n\t\t\t\tif (kind == \"out\") {\n\t\t\t\t\telement.style.display = \"none\";\n\t\t\t\t}\n\t\t\t\telse if (kind == \"hide\") {\n\t\t\t\t\telement.style.visibility = \"hidden\";\n\t\t\t\t}\n\n\t\t\t\t// \u00DAklid.\n\t\t\t\ttearDown(element);\n\t\t\t}\n\n\t\t\t// Pokra\u010Dujme d\u00E1l (promise).\n\t\t\tresolve(elements);\n\n\t\t}, Animation.default.duration + 10); // Dejme n\u011Bjakou \u010Dasovou rezervu (10ms), a\u0165 pohodln\u011B dob\u011Bhne CSS animace a nedojde k n\u011Bjak\u00E9mu posko\u010Den\u00ED.\n\t});\n};\n\n\n// *************************************************************************\n// Zobrazen\u00ED/skryt\u00ED prvk\u016F pomoc\u00ED fade animace\n// *************************************************************************\n\nfunction fadeInitialize() {\n\t// Pr\u00E1zdn\u00E1 funkce, u fade animace nepot\u0159ebujeme zn\u00E1t \u017E\u00E1dn\u00E9 informace o prvku.\n}\n\nfunction fadeHidden(element, data) {\n\telement.style.opacity = 0;\n}\n\nfunction fadeVisible(element, data) {\n\telement.style.transitionProperty = \"opacity\";\n\telement.style.opacity = 1;\n}\n\nfunction fadeCleanAnimation(element) {\n\telement.style.removeProperty(\"opacity\");\n}\n\nAnimation.fadeIn = function(elements) {\n\treturn animate(\n\t\telements, \"in\",\n\t\tfadeInitialize,\n\t\tfadeHidden,\n\t\tfadeVisible,\n\t\tfadeCleanAnimation\n\t);\n};\n\nAnimation.fadeOut = function(elements, onlyHide) {\n\treturn animate(\n\t\telements, onlyHide ? \"hide\" : \"out\",\n\t\tfadeInitialize,\n\t\tfadeVisible,\n\t\tfadeHidden,\n\t\tfadeCleanAnimation\n\t);\n};\n\n\n// *************************************************************************\n// Zobrazen\u00ED/skryt\u00ED prvk\u016F pomoc\u00ED slide animace\n// *************************************************************************\n\nfunction slideInitialize(element, data) {\n\t// Zjist\u011Bme, jak\u00E1 je v\u00FD\u0161ka elementu (skrze ni budeme animovat)\n\tdata.height = element.offsetHeight;\n}\n\nfunction slideHidden(element, data) {\n\telement.style.overflow = \"hidden\";\n\telement.style.height = 0;\n\telement.style.paddingTop = 0;\n\telement.style.paddingBottom = 0;\n\telement.style.marginTop = 0;\n\telement.style.marginBottom = 0;\n}\n\nfunction slideVisible(element, data) {\n\telement.style.transitionProperty = \"height, margin, padding\";\n\telement.style.boxSizing = \"border-box\";\n\telement.style.height = data.height + \"px\";\n}\n\nfunction slideCleanAnimation(element) {\n\telement.style.removeProperty(\"height\");\n\telement.style.removeProperty(\"overflow\");\n\telement.style.removeProperty(\"box-sizing\");\n}\n\nfunction slideCleanState(element) {\n\telement.style.removeProperty(\"padding-top\");\n\telement.style.removeProperty(\"padding-bottom\");\n\telement.style.removeProperty(\"margin-top\");\n\telement.style.removeProperty(\"margin-bottom\");\n}\n\nAnimation.slideDown = function(elements) {\n\treturn animate(\n\t\telements, \"in\",\n\t\tslideInitialize,\n\t\tslideHidden,\n\t\tfunction(element, data) {\n\t\t\tslideCleanState(element);\n\t\t\tslideVisible(element, data);\n\t\t},\n\t\tslideCleanAnimation\n\t);\n};\n\nAnimation.slideUp = function(elements, onlyHide) {\n\treturn animate(\n\t\telements, onlyHide ? \"hide\" : \"out\",\n\t\tslideInitialize,\n\t\tslideVisible,\n\t\tslideHidden,\n\t\tfunction(element) {\n\t\t\tslideCleanState(element);\n\t\t\tslideCleanAnimation(element);\n\t\t}\n\t);\n};\n", "import { preventLinkDefault } from \"./utils\";\nimport { Animation } from \"./animations\";\n\n\n// *************************************************************************\n// Otev\u00EDr\u00E1n\u00ED/zav\u00EDr\u00E1n\u00ED nab\u00EDdek se slide efektem a s mo\u017Enost\u00ED exklusivity\n// (tj. v\u017Edy pouze jedna nab\u00EDdka z vybran\u00E9 skupiny je otev\u0159en\u00E1 - akordeon)\n// *************************************************************************\n\nfunction isTargetExpanded(target) {\n\t// Zji\u0161\u0165ov\u00E1n\u00ED p\u0159es t\u0159\u00EDdy nesta\u010D\u00ED. Aby to fungovalo, mus\u00EDme p\u0159idat je\u0161t\u011B kontrolu na breakpointy.\n\treturn target.classList.contains(\"expanded\") ||\n\t\t(target.classList.contains(\"expanded-sm\") && MediaBreakpoint.up(\"sm\")) ||\n\t\t(target.classList.contains(\"expanded-md\") && MediaBreakpoint.up(\"md\")) ||\n\t\t(target.classList.contains(\"expanded-lg\") && MediaBreakpoint.up(\"lg\")) ||\n\t\t(target.classList.contains(\"expanded-xl\") && MediaBreakpoint.up(\"xl\"));\n}\n\nfunction removeExpandedClass(target) {\n\ttarget.classList.remove(\"expanded\", \"expanded-sm\", \"expanded-md\", \"expanded-lg\", \"expanded-xl\");\n}\n\n//\n// Pomocn\u00E1 funkce pro nastaven\u00ED t\u0159\u00EDdy \"spou\u0161t\u011B\u010D\u016Fm\" (toggles)\n//\nfunction toggleToggleClasses(toggle, animationKind, classNames, addOrRemove) {\n\t// Nastavme/odstra\u0148me t\u0159\u00EDdy p\u0159\u00EDmo na toggle.\n\tfor (let i = 0; i < classNames.length; ++i) {\n\t\ttoggle.classList[addOrRemove](classNames[i]);\n\t}\n\n\t// Ka\u017Ed\u00FD \"toggle\" m\u016F\u017Ee m\u00EDt je\u0161t\u011B sv\u00E9 \"feedback\" prvky.\n\tlet feedbacksSelector = toggle.getAttribute(\"data-\" + animationKind + \"-feedback\");\n\tif (feedbacksSelector) {\n\t\tlet feedbacks = document.querySelectorAll(feedbacksSelector);\n\t\tfor (let j = 0; j < feedbacks.length; ++j) {\n\t\t\tfor (let i = 0; i < classNames.length; ++i) {\n\t\t\t\tfeedbacks[j].classList[addOrRemove](classNames[i]);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n//\n// Sbalit nab\u00EDdku\n//\nfunction hideElements(toggles, targets, animationOut, animationKind) {\n\tfor (let i = 0; i < toggles.length; ++i) {\n\t\ttoggleToggleClasses(toggles[i], animationKind, [\"collapsing\"], \"add\");\n\t\ttoggleToggleClasses(toggles[i], animationKind, [\"expanded\", \"expanded-sm\", \"expanded-md\", \"expanded-lg\", \"expanded-xl\"], \"remove\");\n\t\ttoggles[i].trigger(\"slidetogglecollapsing\");\n\t}\n\tfor (let i = 0; i < targets.length; ++i) {\n\t\ttargets[i].classList.add(\"collapsing\");\n\t\ttargets[i].trigger(\"slidetargetcollapsing\");\n\t}\n\n\treturn animationOut(targets).then(function() {\n\t\tfor (let i = 0; i < toggles.length; ++i) {\n\t\t\ttoggleToggleClasses(toggles[i], animationKind, [\"collapsing\"], \"remove\");\n\t\t\ttoggles[i].trigger(\"slidetogglecollapsed\");\n\t\t}\n\t\tfor (let i = 0; i < targets.length; ++i) {\n\t\t\ttargets[i].classList.remove(\"collapsing\");\n\t\t\tremoveExpandedClass(targets[i]);\n\t\t\ttargets[i].trigger(\"slidetargetcollapsed\");\n\t\t}\n\t});\n}\n\n\n//\n// Rozbalit nab\u00EDdku\n//\nfunction showElements(toggles, targets, animationIn, animationKind) {\n\tfor (let i = 0; i < toggles.length; ++i) {\n\t\ttoggleToggleClasses(toggles[i], animationKind, [\"expanding\"], \"add\");\n\t\ttoggles[i].trigger(\"slidetoggleexpanding\");\n\t}\n\tfor (let i = 0; i < targets.length; ++i) {\n\t\ttargets[i].classList.add(\"expanding\");\n\t\ttargets[i].trigger(\"slidetargetexpanding\");\n\t}\n\n\tlet promises = [];\n\n\tfor (let i = 0; i < targets.length; ++i) {\n\t\t// TODO display\n\t\t// let display = targets[i].getAttribute(\"data-\" + animationKind + \"-display\") || Animation.default.display;\n\n\t\tpromises.push(\n\t\t\tanimationIn(targets[i]).then(function() {\n\t\t\t\tfor (let j = 0; j < toggles.length; ++j) {\n\t\t\t\t\ttoggleToggleClasses(toggles[j], animationKind, [\"expanding\"], \"remove\");\n\t\t\t\t\ttoggleToggleClasses(toggles[j], animationKind, [\"expanded\"], \"add\");\n\t\t\t\t\ttoggles[j].trigger(\"slidetoggleexpanded\");\n\t\t\t\t}\n\t\t\t\tfor (let j = 0; j < targets.length; ++j) {\n\t\t\t\t\ttargets[j].classList.remove(\"expanding\");\n\t\t\t\t\ttargets[j].classList.add(\"expanded\");\n\t\t\t\t\ttargets[j].trigger(\"slidetargetexpanded\");\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\treturn Promise.all(promises);\n}\n\n\n//\n// Pro combobox a v\u00FDb\u011Br variant vznikla tato specialita, kdy je mo\u017En\u00E9 zobrazen\u00FD obsah p\u0159i kliknut\u00ED\n// kamkoliv jinam do prostoru obsah zav\u0159\u00EDt (n\u011Bco jako jsou bubliny s n\u00E1pov\u011Bdou).\n//\n// P\u0159es data atribut \"data-sticky='ignore'\" je mo\u017En\u00E9 p\u0159i kliknut\u00ED v dan\u00E9m kontejneru skr\u00FDv\u00E1n\u00ED vypnout.\n//\nfunction hideNonStickyElements(eventTarget, omitElement) {\n\tif (eventTarget.closest(\"[data-sticky='ignore']\")) {\n\t\treturn;\n\t}\n\n\tlet targets = document.querySelectorAll(\"[data-slide][data-sticky='false'], [data-fade][data-sticky='false']\");\n\tif (!targets.length) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < targets.length; ++i) {\n\t\tlet target = targets[i];\n\n\t\tif (target == omitElement) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet elementSelector = target.getAttribute(\"data-slide\") || target.getAttribute(\"data-fade\");\n\t\tlet animationKind = target.getAttribute(\"data-slide\") ? \"slide\" : \"fade\";\n\t\tlet animationOut = animationKind == \"slide\" ? Animation.slideUp : Animation.fadeOut;\n\n\t\tlet toggles = document.querySelectorAll(\"[data-\" + animationKind + \"='\" + elementSelector + \"']\");\n\t\tlet elements = document.querySelectorAll(elementSelector);\n\n\t\thideElements(toggles, elements, animationOut, animationKind);\n\t}\n}\n\n\n//\n// Core animation\n//\nfunction animate(target, blockAnimationIfRunning) {\n\tblockAnimationIfRunning = blockAnimationIfRunning || false;\n\n\t// Pokud pr\u00E1v\u011B prob\u00EDh\u00E1 n\u011Bjak\u00FD druh animace, tak nic ned\u011Blejme.\n\tif (blockAnimationIfRunning) {\n\t\tlet isAnimating = target.classList.contains(\"expanding\") || target.classList.contains(\"collapsing\");\n\t\tif (isAnimating) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tlet animationKind = target.getAttribute(\"data-slide\") ? \"slide\" : \"fade\";\n\tlet exclusiveGroup = target.getAttribute(\"data-exclusive\");\n\tlet otherGroups = exclusiveGroup ? document.querySelectorAll(\"[data-\" + animationKind + \"][data-exclusive='\" + exclusiveGroup + \"']\") : [];\n\n\t// Pokud pr\u00E1v\u011B prob\u00EDh\u00E1 n\u011Bjak\u00FD druh animace na exklusivn\u00ED skupin\u011B, tak nic ned\u011Blejme.\n\tif (blockAnimationIfRunning) {\n\t\tfor (let i = 0; i < otherGroups.length; ++i) {\n\t\t\tlet otherGroup = otherGroups[i];\n\t\t\tlet isAnimating = otherGroup.classList.contains(\"expanding\") || otherGroup.classList.contains(\"collapsing\");\n\t\t\tif (isAnimating) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet isExpanded = isTargetExpanded(target);\n\tlet animationIn = animationKind == \"slide\" ? Animation.slideDown : Animation.fadeIn;\n\tlet animationOut = animationKind == \"slide\" ? Animation.slideUp : Animation.fadeOut;\n\tlet elementSelector = target.getAttribute(\"data-\" + animationKind);\n\tlet direction = target.getAttribute(\"data-direction\");\n\tlet waitForFinish = target.getAttribute(\"data-wait-for-finish\") == \"true\";\n\n\t// N\u011Bkter\u00E1 tla\u010D\u00EDtka mohou m\u00EDt pouze jednosm\u011Brnou funkci (pouze otev\u0159\u00EDt/pouze zav\u0159\u00EDt).\n\t// Zablokujme proto opa\u010Dnou funkci.\n\tif ((isExpanded && (direction == \"down\" || direction == \"in\")) || (!isExpanded && (direction == \"up\" || direction == \"out\"))) {\n\t\treturn;\n\t}\n\n\t// V\u0161echna tla\u010D\u00EDtka, kter\u00E1 vedou na stejn\u00FD c\u00EDl (abychom m\u011Bli mo\u017Enost jednu a tut\u00E9\u017E nab\u00EDdku rozbalovat/sbalovat z v\u00EDce m\u00EDst)\n\tlet toggles = document.querySelectorAll(\"[data-\" + animationKind + \"='\" + elementSelector + \"']\");\n\n\t// C\u00EDl rozbalen\u00ED/sbalen\u00ED\n\tlet elements = document.querySelectorAll(elementSelector);\n\n\t// Akce\n\tif (isExpanded) {\n\t\t// Skryj polo\u017Eky\n\t\treturn hideElements(toggles, elements, animationOut, animationKind);\n\t}\n\telse {\n\t\t// Pokud je \u017E\u00E1d\u00E1no, skryj v\u0161echny ostatn\u00ED polo\u017Eky, kter\u00E9 pat\u0159\u00ED do stejn\u00E9 skupiny.\n\t\tlet promises = [];\n\t\tfor (let i = 0; i < otherGroups.length; ++i) {\n\t\t\tlet otherGroup = otherGroups[i];\n\n\t\t\tif (target == otherGroup || !isTargetExpanded(otherGroup)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet otherElementSelector = otherGroup.getAttribute(\"data-\" + animationKind);\n\t\t\t// let otherToggles = document.querySelectorAll(\"[data-\" + animationKind + \"='\" + otherElementSelector + \"']\");\n\t\t\tlet otherElements = document.querySelectorAll(otherElementSelector);\n\n\t\t\tpromises.push(hideElements([otherGroup], otherElements, animationOut, animationKind));\n\t\t}\n\n\t\tif (waitForFinish) {\n\t\t\t// Po\u010Dkej, ne\u017E se dokon\u010D\u00ED skr\u00FDv\u00E1n\u00ED.\n\t\t\treturn Promise.all(promises).then(function() {\n\t\t\t\treturn showElements(toggles, elements, animationIn, animationKind);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\t// Zobraz polo\u017Eky rovnou\n\t\t\treturn showElements(toggles, elements, animationIn, animationKind);\n\t\t}\n\t}\n}\n\n\n// *************************************************************************\n// Animation queue\n// *************************************************************************\n\n// Kdy\u017E u\u017Eivatel\u00E9 zb\u011Bsile klikali, tak se animace za\u010Daly r\u016Fzn\u011B rozb\u00EDjet. Prvn\u00ED ochrana\n// proti tomuto chov\u00E1n\u00ED bylo ignorov\u00E1n\u00ED kliknut\u00ED, dokud se p\u0159edchoz\u00ED animace nedokon\u010Dila.\n// V\u00FDsledek ale nebyl \u00FApln\u011B p\u0159\u00EDjemn\u00FD, vypadalo to, jako kdy\u017E se telefon rozbil a nechce\n// reagovat na u\u017Eivatelovy povely. Proto jsou nyn\u00ED animace za sebe skl\u00E1d\u00E1ny do fronty\n// a vykonaj\u00ED se postupn\u011B jedna po druh\u00E9. Tak\u00E9 to nen\u00ED \u00FApln\u011B ide\u00E1ln\u00ED, ale v\u00FDsledek se\n// zd\u00E1 b\u00FDt pocitov\u011B lep\u0161\u00ED. St\u00E1lo by za \u00FAvahu p\u0159idat trochu robustnosti v p\u0159\u00EDpad\u011B,\n// \u017Ee nap\u0159. dynamick\u00FD element v pr\u016Fb\u011Bhu vykon\u00E1v\u00E1n\u00ED fronty ze str\u00E1nky zmiz\u00ED. Toto by\n// sou\u010Dasnou implementaci fronty nejsp\u00ED\u0161e rozbilo. Fronta je spole\u010Dn\u00E1 pro v\u0161echny animace,\n// dal\u0161\u00ED vylep\u0161en\u00ED by p\u0159idalo na robustnosti a u\u017Eivatelsk\u00E9 p\u0159\u00EDv\u011Btivosti, kdyby na sob\u011B nez\u00E1visl\u00E9\n// animace se mohly animovat sou\u010Dasn\u011B (rozbalit/sbalit jedno tla\u010D\u00EDtko a p\u0159itom rozbalit/sbalit\n// jin\u00E9 tla\u010D\u00EDtko, kter\u00E9 nen\u00ED v t\u00E9 sam\u00E9 exklusivn\u00ED skupin\u011B).\n\nfunction PromiseQueue() {\n\tthis.queue = [];\n\tthis.workingOnPromise = false;\n}\nPromiseQueue.prototype = {\n\tconstructor: PromiseQueue,\n\n\tpush: function(promise) {\n\t\tthis.queue.push(promise);\n\t\tthis._dequeue();\n\t},\n\n\t_dequeue: function() {\n\t\tlet self = this;\n\n\t\tif (this.workingOnPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet promise = this.queue.shift();\n\t\tif (!promise) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.workingOnPromise = true;\n\n\t\t// Pozor, funkce nemus\u00ED nutn\u011B vr\u00E1tit promise.\n\t\tlet returnValue = promise();\n\t\tif (returnValue) {\n\t\t\treturnValue.then(function() {\n\t\t\t\tself.workingOnPromise = false;\n\t\t\t\tself._dequeue();\n\t\t\t})\n\t\t\t\t.catch(function() {\n\t\t\t\t\tself.workingOnPromise = false;\n\t\t\t\t\tself._dequeue();\n\t\t\t\t});\n\t\t}\n\t\telse {\n\t\t\t// Pokud nevr\u00E1tila promise, nen\u00ED na co \u010Dekat a pokra\u010Dujme dal\u0161\u00EDm prvkem ve front\u011B.\n\t\t\tthis.workingOnPromise = false;\n\t\t\tthis._dequeue();\n\t\t}\n\t}\n};\n\nlet animationQueue = new PromiseQueue();\n\n\n// *************************************************************************\n// Event\n// *************************************************************************\n\ndocument.addEventListener(\"click\", function(event) {\n\tlet target = event.target.closest(\"[data-slide], [data-fade]\");\n\tif (!target) {\n\t\thideNonStickyElements(event.target, null);\n\t\treturn;\n\t}\n\n\tlet breakpointDown = target.getAttribute(\"data-slide-down\") || target.getAttribute(\"data-fade-down\");\n\tlet breakpointUp = target.getAttribute(\"data-slide-up\") || target.getAttribute(\"data-fade-up\");\n\n\tif ((breakpointDown && !MediaBreakpoint.down(breakpointDown)) || (breakpointUp && !MediaBreakpoint.up(breakpointUp))) {\n\t\treturn\n\t}\n\n\tlet preventDefault = (target.getAttribute(\"data-slide-prevent\") || target.getAttribute(\"data-fade-prevent\")) == \"true\"\n\tif (preventDefault) {\n\t\t// Explicitn\u00ED po\u017Eadavek na zablokov\u00E1n\u00ED v\u00FDchoz\u00ED ud\u00E1losti.\n\t\tevent.preventDefault();\n\t}\n\telse {\n\t\t// Potla\u010Dovat v\u00FDchoz\u00ED funkcionalitu budeme pouze u odkaz\u016F s pr\u00E1zdn\u00FDm \"href\" a tla\u010D\u00EDtek, kter\u00E9 nebudou m\u00EDt typ \"submit\".\n\t\t// U ostatn\u00EDch nech\u00E1me akci prob\u011Bhnout, proto\u017Ee to m\u016F\u017Ee m\u00EDt n\u011Bjak\u00FD dal\u0161\u00ED v\u00FDznam (jako nap\u0159. sbalov\u00E1n\u00ED combobox\u016F\n\t\t// p\u0159i v\u00FDb\u011Bru n\u011Bjak\u00E9 z polo\u017Eek).\n\t\tpreventLinkDefault(event, target);\n\t}\n\n\thideNonStickyElements(event.target, target);\n\n\tconst promise = animate.bind(null, target);\n\tanimationQueue.push(promise);\n});\n", "import \"../dom_extend\";\n\n// \u00DAlo\u017Ei\u0161t\u011B pro objekty reprezentuj\u00EDc\u00ED mod\u00E1ln\u00ED okna.\nconst modals = new WeakMap();\n\n// *************************************************************************\n// T\u0159\u00EDda.\n// *************************************************************************\n\n//\n// T\u0159\u00EDda mod\u00E1ln\u00EDho okna. Prom\u011Bnn\u00E1 \"element\" ukazuje na t\u0159\u00EDdu s mod\u00E1ln\u00EDm oknem \".modal\".\n// Pokud bychom pot\u0159ebovali mod\u00E1ln\u00ED okno i vytvo\u0159it, je zapot\u0159eb\u00ED\n// bu\u010F ru\u010Dn\u011B vystav\u011Bt vhodn\u00FD HTML markup a nebo si pomoci programov\u011B\n// zavol\u00E1n\u00EDm funkce Modal.create(...).\n//\nexport function Modal(element) {\n\tthis.element = element;\n}\nModal.prototype = {\n\tcontructor: Modal,\n\n\t//\n\t// Zobrazen\u00ED mod\u00E1ln\u00EDho okna.\n\t//\n\topen: function() {\n\t\tdocument.body.classList.add(\"modal-opened\");\n\t\tthis.element.classList.add(\"opened\");\n\t},\n\n\n\t//\n\t// Ukon\u010Den\u00ED mod\u00E1ln\u00EDho okna.\n\t// Mod\u00E1ln\u00ED okno po jeho zav\u0159en\u00ED odstran\u00EDme.\n\t// Budeme podporovat zobrazen\u00ED v\u00EDcen\u00E1sobn\u00FDch mod\u00E1ln\u00EDch oken, i kdy\u017E zat\u00EDm jen takov\u00FDm\n\t// jednoduch\u00FDm zp\u016Fsobem.\n\t//\n\tclose: function() {\n\t\t// Zav\u0159eme mod\u00E1ln\u00ED okno.\n\t\tthis.element.classList.remove(\"opened\");\n\n\t\t// Zjist\u011Bme, kolik m\u00E1me otev\u0159en\u00FDch mod\u00E1ln\u00EDch oken.\n\t\tvar openedModalsCount = document.querySelectorAll(\".modal.opened\").length;\n\t\tif (!openedModalsCount) {\n\t\t\t// Budeme zav\u00EDrat posledn\u00ED okno, proto m\u016F\u017Eeme zru\u0161it speci\u00E1ln\u00ED t\u0159\u00EDdu na body elementu.\n\t\t\tdocument.body.classList.remove(\"modal-opened\");\n\t\t}\n\n\t\t// Aby se n\u00E1m nemno\u017Eily mod\u00E1ln\u00ED okna, tak (krom\u011B t\u011Bch, co jsou ozna\u010Deny jako \"inPlace\")\n\t\t// je z k\u00F3du zcela odstra\u0148me. V\u011Bt\u0161inu oken nem\u00E1 smysl otev\u00EDrat v\u00EDcekr\u00E1t, tj. jejich\n\t\t// \u017Eivotn\u00ED cyklus typicky jejich skryt\u00EDm skon\u010D\u00ED.\n\t\tif (!this.isInPlace) {\n\t\t\tmodals.delete(this.element);\n\t\t\tthis.element.remove();\n\t\t}\n\t},\n\n\n\t//\n\t// Je dan\u00E9 mod\u00E1ln\u00ED okno ozna\u010Den\u00E9 jako \"inPlace\"? In place mod\u00E1ln\u00ED okna z\u016Fst\u00E1vaj\u00ED v k\u00F3du\n\t// a p\u0159i jejich zav\u0159en\u00ED se z k\u00F3du neodstra\u0148uj\u00ED.\n\t//\n\tget isInPlace() {\n\t\treturn (this.element.getAttribute(\"data-modal\") || \"\").includes(\"inPlace\");\n\t},\n\n\tget isNoClose() {\n\t\treturn (this.element.getAttribute(\"data-modal\") || \"\").includes(\"noClose\");\n\t}\n\n};\n\n//\n// Vytvo\u0159\u00ED z\u00E1klad mod\u00E1ln\u00EDho okna a p\u0159id\u00E1 do DOM stromu. Vrac\u00ED ko\u0159enov\u00FD element mod\u00E1ln\u00EDho okna.\n// Okno po vytvo\u0159en\u00ED z\u016Fst\u00E1v\u00E1 nezobrazen\u00E9.\n//\nModal.create = function() {\n\tvar modal = document.createElement(\"div\");\n\tmodal.classList.add(\"modal\");\n\n\tdocument.body.appendChild(modal);\n\treturn modal;\n}\n\n//\n// Instance mod\u00E1ln\u00EDho okna m\u00E1me ulo\u017Een\u00E9 ve WeakMap. Z\u00EDskejme instanci mod\u00E1ln\u00EDho okna pro dan\u00FD element.\n// Nen\u00ED-li element zad\u00E1n, mod\u00E1ln\u00ED okno se samo vytvo\u0159\u00ED (tj. nen\u00ED nutn\u00E9 volat metodu \"create\").\n//\nModal.get = function(element, childObject, factoryMethod) {\n\tif (!childObject) {\n\t\tchildObject = Modal;\n\t}\n\tif (!factoryMethod) {\n\t\tfactoryMethod = childObject.create;\n\t}\n\tif (!element) {\n\t\telement = factoryMethod();\n\t}\n\telement = element.closest(\".modal\");\n\n\tif (!modals.has(element)) {\n\t\tmodals.set(element, new childObject(element));\n\t}\n\n\treturn modals.get(element);\n}\n\n\n//\n// Je otev\u0159en\u00E9 n\u011Bjak\u00E9 mod\u00E1ln\u00ED okno?\n//\nModal.isAnyOpened = function() {\n\treturn 0 < document.querySelectorAll(\".modal.opened\").length;\n}\n\n//\n// Zav\u0159en\u00ED v\u0161ech mod\u00E1ln\u00EDch oken najednou.\n//\nModal.closeAll = function() {\n\tvar modals = document.querySelectorAll(\".modal.opened\");\n\tfor (var i = 0; i < modals.length; ++i) {\n\t\tModal.get(modals[i]).close();\n\t}\n}\n\n//\n// Zav\u0159en\u00ED posledn\u00EDho mod\u00E1ln\u00EDho okna.\n//\nModal.closeLast = function() {\n\tvar modals = document.querySelectorAll(\".modal.opened\");\n\tif (0 < modals.length) {\n\t\tModal.get(modals[modals.length - 1]).close();\n\t}\n}\n\n\n\n// *************************************************************************\n// Ud\u00E1losti.\n// *************************************************************************\n\n//\n// Otev\u0159en\u00ED mod\u00E1ln\u00EDho okna, kter\u00E9 je \"in-place\", tj. rovnou vlo\u017Een\u00E9ho v k\u00F3du a nep\u0159ijde nap\u0159.\n// formou flash message. Narozd\u00EDl od ostatn\u00EDch oken se po jeho uzav\u0159en\u00ED z k\u00F3du neodstra\u0148uje.\n//\ndocument.addEventSelectorListener(\"click\", \"[href][data-modal='open']\", function(event, target) {\n\tevent.preventDefault();\n\tvar selector = target.getAttribute(\"href\");\n\tvar modal = document.querySelector(selector);\n\tModal.get(modal).open();\n});\n\n\n//\n// Uzav\u0159en\u00ED mod\u00E1ln\u00EDho okna kliknut\u00EDm na zav\u00EDrac\u00ED k\u0159\u00ED\u017Eek\n// (k\u0159\u00ED\u017Eek mus\u00ED b\u00FDt kdekoliv v podstrom\u011B dan\u00E9ho mod\u00E1ln\u00EDho okna, kter\u00E9 budeme zav\u00EDrat).\n//\ndocument.addEventSelectorListener(\"click\", \"[data-modal='close']\", function(event, target) {\n\tevent.preventDefault();\n\tModal.get(target).close();\n});\n\n\n//\n// Uzav\u0159en\u00ED mod\u00E1ln\u00EDch oken stisknut\u00EDm kl\u00E1vesy \"escape\".\n// Uzav\u0159e posledn\u00ED otev\u0159en\u00E9 mod\u00E1ln\u00ED okno.\n//\ndocument.addEventListener(\"keyup\", function(event) {\n\tif (event.key == \"Escape\" && Modal.isAnyOpened()) {\n\t\tevent.preventDefault();\n\t\tModal.closeLast();\n\t}\n});\n\n\n//\n// Uzav\u0159en\u00ED mod\u00E1ln\u00EDho okna kliknut\u00EDm na \u010Dern\u00E9 pozad\u00ED.\n//\ndocument.addEventMatchesListener(\"click\", \".modal.opened\", function(event, target) {\n\tlet modal = ModalDialog.get(target);\n\tif (!modal.isNoClose) {\n\t\tevent.preventDefault();\n\t\tmodal.close();\n\t}\n});\n\n\n\n// *************************************************************************\n// Publikujeme do ve\u0159ejn\u00E9ho namespace.\n// *************************************************************************\n", "import \"./dom_extend\";\n\n\n//\n// Jedna polo\u017Eka v carouselu.\n// Polo\u017Eka v carouselu se skl\u00E1d\u00E1 ze \"slide\" (tj. to co, zobrazujeme) a \"dot\" (tj. navigace na tento sn\u00EDmek).\n// \"Dot\" je voliteln\u00FD (navigace nen\u00ED povinn\u00E1) a fyzicky m\u016F\u017Ee m\u00EDt libovolnou podobu (tj. nejen te\u010Dky, ale t\u0159eba\n// i obr\u00E1zkov\u00FD n\u00E1hled atd.).\n//\nfunction CarouselItem(slideElement, dotElement) {\n\tthis.slide = slideElement;\n\tthis.dot = dotElement;\n}\nCarouselItem.prototype = {\n\tconstructor: CarouselItem,\n\n\t//\n\t// P\u0159id\u00E1 k slide i dot t\u0159\u00EDdu nebo t\u0159\u00EDdy (jsou jako voliteln\u00E9 argumenty).\n\t//\n\taddClass: function() {\n\t\tthis.slide.classList.add.apply(this.slide.classList, arguments);\n\t\tif (this.dot) {\n\t\t\tthis.dot.classList.add.apply(this.dot.classList, arguments);\n\t\t}\n\t},\n\n\t//\n\t// Odebere od slide a dot t\u0159\u00EDdu nebo t\u0159\u00EDdy (jsou jako voliteln\u00E9 argumenty).\n\t//\n\tremoveClass: function() {\n\t\tthis.slide.classList.remove.apply(this.slide.classList, arguments);\n\t\tif (this.dot) {\n\t\t\tthis.dot.classList.remove.apply(this.dot.classList, arguments);\n\t\t}\n\t},\n\n\t//\n\t// M\u00E1 slide danou t\u0159\u00EDdu?\n\t// Sta\u010D\u00ED kontrolovat na slide, proto\u017Ee ten je (na rozd\u00EDl od dot) povinn\u00FD a t\u0159\u00EDdy\n\t// jsou u slide i dot v\u017Edy stejn\u00E9.\n\t//\n\tcontainsClass: function(klass) {\n\t\treturn this.slide.classList.contains(klass);\n\t},\n\n\tclearAnimation: function() {\n\t\tthis.slide.style.animation = \"none\";\n\t\tthis.slide.offsetHeight; // Reset\n\t},\n\n\tresumeAnimation: function() {\n\t\tthis.slide.style.animation = null;\n\t}\n};\n\n\n//\n// Carousel\n//\nexport function Carousel(wrapper) {\n\t// Id intervalu pro autoplay (pro mo\u017Enost zru\u0161it interval).\n\tthis.intervalId = null;\n\n\t// Autoplay bu\u010F m\u016F\u017Ee b\u00FDt do\u010Dasn\u011B pozastaven (nap\u0159. p\u0159i najet\u00ED my\u0161i) a nebo \u00FApln\u011B zastaven (nap\u0159. p\u0159i kliknut\u00ED na navigaci).\n\tthis.isAutoplayPaused = false;\n\n\t// [px] Kolik pixel\u016F u\u017Eivatel mus\u00ED ujet prstem, aby byl pohyb rozpozn\u00E1n jako tah.\n\tthis.touchBound = 30;\n\n\t// X-ov\u00E1 pozice kliknut\u00ED (pro detekci gesta pohybu do stran - n\u00E1sleduj\u00EDc\u00ED nebo p\u0159edchoz\u00ED slide).\n\tthis.touchX = null;\n\n\t// [ms] Interval v\u00FDm\u011Bny slid\u016F, m\u00E1-li b\u00FDt autoplay aktivn\u00ED.\n\tthis.interval = wrapper.getAttribute(\"data-carousel-interval\");\n\n\t// Je povoleno zastaven\u00ED p\u0159ehr\u00E1v\u00E1n\u00ED p\u0159i najet\u00ED my\u0161\u00ED?\n\tthis.isPauseOnHoverEnabled = wrapper.getAttribute(\"data-carousel-pauseonhover\") !== \"false\";\n\n\t// Kontejnery carouselu.\n\tthis.wrapper = wrapper;\n\tthis.container = wrapper.querySelector(\"[data-carousel='slides']\");\n\tthis.navigation = wrapper.querySelector(\"[data-carousel='dots']\")\n\n\t// Slidy + naviga\u010Dn\u00ED tla\u010D\u00EDtka.\n\tthis.slides = this.container ? this.container.children : [];\n\tthis.dots = this.navigation ? this.navigation.children : [];\n\n\t// Slidy ulo\u017E\u00EDme do vlastn\u00ED struktury pro snaz\u0161\u00ED zach\u00E1zen\u00ED.\n\t// Naviga\u010Dn\u00ED te\u010Dky nejsou povinn\u00E9.\n\tthis.items = [];\n\tfor (var i = 0; i < this.slides.length; ++i) {\n\t\tthis.items.push(new CarouselItem(\n\t\t\tthis.slides[i],\n\t\t\ti < this.dots.length ? this.dots[i] : null\n\t\t));\n\t}\n\n\t// Registrace ud\u00E1lost\u00ED.\n\tfor (let button of wrapper.querySelectorAll(\"[data-carousel='prev']\")) {\n\t\tbutton.addEventListener(\"click\", this.onPrev.bind(this));\n\t}\n\tfor (let button of wrapper.querySelectorAll(\"[data-carousel='next']\")) {\n\t\tbutton.addEventListener(\"click\", this.onNext.bind(this));\n\t}\n\tfor (var i = 0; i < this.dots.length; ++i) {\n\t\tthis.dots[i].addEventListener(\"click\", this.onNavigation.bind(this));\n\t}\n\n\t// Ud\u00E1losti pro posun prstem.\n\tthis.container.addEventListener(\"touchstart\", this.onTouchStart.bind(this), { passive: true });\n\tthis.container.addEventListener(\"touchmove\", this.onTouchMove.bind(this), { passive: false });\n\tthis.container.addEventListener(\"mouseenter\", this.onMouseEnter.bind(this), { passive: true });\n\tthis.container.addEventListener(\"mouseleave\", this.resumeAutoplay.bind(this), { passive: true });\n\n\t// Nastartujme autoplay (je-li u\u017Eivatelem definovan\u00FD).\n\tthis.initByActive();\n\tthis.startAutoplay();\n}\nCarousel.prototype = {\n\tconstructor: Carousel,\n\n\t//\n\t// Posune se na nov\u00FD slide.\n\t//\n\tmove: function(index, direction, force) {\n\t\tvar activeIndex = this.activeIndex;\n\t\tif (!force && index == activeIndex) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Pokud nen\u00ED sm\u011Br zad\u00E1n, zkusme si ho odvodit.\n\t\tif (!direction && activeIndex !== -1) {\n\t\t\t// Carousel je \"nekone\u010Dn\u00FD\", zjist\u011Bme proto, kam se u\u017Eivatel posouv\u00E1 (zda vp\u0159ed nebo vzad).\n\t\t\tvar forwardDistance = activeIndex < index ? index - activeIndex : this.items.length - activeIndex + index;\n\t\t\tvar backwardDistance = activeIndex < index ? this.items.length - index + activeIndex : activeIndex - index;\n\t\t\tdirection = forwardDistance <= backwardDistance ? \"forward\" : \"backward\";\n\t\t}\n\n\t\tif (0 <= activeIndex) {\n\t\t\tvar activeItem = this.items[activeIndex];\n\t\t\tthis.wrapper.trigger(\"carouselslidebefore\", { item: activeItem });\n\t\t}\n\n\t\tfor (var i = 0; i < this.items.length; ++i) {\n\t\t\tvar item = this.items[i];\n\t\t\titem.removeClass(\"active\", \"last\", \"next\", \"forward\", \"backward\");\n\t\t\tif (direction) {\n\t\t\t\titem.addClass(direction);\n\t\t\t}\n\t\t\titem.clearAnimation();\n\t\t}\n\n\t\tfor (var i = 0; i < this.items.length; ++i) {\n\t\t\tvar orderIndex = (index + this.items.length - (direction != \"backward\" ? 1 : 0) + i) % this.items.length;\n\t\t\tvar item = this.items[orderIndex];\n\t\t\titem.slide.style.order = i;\n\t\t}\n\n\t\tvar item = this.items[index];\n\t\titem.addClass(\"active\");\n\n\t\tvar prevItem = this.items[this.prevIndex(index)];\n\t\tif (item != prevItem) {\n\t\t\tprevItem.addClass(\"last\");\n\t\t}\n\n\t\tvar nextItem = this.items[this.nextIndex(index)];\n\t\tif (item != nextItem) {\n\t\t\tnextItem.addClass(\"next\");\n\t\t}\n\n\t\tthis.wrapper.trigger(\"carouselslide\", { item: item });\n\n\t\tfor (var i = 0; i < this.items.length; ++i) {\n\t\t\tvar item = this.items[i];\n\t\t\titem.resumeAnimation();\n\t\t}\n\t},\n\n\tget activeIndex() {\n\t\treturn Array.prototype.findIndex.call(this.slides, function(slide) {\n\t\t\treturn slide.classList.contains(\"active\");\n\t\t});\n\t},\n\n\t//\n\t// Dal\u0161\u00ED obr\u00E1zek\n\t//\n\tnext: function() {\n\t\tvar newIndex = this.nextIndex(this.activeIndex);\n\t\tthis.move(newIndex, \"forward\");\n\t},\n\n\tnextIndex: function(idx) {\n\t\treturn (idx + 1) % this.items.length;\n\t},\n\n\t//\n\t// P\u0159edchoz\u00ED obr\u00E1zek\n\t//\n\tprev: function() {\n\t\tvar newIndex = this.prevIndex(this.activeIndex);\n\t\tthis.move(newIndex, \"backward\");\n\t},\n\n\tprevIndex: function(idx) {\n\t\treturn (idx + this.items.length - 1) % this.items.length;\n\t},\n\n\t//\n\t// Handler kliknut\u00ED na tla\u010D\u00EDtko \"dal\u0161\u00ED\".\n\t//\n\tonNext: function(event) {\n\t\tevent.preventDefault();\n\t\tthis.stopAutoplay();\n\t\tthis.next();\n\t},\n\n\t//\n\t// Handler kliknut\u00ED na tla\u010D\u00EDtko \"p\u0159edchoz\u00ED\".\n\t//\n\tonPrev: function(event) {\n\t\tevent.preventDefault();\n\t\tthis.stopAutoplay();\n\t\tthis.prev();\n\t},\n\n\t//\n\t// Handler kliknut\u00ED na tla\u010D\u00EDtko sn\u00EDmku v navigaci.\n\t//\n\tonNavigation: function(event) {\n\t\tevent.preventDefault();\n\t\tthis.stopAutoplay();\n\t\tvar newIndex = Array.prototype.indexOf.call(event.currentTarget.parentNode.children, event.currentTarget);\n\t\tthis.move(newIndex, newIndex < this.activeIndex ? \"backward\" : \"forward\");\n\t},\n\n\t//\n\t// Handler dotyku prstem v carouselu.\n\t//\n\tonTouchStart: function(event) {\n\t\tthis.touchX = event.touches[0].clientX;\n\t},\n\n\t//\n\t// P\u0159esun na dal\u0161\u00ED sn\u00EDmek gestem prstu.\n\t//\n\tonTouchMove: function(event) {\n\t\tif (this.touchX !== null) {\n\t\t\tvar x = event.touches[0].clientX;\n\t\t\tvar difference = this.touchX - x;\n\t\t\tif (this.touchBound < Math.abs(difference)) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.stopAutoplay();\n\n\t\t\t\tif (0 < difference) {\n\t\t\t\t\tthis.next();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.prev();\n\t\t\t\t}\n\n\t\t\t\tthis.touchX = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t//\n\t// Vstup my\u0161i\n\t//\n\tonMouseEnter: function(event) {\n\t\tif (this.isPauseOnHoverEnabled) {\n\t\t\tthis.pauseAutoplay();\n\t\t}\n\t},\n\n\t//\n\t// Autoplay tick - p\u0159echod na dal\u0161\u00ED sn\u00EDmek po tiku \u010Dasova\u010De.\n\t//\n\tonTick: function() {\n\t\tif (!this.isAutoplayPaused) {\n\t\t\tthis.next();\n\t\t}\n\t},\n\n\t//\n\t// Pokud je n\u011Bjak\u00FD slide ozna\u010Den\u00FD jako aktivn\u00ED, nastartujeme na n\u011Bj.\n\t//\n\tinitByActive: function() {\n\t\tlet activeIndex = this.activeIndex;\n\t\tif (activeIndex && 0 < activeIndex) {\n\t\t\tthis.move(activeIndex, \"forward\", true);\n\t\t}\n\t},\n\n\t//\n\t// Spust\u00ED autoplay p\u0159ehr\u00E1v\u00E1n\u00ED.\n\t//\n\tstartAutoplay: function() {\n\t\tif (this.interval && 1 < this.items.length) {\n\t\t\tthis.stopAutoplay();\n\t\t\tthis.intervalId = setInterval(this.onTick.bind(this), this.interval);\n\t\t\tthis.container.classList.add(\"autoplay\");\n\t\t}\n\t},\n\n\t//\n\t// Zastav\u00ED auto-p\u0159ehr\u00E1v\u00E1n\u00ED.\n\t//\n\tstopAutoplay: function() {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId);\n\t\t\tthis.intervalId = null;\n\t\t\tthis.container.classList.remove(\"autoplay\");\n\t\t}\n\t},\n\n\t//\n\t// Pozastav\u00ED auto-p\u0159ehr\u00E1v\u00E1n\u00ED.\n\t//\n\tpauseAutoplay: function() {\n\t\tthis.isAutoplayPaused = true;\n\t},\n\n\t//\n\t// Op\u011Btovn\u011B rozb\u011Bhne auto-p\u0159ehr\u00E1v\u00E1n\u00ED (pouze v p\u0159\u00EDpad\u011B, \u017Ee bylo \"pauznut\u00E9\").\n\t//\n\tresumeAutoplay: function() {\n\t\tthis.isAutoplayPaused = false;\n\t}\n};\n", "import { Modal } from \"./modal\";\nimport { Carousel } from \"../carousel\";\n\n// *************************************************************************\n// T\u0159\u00EDda s mod\u00E1ln\u00ED galeri\u00ED.\n//\n// ModalGallery nen\u00ED p\u0159ed\u00E1na do ve\u0159ejn\u00E9ho namespace (nen\u00ED to zat\u00EDm pot\u0159eba).\n// ModalGallery pou\u017E\u00EDv\u00E1 Carousel, \u010D\u00EDm\u017E se vy\u0159e\u0161ila cel\u00E1 funk\u010Dn\u00ED str\u00E1nka v\u011Bci. \u00DAkolem\n// t\u00E9to t\u0159\u00EDdy je tak pouze spojit dohromady funkcionalitu mod\u00E1ln\u00EDho okna a carouselu.\n// Mod\u00E1ln\u00ED dialog proto roz\u0161\u00ED\u0159\u00EDme o markup pro carousel, do kter\u00E9ho p\u0159id\u00E1me obr\u00E1zky.\n// A to je cel\u00E9... v\u0161echno ostatn\u00ED (ve\u0161kerou funkcionalitu) u\u017E pak zajist\u00ED hotov\u00E9\n// t\u0159\u00EDdy Modal a Carousel.\n// *************************************************************************\n\n//\n// T\u0159\u00EDda ModalGallery d\u011Bd\u00ED od t\u0159\u00EDdy Modal.\n//\nexport function ModalGallery(element) {\n\tModal.call(this, element);\n\tthis.gallery = this.element.querySelector(\".modal-gallery-inner\");\n\tthis.carousel = new Carousel(this.gallery);\n\n\tthis.gallery.addEventListener(\"carouselslidebefore\", this.onBeforeSlide.bind(this));\n\tthis.gallery.addEventListener(\"carouselslide\", this.onAfterSlide.bind(this));\n\n\tthis.enableClipboard = false;\n}\nModalGallery.prototype = Object.create(Modal.prototype);\nModalGallery.prototype.constructor = ModalGallery;\n\nModalGallery.prototype.onBeforeSlide = function(event) {\n\tvar clipboardButton = this.gallery.querySelector(\".modal-btn[data-clipboard]\");\n\tif (clipboardButton) {\n\t\tclipboardButton.remove();\n\t}\n}\n\nModalGallery.prototype.onAfterSlide = function(event) {\n\tif (this.enableClipboard) {\n\t\tvar url = event.detail.item.slide.getAttribute(\"src\");\n\t\tthis.gallery.querySelector(\".modal-gallery-content\").innerHTML += \"