function AppMenu() { var self = this; var _app_menu_selector; var _app_menu_mbreite; var _app_menu_url_prefix = ""; var _app_menu_template; /* * die nachfolgenden Funktionen steuern das ein- und * ausblenden des menues */ this.init = function (url_prefix, mdesc, mtpl, mselector, mbreite) { self._app_menu_selector = mselector; self._app_menu_mbreite = mbreite; var menu = document.querySelector(self._app_menu_selector); menu.style.flexBasis = '0em'; self._app_menu_url_prefix = url_prefix; /* Die Menue-Vorlage wird einmal zu Beginn geladen und waehrend dem Programmlauf immer wieder neu zum Rendern einer dynamisch gelandenen Menuebeschreibung verwendet */ var request = new XMLHttpRequest(); request.open("GET", mtpl); request.addEventListener('load', function(event) { if (request.status >= 200 && request.status < 300) { self._app_menu_template = request.responseText; Mustache.parse(self._app_menu_template); // optional, speeds up future uses self.app_menu_laden(mdesc); } else { console.warn(request.statusText, request.responseText); } }); request.send(); }; this.app_menu_do_toggle = function(elem) { self.toggle(); }; this.toggle = function() { var menuDiv = document.querySelector(self._app_menu_selector); if(menuDiv.classList.contains('app-menu-open')) { menuDiv.classList.remove('app-menu-open'); menuDiv.style.flexBasis = '0em'; } else { menuDiv.classList.add('app-menu-open'); menuDiv.style.flexBasis = self._app_menu_mbreite; } }; /* * ab hier Steuerung des Menueinhalts */ /* * Menuebeschreibung als JSON-Datei laden * mdesc: der URL einer JSON-Datei mit einer Menuebeschreibung * richtung: z.Zt. unbenutzt: Animationsrichtung */ this.app_menu_laden = function(mdesc, richtung) { var xmlhttp = new XMLHttpRequest(); var url = self._app_menu_url_prefix + mdesc; xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { self.app_menu_bauen(JSON.parse(this.responseText), richtung); } }; xmlhttp.open("GET", url, true); xmlhttp.send(); }; /* Aus einer Menuebeschreibung im JSON-Format mit Hilfe von Mustache und der zu Beginn geladenen HTML-Vorlage ein div-Element zusammenbauen, das als Menue eingeblendet werden kann und dem Element _app_menu_selector hinzufuegen */ this.app_menu_bauen = function(menuejs, richtung) { // neues Menue als div-Element zusammensetzen var menuDiv = document.createElement("div"); menuDiv.classList.add('app-menu-content'); menuDiv.style.position = 'relative'; menuDiv.innerHTML = Mustache.render(self._app_menu_template, menuejs); // altes Menue loeschen self.app_menu_remove_event_listener_multi('.smenu', 'click', self.app_menu_klick_herunter); self.app_menu_remove_event_listener_multi('.bitem', 'click', self.app_menu_klick_herauf); self.app_menu_remove_event_listener_multi('.mitem', 'click', self.app_menu_ausfuehren); var menu = document.querySelector(self._app_menu_selector); menu.innerHTML = ''; // neues Menue hinzufuegen menu.append(menuDiv); self.app_menu_add_event_listener_multi('.smenu', 'click', self.app_menu_klick_herunter); self.app_menu_add_event_listener_multi('.bitem', 'click', self.app_menu_klick_herauf); self.app_menu_add_event_listener_multi('.mitem', 'click', self.app_menu_ausfuehren); menuDiv = document.querySelector('.app-menu-content'); menuDiv.classList.add('slidein-from-right'); }; this.app_menu_klick_herunter = function() { self.app_menu_laden(this.getAttribute('data-verweis'), 'herunter'); }; this.app_menu_klick_herauf = function() { self.app_menu_laden(this.getAttribute('data-verweis'), 'herauf'); }; this.app_menu_ausfuehren = function() { var functionName = this.getAttribute('data-verweis'); eval(functionName + "(this)"); }; /* --- Helferlein ---*/ /* sel - '.smenu' evt - 'click' fuer onclick func - der verweis auf die funktion */ this.app_menu_remove_event_listener_multi = function(sel, evt, func) { var elem = document.querySelectorAll(sel); for (var index = 0; index < elem.length; index++) { elem[index].removeEventListener(evt, func); } }; this.app_menu_add_event_listener_multi = function(sel, evt, func) { var elem = document.querySelectorAll(sel); for (var index = 0; index < elem.length; index++) { elem[index].addEventListener(evt, func); } }; }