﻿(function() {
    var SideMenu = {
        sideMenuElement: null,
        navElement: null,
        autoExpandToLevel: 1,

        Init: function() {
            let c = this;
            c.sideMenuElement = document.getElementById("Products_SideMenu"); // Znajdź kontener Side Menu
            c.navElement = this.sideMenuElement.getElementsByTagName("nav")[0]; // Znajdź element <nav>
            c.SetClicks();
            //c.AutoExpandToLevel();
            c.AutoExpandToSelectedItem();
            c.AutoExpandSubmenu();
        },

        SetClicks: function() {
            let c = this;
            var aElements = c.sideMenuElement.getElementsByTagName("a");
            for (var i = 0; i < aElements.length; i++) {
                let aElement = aElements[i];

                // <a> - cały link jako onclick
                // efekt podwójnego kliku - 1. otwiera submenu; 2. otwiera stronę z listą produktów
                //aElement.onclick = function(e) {
                //    if (c.HasSubmenu(aElement) === true) {
                //        // Jest submenu
                //        if (c.IsExpanded(aElement) === false) {
                //            // Submenu jest schowane
                //            if (e.target.tagName == "A") {
                //                // Jeśli kliknięcie nastąpiło w <a>
                //                // a nie w ikonkę rozwijania/chowania submenu
                //                c.Expand(aElement); // Rozwiń submenu
                //            }
                //            return false; // Powoduje, że <a> nie działa w tym przypadku
                //        }
                //    }
                //};

                // <span> - ikonka chowania submenu
                /*
                var buttonCollapse = document.createElement("span"); // Stwórz element ikonki chowania submenu
                buttonCollapse.classList.add("button-collapse");
                buttonCollapse.innerHTML = '<i class="far fa-caret-square-up icon-collapse"></i>';
                aElement.appendChild(buttonCollapse); // Dodaj ikonkę do DOM
                buttonCollapse.onclick = function(e) {
                    // Ustaw onclick na ikonce
                    if (c.HasClass(e.target, "icon-collapse")) {
                        // Jeśli ikonka jest typu collapse
                        if (c.HasSubmenu(aElement) === true) {
                            // Jeśli istnieje submenu
                            if (c.IsExpanded(aElement) === true) {
                                // Jeśli submenu jest widoczne
                                c.Collapse(aElement); // Schowaj submenu
                            }
                        }
                    }
                };
                */
            }
        },

        AutoExpandToSelectedItem: function(li) {
            let c = this;
            // Jeśli nie zdefiniowano li
            if (typeof li === "undefined") {
                li = c.navElement.getElementsByClassName("selected"); // Domyślnie zagłębienie poziomu "0"
                if (li.length == 1) {
                    li = li[0];
                } else {
                    return;
                }
            }

            let liParent = li.closest("ul").closest("li"); // Ustal rodzica <li> dla tego <li>

            if (liParent !== null) {
                if (c.HasClass(liParent, "expanded") === false) {
                    liParent.classList.add("expanded");
                }
                liParent.classList.add("selected");
                c.AutoExpandToSelectedItem(liParent);
            }
        },

        // Funkcja rozwija submenu do określonego poziomu
        AutoExpandToLevel: function(level, ul) {
            let c = this;
            // Jeśli nie zdefiniowano zagłębienia
            if (typeof level === "undefined") {
                level = 0; // Domyślnie zagłębienie poziomu "0"
            }
            // Jeśli iteracja tej metody przekracza określone zagłębienie
            if (level >= c.autoExpandToLevel) {
                return;
            }
            // Jeśli nie wskazano <ul> (początek działania tej metody)
            if (typeof ul === "undefined") {
                // Przetwarzaj dzieci najbliższego pod poziomu <nav>
                for (var i = 0; i < c.navElement.children.length; i++) {
                    // Jeśli dziecko jest typu <ul>
                    if (c.navElement.children[i].nodeName == "UL") {
                        ul = c.navElement.children[i]; // Ustal zmienną ul na odnalezione <ul>
                        break;
                    }
                }
            }

            // Przetarzaj <ul>
            for (var i = 0; i < ul.children.length; i++) {
                // Jeśli dziecko <ul> jest typu <li>
                if (ul.children[i].nodeName == "LI") {
                    var li = ul.children[i]; // Ustal <li>
                    li.classList.add("expanded"); // Ustaw kalsę "expanded" dla <li> która rozwija submenu (jeśli istnieje) w <li>
                    li.querySelector("span").remove(); // Usun ikonke chowania submenu - submenu tego poziomu jest zawsze widoczne
                    // Wyszukaj element <ul> w <li> czyli submenu dla <li>
                    for (var a = 0; a < li.children.length; a++) {
                        // Jeśli odnaleziono <ul> czyli submenu
                        if (li.children[a].nodeName == "UL") {
                            // Przeprowadź kolejną iterację tej metody która z automatu rozwinie kolejne submenu
                            c.AutoExpandToLevel(level + 1, li.children[i]);
                        }
                    }
                }
            }
        },

        AutoExpandSubmenu: function (aElement) {
            let c = this;
            openedAElement = c.GetOpenedAElement();
            //console.log(openedAElement);
            if (openedAElement !== null) {
                c.Expand(openedAElement);
            }
        },

        Expand: function(aElement) {
            let c = this;
            aElement.parentElement.classList.add("expanded");
        },

        Collapse: function(aElement) {
            let c = this;
            aElement.parentElement.classList.remove("expanded");
        },

        HasSubmenu: function(aElement) {
            let c = this;
            for (var i = 0; i < aElement.parentElement.childNodes.length; i++) {
                var childElement = aElement.parentElement.childNodes[i];
                if (c.HasClass(childElement, "submenu")) {
                    return true;
                }
            }
            return false;
        },

        IsExpanded: function(aElement) {
            let c = this;
            for (var i = 0; i < aElement.parentElement.childNodes.length; i++) {
                var childElement = aElement.parentElement.childNodes[i];
                if (
                    c.HasClass(aElement.parentElement, "expanded") &&
                    c.HasClass(childElement, "submenu")
                ) {
                    return true;
                }
            }
            return false;
        },

        GetOpenedAElement: function () {
            let c = this;
            var currentPath = document.location.href.replace(new RegExp(document.location.protocol + "//" + document.location.host, "i"), "");
            var aElements = c.sideMenuElement.getElementsByTagName("a");
            for (var i = 0; i < aElements.length; i++) {
                var aElement = aElements[i];
                var aPath = aElement.getAttribute("href");
                //console.log(currentPath + " == " + aPath);
                if (aPath == currentPath) {
                    return aElement;
                }
            }
            return null;
        },

        HasClass: function(element, className) {
            return (" " + element.className + " ").indexOf(" " + className + " ") > -1;
        }
    };

    SideMenu.Init();
    return;
})();
