/* * 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', eventType : 'click', hoverDelay : 300, menuClose : true, autoClose : true, speed : 'slow', saveState : true, disableLink : true, showCount : true }; //call in the default otions var options = $.extend(defaults, options); var $dcAccordionObj = this; return $dcAccordionObj.each(function(options){ setUpAccordion(); if(defaults.saveState == true){ cookieId = $(this).parent().attr('id'); checkCookie(); } 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',$dcAccordionObj).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) }; $($dcAccordionObj).hoverIntent(configMenu); // Disable parent links if(defaults.disableLink == true){ $('li a',$dcAccordionObj).click(function(e){ if($(this).next('ul').length >0){ e.preventDefault(); } }); } } else { $('li a',$dcAccordionObj).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).next('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).next().slideToggle(defaults.speed); $('> a',$activeLi).addClass(defaults.classActive); } // Write cookie if save state is on if(defaults.saveState == true){ createCookie(); } }); } // Set up accordion function setUpAccordion(){ $arrow = ''; $('> ul',$dcAccordionObj).show(); $('li',$dcAccordionObj).each(function(){ var classParentLi = defaults.classParent+'-li'; if($('> ul',this).length > 0){ $(this).addClass(classParentLi); $('> a',this).addClass(defaults.classParent).append($arrow); if(defaults.showCount == true){ var parentLink = $('li:not(.'+defaults.classParent+') > a',this); var countParent = parseInt($(parentLink).length); getCount = countParent; $('> a',this).append(' ('+getCount+')'); } } }); $('> ul',$dcAccordionObj).hide(); } }); 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).next().slideToggle(defaults.speed); $('> a',$activeLi).addClass(defaults.classActive); } // Write cookie if save state is on if(defaults.saveState == true){ createCookie(); } } function linkOut(){ } function menuOver(){ } function menuOut(){ if(defaults.menuClose == true){ $('ul',$dcAccordionObj).slideUp(defaults.speed); // Reset active links $('a',$dcAccordionObj).removeClass(defaults.classActive); createCookie(); } } // Auto-Close Open Menu Items function autoCloseAccordion($parentsLi, $parentsUl){ $('ul',$dcAccordionObj).not($parentsUl).slideUp(defaults.speed); // Reset active links $('a',$dcAccordionObj).removeClass(defaults.classActive); $('> a',$parentsLi).addClass(defaults.classActive); } // Retrieve cookie value and set active items function checkCookie(){ 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+')',$dcAccordionObj); $('> a',$cookieLi).addClass(defaults.classActive); var $parentsLi = $cookieLi.parents('li'); $('> a',$parentsLi).addClass(defaults.classActive); }); } } // Reset accordion using active links function resetAccordion(){ $('ul',$dcAccordionObj).hide(); $allActiveLi = $('a.'+defaults.classActive,$dcAccordionObj); $allActiveLi.next().show(); } // Write cookie function createCookie(){ var activeIndex = []; // Create array of active items index value $('li a.active',$dcAccordionObj).each(function(i){ var $arrayItem = $(this).parent('li'); var itemIndex = $('li',$dcAccordionObj).index($arrayItem); activeIndex.push(itemIndex); }); // Store in cookie $.cookie(cookieId, activeIndex, { path: '/' }); } }; })(jQuery);