﻿/*      
*      jQuery dropmenu 1.1.3
*      www.frebsite.nl
*      Copyright (c) 2010 Fred Heusschen
*      Licensed under the MIT license.
*      http://www.opensource.org/licenses/mit-license.php
*/


(function ($) {
    $.fn.dropmenu = function (options) {
        var isIE = $.browser.ie,
                        isIE6 = isIE && $.browser.version < 7,
                        isIE7 = isIE && $.browser.version < 8;


        return this.each(function () {

            var opts = $.extend({}, $.fn.dropmenu.defaults, options),
                                $menu = $(this),
                                $topl = $menu.find('> li'),
                                menuX = $menu.offset().left;

            if (opts.maxWidth == 0) {
                opts.maxWidth = $('body').width() - menuX;
            }

            //      UL itself and all LI's
            $menu
                                .css({
                                    display: 'block',
                                    listStyle: 'none'
                                })
                                .find("li")
                                .css({
                                    display: 'block',
                                    listStyle: 'none',
                                    position: 'relative',
                                    margin: 0,
                                    padding: 0
                                });


            var css = {
                display: 'block',
                outline: 'none'
            };
            if (opts.nbsp) css['whiteSpace'] = 'nowrap';

            //      all A's and SPANs
            $menu
                                .find('li > a, li > span')
                                .css(css);


            //      top-level LI's and top level A's and SPANs
            $topl
                                .css({
                                    float: 'left'
                                })
                                .find('> a, > span')
                                .addClass('toplevel')
                                .css({
                                    float: 'left'
                                });

            //      all sub-ULs
            $menu
                                .find('ul')
                                .css({
                                    display: 'none',
                                    position: 'absolute',
                                    margin: 0,
                                    padding: 0
                                });

            //      first sub-UL and second, third, etc. sub-ULs
            $topl
                                .find('> ul')
                                .css({
                                    left: 0,
                                    top: $topl.outerHeight()
                                })
                                .find('li > a, li > span')
                                .addClass('sublevel')
                                .parent()
                                .find('ul')
                                .css({
                                    top: 0
                                }).data('subsub', true);

            $topl



            //      IE fixes
            if (isIE6) {
                $menu.find('ul').css({
                    lineHeight: 0
                });
            }
            if (isIE6 || isIE7) {
                $menu.find('ul a, ul span').css({
                    zoom: 1
                });
            }


            $menu.find('a').click(function () {
                $('ul', $menu).hide();
                $('a, span', $menu).removeClass('hover');
            });

            $menu.find('li').hover(

            //      showing submenu
                                function () {
                                    var listit = this,
                                                subnav = $.fn.dropmenu.getSubnav(listit),
                                                subcss = { zIndex: $.fn.dropmenu.zIndex++ };

                                    $(listit).find('> a, > span').addClass('hover');

                                    if (!subnav) return;
                                    if ($(subnav).is(":animated")) return;

                                    if ($.data(subnav, 'subsub')) {
                                        var distance = $(listit).outerWidth(),
                                                        itemWidth = $(listit).offset().left + distance - menuX,
                                                        position = (opts.maxWidth < itemWidth) ? "right" : "left";

                                        subcss[position] = distance;
                                    }
                                    $(subnav).css(subcss);
                                    $.data(subnav, 'stayOpen', true);

                                    switch (opts.effect) {
                                        case 'slide':
                                            $(subnav).slideDown(opts.speed);
                                            break;

                                        case 'fade':
                                            $(subnav).fadeIn(opts.speed);
                                            break;

                                        default:
                                            $(subnav).show();
                                            break;
                                    }

                                    //      hiding submenu
                                }, function () {
                                    var listit = this,
                                                subnav = $.fn.dropmenu.getSubnav(listit);

                                    if (!subnav) {
                                        $(listit).find('> a, > span').removeClass('hover');
                                        return;
                                    }

                                    $.data(subnav, 'stayOpen', false);
                                    setTimeout(function () {
                                        if ($.data(subnav, 'stayOpen')) return;
                                        $(listit).find('> a, > span').removeClass('hover');

                                        $('ul', subnav).hide();
                                        switch (opts.effect) {
                                            case 'slide':
                                                $(subnav).slideUp(opts.speed);
                                                break;

                                            case 'fade':
                                                $(subnav).fadeOut(opts.speed);
                                                break;

                                            default:
                                                $(subnav).hide();
                                                break;
                                        }

                                    }, opts.timeout);
                                }
                        );
        });
    };

    $.fn.dropmenu.getSubnav = function (ele) {
        if (ele.nodeName.toLowerCase() == 'li') {
            var subnav = $('> ul', ele);
            return subnav.length ? subnav[0] : null;
        } else {
            return ele;
        }
    }

    $.fn.dropmenu.zIndex = 1000;
    $.fn.dropmenu.defaults = {
        effect: 'slide',               //      'slide', 'fade', or 'none'
        speed: 'fast',             //      'normal', 'fast', 'slow', 100, 1000, etc
        timeout: 250,
        nbsp: false,
        maxWidth: 0
    };
})(jQuery);
