(function($) {
/*
jquery.dropSlideMenu.js v1.0
Last updated: 24 July 2009
Created by Damien du Toit
http://coda.co.za/blog/2009/07/24/dropslidemenu
Licensed under a Creative Commons Attribution-Non-Commercial 3.0 Unported License
http://creativecommons.org/licenses/by-nc/3.0/
*/
$.fn.dropSlideMenu = function(options) {
$.fn.dropSlideMenu.defaults = {
indicators: true, // adds a div to the list items for attaching indicators (arrows)
clickstream: true, // highlights the clickstream in a menu by comparing the links to the current URL path
openEasing: "easeOutQuad", // open animation effect
closeEasing: "easeInQuad", // close animation effect
duration: 600, // speed of drop down animation (in milliseconds)
delay: 800, // delay before the drop down closes (in milliseconds)
hideSelects: true // hide all select elements on the page when the menu is active (IE6 only)
};
var o = $.extend({}, $.fn.dropSlideMenu.defaults, options);
return this.each(function() {
window.container = $(this).children("ul:first");
window.lists = container.find("ul");
window.listItems = lists.parent();
window.timer = null;
window.count = 1;
// add class to container
container.addClass("ds");
// inject float clearer
var clear = "
";
container.append(clear);
lists.each(function() {
// assign unique id, hide list
$(this).attr("id", "dsList-" + count).css({ display: "none", visibility: "visible" });
count++;
});
count = 1;
listItems.each(function() {
var listItem = $(this);
var list = listItem.children("ul:first");
var link = listItem.children("a:first");
// add clickstream if link href found in URL path
if (o.clickstream) {
var links = listItem.find("a");
links.each(function() {
if (window.location.pathname.indexOf($(this).attr("href")) != -1) {
$(this).parent().addClass("clickstream");
}
});
}
// wrap indicator markup
if (o.indicators) {
link.wrap("");
}
// assign unique id
listItem.attr("id", "dsListItem-" + count);
$.event.special.hover.delay = 80;
listItem.hover(function() {
if ($(this).hasClass("open")) {
if (timer) {
// reset timer
window.clearTimeout(timer);
timer = null;
}
}
else {
// hide all menus
lists.hide();
// reset all list item styles
listItems.removeClass("open").removeClass("active");
// reset timer
window.clearTimeout(timer);
timer = null;
// open menu
openList($(this));
}
},
function() {
timer = setTimeout(function() {
// close menu
closeList(list.parent());
}, o.delay);
});
function openList(li) {
// hide select elements in IE6
if (o.hideSelects && $.browser.msie && parseInt($.browser.version) < 7) {
$("select").css("visibility", "hidden");
}
// add style
li.addClass("open");
// open menu
list.show("slide", {duration: o.duration, direction: "up", easing: o.openEasing}, function() {
});
}
function closeList(li) {
// reset timer
timer = null;
// close menu
list.hide("slide", {duration: o.duration, direction: "up", easing: o.closeEasing}, function() {
// remove style
li.removeClass("open");
// show select elements in IE6
if (o.hideSelects && $.browser.msie && parseInt($.browser.version) < 7) {
$("select").css("visibility", "visible");
}
});
}
count++;
});
// Internet Explorer fix
if ($.browser.msie) {
container.find("li ul li a").css({ zoom: 1, verticalAlign: "top" });
}
// behaviour for links with empty href's
$("a[href$='#']", container).css({cursor: "default"}).click(function() { return false; });
});
};
})(jQuery);