/*
 * big O Menu
 * Fat menu jQuery plugin
 *
 * by Oszkar Nagy
 *
 */

(function($){
$.fn.bigomenu = function(options) {

    // Take care of default options, create settings object with consolidated options
    var options_defaults = {
        baseClass: "bigomenu",
        menuClass: "menu",
        subMenuContainerClass: "sub-menu-container",
        subMenuClass: "sub-menu",
        menuItemClass: "menu-item",
        selectedClass: "selected"
    };
    // Save finalised settings
    var s = $.extend({}, options_defaults, options);

    // Get the main players
    var $nav = this; // Root element
    var $nav_items = $("."+s.menuClass+" > ."+s.menuItemClass); // Nav elements
    var $nav_sub = $("."+s.menuClass+" > .menu-item:has('."+s.subMenuClass+"')", $nav); // Nav elements with submenus

    // Add base class so that it can be skinned - also initially mark as closed
    $nav.addClass(s.baseClass).data("state", "closed");

    // Add helper classes to deal with depth, calculate real top menu width
    $nav_sub.each(function(){
        $(this).children("."+s.subMenuClass).addClass(s.subMenuContainerClass);
    });
    var nav_width = 0;
    $nav_items.each(function(i){
        nav_width += $(this).width();
        nav_width += parseInt($(this).css("padding-left"),10);
        nav_width += parseInt($(this).css("padding-right"),10);

        // Mark divider elements
        if (i !== ($nav_items.length - 1)) {
            $(this).addClass("nav-divider");
        }
    });

    // Fix tab focus, WP menu doesn't bother to do an href attrib on anchor by default????
    $(".menu > li > .nav-item-container a").each(function(index,element){
        if ($(element).attr("href") === undefined) {
            $(element).attr("href","javascript:;");
        }
    });

    // Add toggle handlers to elements with submenus
    $nav_sub.toggle(
        function(e){

            // Stop the event going further
            e.preventDefault();

            // Get main players
            var $selected_main_item = $(e.currentTarget);
            var $submenu_container = $selected_main_item.children("."+s.subMenuClass);
            var $submenus = $submenu_container.children("."+s.menuItemClass);

            // Mark sub menu container
            $submenu_container.addClass(s.subMenuContainerClass);

            // Close other open subnavs
            $("."+s.selectedClass, $nav).click();

            // Mark selected main item with a class
            $selected_main_item.addClass(s.selectedClass);

            // Mark first items in the submenu
            $submenus.each(function(index, element){
                var depthclass = ($("ul.sub-menu li", element).length > 0) ? "sub-menu-head-item-withchildren" : "";
                $("div:first",element).addClass("sub-menu-head-item "+depthclass);
            });

            // Calculate container top and left position
            var selected_main_item_pos = $selected_main_item.position();
            var nav_pos = $nav.position();
            var sc_pos_top = selected_main_item_pos.top + $selected_main_item.height() + (2 * parseInt($selected_main_item.css("padding-bottom"),10)) - 4;
            var sc_pos_left = nav_pos.left + parseInt($selected_main_item.css("padding-left"),10);

            // Set sub menu container position
            $submenu_container.css({
                "top": sc_pos_top+"px",
                "left": sc_pos_left+"px"
            });


            // Set sub menu container min width
            var $last_nav_element = $nav_sub.last();
            $submenu_container.css("min-width",nav_width+"px");

            // Set up click handlers
            $("a",$submenu_container).bind("click", function(e){
                window.location = $(e.currentTarget).attr("href");
            });

            // Show sub menu container
            $submenu_container.show();

            // Mark open state on container
            $nav.data("state","open");


        },
        function(e){

            // Stop the event going further
            e.preventDefault();

            // Get the main players
            var $selected_main_item = $(e.currentTarget);
            var $submenu_container = $selected_main_item.children("."+s.subMenuClass);

            // Remove selected mark
            $selected_main_item.removeClass(s.selectedClass);

            // Hide sub menu and remove selected mark
            $submenu_container.hide();

            // Mark closed state on container
            $nav.data("state","closed");

        }
    );

    // If container is hidden initially (to avoid jump) show it
    if ($nav.parent().css("display") === "none") {
        $nav.parent().show();
    }

    // Clicking inside a menu item but outside of the achnor element should still be interpreted as a valid click to the element's anchor
    $(".sub-menu .nav-item-container").click(function(e){

        var $element_link = $("a", $(this));
        var link_target = $element_link.attr("href") || "";
        if ($element_link.length > 0 && link_target !== "" && link_target !== "javascript:;") {
            window.location = link_target;
        }

    });

    // Clicking outside the menu should close it
    $(document).bind("click", function(e){

        if ($nav.data("state") === "open") {
            $("."+s.selectedClass, $nav).click();
        }

    });


}
})(jQuery);

