(function($) {
    $.fn.slidemenu = function(options) {
        var defaults = {
        };
        options = $.extend(defaults, options);
        return this.each(function() {
            var slidemenu = this;
            var openTimeout = null;
            $(slidemenu).addClass("slide-menu");
            $("> li", slidemenu).addClass("slide-menu-holder");
            $("> li > ul", slidemenu).addClass("slide-menu-content");
            var width = $(".slide-menu-holder", slidemenu).innerWidth();
            $(".slide-menu-holder ul", slidemenu).css({width:width+"px"});

            var openMenu = function (elm) {
                var hasVisible = false;
                $(elm).find("ul").each(function() {
                    if ($(this).is(":visible")) {
                        hasVisible = true;
                    }
                });
                if (hasVisible) {
                    return;
                }

                $(">ul", elm).css({top:0});

                var parents = $(elm).parents("ul");


                var w = (parents.size() - 1) * width;
                if ($(elm).find("ul").size() == 0) {
                    w = (parents.size() - 2) * width;
                }
                var tw = $(elm).parents(".slide-menu-content").data("tw");
                if (tw > w) {
                    w = tw;
                } else {
                    $(elm).parents(".slide-menu-content").data("tw", w);
                }

                $(elm).parents("ul").eq(0).find("ul").stop().clearQueue().hide();


                var h = $(">ul", elm).data("h");
                if (typeof h == "undefined") {
                    h = 0;

                }
                //$(elm).parents("ul").eq(0).find("a").removeClass("active-menu");
                //$(">a", elm).addClass("active-menu");

                $(elm).parents("ul").each(function(i) {
                    $(this).stop().clearQueue();
                    if (typeof $(this).data("h") != "undefined") {
                        if ($(this).data("h") > h) {
                            h = $(this).data("h");
                        }
                    }

                });
                var l = $(".container").offset().left + $(".container").outerWidth(false) -
                    ($(elm).parents(".slide-menu-content").offsetParent().offset().left + w + width);

                if (l > 0) {
                    l = 0;
                }

                $(elm).parents(".slide-menu-content").animate({paddingRight:w + "px", height:h + "px", left: l + "px"}, function() {

                });
                $(">ul", elm).css({left:(width) + "px"}).show();


            };




            var initMenu = function () {
                var timeout = null;
                $(".slide-menu-holder ul").each(
                    function() {
                        //console.log($(this).innerHeight());
                        $(this).data("h", $(this).innerHeight());
                    }).hide();
                $(".slide-menu-content").append('<div class="left-shadow"/><div class="right-shadow"/>');

                $(".slide-menu-content li").each(function() {
                    if ($("ul", this).size() > 0) {
                        $(this).addClass("has-elements");
                    }
                });


                var openAll = function(){
//                    console.log("openALl");
                    $(".slide-menu-holder").each(function () {

                        $(".slide-menu-holder ul").stop().clearQueue().hide();
                        $(".slide-menu-holder > ul").css({paddingRight:0, left:0}).show().each(function () {
                            $(this).css({height:$(this).data("h") + "px"});
                        });
                        if (timeout != null) {
                            clearTimeout(timeout);
                        }

                        $(".slide-menu-holder a").removeClass("active-menu");
                    });
                };

                var closeAll = function(){
//                    console.log("closeAll");
                    timeout = setTimeout(function () {
                        $(".slide-menu-holder ul").stop().clearQueue().hide();
                    }, 500);
                };

                $(slidemenu).bind("openAll", openAll);
                $(slidemenu).bind("closeAll", closeAll);

                $(".slide-menu-holder").mouseenter(
                    function() {
                        $(".slide-menu-holder ul").css({paddingRight:0, left:0}).hide().each(function() {
                            $(this).css({height:$(this).data("h") + "px"});
                        });
                        $(">ul", this).show();
                        if (timeout != null) {
                            clearTimeout(timeout);
                        }
                        $(".slide-menu-holder a").removeClass("active-menu");
//                        console.log("mouseenter holder");
                    }).mouseleave(function() {
//                        console.log("mouseleave holder");
                        timeout = setTimeout(function() {
                            $(".slide-menu-holder ul").stop().clearQueue().hide();
                            $(".slide-menu-content").data("tw", 0);
                        }, 500);
                    });

                $("li", slidemenu).mousemove(function(event) {
                    event.stopPropagation();
                    $(".active-menu").removeClass("active-menu");
                    $(">a", this).addClass("active-menu");
                    $(this).parents("li").each(function() {
                        $(">a", this).addClass("active-menu");
                    });
                });

                $(".slide-menu-holder li").mouseenter(function(event) {
                    event.stopPropagation();
//                    console.log("mouseenter li");
                    if (openTimeout != null) {
                        clearTimeout(openTimeout);
                        openTimeout = null;
                    }
                    if (openTimeout == null) {
                        var elm = this;

                        openTimeout = setTimeout(function() {
                            openMenu(elm);
                        }, 300);
                    }
                });
                $(".slide-menu-content").mouseleave(function() {

                });
            };
            initMenu();
        });
    }
})(jQuery);
