/** Static settings */
var input_init_val = "What product are you looking for?";

function buildExpanders(containerClass, headClass, bodyClass) {
    var exp = "." + containerClass;
    var head = "." + headClass;
    var body = "." + bodyClass;
    
    $(exp).each(
        function(i) {
            $(this).find(head).eq(0).bind("click", {b: $(this).find(body).eq(0)}, function (event) {
                var b = event.data.b;
                b.css("display").trim() == "none" ? b.slideDown(150) : b.slideUp(150);
            });
        }
    )
    
    $(head).css("cursor", "pointer")
}

/** Misc functions */
function confirm_delete_address() {
    return confirm("Are you sure you wish to delete this address entry?");
}

/**
 * Do a search
 */
function invoke_search() {
    var query = $("#search_input").val().trim();
    if (query != input_init_val && query.length > 0) {
        window.location = '/search/' + query;
    }
}

/**
 * Initialization of search input field special functionality
 */
function init_search_input() {
    var input = $("#search_input");

    var click_cb = function() {
        if (input.val() == input_init_val) {
            input.val('');
        } else {
            input.select();
        }
    }

    var blur_cb = function() {
        if (input.val().trim().length == 0) {
            input.val(input_init_val);
        }
    }

    input.click(click_cb);
    input.blur(blur_cb);
    input.enterpress(invoke_search);
    if (input.val().trim().length <= 0) {
        input.val(input_init_val);
    }
}

/**
 * Initialization of the search button
 */
function init_search_btn() {
    $("#tool_search_btn").click(invoke_search);
}

/**
 * Initialization of rollover imagery
 */
function init_rollovers() {
    var classes = [
        'sprite-nav_1',
        'sprite-nav_2',
        'sprite-nav_3',
        'sprite-nav_4',
        'sprite-nav_5',
        'sprite-nav_6',
        'sprite-nav_7',
        'sprite-tool_search_btn',
    ]

    var over_cb = function(event) {
        var data = event.data;
        $('.' + data.normal).removeClass(
            data.normal).addClass(data.hover);
    }
    var out_cb = function(event) {
        var data = event.data;
        $('.' + data.hover).removeClass(
            data.hover).addClass(data.normal);
    }

    for (var i in classes) {
        var c = classes[i];
        var elem = $("." + c);
        var data = { normal: c, hover: c + 'h' };

        elem.bind('mouseover', data, over_cb);
        elem.bind('mouseout', data, out_cb);
    }
}

var open_submenu = null;
var submenu_close_timeout = null;
var launch_submenu_delay_timeout = null;
function init_nav_submenu_buttons() {
    var anim_duration = 100; //ms
    var hover_launch_delay = 250; //ms
    var shop_button = $("#shop_menu_button");
    var resources_button = $("#resources_menu_button");
    var more_button = $("#more_menu_button");
    var menu_container = $('#nav_menu_dropdown_container');

    var handle_submenu_mouseover = function() {
        if (submenu_close_timeout != null) {
            clearTimeout(submenu_close_timeout);
            submenu_close_timeout = null;
        }
    }
    
    var close_menus = function(callback) {
        if (callback == undefined || !(callback instanceof Function)) {
            menu_container.slideUp(anim_duration);
        } else {
            menu_container.slideUp(anim_duration, callback);
        }
        open_submenu = null;
    }

    var handle_mouseover = function(event) {
        var menu = event.data.menu;

        var open_menu = function() {
            // menu open(ing); cancel launch delay timeout handle
            launch_submenu_delay_timeout = null;

            if (submenu_close_timeout != null) {
                clearTimeout(submenu_close_timeout);
                submenu_close_timeout = null;
            }
            if (open_submenu == menu) {
                return;
            }

            var open_new_menu = function() {
                var menu_elem = $('#' + menu).clone().removeClass('hidden');
                var content = $('#nav_menu_dropdown_content').empty();
                content.append(menu_elem);
                open_submenu = menu;
                menu_container.slideDown(anim_duration);
            }
            close_menus(open_new_menu);
        }
            
        // launch the submenu after a delay
        launch_submenu_delay_timeout = setTimeout(open_menu, 
            hover_launch_delay);
    }

    var handle_mouseout = function(event) {
        submenu_close_timeout = setTimeout(close_menus, 300);

        // cancel the submenu launch if still valid
        if (launch_submenu_delay_timeout != null) {
            clearTimeout(launch_submenu_delay_timeout);
            launch_submenu_delay_timeout = null;
        }
    }

    shop_button.bind('mouseenter', {menu:'shop_submenu'}, handle_mouseover);
    shop_button.bind('mouseleave', {menu:'shop_submenu'}, handle_mouseout);
    resources_button.bind('mouseenter', {menu:'resources_submenu'}, handle_mouseover);
    resources_button.bind('mouseleave', {menu:'resources_submenu'}, handle_mouseout);
    more_button.bind('mouseenter', {menu:'more_submenu'}, handle_mouseover);
    more_button.bind('mouseleave', {menu:'more_submenu'}, handle_mouseout);
    menu_container.bind('mouseenter', handle_submenu_mouseover);
    menu_container.bind('mouseleave', handle_mouseout);
}

/**
 * Page main function
 */
function page_main() {
    init_search_input();
    init_search_btn();
    init_rollovers();
    init_nav_submenu_buttons();
}

/** this call must come after all other init functions */
$(page_main);

