| LEFT | RIGHT | 
|    1 /*! |  | 
|    2  * This file is part of help.eyeo.com. |  | 
|    3  * Copyright (C) 2017-present eyeo GmbH |  | 
|    4  * |  | 
|    5  * help.eyeo.com is free software: you can redistribute it and/or modify |  | 
|    6  * it under the terms of the GNU General Public License as published by |  | 
|    7  * the Free Software Foundation, either version 3 of the License, or |  | 
|    8  * (at your option) any later version. |  | 
|    9  * |  | 
|   10  * help.eyeo.com is distributed in the hope that it will be useful, |  | 
|   11  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | 
|   12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | 
|   13  * GNU General Public License for more details. |  | 
|   14  * |  | 
|   15  * You should have received a copy of the GNU General Public License |  | 
|   16  * along with help.eyeo.com.  If not, see <http://www.gnu.org/licenses/>. |  | 
|   17  */ |  | 
|   18 (function() |  | 
|   19 { |  | 
|   20   document.addEventListener("DOMContentLoaded", function() |  | 
|   21   { |  | 
|   22  |  | 
|   23     /************************************************************************** |  | 
|   24      * General |  | 
|   25      **************************************************************************/ |  | 
|   26  |  | 
|   27     // Change html class name from "no-js" to "js" |  | 
|   28     document.documentElement.className = "js"; |  | 
|   29  |  | 
|   30     /************************************************************************** |  | 
|   31      * Navbar |  | 
|   32      **************************************************************************/ |  | 
|   33  |  | 
|   34     function toggleNavbarCollapse() |  | 
|   35     { |  | 
|   36       var navbarCollapseEls = this.parentElement.getElementsByClassName("navbar-
     collapse"); |  | 
|   37       for (var i = 0; i < navbarCollapseEls.length; i++) |  | 
|   38       { |  | 
|   39         navbarCollapseEls[i] |  | 
|   40           .classList.toggle("open") |  | 
|   41       } |  | 
|   42     } |  | 
|   43  |  | 
|   44     var toggleNavbarCollapseEls = document.getElementsByClassName("toggle-navbar
     -collapse"); |  | 
|   45     for (var i = 0; i < toggleNavbarCollapseEls.length; i++) |  | 
|   46     { |  | 
|   47       toggleNavbarCollapseEls[i] |  | 
|   48         .addEventListener("click", toggleNavbarCollapse, false); |  | 
|   49     } |  | 
|   50  |  | 
|   51     /************************************************************************** |  | 
|   52      * CustomSelect |  | 
|   53      **************************************************************************/ |  | 
|   54  |  | 
|   55     function CustomSelect(select) |  | 
|   56     { |  | 
|   57       this.select = select; |  | 
|   58       this.close(); |  | 
|   59       this.select |  | 
|   60           .addEventListener("click", this._onClick.bind(this), false); |  | 
|   61       this.select |  | 
|   62           .addEventListener("focusout", this._onFocusOut.bind(this), false); |  | 
|   63     } |  | 
|   64  |  | 
|   65     CustomSelect.prototype._onFocusOut = function() |  | 
|   66     { |  | 
|   67       // setTimeout to allow document.activeElement  |  | 
|   68       // to move to newly focused element |  | 
|   69       setTimeout(function() |  | 
|   70       { |  | 
|   71         var newFocus = document.activeElement; |  | 
|   72          |  | 
|   73         if (newFocus |  | 
|   74               .classList.contains("custom-select-selected") || |  | 
|   75             newFocus |  | 
|   76               .classList.contains("custom-select-option") || |  | 
|   77             newFocus |  | 
|   78               .parentElement |  | 
|   79               .classList.contains("custom-select-option")) |  | 
|   80         { |  | 
|   81           return; |  | 
|   82         } |  | 
|   83  |  | 
|   84         this.close(); |  | 
|   85          |  | 
|   86       }.bind(this), 1); |  | 
|   87     } |  | 
|   88  |  | 
|   89     CustomSelect.prototype._onClick = function(event) |  | 
|   90     { |  | 
|   91       if (event.target.classList.contains("custom-select-selected")) |  | 
|   92       { |  | 
|   93         var options = this.select.querySelector(".custom-select-options"); |  | 
|   94         if (options.getAttribute("aria-hidden") == "true") |  | 
|   95         { |  | 
|   96           this.open(); |  | 
|   97         } |  | 
|   98         else |  | 
|   99         { |  | 
|  100           this.close(); |  | 
|  101         } |  | 
|  102       } |  | 
|  103     } |  | 
|  104  |  | 
|  105     CustomSelect.prototype.open = function() |  | 
|  106     { |  | 
|  107       this.select |  | 
|  108         .querySelector(".custom-select-selected") |  | 
|  109         .setAttribute("aria-expanded", "true"); |  | 
|  110  |  | 
|  111       this.select |  | 
|  112         .querySelector(".custom-select-options") |  | 
|  113         .removeAttribute("aria-hidden"); |  | 
|  114     } |  | 
|  115  |  | 
|  116     CustomSelect.prototype.close = function() |  | 
|  117     { |  | 
|  118       this.select |  | 
|  119         .querySelector(".custom-select-selected") |  | 
|  120         .setAttribute("aria-expanded", "false"); |  | 
|  121  |  | 
|  122     this.select |  | 
|  123         .querySelector(".custom-select-options") |  | 
|  124         .setAttribute("aria-hidden", "true"); |  | 
|  125     } |  | 
|  126      |  | 
|  127     new CustomSelect(document.getElementById("language-select")); |  | 
|  128  |  | 
|  129     /************************************************************************** |  | 
|  130      * Accordion |  | 
|  131      **************************************************************************/ |  | 
|  132  |  | 
|  133     function Accordion(accordion) |  | 
|  134     { |  | 
|  135       this.accordion = accordion; |  | 
|  136        |  | 
|  137       var accordionButtons = this.accordion.getElementsByClassName('accordion-to
     ggle-button'); |  | 
|  138       for (var i = 0; i < accordionButtons.length; i++) |  | 
|  139       { |  | 
|  140         // Close all sections except the first |  | 
|  141         if (i !== 0) |  | 
|  142         { |  | 
|  143           accordionButtons[i].setAttribute("aria-expanded", "false"); |  | 
|  144           document |  | 
|  145             .getElementById( accordionButtons[i].getAttribute("aria-controls") ) |  | 
|  146             .setAttribute("hidden", "true"); |  | 
|  147         } |  | 
|  148       } |  | 
|  149  |  | 
|  150       this.accordion |  | 
|  151         .addEventListener("click", this._onClick.bind(this), false); |  | 
|  152       this.accordion |  | 
|  153         .addEventListener("keydown", this._onKeyDown.bind(this), false); |  | 
|  154     } |  | 
|  155  |  | 
|  156     Accordion.prototype.toggleSection = function(clickedButton) |  | 
|  157     { |  | 
|  158       // Hide currently expanded section |  | 
|  159       var expandedButton = this.accordion.querySelector("button[aria-expanded='t
     rue']"); |  | 
|  160       if (expandedButton) |  | 
|  161       { |  | 
|  162         expandedButton.setAttribute("aria-expanded", "false"); |  | 
|  163         document |  | 
|  164           .getElementById( expandedButton.getAttribute("aria-controls") ) |  | 
|  165           .setAttribute("hidden", "true"); |  | 
|  166       } |  | 
|  167  |  | 
|  168       // If currently expanded section is clicked |  | 
|  169       if (expandedButton === clickedButton) return; |  | 
|  170  |  | 
|  171       // Expand new section |  | 
|  172       clickedButton.setAttribute("aria-expanded", "true"); |  | 
|  173       document |  | 
|  174         .getElementById( clickedButton.getAttribute("aria-controls") ) |  | 
|  175         .removeAttribute("hidden"); |  | 
|  176     } |  | 
|  177  |  | 
|  178     Accordion.prototype.focusNextSection = function() |  | 
|  179     { |  | 
|  180       var currentFocus = document.activeElement; |  | 
|  181       var nextheading = currentFocus.parentElement.nextElementSibling.nextElemen
     tSibling; |  | 
|  182  |  | 
|  183       if (nextheading) |  | 
|  184       { |  | 
|  185         nextheading // .accordion-heading |  | 
|  186           .firstElementChild // .accordion-toggle-button |  | 
|  187           .focus(); |  | 
|  188       } |  | 
|  189       else |  | 
|  190       { |  | 
|  191         this.accordion |  | 
|  192           .firstElementChild // .accordion-heading |  | 
|  193           .firstElementChild // .accordion-toggle-button |  | 
|  194           .focus(); |  | 
|  195       } |  | 
|  196     } |  | 
|  197  |  | 
|  198     Accordion.prototype.focusPrevSection = function() |  | 
|  199     { |  | 
|  200       var currentFocus = document.activeElement; |  | 
|  201       var prevAccordionBody = currentFocus.parentElement.previousElementSibling; |  | 
|  202  |  | 
|  203       if (prevAccordionBody) |  | 
|  204       { |  | 
|  205         prevAccordionBody // .accordion-body |  | 
|  206           .previousElementSibling // .accordion-heading |  | 
|  207           .firstElementChild // .accordion-toggle-button |  | 
|  208           .focus(); |  | 
|  209       } |  | 
|  210       else |  | 
|  211       { |  | 
|  212         this.accordion |  | 
|  213           .lastElementChild // .accordion-body |  | 
|  214           .previousElementSibling // .accordion-heading |  | 
|  215           .firstElementChild // .accordion-toggle-button |  | 
|  216           .focus(); |  | 
|  217       } |  | 
|  218     } |  | 
|  219  |  | 
|  220     Accordion.prototype._onKeyDown = function(event) |  | 
|  221     { |  | 
|  222       if (!event.target.classList.contains("accordion-toggle-button")) return; |  | 
|  223  |  | 
|  224       if (event.key == "ArrowUp" || event.keyCode == 38) |  | 
|  225       { |  | 
|  226         this.focusPrevSection(); |  | 
|  227       } |  | 
|  228       else if (event.key == "ArrowDown" || event.keyCode == 40) |  | 
|  229       { |  | 
|  230         this.focusNextSection(); |  | 
|  231       } |  | 
|  232     } |  | 
|  233  |  | 
|  234     Accordion.prototype._onClick = function(event) |  | 
|  235     { |  | 
|  236       if (!event.target.classList.contains("accordion-toggle-button")) return; |  | 
|  237        |  | 
|  238       this.toggleSection(event.target); |  | 
|  239     } |  | 
|  240  |  | 
|  241     var productTopicsAccordion = document.getElementById('product-topics-accordi
     on'); |  | 
|  242     if (productTopicsAccordion) |  | 
|  243     { |  | 
|  244       new Accordion(productTopicsAccordion); |  | 
|  245     } |  | 
|  246  |  | 
|  247     /************************************************************************** |  | 
|  248      * BrowserSelect |  | 
|  249      **************************************************************************/ |  | 
|  250  |  | 
|  251     function BrowserSelect(select) |  | 
|  252     { |  | 
|  253       this.select = select; |  | 
|  254       CustomSelect.apply(this, [this.select]); |  | 
|  255        |  | 
|  256       this.BROWSER_STORAGE_KEY = "BROWSER"; |  | 
|  257       this.BROWSER_AUTODETECTED_STORAGE_KEY = "BROWSER_AUTODETECTED"; |  | 
|  258       this.SUPPORTED_BROWSERS = ["chrome", "opera", "samsungBrowser",  |  | 
|  259                                  "yandexbrowser", "maxthon", "msie",  |  | 
|  260                                  "msedge", "firefox", "ios", "safari"]; |  | 
|  261       this.DEFAULT_BROWSER = "chrome"; |  | 
|  262        |  | 
|  263       this.select |  | 
|  264         .addEventListener("click", this._onClickOrKeyDown.bind(this), false); |  | 
|  265        |  | 
|  266       this.select |  | 
|  267         .addEventListener("keydown", this._onClickOrKeyDown.bind(this), false); |  | 
|  268  |  | 
|  269       var storedBrowser = localStorage.getItem(this.BROWSER_STORAGE_KEY); |  | 
|  270       if (storedBrowser) this.selectOption(storedBrowser); |  | 
|  271       else this.detectBrowser(); |  | 
|  272     } |  | 
|  273  |  | 
|  274     BrowserSelect.prototype = Object.create(CustomSelect.prototype); |  | 
|  275     BrowserSelect.prototype.constructor = BrowserSelect; |  | 
|  276  |  | 
|  277     BrowserSelect.prototype.detectBrowser = function() |  | 
|  278     { |  | 
|  279       for (var i = 0; i < this.SUPPORTED_BROWSERS.length; i++) |  | 
|  280       { |  | 
|  281         var supportedBrowser = this.SUPPORTED_BROWSERS[i]; |  | 
|  282         if (bowser[supportedBrowser]) |  | 
|  283         { |  | 
|  284           localStorage.setItem(this.BROWSER_AUTODETECTED_STORAGE_KEY, "true"); |  | 
|  285           return this.selectOption(supportedBrowser); |  | 
|  286         } |  | 
|  287       } |  | 
|  288  |  | 
|  289       this.selectOption(this.DEFAULT_BROWSER);   |  | 
|  290     }; |  | 
|  291  |  | 
|  292     BrowserSelect.prototype.selectOption = function(browser) |  | 
|  293     { |  | 
|  294       localStorage.setItem(this.BROWSER_STORAGE_KEY, browser); |  | 
|  295  |  | 
|  296       // Change body class |  | 
|  297       var bodyClassList = Array.prototype.slice.call(document.body.classList); |  | 
|  298       for (var i = 0; i < bodyClassList.length; i++) |  | 
|  299       { |  | 
|  300         if (bodyClassList[i].indexOf("ua-") > -1) |  | 
|  301         { |  | 
|  302           document.body.classList.remove(bodyClassList[i]); |  | 
|  303         } |  | 
|  304       } |  | 
|  305       document.body.classList.add("ua-" + browser); |  | 
|  306  |  | 
|  307       // Check selected option |  | 
|  308       var selectedItem = this.select |  | 
|  309                              .querySelector("[data-value='" + browser + "']"); |  | 
|  310       selectedItem.setAttribute("aria-checked", "true"); |  | 
|  311  |  | 
|  312       // Set selected option |  | 
|  313       var selectedOption = selectedItem.innerHTML; |  | 
|  314  |  | 
|  315       if (localStorage.getItem(this.BROWSER_AUTODETECTED_STORAGE_KEY)) |  | 
|  316       { |  | 
|  317         var autodetected = document |  | 
|  318                               .getElementById("browser-select-autodetected") |  | 
|  319                               .innerHTML; |  | 
|  320         selectedOption += "<span class='muted'>(" + autodetected + ")</span>"; |  | 
|  321       } |  | 
|  322  |  | 
|  323       this.select |  | 
|  324           .querySelector(".custom-select-selected") |  | 
|  325           .innerHTML = selectedOption; |  | 
|  326        |  | 
|  327       if (!document.querySelector(".platform-" + browser)) |  | 
|  328       { |  | 
|  329         this.handleNoContentForBrowser(browser); |  | 
|  330       } |  | 
|  331     }; |  | 
|  332  |  | 
|  333     BrowserSelect.prototype.handleNoContentForBrowser = function(browser) |  | 
|  334     { |  | 
|  335       var section = document.createElement("section"); |  | 
|  336       section.classList.add("platform-" + browser); |  | 
|  337       section.innerHTML = document |  | 
|  338                             .getElementById("no-content-for-platform-message") |  | 
|  339                             .innerHTML; |  | 
|  340  |  | 
|  341       document |  | 
|  342         .querySelector(".article-body") |  | 
|  343         .insertAdjacentElement("afterbegin", section); |  | 
|  344     } |  | 
|  345  |  | 
|  346     BrowserSelect.prototype._onClickOrKeyDown = function(event) |  | 
|  347     { |  | 
|  348       var option = event.target.closest(".custom-select-option"); |  | 
|  349       if (!option) return; |  | 
|  350  |  | 
|  351       var IS_ENTER_KEY = event.key == "Enter" || event.keyCode == 13; |  | 
|  352       if (event.keyCode && !IS_ENTER_KEY) return; |  | 
|  353  |  | 
|  354       localStorage.removeItem(this.BROWSER_AUTODETECTED_STORAGE_KEY); |  | 
|  355  |  | 
|  356       // Uncheck previously checked option |  | 
|  357       this.select |  | 
|  358           .querySelector("[aria-checked='true']") |  | 
|  359           .setAttribute("aria-checked", "false"); |  | 
|  360  |  | 
|  361       this.selectOption(option.getAttribute("data-value")); |  | 
|  362  |  | 
|  363       this.close(); |  | 
|  364     }; |  | 
|  365  |  | 
|  366     var browserSelect = document.getElementById("browser-select"); |  | 
|  367     if (browserSelect) |  | 
|  368     { |  | 
|  369       new BrowserSelect(browserSelect); |  | 
|  370     } |  | 
|  371  |  | 
|  372   }, false); |  | 
|  373 }()); |  | 
|  374 //# sourceMappingURL=main.js.map |  | 
|  375  |  | 
|  376 //# sourceMappingURL=main-debug.js.map |  | 
|  377  |  | 
|  378 //# sourceMappingURL=main.js.map |  | 
|  379  |  | 
|  380 //# sourceMappingURL=main.js.map |  | 
| LEFT | RIGHT |