/* * DC jQuery Drill Down Menu - jQuery drill down ipod menu * Copyright (c) 2011 Design Chemical * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ (function($){ //define the new for the plugin ans how to call it $.fn.dcDrilldown = function(options) { //set default options var defaults = { classWrapper : 'dd-wrapper', classMenu : 'dd-menu', classParent : 'dd-parent', classParentLink : 'dd-parent-a', classActive : 'active-ul', classHeader : 'dd-header', eventType : 'click', hoverDelay : 300, speed : 2000, saveState : false, showCount : false, classCount : 'dd-count', classIcon : 'dd-icon', linkType : 'backlink', resetText : 'All', headerTag : 'h6', defaultText : 'Select Option', includeHdr : true }; //call in the default otions var options = $.extend(defaults, options); //act upon the element that is passed into the design return this.each(function(options){ var $dcDrilldownObj = this; $($dcDrilldownObj).addClass(defaults.classMenu); var $wrapper = '
'; $($dcDrilldownObj).wrap($wrapper); var $dcWrapper = $($dcDrilldownObj).parent(); var objIndex = $($dcWrapper).index('.'+defaults.classWrapper); var idHeader = defaults.classHeader+'-'+objIndex; var idWrapper = defaults.classWrapper+'-'+objIndex; $($dcWrapper).attr('id',idWrapper); var $header = '
'; setUpDrilldown(); if(defaults.saveState == true){ var cookieId = defaults.classWrapper+'-'+objIndex; checkCookie(cookieId, $dcDrilldownObj); } resetDrilldown($dcDrilldownObj, $dcWrapper); $('li a',$dcDrilldownObj).click(function(e){ $link = this; $activeLi = $(this).parent('li').not('.disabled').stop(); $siblingsLi = $($activeLi).siblings(); // Drilldown action if($('> ul',$activeLi).length){ if($($link).hasClass(defaults.classActive)){ $('ul a',$activeLi).removeClass(defaults.classActive); resetDrilldown($dcDrilldownObj, $dcWrapper); } else { actionDrillDown($activeLi, $dcWrapper, $dcDrilldownObj); } } // Prevent browsing to link if has child links if($(this).next('ul').length > 0){ e.preventDefault(); } }); // Set up accordion function setUpDrilldown(){ $arrow = ''; $($dcDrilldownObj).before($header); // Get width of menu container & height of list item var totalWidth = $($dcDrilldownObj).outerWidth(); totalWidth += 'px'; var itemHeight = $('li',$dcDrilldownObj).outerHeight(true); // Get height of largest sub menu var objUl = $('ul',$dcDrilldownObj); var maxItems = findMaxHeight(objUl); // Get level of largest sub menu //var maxUl = $(objUl.html()+'[rel="'+maxItems+'"]'); var maxUl = $('[rel="'+maxItems+'"]', objUl); var getIndex = findMaxIndex(maxUl); // Set menu container height if(defaults.linkType == 'link'){ menuHeight = itemHeight * (maxItems + getIndex); } else { menuHeight = itemHeight * maxItems; } // Set sub menu width and offset $('li',$dcDrilldownObj).each(function(){ $('ul',this).css({marginRight: '-'+totalWidth, marginTop: '0'}); if($('> ul',this).length){ $(this).addClass(defaults.classParent); $('> a',this).addClass(defaults.classParentLink).append($arrow); if(defaults.showCount == true){ var parentLink = $('a:not(.'+defaults.classParentLink+')',this); var countParent = parseInt($(parentLink).length); getCount = countParent; $('> a',this).append(' ('+getCount+')'); } } }); // Add css class $('ul',$dcWrapper).each(function(){ $('li:last',this).addClass('last'); }); $('> ul > li:last',$dcWrapper).addClass('last'); if(defaults.linkType == 'link'){ $(objUl).css('top',itemHeight+'px'); } // Add 'active' class to parent list item in all levels $('ul',$dcWrapper).find('li.active').parents('li').addClass('active'); } // Breadcrumbs $('#'+idHeader).on('click', 'a', function(e){ if($(this).hasClass('link-back')){ linkIndex = $('#'+idWrapper+' .'+defaults.classParentLink+'.active-ul').length; linkIndex = linkIndex-2; $('a.'+defaults.classActive+':last', $dcDrilldownObj).removeClass(defaults.classActive); } else { // Get link index var linkIndex = parseInt($(this).index('#'+idHeader+' a')); if(linkIndex == 0){ $('a',$dcDrilldownObj).removeClass(defaults.classActive); } else { // Select equivalent active link linkIndex = linkIndex-1; $('a.'+defaults.classActive+':gt('+linkIndex+')',$dcDrilldownObj).removeClass(defaults.classActive); } } resetDrilldown($dcDrilldownObj, $dcWrapper); e.preventDefault(); e.stopPropagation(); }); }); function findMaxHeight(element){ var maxValue = undefined; $(element).each(function(){ var val = parseInt($('> li',this).length); $(this).attr('rel',val); if (maxValue === undefined || maxValue < val){ maxValue = val; } }); return maxValue; } function findMaxIndex(element){ var maxIndex = undefined; $(element).each(function(){ var val = parseInt($(this).parents('li').length); if (maxIndex === undefined || maxIndex < val) { maxIndex = val; } }); return maxIndex; } // Drill Down function actionDrillDown(element, wrapper, obj){ // Declare header var $header = $('.'+defaults.classHeader, wrapper); // Get new breadcrumb and header text var getNewBreadcrumb = $(defaults.headerTag,$header).html(); var getNewHeaderText = $('> a',element).html(); //var getParentText = $(wrapper).find('.'+defaults.classMenu).data('category'); // Add new breadcrumb if(defaults.linkType == 'breadcrumb'){ if(!$('ul',$header).length){ $($header).prepend(''); } if(getNewBreadcrumb == defaults.defaultText){ $('ul',$header).append('
  • '+defaults.resetText+'
  • '); } else { $('ul',$header).append('
  • '+getNewBreadcrumb+'
  • '); } } if(defaults.linkType == 'backlink'){ if(!$('a',$header).length){ $($header).prepend(' '+getNewBreadcrumb+''); } else { $('.link-back',$header).html(getNewBreadcrumb); } } if(defaults.linkType == 'link'){ if(!$('a',$header).length){ $($header).prepend(''); } } // Update header text updateHeader($header, getNewHeaderText); // declare child link var activeLink = $('> a',element); // add active class to link $(activeLink).addClass(defaults.classActive); $('> ul li',element).show(); $('> ul',element).animate({"margin-right": 0}, defaults.speed); // Find all sibling items & hide var $siblingsLi = $(element).siblings(); $($siblingsLi).hide(); // If using breadcrumbs hide this element if(defaults.linkType != 'link'){ $(activeLink).hide(); } // Write cookie if save state is on if(defaults.saveState == true){ var cookieId = $(wrapper).attr('id'); createCookie(cookieId, obj); } } // Drill Up function actionDrillUp(element, obj, wrapper){ // Declare header var $header = $('.'+defaults.classHeader, wrapper); var activeLink = $('> a',element); var checklength = $('.'+defaults.classActive, wrapper).length; var activeIndex = $(activeLink).index('.'+defaults.classActive, wrapper); // Get width of menu for animating right var totalWidth = $(obj).outerWidth(true); $('ul',element).css('margin-right',-totalWidth+'px'); // Show all elements $(activeLink).addClass(defaults.classActive); $('> ul li',element).show(); $('a',element).show(); // Get new header text from clicked link var getNewHeaderText = $('> a',element).html(); $(defaults.headerTag,$header).html(getNewHeaderText); if(defaults.linkType == 'breadcrumb'){ var breadcrumbIndex = activeIndex-1; $('a:gt('+activeIndex+')',$header).remove(); } } function updateHeader(obj, html){ if(defaults.includeHdr == true){ if($(defaults.headerTag,obj).length){ $(defaults.headerTag,obj).html(html); } else { $(obj).append('<'+defaults.headerTag+'>'+html+''); } } } // Reset accordion using active links function resetDrilldown(obj, wrapper){ var $header = $('.'+defaults.classHeader, wrapper); $('ul',$header).remove(); $('a',$header).remove(); $('li',obj).show(); $('a',obj).show(); var totalWidth = $(obj).outerWidth(true); if(defaults.linkType == "link"){ if($('a.'+defaults.classActive+':last',obj).parent('li').length){ var lastActive = $('a.'+defaults.classActive+':last',obj).parent('li'); $('ul',lastActive).css('margin-right',-totalWidth+'px'); }else { $('ul',obj).css('margin-right',-totalWidth+'px'); } } else { $('ul',obj).css('margin-right',-totalWidth+'px'); } updateHeader($header, defaults.defaultText); // Write cookie if save state is on if(defaults.saveState == true){ var cookieId = $(wrapper).attr('id'); createCookie(cookieId, obj); } $('a.'+defaults.classActive,obj).each(function(i){ var $activeLi = $(this).parent('li').stop(); actionDrillDown($activeLi, wrapper, obj); }); } // Retrieve cookie value and set active items function checkCookie(cookieId, obj){ var cookieVal = $.cookie(cookieId); if(cookieVal != null){ // create array from cookie string var activeArray = cookieVal.split(','); $.each(activeArray, function(index,value){ // mewsoft. fix firefox root menu not shown value = parseInt(value) + 0; var $cookieLi = $('li:eq('+value+')',obj); $('> a',$cookieLi).addClass(defaults.classActive); }); } } // Write cookie function createCookie(cookieId, obj){ var activeIndex = []; // Create array of active items index value $('a.'+defaults.classActive,obj).each(function(i){ var $arrayItem = $(this).parent('li'); var itemIndex = $('li',obj).index($arrayItem); activeIndex.push(itemIndex); }); // Store in cookie $.cookie(cookieId, activeIndex, { path: '/' }); } }; })(jQuery); /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (arguments.length > 1 && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setTime(+t + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); var name = decode(parts.shift()); var cookie = parts.join('='); if (key && key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) === undefined) { return false; } // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; }));