﻿// Fusion Javascript Library 
// (c) Webfuel

if (typeof (Fsn) == 'undefined') Fsn = {};

Fsn.Menu = function(settings, my) {
	my = my || {};
	settings = settings || {};
	settings.isModal = true;
	settings.modalOptions = { opacity: 0.0, onClick: function() { IMenu.hide(); } };
	var IMenu = Fsn.Control(settings, my);

	$.extend(my, {
		items: Fsn.List(),
		parent: my.parent || null,
		root: my.root || null,
		title: null,

		// Presentation / Behaviour
		icon: settings.icon || "",
		text: settings.text || "",
		navigateURL: settings.navigateURL || null,
		onClick: settings.onClick || null,
		isDivider: settings.isDivider === true,
		isChecked: settings.isChecked === true,
		isCheckable: settings.isCheckable === true
	});
	my.accessors.get_depth = function() {
		var depth = 1;
		var parent = my.parent;
		while (parent != null) {
			parent = parent.get('parent');
			depth++;
		}
		return depth;
	};
	my.addGetters("items;parent;root;depth;title;");
	my.addSetters("text;icon;isChecked;isCheckable;isDivider");

	$.extend(IMenu, {
		refresh: function() {
			if (!my.title) return;
			$(".iconbar > span > span", my.title).removeClass().addClass("ui-icon").addClass("ui-icon-" + my.icon);
			$(".text", my.title).html(my.text);
			my.title[my.isChecked ? "addClass" : "removeClass"]('checked')[my.isEnabled ? "removeClass" : "addClass"]('dis')[my.isDivider ? "addClass" : "removeClass"]('div');
			$(".submenubar > span", my.title)[my.items.length() > 0 ? "addClass" : "removeClass"]('ui-icon-menumore');
		},
		hideItems: function(except) {
			for (var i = 0; i < my.items.length(); i++) {
				if (my.items.itemAt(i) == except) continue;
				my.items.itemAt(i).hide();
			}
		}
	});
	$.extend(IMenu, {
		hide: function() {
			if (!my.isVisible) return;
			IMenu.hideItems();
			IMenu._hide();
		},
		show: function(options) {
			if (!my.element) return;
			my.element.css('zIndex', 10000 + IMenu.get('depth'));
			if (options) {
				IMenu._show(options);
			} else {
				var target = $(".submenubar", my.title);
				var position = target.offset();
				IMenu._show({ left: position.left + target.width() - $(window).scrollLeft(), top: position.top - $(window).scrollTop() });
			}
		}
	});


	// Create out title (assuming we have a parent) : TODO: Make this a function?
	if (my.parent) {
		if (!settings.isDivider) {
			my.title = $("<tr class='fui-menuitem'><td class='iconbar'><span><span class='ui-icon ui-icon-check'></span></span></td><td class='text'></td><td class='submenubar'><span style='display:block' class='ui-icon'></span></td></tr>");
		} else {
			my.title = $("<tr class='fui-menuitem'><td class='iconbar'></td><td class='text'></td><td class='submenubar'></td></tr>");
		}
		// Element behaviour
		if (my.navigateURL) {
			my.title.click(function() { if (!my.isEnabled) return; $PageManager.redirectTo(my.navigateURL); });
		} else if (my.onClick) {
			my.title.click(function() { if (!my.isEnabled) return; if (my.root) my.root.hide(); my.onClick(); });
		}

		if (my.isCheckable) {
			my.title.click(function() { if (!my.isEnabled) return; IMenu.set('isChecked', !my.isChecked); if (my.root) my.root.hide(); IMenu.refresh(); });
		}
		$(".submenubar", my.title).mouseover(function() { if (!my.isEnabled) return; IMenu.show(); });
		$(my.title).mouseover(function() { if (my.parent) my.parent.hideItems(IMenu); });
	}

	// Bind to items event handlers
	my.items.addEventHandler('insertedItem', function(sender, event) {
		if (!my.element) {
			my.element = $("<div></div>").hide().prependTo($("body"));
			my.element.addClass("fui-menu");
			my.contentTable = $("<table></table>").appendTo(my.element);
		}
		// Render the item within our element
		event.item.get('title').appendTo(my.contentTable);
	});

	// Process items from settings
	if (settings.items) {
		for (var i = 0; i < settings.items.length; i++) {
			my.items.insert(Fsn.Menu(settings.items[i], { parent: IMenu, root: my.root || IMenu }));
		}
	}
	IMenu.refresh();
	return IMenu;
};

Fsn.MenuBar = function(settings, my) {
	my = my || {};
	settings = settings || {};
	var IMenuBar = Fsn.Control(settings, my);

	$.extend(my, {
		items: Fsn.List(),
		rightAlign: settings.rightAlign === true
	});
	my.addGetters("items");

	$.extend(IMenuBar, {
		hideItems: function(except) {
			for (var i = 0; i < my.items.length(); i++) {
				if (my.items.itemAt(i) == except) continue;
				my.items.itemAt(i).hide();
			}
		}
	});

	my.element.addClass("fui-menubar");

	// Bind to items event handlers
	my.items.addEventHandler('insertedItem', function(sender, event) {
		// Render the item within our element
		var menuItem = event.item;
		var menuTitle = $("<span><span>" + menuItem.get('text') + "</span>" + (menuItem.get('icon') ? "&nbsp;<span class='ui-icon ui-icon-" + menuItem.get('icon') + "'></span>" : "") + "</span>");
		menuTitle.mouseup(function() {
			var position = menuTitle.offset();
			var menuElement = menuItem.get('element');
			if (my.rightAlign)
				menuItem.show({ left: position.left - $(window).scrollLeft() + menuTitle.outerWidth() - menuElement.outerWidth(), top: position.top + menuTitle.outerHeight() - $(window).scrollTop() })
			else
				menuItem.show({ left: position.left - $(window).scrollLeft() + 3, top: position.top + menuTitle.outerHeight() - $(window).scrollTop() })
		});
		menuTitle.appendTo(my.element);
	});

	// Process items from settings
	if (settings.items) {
		for (var i = 0; i < settings.items.length; i++) {
			my.items.insert(Fsn.Menu(settings.items[i], { parent: null, root: null }));
		}
	}
	//IMenuBar.refresh();
	return IMenuBar;
};
