/*
* 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);