﻿var AjaxCssButton = new Class(
{
	initialize: function()
	{
		this.activeItems = {};
		this.groups = {};
		this.groupNames = [];

		ui.registerCleanupHandler(this.filterGroups);
	},

	filterGroups: function(rootElement)
	{
		var filteredGroups = {};
		var filteredGroupNames = [];

		for (var i = 0; i < ajaxCssButton.groupNames.length; i++)
		{
			var groupName = ajaxCssButton.groupNames[i];
			var group = ajaxCssButton.groups[groupName];
			var filteredGroup = [];

			for (var c = 0; c < group.length; c++)
			{
				var groupEl = group[c];
				if (!rootElement.hasChild(groupEl))
				{
					filteredGroup.push(groupEl);
				}
			}

			//			if (filteredGroup.length < group.length)
			//			{
			//				alert("Filtered " + (group.length - filteredGroup.length) + " elements");
			//			}

			if (filteredGroup.length > 0)
			{
				filteredGroups[groupName] = filteredGroup;
				filteredGroupNames.push(groupName);
			}
		}

		ajaxCssButton.groups = filteredGroups;
		ajaxCssButton.groupNames = filteredGroupNames;
	},

	onMouseEnter: function(isFollowUp)
	{
		if (this.retrieve("mouseOver") || this.retrieve("activated"))
		{
			return;
		}

		this.set("class", this.retrieve("hoverCss"));
		this.store("mouseOver", true);

		var group = ajaxCssButton.groups[this.retrieve("group")];

		if (group != null && this.retrieve("triggerMouseEnter"))
		{
			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("mouseenter");
			}
		}
	},

	onMouseLeave: function()
	{
		if (!this.retrieve("mouseOver") || this.retrieve("activated"))
		{
			return;
		}

		this.set("class", this.retrieve("normalCss"));
		this.store("mouseOver", false);

		var group = ajaxCssButton.groups[this.retrieve("group")];

		if (group != null && this.retrieve("triggerMouseLeave"))
		{
			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("mouseleave");
			}
		}
	},

	deactivate: function(cssButton, updateGroup)
	{
		cssButton.set("class", cssButton.retrieve("normalCss"));
		cssButton.store("activated", false);

		var groupName = cssButton.retrieve("group");

		if (updateGroup && groupName != '')
		{
			var group = ajaxCssButton.groups[groupName];

			for (var i = 0; i < group.length; i++)
			{
				group[i].fireEvent("deactivate", [group[i], false]);
			}
		}
	},

	activate: function(cssButton, updateGroup)
	{
		if (cssButton == null || cssButton.retrieve("activated"))
		{
			return;
		}

		var btnSection = cssButton.retrieve("section");

		if (updateGroup)
		{
			var lastActiveItem = ajaxCssButton.activeItems[btnSection];

			if (lastActiveItem != null)
			{
				lastActiveItem.fireEvent("deactivate", [lastActiveItem, true]);
			}
		}

		cssButton.set("class", cssButton.retrieve("activeCss"));
		cssButton.store("activated", true);

		if (updateGroup)
		{
			ajaxCssButton.activeItems[btnSection] = cssButton;

			var groupName = cssButton.retrieve("group");
			if (groupName != '')
			{
				var group = ajaxCssButton.groups[groupName];

				for (var i = 0; i < group.length; i++)
				{
					group[i].fireEvent("activate", [group[i], false]);
				}
			}
		}
	},

	onClick: function()
	{
		if (this.section != "")
		{
			ajaxCssButton.activate(this, true);
		}
	},

	initControl: function(dialogID, controlID, normalCss, hoverCss, activeCss, section, group, triggerMouseEnter, triggerMouseLeave)
	{
		var control = ui.getNestedControl(dialogID, controlID);

		if (control == null)
		{
			return;
		}

		if (group != '')
		{
			if (ajaxCssButton.groups[group] == null)
			{
				ajaxCssButton.groups[group] = [];
				ajaxCssButton.groupNames.push(group);
			}

			ajaxCssButton.groups[group].push(control);
		}

		control.store("normalCss", normalCss);
		control.store("hoverCss", hoverCss);
		control.store("activeCss", activeCss);
		control.store("section", section);
		control.store("group", group);
		control.store("triggerMouseEnter", triggerMouseEnter);
		control.store("triggerMouseLeave", triggerMouseLeave);
		control.store("mouseOver", false);
		control.store("activated", false);

		//		control["hoverCss"] = hoverCss;
		//		control["activeCss"] = activeCss;
		//		control["section"] = section;
		//		control["group"] = group;
		//		control["triggerMouseEnter"] = triggerMouseEnter;
		//		control["triggerMouseLeave"] = triggerMouseLeave;
		//		control["mouseOver"] = false;
		//		control["activated"] = false;

		control.addEvent('mouseenter', ajaxCssButton.onMouseEnter);
		control.addEvent('mouseleave', ajaxCssButton.onMouseLeave);
		control.addEvent('activate', ajaxCssButton.activate);
		control.addEvent('deactivate', ajaxCssButton.deactivate);
		control.addEvent('click', ajaxCssButton.onClick);
	}
});

var ajaxCssButton = new AjaxCssButton();