sashomaga

Accordion menu

May 13th, 2013
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title></title>
  5. </head>
  6. <body>
  7.     <div id="cont"></div>
  8.     <script>
  9.         var controls = (function () {
  10.             function hidePrev(item) {
  11.                 var prev = item.previousElementSibling;
  12.  
  13.                 while (prev) {
  14.                     var subList = prev.querySelector('ul');
  15.                     if (subList) {
  16.                         subList.style.display = "none";
  17.                     }                    
  18.                     prev = prev.previousElementSibling;
  19.                 }
  20.             }
  21.  
  22.             function hideNext(item) {
  23.                 var next = item.nextElementSibling;
  24.  
  25.                 while (next) {
  26.                     var subList = next.querySelector('ul');
  27.                     if (subList) {
  28.                         subList.style.display = "none";
  29.                     }
  30.                     next = next.nextElementSibling;
  31.                 }
  32.             }
  33.             function Accordeon(selector) {
  34.                 var items = [];                
  35.                 var accItem = document.querySelector(selector);
  36.  
  37.                 accItem.addEventListener('click', function (ev) {
  38.  
  39.                     ev.stopPropagation();
  40.                     ev.preventDefault();
  41.  
  42.                     var clickedItem = ev.target;
  43.                     if (!(clickedItem instanceof HTMLAnchorElement)) {
  44.                         return;
  45.                     }
  46.  
  47.                     hidePrev(clickedItem.parentNode);
  48.                     hideNext(clickedItem.parentNode);
  49.  
  50.                     var sublist = clickedItem.nextElementSibling;
  51.  
  52.                     if (!sublist) {
  53.                         return;
  54.                     }                    
  55.                     if (sublist.style.display === "none") {
  56.                         sublist.style.display = "block";
  57.                     } else {
  58.                         sublist.style.display = "none";
  59.                     }
  60.                 }, false)
  61.                 this.add = function (title) {
  62.                     var newItem = new Item(title);
  63.                     items.push(newItem);
  64.                     return newItem;
  65.                 };
  66.  
  67.                 var itemsList = document.createElement('ul');
  68.  
  69.                 this.render = function () {
  70.                      
  71.                     while (accItem.firstChild) {
  72.                         accItem.removeChild(accItem.firstChild);
  73.                     }
  74.  
  75.                     while (itemsList.firstChild) {
  76.                         itemsList.removeChild(itemsList.firstChild);
  77.                     }
  78.  
  79.                     for (var i = 0; i < items.length; i+=1) {
  80.                         var domItem = items[i].render();
  81.                         itemsList.appendChild(domItem);
  82.                     }
  83.                     console.log(itemsList);
  84.                     accItem.appendChild(itemsList);
  85.                 }
  86.  
  87.                 this.serialize = function () {
  88.                     var serializedItems = [];
  89.                     for (var i = 0; i < items.length; i+=1 ) {
  90.                         serializedItems.push(items[i].serialize());
  91.                     }
  92.                     return serializedItems;
  93.                 }
  94.             }
  95.  
  96.             function Item(title) {
  97.                 var items = [];
  98.                
  99.                 this.add = function (title) {
  100.                     var newItem = new Item(title);
  101.                     items.push(newItem);
  102.                     return newItem;
  103.                 }
  104.                 this.render = function () {
  105.                     var itemNode = document.createElement("li");
  106.  
  107.                     itemNode.innerHTML = "<a href='#'>" + title + "</a>";
  108.                     if (items.length > 0) {
  109.                         var sublist = document.createElement('ul');
  110.                         sublist.style.display = "none";
  111.                         for (var i = 0; i < items.length; i += 1) {
  112.                             var subItem = items[i].render();
  113.                             sublist.appendChild(subItem);
  114.                         }
  115.                         itemNode.appendChild(sublist);
  116.                     }
  117.                     return itemNode;
  118.                 }
  119.                 this.serialize = function () {
  120.                     var thisItem = {
  121.                         title: title
  122.                     };
  123.                     if (items.length > 0) {
  124.                         var serializedItems = [];
  125.                         for (var i = 0; i < items.length; i+=1) {
  126.                             var serItem = items[i].serialize();
  127.                             serializedItems.push(serItem);
  128.                         }
  129.                         thisItem.items = serializedItems;
  130.                     }
  131.                     return thisItem;
  132.                 }
  133.             }
  134.  
  135.             function addItem(item, dataItem) {
  136.                 var accItem = item.add(dataItem.title);
  137.                 if (dataItem.items) {
  138.                     for (var i = 0; i < dataItem.items.length; i++) {
  139.                         addItem(accItem, dataItem.items[i]);
  140.                     }
  141.                 }
  142.             }
  143.  
  144.             return {
  145.                 getAccordion: function (selector) {
  146.                     return new Accordeon(selector);
  147.                 },
  148.                 buildAccordion: function (selector, data) {
  149.                     var accordion = this.getAccordion(selector);
  150.  
  151.                     if (data) {
  152.                         for (var i = 0; i < data.length; i++) {
  153.                             addItem(accordion, data[i]);
  154.                         }
  155.                     }
  156.  
  157.                     return accordion;
  158.                 }
  159.             }
  160.  
  161.  
  162.         }());
  163.  
  164.         //extensions
  165.         (function () {
  166.             if (!Storage.prototype.setObject) {
  167.                 Storage.prototype.setObject = function (key, obj) {
  168.                     this.setItem(key, JSON.stringify(obj));
  169.                 }
  170.             }
  171.  
  172.             if (!Storage.prototype.getObject) {
  173.                 Storage.prototype.getObject = function (key) {
  174.                     return JSON.parse(this.getItem(key));
  175.                 }
  176.             }
  177.         }());
  178.      
  179.         var accordion = controls.getAccordion("#cont");
  180.         var webItem = accordion.add("Web");
  181.         var html = webItem.add("HTML");
  182.         html.add("4.1");
  183.         html.add("5");
  184.         webItem.add("CSS");
  185.         webItem.add("JavaScript");
  186.         webItem.add("jQuery");
  187.         webItem.add("ASP.NET MVC");
  188.         var desctop = accordion.add("Desktop");
  189.         desctop.add("Desktop viewer");
  190.         accordion.add("Mobile");
  191.         accordion.add("Embedded");
  192.         accordion.render();
  193.  
  194.         var serialized = accordion.serialize();
  195.         localStorage.setObject("acc", serialized);
  196.         var deserializedData = localStorage.getObject("acc");
  197.         var clonedAccordion = controls.buildAccordion("#cont", deserializedData);
  198.         console.log(controls.buildAccordion("#cont", deserializedData));
  199.         clonedAccordion.render();
  200.     </script>
  201. </body>
  202. </html>
Advertisement
Add Comment
Please, Sign In to add comment