225 lines
6.5 KiB
JavaScript
225 lines
6.5 KiB
JavaScript
|
/*
|
||
|
* 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 = '<span class="'+defaults.classArrow+'"></span>';
|
||
|
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(' <span class="'+defaults.classCount+'">'+getCount+'</span>');
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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);
|