﻿(function($) {

    var $s = $.serpentine;

    $.extend($s, {
        menu: function(element, options) {
            $.extend(this, options);
            this.element = element;
            this.isOverContent = false;

            if (!options.hoverCssClass)
                this.hoverCssClass = "hover";
            else
                this.hoverCssClass = options.hoverCssClass;

            if (!options.currentCssClass)
                this.currentCssClass = "current";
            else
                this.currentCssClass = options.currentCssClass;

            this._init();
            $s.trigger(element, 'load');
        }
    });

    $.extend($s.menu.prototype, {
        _init: function() {
            var bgSelector = '#sMenuBg';
            var liSelector = "#" + this.element.id + ">ul>li";
            var wrapperSelector = "#" + this.element.id;
            var divSelector = "#" + this.element.id + ">div";
            var hoverCssClass = this.hoverCssClass;

            var jumpOut = "JumpOut";
            var jumpIn = "JumpIn";

            if ($(bgSelector).length == 0)
                $(wrapperSelector).parent().append('<div id="sMenuBg" style="width: 100%; height: 100%; z-index: 80; background-color: black; filter: alpha(opacity=10);-moz-opacity: 0.1;opacity: 0.1; position: fixed; top: 0px; left: 0px; display: none;">&nbsp;</div> ');

            $(bgSelector).click(function(e) {
                $(document.body).data('sMenus').inProgress = false;

                if ($(liSelector).hasClass(hoverCssClass))
                    $(liSelector).removeClass(hoverCssClass);

                $(divSelector).hide();
                $(this).fadeOut();
            });

            $(bgSelector)
                .mouseenter(function() { })
                .mouseleave(function() { });

            $(liSelector).mouseenter(function() {
                
                if ($(liSelector).hasClass(hoverCssClass))
                    $(liSelector).removeClass(hoverCssClass);

                $(this).addClass(hoverCssClass);

                if (typeof ($(wrapperSelector).data(jumpOut)) != 'undefined') {
                    clearTimeout($(wrapperSelector).data(jumpOut));
                    $(wrapperSelector).removeData(jumpOut);
                }
                                
                if (!$(document.body).data('sMenus').inProgress) {

                    var Id = $(this).attr('id');
                    $.each($('div[selector]'), function(key, value) {
                        if ($(value).attr('selector') != Id)
                            $(value).hide();
                    });

                    var isSticky = $(this).attr("mode") == "sticky";
                    var timeOut = setTimeout(function() {
                        $(bgSelector).fadeIn();

                        var d = $(wrapperSelector).children('div[selector*="' + Id + '"]');
                        if (d.length == 1) {
                            d.fadeIn();
                            $(document.body).data('sMenus').inProgress = isSticky;
                        }

                        // jumpIn has been already executed
                        $(wrapperSelector).removeData(jumpIn);
                    }, 200);

                    $(wrapperSelector).data(jumpIn, timeOut);
                }
            }).mouseleave(function() {
                if ($(liSelector).hasClass(hoverCssClass))
                    $(liSelector).removeClass(hoverCssClass);

                if (typeof ($(wrapperSelector).data(jumpIn)) != 'undefined') {
                    clearTimeout($(wrapperSelector).data(jumpIn));
                    $(wrapperSelector).removeData(jumpIn);
                }

                if (!$(document.body).data('sMenus').inProgress) {
                    var timeOut = setTimeout(function() {
                        if ($(liSelector).hasClass(hoverCssClass))
                            $(liSelector).removeClass(hoverCssClass);

                        $(divSelector).hide();
                        $(bgSelector).fadeOut();

                        $(wrapperSelector).removeData(jumpOut);
                    }, 300);

                    $(wrapperSelector).data(jumpOut, timeOut);
                }
            });

            $(liSelector).click(function(e) {
                if (!$(document.body).data('sMenus').inProgress) {
                    $(document.body).data('sMenus').inProgress = false;
                    $(this).trigger('mouseenter');
                }
            });

            $(divSelector).mouseenter(function() {
                if (typeof ($(wrapperSelector).data(jumpOut)) != 'undefined') {
                    clearTimeout($(wrapperSelector).data(jumpOut));
                    $(wrapperSelector).removeData(jumpOut);
                }
            }).mouseleave(function() {
                if (!$(document.body).data('sMenus').inProgress) {
                    var timeOut = setTimeout(function() {
                        if ($(liSelector).hasClass(hoverCssClass))
                            $(liSelector).removeClass(hoverCssClass);

                        $(divSelector).hide();
                        $(bgSelector).fadeOut();

                        $(wrapperSelector).removeData(jumpOut);
                    }, 300);

                    $(wrapperSelector).data(jumpOut, timeOut);
                }
            });

            $(divSelector).hide();

            //show window if have query parameters
            //menuid=menu103 - About the Speakers
            //menuid=menu102 - Contact
            //menuid=menu101 - Menues $ Agenda

            var menuId = $s.getUrlVars("menuid");
            if ((typeof (menuId) != 'undefined') && (menuId != null)) {
                var selectorId = $("div[selector=" + menuId + "]");
                $(selectorId).show();
            }

        },
        openProgress: function() {
            $(document.body).data('sMenus').inProgress = true;
        },
        closeProgress: function() {
            $(document.body).data('sMenus').inProgress = false;
        },
        lockProgress: function(action) {
            this.closeProgress();
            action();

            this.openProgress();
        },
        disposeProgress: function(preAction, postAction) {
            var liSelector = "#" + this.element.id + ">ul>li";
            var hoverCssClass = this.hoverCssClass;
            var divSelector = "#" + this.element.id + ">div";
            var bgSelector = '#sMenuBg';
            var wrapperSelector = "#" + this.element.id;

            if ((typeof (preAction) != 'undefined') && (preAction != null))
                preAction();

            $(document.body).data('sMenus').inProgress = false;

            if ($(liSelector).hasClass(hoverCssClass))
                $(liSelector).removeClass(hoverCssClass);

            $(divSelector).hide();
            $(bgSelector).fadeOut();

            if ((typeof (postAction) != 'undefined') && (postAction != null))
                postAction();
        },
        setCurrentItem: function(currentItemIndex) {
            var selector = "#" + this.element.id + ">ul>li:eq(" + currentItemIndex + ")";
            var liSelector = "#" + this.element.id + ">ul>li";

            if ($(liSelector).hasClass(this.currentCssClass))
                $(liSelector).removeClass(this.currentCssClass);

            $(selector).addClass(this.currentCssClass);
        }

    });

    $.fn.sMenu = function(options) {
        options = $.extend({}, $.fn.sMenu.defaults, options);

        var cache = ($(document.body).data('sMenus')) ? $(document.body).data('sMenus') : { inProgress: false, menus: [] };
        var ret = this.each(function() {
            options = $.meta ? $.extend({}, options, $(this).data()) : options;
            if (!$(this).data('sMenu'))
                $(this).data('sMenu', new $s.menu(this, options));

            cache.menus.push($(this).data('sMenu'));
            if (options.inProgress)
                cache.inProgress = true;
        });

        $(document.body).data('sMenus', cache);
        return ret;
    };

    $.fn.sMenu.defaults = { inProgress: false };

})(jQuery);


