// start enclosure
(function($) {
	// define public function to create pcMenu
	$.fn.pcMenu = function(options, listMasterId, listName, JSONmenuList) {
		// "global" vars
		var settings = $.extend({}, $.fn.pcMenu.defaultSettings, options);
		var menuList = [];
		pcTimeouts = [];
		customId = '';
		MenuItem = function() {
			this.id = 0;
			this.link = "";
			this.title = "";
			this.image = "";
			this.masterid = 0;
			this.indent = 0;
		};
		// support functions
		
		function generateMenuList(divName, masterItem, indent) {
			var masterId = 0;
			var lastId = 0;
			if (typeof(indent) == "undefined") indent = 0;
			var newIndent = indent;
			divName.children().each(function() { 
				if ($(this).get(0).tagName == "LI") {
					// if this is a LI item then add to array
					obj = new MenuItem();
					obj.indent = indent;
					// set menuitem properties
					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;
					// add menuitem to array
					menuList.push(obj); 
					if (newIndent == indent) newIndent++;
				}
				// iterate also trough children
				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;
		};
		// retreive Direction for submenu level
		function getLevelDirection(menuItem) {
			var level = menuItem.indent+1;
			var direction = settings.showSubmenusFloatLevels['level'+level];
			if (direction === undefined) {
				direction = settings.showSubmenusFloatLevels.defaultDir;
			}
			return (direction);	
		};
		// retreive Arrow level visibility
		function showSubmenusArrowsLevel(menuItem) {
			var level = menuItem.indent+1;
			var show = settings.showSubmenusArrowsLevels['level'+level];
			if (show === undefined) {
				show = settings.showSubmenusArrowsLevels.defaultShow;
			}
			return (show);	
		};
		// return item from menu by it's id
		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) {
			// change classes
			$(menuItemObj).removeClass(settings.cssClassPrefix+'menu_item_over'); 
			$(menuItemObj).addClass(settings.cssClassPrefix+'menu_item_out');
			// selected menu item
			var menuItem = $(menuItemObj);
			var menuItemId = String(menuItem.attr('id'));
			// get menu item ID / page ID
			menuItemId = menuItemId.substr(8);
			// if event fired on item over and menus should not be closed exit
			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) {
			// change classes
			$(menuItemObj).removeClass(settings.cssClassPrefix+'menu_item_out'); 
			$(menuItemObj).addClass(settings.cssClassPrefix+'menu_item_over');
			// selected menu item
			var menuItem = $(menuItemObj);
			var menuItemId = String(menuItem.attr('id'));
			// get menu item ID / page ID
			menuItemId = menuItemId.substr(8);
			if (getMenuItemById(menuItemId).masterid !== 0 && settings.showSubmenusOnHover && settings.showSubmenus) {
				keepMasterMenusOpen(getMenuItemById(menuItemId));
			}
			// if event fired on item over and menus should not be opened exit
			if (isHover && !settings.showSubmenusOnHover) { return; }
			// check if has subitems
			if (hasSubItems(menuList, menuItemId) && settings.showSubmenus) {
				// open submenu
				if (settings.showSubmenusFloat) {
					var pos = $('#menuItem'+menuItemId).offset();  
					var width = $('#menuItem'+menuItemId).width();
					var height = $('#menuItem'+menuItemId).height();
					// get level
					if (getLevelDirection(getMenuItemById(menuItemId))=='down') {
						// down
						$('#menuSub'+menuItemId).css( { "left": (pos.left) + "px", "top":(pos.top+height) + "px", "z-index":999, "position":'absolute' } );
					} else
					if (getLevelDirection(getMenuItemById(menuItemId))=='right') {
						// right
						$('#menuSub'+menuItemId).css( { "left": (pos.left+width) + "px", "top":(pos.top) + "px", "z-index":999, "position":'absolute' } );
					} else
					if (getLevelDirection(getMenuItemById(menuItemId))=='left') {
						// 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() {
					// set cookies with clicked submenu item
					$.cookie('menuSub'+menuItemId, $('#menuSub'+menuItemId).is(':visible'));
					$.cookie('menuSub', menuItemId);
					// check if clicked item is now visible and set appropriate bullet
					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) {
			// selected menu item
			var menuItem = $(menuItemObj);
			var menuItemId = String(menuItem.attr('id'));
			// get menu item ID / page ID
			menuItemId = menuItemId.substr(8);
			// check if has subitems
			if (hasSubItems(menuList, menuItemId) && settings.showSubmenus) {
				// call openMenuItem because it has subitems and that function handles showing of menus
				if ($('#menuSub'+menuItemId).is(':visible')) {
					closeMenuItem(menuItemObj, settings.showSubmenusOnHover);
				} else {
					openMenuItem(menuItemObj, settings.showSubmenusOnHover);
					if (settings.openSubmenuLink) {
						// set cookie with menu ID
						$.cookie('menu_id', menuItemId);
						// open new page
						if (getMenuItemById(menuItemId).link === undefined) {
							parent.window.location.href=('?page='+menuItemId);
						} else {
							parent.window.location.href=(getMenuItemById(menuItemId).link);
						}
					}
				}
			} else {
				// set cookie with menu ID
				$.cookie('menu_id', menuItemId);
				// open new page
				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) {
				$('#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) {// && menuList[i+1].masterid === 0) {
						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');
						} else
						if (pageId == menuList[i].id) {
							$('#menuItem'+menuList[i].id).addClass(settings.cssClassPrefix+'menu_item_selected');
						}
					}
					// append class if has subitems
					if (settings.showSubmenus && hasSubItems(menuList, menuList[i].id)) { 
						// add submenu div
						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>');
						}
						// set submenu visible or not
						if (settings.openSubLast && $.cookie('menuSub') == menuList[i].id) {
							$('#menuSub'+menuList[i].id).css('display', 'block');
							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'); 
							}
						}
						// add submenu items
						if (settings.showSubmenus) { generateMenu($('#menuSub'+menuList[i].id), menuList[i].id); }
					}
					// set click event
					$('#menuItem'+menuList[i].id).click( function () { clickMenuItem(this, false); } );
					// set hover event
					$('#menuItem'+menuList[i].id).hover(
						(function () { openMenuItem(this, true); }),
						(function () { closeMenuItem(this, true); })
					);
				}
			}		
		};

		/////////////////////////////////////////////////////////////////////
		/// run run run
		/////////////////////////////////////////////////////////////////////
		return this.each(function() {
			$this = $(this);
			/////////////////////////////////////////////////////////////////
			// this part is for backward compatibility only
			/////////////////////////////////////////////////////////////////
			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
			/////////////////////////////////////////////////////////////////
			// this is the regular part
			/////////////////////////////////////////////////////////////////
			// generate menuitem list
			if (listName) {
				generateMenuList($('#'+listName), listMasterId);
			} else {
				generateMenuList($('#'+this.id), listMasterId);
			}
			// go trough menu list and create menu
			generateMenu($(this), listMasterId, menuList, settings);
		});
	};
	// define default settings
	$.fn.pcMenu.defaultSettings = {
		openSubLast: true, // true - open last opened submenu
		openSubAll: false, // true - expand all submenus
		showSelected: true, // true - show different style for selected items
		showSubmenus: true, // true - enable show/hide of submenus
		showSubmenusOnHover: false, // true - show submenu on hover on item not on click
		showSubmenusFloat: false, // true - submenus should float
		showSubmenusFloatLevels: {defaultDir: 'right', level1: 'down'}, // default direction for opening submenu and sublevels
		showSubmenusArrows: true, // true - show arrows for submenus
		showSubmenusArrowsLevels: {defaultShow: true, level1: false}, // true-false
		openSubmenuLink: false, // true - on click of main submenu open link; default is false as it should only open the submenu not the page under the clicked item
		cssClassPrefix: ''
	};
// end of enclosure
})(jQuery);
