/* * DC jQuery Vertical Accordion Menu - jQuery vertical accordion menu plugin * 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($){ $.fn.dcAccordion = function(options) { //set default options var defaults = { classParent : 'dcjq-parent', classActive : 'active', classArrow : 'dcjq-icon', classCount : 'dcjq-count', classExpand : 'dcjq-current-parent', eventType : 'click', hoverDelay : 300, menuClose : true, autoClose : true, autoExpand : false, speed : 'slow', saveState : true, disableLink : true, showCount : false, // cookie : 'dcjq-accordion' }; //call in the default otions var options = $.extend(defaults, options); this.each(function(options){ var obj = this; setUpAccordion(); // if(defaults.saveState == true){ // checkCookie(defaults.cookie, obj); // } if(defaults.autoExpand == true){ $('li.'+defaults.classExpand+' > a').addClass(defaults.classActive); } resetAccordion(); if(defaults.eventType == 'hover'){ var config = { sensitivity: 2, // number = sensitivity threshold (must be 1 or higher) interval: defaults.hoverDelay, // number = milliseconds for onMouseOver polling interval over: linkOver, // function = onMouseOver callback (REQUIRED) timeout: defaults.hoverDelay, // number = milliseconds delay before onMouseOut out: linkOut // function = onMouseOut callback (REQUIRED) }; $('li a',obj).hoverIntent(config); var configMenu = { sensitivity: 2, // number = sensitivity threshold (must be 1 or higher) interval: 1000, // number = milliseconds for onMouseOver polling interval over: menuOver, // function = onMouseOver callback (REQUIRED) timeout: 1000, // number = milliseconds delay before onMouseOut out: menuOut // function = onMouseOut callback (REQUIRED) }; $(obj).hoverIntent(configMenu); // Disable parent links if(defaults.disableLink == true){ $('li a',obj).click(function(e){ if($(this).siblings('ul').length >0){ e.preventDefault(); } }); } } else { $('li a',obj).click(function(e){ $activeLi = $(this).parent('li'); $parentsLi = $activeLi.parents('li'); $parentsUl = $activeLi.parents('ul'); // Prevent browsing to link if has child links if(defaults.disableLink == true){ if($(this).siblings('ul').length >0){ e.preventDefault(); } } // Auto close sibling menus if(defaults.autoClose == true){ autoCloseAccordion($parentsLi, $parentsUl); } if ($('> ul',$activeLi).is(':visible')){ $('ul',$activeLi).slideUp(defaults.speed); $('a',$activeLi).removeClass(defaults.classActive); } else { $(this).siblings('ul').slideToggle(defaults.speed); $('> a',$activeLi).addClass(defaults.classActive); } // // Write cookie if save state is on // if(defaults.saveState == true){ // createCookie(defaults.cookie, obj); // } }); } // Set up accordion function setUpAccordion(){ $arrow = ''; var classParentLi = defaults.classParent+'-li'; $('> ul',obj).show(); $('li',obj).each(function(){ if($('> ul',this).length > 0){ $(this).addClass(classParentLi); $('> a',this).addClass(defaults.classParent).append($arrow); } }); $('> ul',obj).hide(); if(defaults.showCount == true){ $('li.'+classParentLi,obj).each(function(){ if(defaults.disableLink == true){ var getCount = parseInt($('ul a:not(.'+defaults.classParent+')',this).length); } else { var getCount = parseInt($('ul a',this).length); } $('> a',this).append(' '+getCount+''); }); } } function linkOver(){ $activeLi = $(this).parent('li'); $parentsLi = $activeLi.parents('li'); $parentsUl = $activeLi.parents('ul'); // Auto close sibling menus if(defaults.autoClose == true){ autoCloseAccordion($parentsLi, $parentsUl); } if ($('> ul',$activeLi).is(':visible')){ $('ul',$activeLi).slideUp(defaults.speed); $('a',$activeLi).removeClass(defaults.classActive); } else { $(this).siblings('ul').slideToggle(defaults.speed); $('> a',$activeLi).addClass(defaults.classActive); } // Write cookie if save state is on if(defaults.saveState == true){ createCookie(defaults.cookie, obj); } } function linkOut(){ } function menuOver(){ } function menuOut(){ if(defaults.menuClose == true){ $('ul',obj).slideUp(defaults.speed); // Reset active links $('a',obj).removeClass(defaults.classActive); createCookie(defaults.cookie, obj); } } // Auto-Close Open Menu Items function autoCloseAccordion($parentsLi, $parentsUl){ $('ul',obj).not($parentsUl).slideUp(defaults.speed); // Reset active links $('a',obj).removeClass(defaults.classActive); $('> a',$parentsLi).addClass(defaults.classActive); } // Reset accordion using active links function resetAccordion(){ $('ul',obj).hide(); $allActiveLi = $('a.'+defaults.classActive,obj); $allActiveLi.siblings('ul').show(); } }); // 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){ // var $cookieLi = $('li:eq('+value+')',obj); // $('> a',$cookieLi).addClass(defaults.classActive); // var $parentsLi = $cookieLi.parents('li'); // $('> a',$parentsLi).addClass(defaults.classActive); // }); // } // } // Write cookie // function createCookie(cookieId, obj){ // var activeIndex = []; // // Create array of active items index value // $('li 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);