﻿var UNIQUE_PREFIX = "aj_";

var GLOBAL_AJAX_MENU = null;
var GLOBAL_AJAX_MENUITEM_MANAGER = null;
var GLOBAL_AJAX_MANAGER = null; 
var GLOBAL_AJAX_MANAGER_BASEADDRESS = "http://all-inclusivevacations.com/";

var MENU_SERVICE_URL = "menu_service.php";
var MENU_HIDE_TIMEOUT = 1000;
var MENU_MAX_LEVEL = 8;
var MENU_LOADING_MENUITEM = "<li class='loading'>Loading... <img src=\""+GLOBAL_AJAX_MANAGER_BASEADDRESS+"image/loading.gif\" /></li>";

function AJAX_Manager(BaseAddress) {
    var that = this;
    that.baseAddress = BaseAddress;

    return {
        GetChildMenuItems: function (ParentID, SucessHandler, ErrorHandler) {
            $.ajax({
                url: that.baseAddress + MENU_SERVICE_URL,
                data: "parent=" + ParentID,
                dataType : "json",
                success: SucessHandler,
                error: ErrorHandler
            });
        }
    };
}

function AJAX_Menu(ContainerID) {

    var that = this;
    that.containerID = ContainerID;

    that.menu = null;

    return {
        // --
        Initialize: function () {
            this.CreateMenu();
            GLOBAL_AJAX_MANAGER.GetChildMenuItems(0, this.CreateMenuItems, this.HandleLookupError);
        },
        Menu: function () {
            return that.menu;
        },
        CreateMenu: function () {
            $('#' + that.containerID).html("<ul id='" + UNIQUE_PREFIX + "ajax_menu' class='level0'>"+MENU_LOADING_MENUITEM+"</ul>");

            that.menu = $('#' + UNIQUE_PREFIX + "ajax_menu");
        },
        CreateMenuItems: function (data, textStatus) {
            var menuItemText = "";
            var x = 0;
            for (x = 0; x < data.menuitems.length; x++) {
                var item = data.menuitems[x];
                menuItemText += "<li id='" + UNIQUE_PREFIX + "ajax_menuitem" + item.id + "' class='level0'>" +
                                (item.link.length > 0 ? "<a href='" + item.link + "'>" : "") +
                                "<img class=\"aj_ajax_menu_image\" src=\""+GLOBAL_AJAX_MANAGER_BASEADDRESS+"image/menu/" + item.text.replace('\'', '').replace(' ', '').toLowerCase() + ".jpg\" border=\"0\"/>" +
                                (item.link.length > 0 ? "</a>" : "") +
                                "</li>";
            }

            that.menu.html(menuItemText);

            for (x = 0; x < data.menuitems.length; x++) {
                var item = data.menuitems[x];
                if (item.hasSubMenu == 1) {

                    $('#' + UNIQUE_PREFIX + "ajax_menuitem" + item.id)
                    .data("id", item.id)
                    .data("text", item.text)
                    .data("link", item.link)
                    .data("level", 0)
                    .hover(
                    function () {
                        clearSubMenuTimer();

                        var current = $(this);

                        var stored_MenuItem = GLOBAL_AJAX_MENUITEM_MANAGER.Get(current.data("id"));
                        if (stored_MenuItem) {
                            stored_MenuItem.OnMouseOver();
                        }
                        else {
                            var ajax_MenuItem = new AJAX_MenuItem(current.data("id"), current.data("text"), current.data("link"), current.data("level"), 1);
                            ajax_MenuItem.OnMouseOver();

                            GLOBAL_AJAX_MENUITEM_MANAGER.Add(ajax_MenuItem);
                        }
                    },
                    function () {
                        setSubMenuTimer($(this).data("level"));
                    });
                } else {
                    $('#' + UNIQUE_PREFIX + "ajax_menuitem" + item.id)
                    .hover(function () { clearAllMenuTimer(); }, function () { setAllMenuTimer(); });
                }
            }
        },
        CloseSubMenusAboveLevel : function (Level) {
            for (x = MENU_MAX_LEVEL; x > Level; x--)
                that.menu.find('ul.level' + x).hide();
        },
        HandleLookupError: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("error:" + textStatus + errorThrown);
        }
    };
}

function AJAX_MenuItem(ID, Text, Link, Level, HasSubMenu) {

    var that = this;
    that.id = ID;
    that.text = Text;
    that.link = Link;
    that.level = Level;
    that.hasSubMenu = HasSubMenu;

    that.subMenu = null;

    return {
        ID: function () {
            return that.id;
        },
        // --
        OnMouseOver: function (e) {
            if (that.hasSubMenu) {
                if (!that.subMenu) {
                    this.CreateSubMenu();
                    GLOBAL_AJAX_MANAGER.GetChildMenuItems(that.id, this.CreateSubMenuItems, this.HandleLookupError);
                } else {
                    GLOBAL_AJAX_MENU.CloseSubMenusAboveLevel(that.level);
                    that.subMenu.show();
                }
            }
        },
        //-- 
        OnMouseOut: function () {

        },
        CreateSubMenu: function () {
            var item = $('#' + UNIQUE_PREFIX + "ajax_menuitem" + that.id);
            //item.html(item.html() + "<ul id='" + UNIQUE_PREFIX + "ajax_menu" + that.id + "' class='level" + (that.level + 1) + "'></ul>");
            item.append("<ul id='" + UNIQUE_PREFIX + "ajax_menu" + that.id + "' class='level" + (that.level + 1) + "'>" + MENU_LOADING_MENUITEM + "</ul>");

            that.subMenu = $("#" + UNIQUE_PREFIX + "ajax_menu" + that.id);

            GLOBAL_AJAX_MENU.CloseSubMenusAboveLevel(that.level);
            that.subMenu.show();
        },
        CreateSubMenuItems: function (data, textStatus) {
            var menuItemText = "";
            var x = 0;
            for (x = 0; x < data.menuitems.length; x++) {
                var item = data.menuitems[x];
                menuItemText += "<li id='" + UNIQUE_PREFIX + "ajax_menuitem" + item.id + "' class='level" + (that.level + 1) + "'>" +
                                (item.link.length > 0 ? "<a href='" + item.link + "'>" : "") +
                                item.text +
                                (item.link.length > 0 ? "</a>" : "") +
                                "</li>";
            }

            that.subMenu.html(menuItemText);

            for (x = 0; x < data.menuitems.length; x++) {
                var item = data.menuitems[x];
                if (item.hasSubMenu == 1) {

                    $('#' + UNIQUE_PREFIX + "ajax_menuitem" + item.id /*+ ", #" + UNIQUE_PREFIX + "ajax_menuitem" + item.id + " > a"*/)
                    .data("id", item.id)
                    .data("text", item.text)
                    .data("link", item.link)
                    .data("level", (that.level + 1))
                    .hover(function () {
                        clearSubMenuTimer();

                        var current = $(this);

                        var stored_MenuItem = GLOBAL_AJAX_MENUITEM_MANAGER.Get(current.data("id"));
                        if (stored_MenuItem) {
                            stored_MenuItem.OnMouseOver();
                        }
                        else {
                            var ajax_MenuItem = new AJAX_MenuItem(current.data("id"), current.data("text"), current.data("link"), current.data("level"), 1);
                            ajax_MenuItem.OnMouseOver();

                            GLOBAL_AJAX_MENUITEM_MANAGER.Add(ajax_MenuItem);
                        }
                    },
                    function () {
                        setSubMenuTimer($(this).data("level"));
                    });
                }
                else {
                    $('#' + UNIQUE_PREFIX + "ajax_menuitem" + item.id)
                    .hover(
                    function () {
                        clearAllMenuTimer();
                    },
                    function () {
                        setAllMenuTimer();
                    });
                }
            }
        },
        HandleLookupError: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("error:" + textStatus + errorThrown);
        }
    };
}


function AJAX_MenuItem_Manager() {

    var that = this;
    that.MenuItemArray = new Array();

    return {
        Length: function () {
            return that.MenuItemArray.length;
        },
        //ADDS A MENU ITEM
        Add: function (MenuItem) {
            that.MenuItemArray[that.MenuItemArray.length] = MenuItem;
        },
        //GET A MENU ITEM
        Get: function (MenuItemID) {
            var x = 0;
            for (x = 0; x < that.MenuItemArray.length; x++) {
                if (that.MenuItemArray[x].ID() == MenuItemID) {
                    return that.MenuItemArray[x];
                }
            }
            return null;
        },
        //GET A MENU ITEM AT A SPECIFIC POSITION
        GetAt: function (index) {
            return that.MenuItemArray[index];
        }  
    };
}

//----------------------------------------------------------------
// TIMERS FOR MANAGING USER INTERACTION
var allMenuTimer;
var subMenuTimer;

function clearAllMenuTimer() {
    if (allMenuTimer) clearTimeout(allMenuTimer);
}
function setAllMenuTimer() {
    clearAllMenuTimer();
    allMenuTimer = setTimeout('GLOBAL_AJAX_MENU.CloseSubMenusAboveLevel(0)', MENU_HIDE_TIMEOUT);
}

function clearSubMenuTimer() {
    if (allMenuTimer) clearTimeout(allMenuTimer);
    if (subMenuTimer) clearTimeout(subMenuTimer);
}
function setSubMenuTimer(Level) {
    clearSubMenuTimer();
    setAllMenuTimer();
    subMenuTimer = setTimeout('GLOBAL_AJAX_MENU.CloseSubMenusAboveLevel(' + Level + ')', MENU_HIDE_TIMEOUT);
}
//----------------------------------------------------------------


$(document).ready(function () {
    GLOBAL_AJAX_MANAGER = new AJAX_Manager(GLOBAL_AJAX_MANAGER_BASEADDRESS);
    GLOBAL_AJAX_MENUITEM_MANAGER = new AJAX_MenuItem_Manager();
    GLOBAL_AJAX_MENU = new AJAX_Menu("ajax_menu_block_inner");
    GLOBAL_AJAX_MENU.Initialize();
});



//function AJAX_MenuTimers() {
//    var that = this;
//    return {
//        // --
//        OnMouseOver: function () {
//        },
//        //--
//        OnMouseOut: function () {
//        }
//    };
//}
