(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);