public void Build()
		{
			InitClientID.Value = this.ClientID;
			InitEnableEffects.Value = ((Master.DsiPage)Page).Url["Animate"].Exists ? "true" : "false";

			int musicTypeK = Prefs.Current["MusicPref"].IsNull ? 1 : (int)Prefs.Current["MusicPref"];

			EventPageStub data = new EventPageStub(ObjectType, ObjectK, TabType.Future, musicTypeK, 0, 0, null);

			EventSet es = Event.GetEventSetFromEventBoxKey(EventPageDetails.GetKeyStatic(data));

			EventPageDetails firstPage = new EventPageDetails(
				this.ClientID,
				es,
				data,
				false);

			
			firstPage.Selected = true;
			firstPage.Events[0].Selected = true;

			EventIconsHolder.Controls.Clear();
			EventIconsHolder.Controls.Add(new LiteralControl(firstPage.Html.ToHtml()));

			EventInfoHolderOuter.Controls.Clear();
			EventInfoHolderOuter.Controls.Add(new LiteralControl(firstPage.Events[0].Html.ToHtmlInfo()));

			InitFirstPage.Value = firstPage.Serialize();

		}
		public EventPageStub GetEventPage(string key)
		{
			//int rndK = new Random().Next(190000);
			//Query q = new Query();
			//q.QueryCondition = new And(
			//    new Q(Event.Columns.Pic, QueryOperator.IsNotNull, null),
			//    new Q(Event.Columns.Pic, QueryOperator.NotEqualTo, Guid.Empty),
			//    new Q(Event.Columns.K, QueryOperator.GreaterThan, rndK),
			//    new Q(Event.Columns.K, QueryOperator.LessThan, rndK + 1000)
			//);
			//q.OrderBy = new OrderBy(Event.Columns.UsrAttendCount, OrderBy.OrderDirection.Descending);
			//q.TopRecords = 8;
			//EventSet es = new EventSet(q);

			try
			{

				EventPageStub data = EventPageDetails.GetStubFromKey(key);

				int currentMusicPref = Prefs.Current["MusicPref"].Exists || Prefs.Current["MusicPref"].IsInt ? (int)Prefs.Current["MusicPref"] : 1;
				if (data.musicTypeK != currentMusicPref)
					Prefs.Current["MusicPref"] = data.musicTypeK;
				
				EventSet es = Event.GetEventSetFromEventBoxKey(key);

				data.requestedPageIndex = data.pageIndex;
				data.pageIndex = es.Paging.ReturnedPageIndex;

				EventPageDetails page = new EventPageDetails(
					"",
					es,
					data,
					false);

				return page.Data;
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public EventPageHtml(EventPageDetails details)
		{
			Details = details;
			HolderClientID = Details.ParentClientID + "_EventPage_" + Details.GetKey() + "_Holder";
		}
		/// <summary>
		/// Anything that affects the DOM goes in here.
		/// </summary>
		void initialise()
		{

			jQuery.Window.Bind("hashchange", Application_Navigate);
			
			//Application.Navigate += new HistoryEventHandler(Application_Navigate);
			
			#region Initialisation variables
			ClientID = View.InitClientID.Value;
			EnableEffects = bool.Parse(View.InitEnableEffects.Value);
			#endregion

			#region JQuery handles
			EventInfoHolderOuterJ = View.EventInfoHolderOuterJ;
			#endregion 

			View.EventIconsNavigationForwardHolderJ.Click(pageChangeForwardClick);
			View.EventIconsNavigationBackHolderJ.Click(pageChangeBackClick);
			View.MusicDropDownControl.View.DropDownJ.Change(musicChangeClick);
			View.PastEventsTabJ.Click(tabClickPast);
			View.FutureEventsTabJ.Click(tabClickFuture);
			View.TicketsTabJ.Click(tabClickTickets);
			
			#region Event data cache, and initialise first page from json data in the page
			EventPageCache = new Dictionary<object, object>();

			EventPageStub firstPageData = ((EventPageStub[])Script.Eval(" [ " + View.InitFirstPage.Value + " ] "))[0];
			EventPageDetails firstPage = new EventPageDetails(this, firstPageData, false);

			firstPage.Selected = true;
			firstPage.Html.InitialiseElements(true, false, false, true, true, false, true);
			for (int i = 0; i < firstPage.Events.Length; i++)
			{
				firstPage.Events[i].ChangeSelectedState(i == 0, false, "");
			}
			CurrentlySelectedEvent = firstPage.Events[0];
			#endregion
			
			EventPageCache[firstPage.GetKey()] = firstPage;
			
			#region Set initial page spec
			InitParentObjectType = firstPage.Data.parentObjectType;
			InitParentObjectK = firstPage.Data.parentObjectK;
			InitTabType = firstPage.Data.tabType;
			InitMusicTypeK = firstPage.Data.musicTypeK;
			InitPageIndex = firstPage.Data.pageIndex;
			#endregion

			#region Set initial and current page spec - this should be done by looking at the page hash state data...
			CurrentParentObjectType = InitParentObjectType;
			CurrentParentObjectK = InitParentObjectK;
			CurrentTabType = InitTabType;
			CurrentMusicTypeK = InitMusicTypeK;
			CurrentPageIndex = InitPageIndex;
			#endregion

			if (Misc.BrowserIsIE)
			{
				jQueryHistory.PushState(new Dictionary<object, object>());
				//Application.AddHistoryPoint(new Dictionary<object, object>());
			}

		}
		void updatePage(EventPageDetails newPage)
		{
			string key = newPage.GetKey();

			if (EventPageCache[key] != null)
			{
				EventPageDetails page = (EventPageDetails)EventPageCache[key];
				if (page.HasIncompleteEventData)
				{
					if (page.Selected)
						newPage.Selected = true;

					bool selectedEventIsOnThisPage = false;
					for (int i = 0; i < 8; i++)
					{
						if (page.Events[i].Selected)
						{
							newPage.Events[i].Selected = true;
							CurrentlySelectedEvent = newPage.Events[i];
							selectedEventIsOnThisPage = true;
						}
					}

					newPage.Html.InitialiseElements(true, false, false, true, false, false, true); // just initialise elements (from old html)
					newPage.Html.InitialiseElements(false, false, true, true, false, true, true);  // now refresh new contents html

					if (selectedEventIsOnThisPage)
					{
						//if (EnableEffects)
						//    PerformOrQueueAnimationTask(new Action[] { new Action(delegate() { CurrentlySelectedEvent.Html.ResizeInfoHolderAnimate(); }) }, "ResizeInfoHolderAnimate");
						//else
							CurrentlySelectedEvent.Html.ResizeInfoHolderImmediate();
					}
				}
				else
					return;
			}
			else
			{
				newPage.Html.InitialiseElements(true, true, false, true, true, false, true);
			}
			EventPageCache[key] = newPage;
		}
		public void gotEventPage(object o, EventArgs e)
		{
			if (o != null)
			{
				EventPageStub stub = (EventPageStub)o;
				{
					EventPageDetails newPage = new EventPageDetails(this, stub, false);

					updatePage(newPage);
				}

				if (stub.requestedPageIndex != stub.pageIndex)
				{
					//find requested page and mark it as empty...
					EventPageStub requestedStub = new EventPageStub(
						stub.parentObjectType,
						stub.parentObjectK,
						stub.tabType,
						stub.musicTypeK,
						stub.requestedPageIndex,
						stub.requestedPageIndex,
						null);
					EventPageDetails requestedPage = new EventPageDetails(this, requestedStub, false);

					updatePage(requestedPage);

				}

				


			}
		}
		void restorePageState(string key)
		{
			if (key == null)
			{
				EventPageDetails d = new EventPageDetails(this, new EventPageStub(InitParentObjectType, InitParentObjectK, InitTabType, InitMusicTypeK, InitPageIndex, InitPageIndex, null), false);
				key = d.GetKey();
			}

			#region Get the event page to the right place
			if (CurrentEventPage.GetKey() == key)
				return;

			CurrentEventPage.ChangeSelectedState(false, false, "");

			EventPageStub s = EventPageDetails.GetStubFromKey(key);

			CurrentParentObjectType = s.parentObjectType;
			CurrentParentObjectK = s.parentObjectK;
			CurrentMusicTypeK = s.musicTypeK;
			CurrentTabType = s.tabType;
			CurrentPageIndex = s.pageIndex;

			CurrentEventPage.ChangeSelectedState(true, false, "");

			ChangeEventNow(CurrentEventPage.Events[0], false, "");
			#endregion

			#region Set the music-type drop-down
			View.MusicDropDownControl.View.DropDown.Value = CurrentMusicTypeK.ToString();
			#endregion

			#region Set the future / past events tabs
			updateTabsUI();
			#endregion
		}