﻿/// <reference path="../src/jquery-1.4.1-vsdoc.js" />
/// <reference path="pc3_JavaScript.js" />

function ButtonGroup(groupName)
{
	var GroupName = groupName;

	var Buttons = [];

	this.Name = GroupName;

	this.getButtons = function () { return Buttons; };

	this.onPostInit = new EventHandle();

	this.init = function ()
	{
		Buttons = PC3.getObjectsOfGroupName(GroupName);
		this.onPostInit.init();
	};

	this.runFuncOnEach = function (Func, Exclusion)
	{
		if (isFunction(Func))
		{
			if (isArray(Exclusion))
			{
				for (var i = 0; i < Buttons.length; i++)
				{
					var ignore = false;
					for (var j = 0; j < Exclusion.length; j++)
					{
						if (Buttons[i].Name == Exclusion[j])
						{
							ignore = true;
							break;
						}
					}
					if (!ignore)
					{
						Func(Buttons[i]);
					}
				}
			}
			else
			{
				for (var i = 0; i < Buttons.length; i++)
				{

					if (Buttons[i].Name != Exclusion)
					{
						Func(Buttons[i]);
					}
				}
			}
		}
	};
	this.Select = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Select(); }, Exclusion);
	};
	this.UnSelect = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.UnSelect(); }, Exclusion);
	};
	this.Click = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Click(); }, Exclusion);
	};
	this.Hide = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Hide(); }, Exclusion);
	};
	this.Show = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Show(); }, Exclusion);
	};
	this.Activate = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Activate(); }, Exclusion);
	};
	this.DeActivate = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.DeActivate(); }, Exclusion);
	};
	this.Destroy = function (Exclusion)
	{
		this.runFuncOnEach(function (B) { B.Destroy(); Buttons = PC3.getObjectsOfGroupName(GroupName); }, Exclusion);
	};
}


function ToolButton(objectID, GroupName, Name, otherGroupsNameArray)
{
	var 
	Object = JQ,
	ObjectID = objectID,
	OtherGroupsNameArray = isArray(otherGroupsNameArray) ? otherGroupsNameArray : [],
	GroupObject = null;

	this.Visible = true;
	this.Accessible = true;
	this.Selected = false;
	this.hasBeenSelected = false;
	this.Name = Name;
	this.GroupName = GroupName;

	this.getObjectID = function () { return ObjectID; };
	this.getJQObject = function () { return Object; };
	this.getGroupObject = function () { return GroupObject; };
	this.getGroupArray = function () { return GroupObject.getButtons(); };

	this.onInitFunc = null;

	var initialised = false;

	this.onPreInitFunc = function () { };
	this.onReBindFunc = function () { };

	this.onPostInit = new EventHandle();

	this.Destroy = function ()
	{
		this.unbind();
		PC3.removeByName(this.Name);
	}

	this.unbind = function ()
	{
		Object = isString(ObjectID) ? $("#" + ObjectID) : Object;
		if (Object)
		{
			Object.unbind('click');
		}
	}

	this.rebind = function ()
	{
		var Self = this;

		this.unbind();

		Object.click(function () { Self.Click() });
		if (this.Selected)
		{
			Object.addClass("Selected");
		}
		else
		{
			Object.addClass("UnSelect");
		}

		if (this.Accessible)
		{
			Object.addClass("Activated");
		}
		else
		{
			Object.addClass("DeActivated");
		}

		if (this.Visible)
		{
			Object.show();
		}
		else
		{
			Object.hide();
		}

		this.onReBindFunc();
	};

	this.init = function ()
	{
		this.onPreInitFunc();

		if (ObjectID)
		{
			Object = isString(ObjectID) ? $("#" + ObjectID) : Object;
		}
		else
		{
			Object = JQ;
		}

		var groups = PC3.getObjectsOftype(ButtonGroup);
		this.OtherGroups = [];
		if (GroupName)
		{
			for (var i = 0; i < groups.length; i++)
			{
				if (groups[i].Name && groups[i].Name == GroupName)
				{
					GroupObject = groups[i];
					break;
				}
			}
			if (GroupObject == null)
			{
				GroupObject = new ButtonGroup(GroupName);
				PC3.postInit.add(GroupObject);
			}
		}
		if (isArray(otherGroupsNameArray))
		{
			this.OtherGroupsNames = otherGroupsNameArray;
			for (var j = 0; j < this.OtherGroupsNames.length; j++)
			{
				this.OtherGroups[j] = null;
				for (var i = 0; i < groups.length; i++)
				{
					if (groups[i].Name && groups[i].Name == this.OtherGroupsNames[j])
					{
						this.OtherGroups[j] = groups[i];
						break;
					}
				}
				if (this.OtherGroups[j] == null)
				{
					this.OtherGroups[j] = new ButtonGroup(this.OtherGroupsNames[j]);
					PC3.postInit.add(this.OtherGroups[j]);
				}
			}
		}
		var Self = this;
		if (ObjectID)
		{
			Object.click(function () { Self.Click() });
		}
		if (isFunction(this.onInitFunc)) this.onInitFunc();

		initialised = true;

		var 
		PreVisible = this.Visible,
		PreAccessible = this.Accessible,
		PreSelected = this.Selected;

		if (PreVisible == false) { this.Visible = true; this.Hide(); }
		if (PreAccessible == false) { this.Accessible = true; this.DeActivate(); }
		if (PreSelected == true) { this.Selected = false; this.Select(); }
		else { this.Selected = true; this.UnSelect(); }

		this.onPostInit.init();
	};

	var Events = true;
	this.TurnOnEvents = function () { Events = true; };
	this.TurnOffEvents = function () { Events = false; };

	var Extensions = true;
	this.TurnOnExtensions = function () { Extensions = true; };
	this.TurnOffExtensions = function () { Extensions = false; };

	this.onPostClickFunc = null;
	this.onClickFunc = null;
	this.onUnSelectFunc = null;
	this.onSelectFunc = null;

	this.onPostClick = new EventHandle();
	this.onClick = new EventHandle();
	this.onUnSelect = new EventHandle();
	this.onSelect = new EventHandle();

	this.Select = function (ActivateBool, ShowBool)
	{
		this.hasBeenSelected = true;
		if (!this.Selected)
		{
			this.Selected = true;
			if (initialised)
			{
				if (this.Options.OnSelectUnselectOtherGroups) { for (var i = 0; i < this.OtherGroups.length; i++) { this.OtherGroups[i].UnSelect(this.Name); } }
				if (this.Options.OnSelectUnselectAllInGroup && GroupObject !== null) { GroupObject.UnSelect(this.Name); }
				if (this.Options.OnSelectShow) { this.Show(); }

				if (ActivateBool) { this.Activate(); }
				if (ShowBool) { this.Show(); }

				Object.removeClass("UnSelect");
				Object.addClass("Selected");
				if (Extensions && isFunction(this.onSelectFunc)) this.onSelectFunc();
				if (Events) this.onSelect.init();
			}
		}
	};
	this.UnSelect = function ()
	{
		if (this.Selected)
		{
			this.Selected = false;

			if (initialised)
			{
				Object.removeClass("Selected");
				Object.addClass("UnSelect");
				if (Extensions && isFunction(this.onUnSelectFunc)) this.onUnSelectFunc();
				if (Events) this.onUnSelect.init();
			}
		}
	};

	this.Click = function ()
	{
		if (this.Accessible)
		{
			if (Extensions && isFunction(this.onClickFunc)) this.onClickFunc();
			if (Events) this.onClick.init();
			if (this.Selected == false && this.Options.OnClickAllowSelect)
			{
				this.Select();
			}
			else if (this.Options.OnClickAllowUnselect)
			{
				this.UnSelect();
			}
			if (Extensions && isFunction(this.onPostClickFunc)) this.onPostClickFunc();
			if (Events) this.onPostClick.init();
		}
	};

	this.onShowFunc = null;
	this.onHideFunc = null;

	this.onShow = new EventHandle();
	this.onHide = new EventHandle();

	this.Show = function (ActivateBool, SelectBool)
	{
		if (!this.Visible)
		{
			this.Visible = true;

			if (initialised)
			{

				if (ActivateBool || (this.Options.OnShowActivate && ActivateBool !== false)) { this.Activate(); }
				if (SelectBool || (this.Options.OnShowSelect && SelectBool !== false)) { var Self = this; setTimeout(function () { Self.Select(); }, 300); }

				Object.show();

				if (Extensions && isFunction(this.onShowFunc)) this.onShowFunc();
				if (Events) this.onShow.init();
			}
		}
	};
	this.Hide = function (DeactivateBool, UnSelectBool)
	{
		if (this.Visible)
		{
			this.Visible = false;

			if (initialised)
			{
				if (DeactivateBool || (this.Options.OnHideDeactivate && DeactivateBool !== false)) { this.DeActivate(); }
				if (UnSelectBool || (this.Options.OnHideUnselect && UnSelectBool !== false)) { this.UnSelect(); }

				Object.hide();

				if (Extensions && isFunction(this.onHideFunc)) this.onHideFunc();
				if (Events) this.onHide.init();
			}
		}
	};


	this.onActivateFunc = null;
	this.onDeActivateFunc = null;

	this.onActivate = new EventHandle();
	this.onDeActivate = new EventHandle();

	this.Activate = function (ShowBool, SelectBool)
	{
		if (!this.Accessible)
		{
			this.Accessible = true;

			if (initialised)
			{
				if (ShowBool || (this.Options.OnActivateShow && ShowBool !== false)) { this.Show(); }
				if (SelectBool || (this.Options.OnActivateSelect && SelectBool !== false)) { this.Select(); }
				this.Accessible = true;
				Object.removeClass("DeActivated");
				Object.addClass("Activated");
				if (Extensions && isFunction(this.onActivateFunc)) this.onActivateFunc();
				if (Events) this.onActivate.init();
			}
		}
	};
	this.DeActivate = function (HideBool, UnSelectBool)
	{
		if (this.Accessible)
		{
			this.Accessible = false;

			if (initialised)
			{
				if (HideBool || (this.Options.OnDeActivateHide && HideBool !== false)) { this.Hide(); }
				if (UnSelectBool || (this.Options.OnDeActivateUnselect && UnSelectBool !== false)) { this.UnSelect(); }
				Object.removeClass("Activated");
				Object.addClass("DeActivated");
				if (Extensions && isFunction(this.onDeActivateFunc)) this.onDeActivateFunc();
				if (Events) this.onDeActivate.init();
			}
		}
	};

	this.OtherGroupsNames = [];
	this.OtherGroups = [];

	this.Options = {
		OnShowSelect: false,
		OnShowActivate: true,

		OnActivateSelect: false,
		OnActivateShow: true,

		OnDeActivateUnselect: true,
		OnDeActivateHide: false,

		OnHideUnselect: true,
		OnHideDeactivate: true,

		OnSelectUnselectAllInGroup: true,
		OnSelectUnselectOtherGroups: true,
		OnSelectShow: false,
		OnSelectActivate: false,

		OnClickAllowSelect: true,
		OnClickAllowUnselect: true
	};
}
