var g_oCounters = g_oCounters || 0;

if (g_oCounters == 0)
{
	g_oCounters = {

		Events		: [],
		Counters	: [],
		Switchers	: [],
		PerDays		: [],
		Words		: [],
		CheatTime	: 0,
		
		SetCheat :
			function (Amount)
			{
				CheatTime = Amount;
			},
		
		SetWords :
			function (newWords)
			{
				for (attr in newWords)
				{
					this.Words[attr] = newWords[attr];
				}
			},
		
		AddObject	:
			function (HTMLObject)
			{
				switch (HTMLObject.getAttribute("data-counter-type"))
				{
					case 'counter':
					{
						this.AddCounter(HTMLObject);
						break;
					};
					case 'switcher':
					{
						this.AddSwitcher(HTMLObject);
						break;
					};
					case 'perday':
					{
						this.AddPerDay(HTMLObject);
						break;
					};
				}
			},
		
		RemoveObject	:
			function (HTMLObject)
			{			
				switch (HTMLObject.getAttribute("data-counter-type"))
				{
					case 'counter':
					{
						this.RemoveCounter(HTMLObject);
						break;
					};
					case 'switcher':
					{
						this.RemoveSwitcher(HTMLObject);
						break;
					};
				}
			},
			
		AddCounter :
			function (HTMLObject)
			{
				var Counter = new Object();
				
				Counter["Object"]	= HTMLObject;
				Counter["Event"]	= this.FindEvent(Counter["Object"].getAttribute("data-counter-event"));
				
				function FindIndex(String, Type)
				{
					var Depth = 0;
					for (i = 0; i < String.length; i++)
					{
						if (String[i] == '<')
						{
							Depth += 1;
							continue;
						}
						if (String[i] == '>')
						{
							Depth -= 1;
							continue;
						}
						if (Depth > 0)
						{
							continue;
						}
						
						return i;
					}
				}
				
				var tmp = Counter["Object"].children[0].innerHTML;
				var idx = FindIndex(tmp, 'a');
				Counter["Prefixa"] = tmp.substring(tmp, idx);
				Counter["Postfixa"] = tmp.substring(idx+1);
				
				var tmp = Counter["Object"].children[1].innerHTML;
				var idx = FindIndex(tmp, 'A');
				Counter["PrefixA"] = tmp.substring(tmp, idx);
				Counter["PostfixA"] = tmp.substring(idx+1);
				
				var tmp = Counter["Object"].children[2].innerHTML;
				var idx = FindIndex(tmp, '0');
				Counter["Prefix0"] = tmp.substring(tmp, idx);
				Counter["Postfix0"] = tmp.substring(idx+1);
				
				this.Counters.push(Counter);
				
				this.UpdateCounter(Counter);
			},
			
		RemoveCounter :
			function (HTMLObject)
			{
				for (elm in this.Counters)
				{
					if (this.Counters[elm]["Object"] == HTMLObject)
					{
						this.Counters.remove(elm)
						return;
					}
				}
			},
			
		AddSwitcher :
			function (HTMLObject)
			{
				var Switcher = new Object();
				
				Switcher["Object"]	= HTMLObject;
				Switcher["Event"]	= this.FindEvent(Switcher["Object"].getAttribute("data-counter-event"));
				eval("var a	= " + Switcher["Object"].getAttribute("data-counter-content"));
				Switcher["Content"]	= a;
				Switcher["Current"]	= -1;
				
				for (elm in Switcher["Content"])
				{
					Switcher["Content"][elm]["Content"] = Switcher["Content"][elm]["Content"].replace(/#Q1/g, "'");
					Switcher["Content"][elm]["Content"] = Switcher["Content"][elm]["Content"].replace(/#Q2/g, '"');
					Switcher["Content"][elm]["Content"] = Switcher["Content"][elm]["Content"].replace(/#Q3/g, "<");
					Switcher["Content"][elm]["Content"] = Switcher["Content"][elm]["Content"].replace(/#Q4/g, ">");
					Switcher["Content"][elm]["Content"] = Switcher["Content"][elm]["Content"].replace(/#Hs/g, "#");
				}
				
				this.Switchers.push(Switcher);
				
				this.UpdateSwitcher(Switcher);
			},
			
		RemoveSwitcher :
			function (HTMLObject)
			{
				for (elm in this.Switchers)
				{
					if (this.Switchers[elm]["Object"] == HTMLObject)
					{
						this.Switchers.remove(elm)
						return;
					}
				}
			},
			
		AddPerDay :
			function (HTMLObject)
			{
				var PerDay = new Object();
				
				PerDay["Object"]	= HTMLObject;
				eval("var a	= " + PerDay["Object"].getAttribute("data-counter-content"));
				PerDay["Content"]	= a;
				
				for (elm in PerDay["Content"])
				{
					PerDay["Content"][elm]["Content"] = PerDay["Content"][elm]["Content"].replace(/#Q1/g, "'");
					PerDay["Content"][elm]["Content"] = PerDay["Content"][elm]["Content"].replace(/#Q2/g, '"');
					PerDay["Content"][elm]["Content"] = PerDay["Content"][elm]["Content"].replace(/#Q3/g, "<");
					PerDay["Content"][elm]["Content"] = PerDay["Content"][elm]["Content"].replace(/#Q4/g, ">");
					PerDay["Content"][elm]["Content"] = PerDay["Content"][elm]["Content"].replace(/#Hs/g, "#");
				}
				
				this.PerDays.push(PerDay);
				
				this.UpdatePerDay(PerDay);
			},
			
		RemovePerDay :
			function (HTMLObject)
			{
				for (elm in this.PerDays)
				{
					if (this.PerDays[elm]["Object"] == HTMLObject)
					{
						this.PerDays.remove(elm)
						return;
					}
				}
			},
			
		UpdateCounter :
			function (Counter)
			{
				if (Counter["Event"] == 0)
					return;
					
				var TimeLeft = Counter["Event"].getTimeLeft() - this.CheatTime;
				if (TimeLeft < 0)
				{
					Counter["Object"].innerHTML = Counter["FinishedText"];
					return;
				}
				
				var SecondsLeft = Math.ceil(TimeLeft / 1000);
				var MinutesLeft = 0;
				var HoursLeft = 0;
				var DaysLeft = 0;
				var WeeksLeft = 0;
				var Written = false;
				
				if (SecondsLeft > 120)
				{
					MinutesLeft		=	Math.floor(SecondsLeft / 60);
					SecondsLeft		-=	MinutesLeft * 60;
					SecondsLeft		=	Math.floor(SecondsLeft / 2) * 2;
				}
				
				if (MinutesLeft > 120)
				{
					SecondsLeft		=	0;
					HoursLeft		=	Math.floor(MinutesLeft / 60);
					MinutesLeft		-=	HoursLeft * 60;
				}
				
				if (HoursLeft > 48)
				{
					MinutesLeft		=	0;
					DaysLeft		=	Math.floor(HoursLeft / 24);
					HoursLeft		-=	DaysLeft * 24;
				}
				
				if (DaysLeft > 14)
				{
					HoursLeft		=	0;
					WeeksLeft		=	Math.floor(DaysLeft / 7);
					DaysLeft		-=	WeeksLeft * 7;
				}
				
				var String = '';
				
				if (WeeksLeft > 0)
				{
					String += Counter["Prefix0"] + WeeksLeft + Counter["Postfix0"] + ' ' + ((WeeksLeft == 1)? this.Words["week"] : this.Words["weeks"]);
					Written = true;
				}
				
				if (DaysLeft > 0)
				{
					if (Written)
						String += ', ';
					String += Counter["Prefix0"] + DaysLeft + Counter["Postfix0"] + ' ' + ((DaysLeft == 1)? this.Words["day"] : this.Words["days"]);
					Written = true;
				}
				
				if (HoursLeft > 0)
				{
					if (Written)
						String += ', ';
					String += Counter["Prefix0"] + HoursLeft + Counter["Postfix0"] + ' ' + ((HoursLeft == 1)? this.Words["hour"] : this.Words["hours"]);
					Written = true;
				}
				
				if (MinutesLeft > 0)
				{
					if (Written)
						String += ', ';
					String += Counter["Prefix0"] + MinutesLeft + Counter["Postfix0"] + ' ' + ((MinutesLeft == 1)? this.Words["minute"] : this.Words["minutes"]);
					Written = true;
				}
				
				if (!Written || SecondsLeft > 0)
				{
					if (Written)
						String += ', ';
					String += Counter["Prefix0"] + SecondsLeft + Counter["Postfix0"] + ' ' + ((SecondsLeft == 1)? this.Words["second"] : this.Words["seconds"]);
					Written = true;
				}
				
				Counter["Object"].innerHTML = String;
			},
			
		UpdateSwitcher :
			function (Switcher)
			{
				var TimeLeft = Switcher["Event"].getTimeLeft() - this.CheatTime;
				
				var newSelect	= -1;
				var curHighest	= Number.MAX_VALUE;
				var Default		= -1;
				
				for (elm in Switcher["Content"])
				{
					var Value = Switcher["Content"][elm]["Time"];
					if (Value == "default")
					{
						Default = elm;
						continue;
					}
					
					if (Value > TimeLeft && Value < curHighest)
					{
						newSelect	= elm;
						curHighest	= Value;
					}
				}
				
				if (newSelect == -1)
					newSelect = Default;
					
				if (Switcher["Current"] != newSelect)
				{
					Switcher["Current"] = newSelect;
					g_oHandleDynamic.ReplaceInnerHTML(Switcher["Object"], Switcher["Content"][newSelect]["Content"]);
				}
			},
			
		UpdatePerDay :
			function (PerDay)
			{
				var CurrentTime	= new Date();
				CurrentTime = new Date(CurrentTime.getTime() + this.CheatTime);
				
				var Day			= CurrentTime.getDay();
				var Hour		= CurrentTime.getHours();
				
				Day -= 1;
				if (Day < 0)
					Day += 7;
				
				var newSelect	= -1;
				var tmpContent	= Day + '~' + Hour + '; ';
				
				for (elm in PerDay["Content"])
				{
					var Conditions = PerDay["Content"][elm]["Conditions"];
					
					var WDayMin = Conditions["WDayMin"];
					var WDayMax = Conditions["WDayMax"];
					var HourMin = Conditions["HourMin"];
					var HourMax = Conditions["HourMax"];
					
					while (HourMax >= 0)
					{
						if (Day < WDayMin || Day > WDayMax || Hour < HourMin || Hour > HourMax)
						{
							HourMin -= 24;
							HourMax -= 24;
							WDayMin += 1;
							WDayMax += 1;
							if (WDayMin > 6)
							{
								WDayMin -= 7;
								WDayMax -= 7;
							}
							continue;
						}
						
						newSelect = elm;
						break;
					}
					
					if (newSelect != -1)
						break;
				}
				
				if (newSelect == PerDay["Current"])
					return;
				
				if (newSelect == -1)
				{
					g_oHandleDynamic.ReplaceInnerHTML(PerDay["Object"], tmpContent);
				}
				else
				{
					PerDay["Current"] = newSelect;
					g_oHandleDynamic.ReplaceInnerHTML(PerDay["Object"], PerDay["Content"][newSelect]["Content"]);
				}
			},
			
		AddEvent	:
			function (Data)
			{
				var Event = new Object();
				
				Event.Name	= Data["ID"];
				Event.Time	= Data["Time"];
				
				Event.getTimeLeft =
					function (Time)
					{
						if (!Time)
							Time = new Date();
						return this.Time - Time.getTime();
					};
				
				this.Events.push(Event);
			},
			
		FindEvent :
			function (Name)
			{
				for (i = 0; i < this.Events.length; i++)
				{
					if (this.Events[i].Name == Name)
						return this.Events[i];
				}
				return 0;
			},
			
		Update :
			function ()
			{
				for (i = 0; i < this.Counters.length; i++)
					this.UpdateCounter(this.Counters[i]);
				for (i = 0; i < this.Switchers.length; i++)
					this.UpdateSwitcher(this.Switchers[i]);
				for (i = 0; i < this.PerDays.length; i++)
					this.UpdatePerDay(this.PerDays[i]);
			},
			
		Load :
			function ()
			{
				window.setInterval("g_oCounters.Update()", 500);
			}

	};
	
	g_oHandleDynamic.AddLoadEvent(g_oCounters.Load);
}
