(function ($) {
    $.fn.pcMenu = function (options, listMasterId, listName, JSONmenuList) {
			var settings = $.extend({}, $.fn.pcMenu.defaultSettings, options);
			var menuList = [];
			var obj;
			pcTimeouts = [];
			customId = '';
			MenuItem = function () {
				this.id = 0;
				this.link = "";
				this.title = "";
				this.image = "";
				this.masterid = 0;
				this.indent = 0;
			};

        function generateMenuList(divName, masterItem, indent) {
            var masterId = 0;
            var lastId = 0;
            if (typeof(indent) == "undefined") { indent = 0; masterItem = 0; }
            var newIndent = indent;
            divName.children().each(function () {
                if ($(this).get(0).tagName == "LI") {
                    obj = new MenuItem();
                    obj.indent = indent;
                    obj.id = $(this).attr('id');
                    if (!obj.id) {
                        obj.id = lastId + 1;
                        lastId++;
                    } else {
                        lastId = obj.id;
                    }
                    obj.link = $($(this).find("a")[0]).attr('href');
                    obj.title = $($(this).find("a")[0]).html();
                    if ($($(this).find("a")[0]).find("img").length) {
                        obj.image = $($($(this).find("a")[0]).find("img")[0]).attr('src');
                        obj.title = $($($(this).find("a")[0]).find("img")[0]).attr('title');
                        if (obj.title == "") {
                            obj.title = $($($(this).find("a")[0]).find("img")[0]).attr('alt');
                        }
                    }
                    obj.masterid = masterItem;
                    menuList.push(obj);
                    if (newIndent == indent) newIndent++;
                }
                if (typeof(obj) != "undefined") {
                    masterId = obj.id;
                }
                if ($(this).children().length) {
                    generateMenuList($(this), masterId, newIndent);
                }
            });
        };

        function hasSubItems(menuList, masterId) {
            for (var i = 0; i < menuList.length; i++) {
                if (menuList[i].masterid == masterId) {
                    return true;
                }
            }
            return false;
        };

        function getLevelDirection(menuItem) {
            var level = menuItem.indent + 1;
            var direction = settings.showSubmenusFloatLevels['level' + level];
            if (direction === undefined) {
                direction = settings.showSubmenusFloatLevels.defaultDir;
            }
            return (direction);
        };

        function showSubmenusArrowsLevel(menuItem) {
            var level = menuItem.indent + 1;
            var show = settings.showSubmenusArrowsLevels['level' + level];
            if (show === undefined) {
                show = settings.showSubmenusArrowsLevels.defaultShow;
            }
            return (show);
        };

        function getMenuItemById(menuItemId) {
            for (var i = 0; i < menuList.length; i++) {
                if (menuList[i].id == menuItemId) {
                    return menuList[i];
                }
            }
        };

        function keepMasterMenusOpen(menuItem) {
            if (pcTimeouts[menuItem.masterid] !== undefined) {
                clearTimeout(pcTimeouts[menuItem.masterid]);
            }
            if (getMenuItemById(menuItem.masterid).masterid !== 0) {
                keepMasterMenusOpen(getMenuItemById(menuItem.masterid));
            }
        };

        function closeMasterMenus(menuItem) {
            if ($('#menuSub' + menuItem.masterid).length) {
                pcTimeouts[menuItem.masterid] = setTimeout(function () {
                    $('#menuSub' + menuItem.masterid).hide("normal");
                }, 200);
                if (getMenuItemById(menuItem.masterid).masterid !== 0) {
                    closeMasterMenus(getMenuItemById(menuItem.masterid));
                }
            }
        };

        function closeMenuItem(menuItemObj, isHover) {
            $(menuItemObj).removeClass(settings.cssClassPrefix + 'menu_item_over');
            $(menuItemObj).addClass(settings.cssClassPrefix + 'menu_item_out');
            var menuItem = $(menuItemObj);
            var menuItemId = String(menuItem.attr('id'));
            menuItemId = menuItemId.substr(8);
            if (isHover && !settings.showSubmenusOnHover) {
                return;
            }
            if (isHover && (!settings.showSubmenusOnHover || !hasSubItems(menuList, menuItemId)) && !getMenuItemById(menuItemId).masterid) {
                return;
            }
            if ($('#menuSub' + menuItemId).length) {
                pcTimeouts[menuItemId] = setTimeout(function () {
                    $('#menuSub' + menuItemId).hide("normal");
                }, 200);
                if (isHover) {
                    closeMasterMenus(getMenuItemById(menuItemId));
                }
            } else {
                closeMasterMenus(getMenuItemById(menuItemId));
            }
        };

        function openMenuItem(menuItemObj, isHover) {
            $(menuItemObj).removeClass(settings.cssClassPrefix + 'menu_item_out');
            $(menuItemObj).addClass(settings.cssClassPrefix + 'menu_item_over');
            var menuItem = $(menuItemObj);
            var menuItemId = String(menuItem.attr('id'));
            menuItemId = menuItemId.substr(8);
            if (getMenuItemById(menuItemId).masterid !== 0 && settings.showSubmenusOnHover && settings.showSubmenus) {
                keepMasterMenusOpen(getMenuItemById(menuItemId));
            }
            if (isHover && !settings.showSubmenusOnHover) {
                return;
            }
            if (hasSubItems(menuList, menuItemId) && settings.showSubmenus) {
	            	$('#menuItem' + menuItemId).addClass(settings.cssClassPrefix+'menu_item_sub_open');
                if (settings.showSubmenusFloat) {
                    var pos = $('#menuItem' + menuItemId).offset();
                    var width = $('#menuItem' + menuItemId).width();
                    var height = $('#menuItem' + menuItemId).height();
                    if (getLevelDirection(getMenuItemById(menuItemId)) == 'down') {
                        $('#menuSub' + menuItemId).css({
                            "left": (pos.left) + "px",
                            "top": (pos.top + height) + "px",
                            "z-index": 999,
                            "position": 'absolute'
                        });
                    } else if (getLevelDirection(getMenuItemById(menuItemId)) == 'right') {
                        $('#menuSub' + menuItemId).css({
                            "left": (pos.left + width) + "px",
                            "top": (pos.top) + "px",
                            "z-index": 999,
                            "position": 'absolute'
                        });
                    } else if (getLevelDirection(getMenuItemById(menuItemId)) == 'left') {
                        $('#menuSub' + menuItemId).css({
                            "left": (pos.left - width) + "px",
                            "top": (pos.top) + "px",
                            "z-index": 999,
                            "position": 'absolute'
                        });
                    }
                }
                pcTimeouts[menuItemId] = setTimeout(function () {
                    $('#menuSub' + menuItemId).show("normal", function () {
                        $.cookie('menuSub' + menuItemId, $('#menuSub' + menuItemId).is(':visible'));
                        $.cookie('menuSub', menuItemId);
                        if ($('#menuSub' + menuItemId).is(':visible')) {
                            if (settings.showSubmenusArrows && showSubmenusArrowsLevel(getMenuItemById(menuItemId))) {
                                $('#menuItem' + menuItemId).removeClass(settings.cssClassPrefix + 'menu_subitems_right');
                                $('#menuItem' + menuItemId).addClass(settings.cssClassPrefix + 'menu_subitems_down');
                            }
                        } else {
                            if (settings.showSubmenusArrows && showSubmenusArrowsLevel(menuList[menuItemId])) {
                                $('#menuItem' + menuItemId).removeClass(settings.cssClassPrefix + 'menu_subitems_down');
                                $('#menuItem' + menuItemId).addClass(settings.cssClassPrefix + 'menu_subitems_right');
                            }
                        }
                    });
                }, 150);
            }
        };

        function clickMenuItem(menuItemObj) {
            var menuItem = $(menuItemObj);
            var menuItemId = String(menuItem.attr('id'));
            menuItemId = menuItemId.substr(8);
            if (hasSubItems(menuList, menuItemId) && settings.showSubmenus) {
	            	$('#menuItem' + menuItemId).removeClass(settings.cssClassPrefix+'menu_item_sub_open');
                if ($('#menuSub' + menuItemId).is(':visible')) {
                    closeMenuItem(menuItemObj, settings.showSubmenusOnHover);
                } else {
                    openMenuItem(menuItemObj, settings.showSubmenusOnHover);
                    if (settings.openSubmenuLink) {
                        $.cookie('menu_id', menuItemId);
                        $.cookie('menuSub' + menuItemId, true);
                        $.cookie('menuSub', menuItemId);
                        if (getMenuItemById(menuItemId).link === undefined) {
                            parent.window.location.href = ('?page=' + menuItemId);
                        } else {
                            parent.window.location.href = (getMenuItemById(menuItemId).link);
                        }
                    }
                }
            } else {
                $.cookie('menu_id', menuItemId);
                if (getMenuItemById(menuItemId).link === undefined) {
                    parent.window.location.href = ('?page=' + menuItemId);
                } else {
                    parent.window.location.href = (getMenuItemById(menuItemId).link);
                }
            }
        };

        function openTopMenus(menuItemId) {
            if ($('#menuSub' + menuItemId).length) {
                $('#menuItem' + menuItemId).addClass(settings.cssClassPrefix+'menu_item_sub_open');            
                $('#menuSub' + menuItemId).css('display', 'block');
                for (var i = 0; i < menuList.length; i++) {
                    if (menuList[i].id == menuItemId && menuList[i].masterid) openTopMenus(menuList[i].masterid);
                }
            }
        }

        function generateMenu(masterDiv, masterId) {
            if (masterId === null) {
                masterId = 0;
            }
            masterDiv.empty();
            if (masterId === 0) {
                masterDiv.addClass(settings.cssClassPrefix + 'menu');
                if ((pageId) && !settings.openSubAll) {
                    for (var j = 0; j < menuList.length; j++) {
                        if (menuList[j].id == (pageId) && menuList[j].masterid === 0) {
                            $.cookie('menuSub', '');
                            break;
                        }
                    }
                }
            }
            for (var i = 0; i < menuList.length; i++) {
                if (menuList[i].masterid == masterId || masterId == -1) {
                    if (menuList[i].image) {
                        masterDiv.append('<div class="' + settings.cssClassPrefix + 'menu_item_image" id="menuItem' + customId + menuList[i].id + '" pcmenu_masterid="' + masterId + '"><img src="' + menuList[i].image + '" alt="' + menuList[i].title + '" title="' + menuList[i].title + '"></div>');
                    } else {
                        masterDiv.append('<div class="' + settings.cssClassPrefix + 'menu_item ' + settings.cssClassPrefix + 'menu_item' + (menuList[i].indent) + '" id="menuItem' + customId + menuList[i].id + '" pcmenu_masterid="' + masterId + '">' + menuList[i].title + '</div>');
                    }
                    if (menuList[i + 1] !== undefined) {
                        masterDiv.append('<div class="' + settings.cssClassPrefix + 'menu_item_delimiter"><img src="/images/blank.gif" height="1" width="1"></div>');
                    }
                    if (settings.showSelected) {
                        if (pageId == "" && i === 0 && masterId === 0) {
                            $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_item_selected');
				                    if (settings.showSubmenus && settings.openLinkSubParent) {
                        			openTopMenus(menuList[i].masterid);
														}
                        } else if (pageId == menuList[i].id) {
                            $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_item_selected');
				                    if (settings.showSubmenus && settings.openLinkSubParent) {
                        			openTopMenus(menuList[i].masterid);
														}
                        }
                    }
                    if (settings.showSubmenus && hasSubItems(menuList, menuList[i].id)) {
                        if (settings.showSubmenusFloat) {
                            $('body').append('<div class="' + settings.cssClassPrefix + 'menu_submenu" id="menuSub' + customId + menuList[i].id + '" pcmenu_masterid="' + masterId + '"></div>');
                        } else {
                            masterDiv.append('<div class="' + settings.cssClassPrefix + 'menu_submenu" id="menuSub' + customId + menuList[i].id + '" pcmenu_masterid="' + masterId + '"></div>');
                        }
                        if (settings.openSubLast && ($.cookie('menuSub') == menuList[i].id || $.cookie('menuSub' + menuList[i].id) == 'true')) {
                            $('#menuSub' + menuList[i].id).css('display', 'block');
                            $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_item_sub_open');
                            if (settings.showSubmenusArrows && showSubmenusArrowsLevel(menuList[i])) {
                                $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_subitems_down');
                            }
                            openTopMenus(menuList[i].masterid);
/*                        } else if (settings.openSubAll && $.cookie('menuSub' + menuList[i].id) == 'true') {
                            $('#menuSub' + menuList[i].id).css('display', 'block');
                            if (settings.showSubmenusArrows && showSubmenusArrowsLevel(menuList[i])) {
                                $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_subitems_down');
                            }*/
                        } else {
                            $('#menuSub' + menuList[i].id).css('display', 'none');
                            if (settings.showSubmenusArrows && showSubmenusArrowsLevel(menuList[i])) {
                                $('#menuItem' + menuList[i].id).addClass(settings.cssClassPrefix + 'menu_subitems_right');
                            }
                        }
                        if (settings.showSubmenus) {
                            generateMenu($('#menuSub' + menuList[i].id), menuList[i].id);
                        }
                    }
                    $('#menuItem' + menuList[i].id).click(function () {
                        clickMenuItem(this, false);
                    });
                    $('#menuItem' + menuList[i].id).hover((function () {
                        openMenuItem(this, true);
                    }), (function () {
                        closeMenuItem(this, true);
                    }));
                }
            }
        };
        return this.each(function () {
            $this = $(this);
            /*if (typeof(obj) != "undefined") delete obj;*/
            if (typeof(JSONmenuList) != "undefined" && JSONmenuList.length) {
                menuList = JSONmenuList;
                for (var i = 0; i < menuList.length; i++) {
                    if (typeof(menuList[i].link) == "undefined") {
                        menuList[i].link = '?page=' + menuList[i].ID;
                        menuList[i].id = menuList[i].ID;
                    }
                }
            } else if (listName) {
                generateMenuList($('#' + listName), 0); /* listMasterId); */
            } else {
                generateMenuList($('#' + this.id), 0); /* listMasterId); */
            }
            generateMenu($(this), listMasterId, menuList, settings);
        });
    };
    $.fn.pcMenu.defaultSettings = {
        openSubLast: true,
        openSubAll: false,
        openLinkSubParent: true,
        showSelected: true,
        showSubmenus: true,
        showSubmenusOnHover: false,
        showSubmenusFloat: false,
        showSubmenusFloatLevels: {
            defaultDir: 'right',
            level1: 'down'
        }, showSubmenusArrows: true,
        showSubmenusArrowsLevels: {
            defaultShow: true,
            level1: false
        }, openSubmenuLink: false,
        cssClassPrefix: ''
    };
})(jQuery);
