﻿(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 timeOutID = "timeOutID";
            var hoverCssClass = this.hoverCssClass;

            if ($(bgSelector).length == 0)
                $(wrapperSelector).parent().append('<div id="sMenuBg" style="width: 100%; height: 100%; z-index: 50; 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) {
                $(liSelector).removeClass(hoverCssClass);
                $(divSelector).hide();
                $(this).fadeOut();

                $(wrapperSelector).data('sMenu').inProgress = false;
            });

            $(bgSelector).mouseenter(function() {
                if (!$(wrapperSelector).data('sMenu').inProgress) {
                    $(liSelector).removeClass(hoverCssClass);
                    $(divSelector).hide();
                    $(this).fadeOut();
                }
            });

            $(liSelector).mouseenter(function() {
                var tab = $(divSelector);
                $(liSelector).removeClass(hoverCssClass);
                $(this).addClass(hoverCssClass);

                if (!$(wrapperSelector).data('sMenu').inProgress) {
                    var index = $(liSelector).index(this);
                    $.each(tab, function(key, value) {
                        if (index != key)
                            $(value).hide();
                    });
                    var timeOut = setTimeout(function() {
                        $(bgSelector).fadeIn();
                        $(wrapperSelector).children("div:eq(" + index + ")").fadeIn();
                    }, 200);

                    $(wrapperSelector).data(timeOutID, timeOut);
                }
            }).mouseleave(function() {
                $(liSelector).removeClass(hoverCssClass);
                clearTimeout($(wrapperSelector).data(timeOutID));
            });

            $(liSelector).click(function(e) {
                if ($(wrapperSelector).data('sMenu').inProgress) {
                    $(wrapperSelector).data('sMenu').inProgress = false;
                    $(this).trigger('mouseenter');
                }
                else {
                    $(this).trigger('mouseenter');
                }
            });

            $(divSelector).mouseenter(function() {
                var index = $(divSelector).index(this);
                $(liSelector + ":eq(" + index + ")").addClass(hoverCssClass);

                $(bgSelector).fadeIn();
                $(wrapperSelector).children("div:eq(" + index + ")").fadeIn();
            }).mouseleave(function() {

            });

            $(divSelector).hide();
        },
        openProgress: function() {
            this.inProgress = true;
        },
        closeProgress: function() {
            this.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();

            this.inProgress = false;

            $(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";

            $(liSelector).removeClass(this.currentCssClass);

            $(selector).addClass(this.currentCssClass);
        }
    });

    $.fn.sMenu = function(options) {
        options = $.extend({}, $.fn.sMenu.defaults, options);

        return this.each(function() {
            options = $.meta ? $.extend({}, options, $(this).data()) : options;
            if (!$(this).data('sMenu'))
                $(this).data('sMenu', new $s.menu(this, options));
        });
    };

    $.fn.sMenu.defaults = { inProgress: false };

})(jQuery);


