//
// Copyright ŠLogARun, Inc. All Rights Reserved
//
var HasWriteAccess = false;
var CurLog;
var CurDayItem;
var ChildOpen = false;
var Cache = new CacheManager();
window.onload = W_Onload;

function W_Onload(event)
{
	LoadRequestedUser();
	RenderMonthlyCalendar();
	ConfigureView(RequestedViewType);
	KeepStats();
}

function IndividualChange(event)
{
	ChangeUser();
	RenderMonthlyCalendar();
}

function RenderMonthlyCalendar()
{
	if(!CheckForValidTeam()) {return;}
	ShowUpdating();
	var mDiv = document.getElementById('month');
	switch(RequestedViewType)
	{
		case 'monthView': setTimeout('RenderMonth()', 100); break;
		case 'weekView': setTimeout('RenderWeek()', 100); break;
		case 'teamView': 
			mDiv.style.overflow = 'auto';
			mDiv.style.height = (GetWinHeight() - 100) + 'px';
			mDiv.style.width = '100%';
			setTimeout('RenderTeam()', 100); break;
	}
}

function RenderTeam()
{
	var date = StartDate.getFirstWeekDay(FirstDayOfWeek);
	var table = document.getElementById('monthTbl').tBodies[0];
	// Clear the table
	ClearTable(table);
	
	// Create the month row
	var tr = document.createElement('tr');
	RenderMonthName(tr, date);
	table.appendChild(tr);
	
	tr = document.createElement('tr');
	RenderDayNames(tr, date);
	table.appendChild(tr);
	
	// Get all individuals of a team
	var us = document.getElementById('indivdrop');
	for(var i=0;i<us.options.length;i++)
	{
		CurLog = Cache.GetWeekXml(us.options[i].value, date);
		tr = document.createElement('tr');
		RenderCalendarWeek(tr, date);
		table.appendChild(tr);
		tr = null;
		SelectDate(StartDate);
		CloseUpdating();
	}
	table = null;
}

function RenderMonth()
{
	CurLog = Cache.GetMonthXml(RequestedUser, StartDate);
	FirstDayOfWeek = CurLog.UserOptions.FirstDay;
	var date = new Date(StartDate.getFirstCalendarDay(FirstDayOfWeek).toLocaleString());
	
	var endOfWeek = date.addDays(6);
	var table = document.getElementById('monthTbl').tBodies[0];
	
	// Clear the table
	ClearTable(table);
	
	// Create the month row
	var tr = document.createElement('tr');
	RenderMonthName(tr, endOfWeek);
	table.appendChild(tr);
	
	tr = document.createElement('tr');
	RenderDayNames(tr, date);
	table.appendChild(tr);
	
	var dt = new Date(date.toLocaleString());
	for(var r=0; r<5; r++)
	{
		tr = document.createElement('tr');
		RenderCalendarWeek(tr, dt);
		table.appendChild(tr);
		dt = dt.addDays(7);
	}
	tr = null;
	table = null;
	SelectDate(StartDate);
	CloseUpdating();
}

function RenderWeek()
{
	CurLog = Cache.GetWeekXml(RequestedUser, StartDate);
	FirstDayOfWeek = CurLog.UserOptions.FirstDay;
	
	var table = document.getElementById('monthTbl').tBodies[0];
	// Clear the table
	ClearTable(table);
	
	// Create the month row
	var date = StartDate.getFirstWeekDay(FirstDayOfWeek);
	var tr = document.createElement('tr');
	RenderMonthName(tr, date);
	table.appendChild(tr);
	
	tr = document.createElement('tr');
	RenderDayNames(tr, date);
	table.appendChild(tr);
	
	tr = document.createElement('tr');
	RenderCalendarWeek(tr, date);
	table.appendChild(tr);
	tr = null;
	table = null;
	SelectDate(StartDate);
	CloseUpdating();
}

function ClearTable(table)
{
	// Clear the table
	var allrows = table.getElementsByTagName('tr');
	if(allrows.length > 0)
	{
		var p = allrows[0].parentNode;
		while(p.childNodes.length > 0)
		{
			p.removeChild(p.childNodes[0]);
		}
		p = null;
	}
	allrows = null;
}

function RenderCalendarWeek(tr, dt)
{
	var td;
	dt = new Date(dt.toShortDate());
	var showAll = RequestedViewType != 'monthView';
	var isTeam = RequestedViewType == 'teamView';
	var widthDay = GetWinWidth() * .13;
	var widthTot = GetWinWidth() * .7;
	var height = (GetWinHeight() - 150) / 5;
	var tot = new Totals();
	for(var i=0; i<7; i++)
	{
		var di = CurLog.DayItems[dt];
		if(di && di.Activities)
		{
			for(var j=0;j<di.Activities.Count;j++)
			{
				tot.Plus(di.Activities.Items[j]);
			}
		}
		td = document.createElement('td');
		td.style.width = widthDay + 'px';
		if(!showAll)
		{
			td.style.height = height + 'px';
		}
		var a = document.createElement('a');
		a.id = isTeam ? CurLog.UserName + "'" + dt.toShortDate() : dt.toShortDate();
		a.href = "#";
		var build = new String.Builder();
		if(isTeam && i==0) 
		{
			build.appendFormat('<span class="usr">{0}</span>', GetDisplayName(CurLog.UserName));
		}
		build.appendFormat('<span class="num">{0}</span>', dt.getDate());
		if(showAll && di) 
		{
			build.appendFormat('<span class="dayTitle" title="{0}">{0}</span>', di.Notes.DayTitle);
		}
		if(showAll) 
		{
			build.append(GetDayTitle(di, true));
		}
		else 
		{
			build.append(RenderCalendarDay(di));
		}
		a.innerHTML =  build.toString();
		a.title = GetDayTitle(di, false);
		a.onclick = DayClick;
		td.appendChild(a);
		tr.appendChild(td);
		dt = dt.addDays(1);
		td = null;
		a = null;
	}
	
	td = document.createElement('td');
	td.className = 'monTot';
	td.style.width = widthTot + 'px';
	if(!showAll) 
	{
		td.style.height = height + 'px';
	}
	var sum = WeekSummary(tot);
	td.innerHTML = sum;
	td.title = sum;
	tr.appendChild(td);
	td = null;
}

function GetDisplayName(username)
{
	var sel = document.getElementById('indivdrop');
	return sel.options[GetOptionIndex(sel.options, username)].text;
}

function DayClick(event)
{
	if(!ChildOpen)
	{
		event = event || window.event;
		var t = event.target || event.srcElement;
		
		while(t.tagName.toUpperCase() != "A")
		{
			t = t.parentElement || t.parentNode;
		}
		
		// Select the item
		var splt = t.id.split("'");
		var dtStr = splt[0];
		if(splt.length > 1)
		{
			RequestedUser = splt[0];
			dtStr = splt[1];
		}
		var dt = new Date(dtStr);
		SelectDate(dt);
		CurLog = (RequestedViewType == 'monthView') ? 
			Cache.GetMonthXml(RequestedUser, dt) : Cache.GetWeekXml(RequestedUser, dt);
		CurDayItem = CurLog.DayItems[dt];
		CurDayItem = (CurDayItem) ? CurDayItem.clone(true) : null;
		
		RequestedDisplayName = GetDisplayName(RequestedUser);
		
		var v = document.getElementById('itemFrame');
		if(v.src.endsWith('.htm'))
		{
			v.src = './item.aspx?username=' + escape(RequestedUser) + '&date=' + dtStr;
		}
		else
		{
			t = v.contentWindow.document.getElementById('usrtxt');
			t.innerHTML = 'Welcome ' + RequestedUser.xmlEncode() + ', ' + dt.toLongDate();
			v.contentWindow.HasWriteAccess = CurLog.HasWriteAccess;
			v.contentWindow.LoggedInUser = LoggedInUser;
			v.contentWindow.RequestedDate = dt.toShortDate();
			v.contentWindow.W_Onload();
		}
		ShowItemForm(true);
	}
}

function ShowItemForm(b)
{
	Toggle('itmopen', b);
	ChildOpen = b;
	SelectToggle(!b);
}

function WeekSummary(tot)
{
	var s = new String.Builder();
	for(var i=0;i<tot.Items.length;i++)
	{
		if(tot.Items[i][1] == "run" || tot.Items[i][1] == "dsttm")
		{
			if(tot.Items[i][2] > 0)
			{
				s.appendFormat('{0} Distance: {1} {2}<br/>', tot.Items[i][0], tot.Items[i][2].toFixed(1),
					DistanceTypeToShortName(GetViewableDistanceType(tot.Items[i][0])));
			}
			else
			{
				s.appendFormat('{0} Duration: {1}<br/>', tot.Items[i][0], GetTimeString(tot.Items[i][3]));
			}
		}
		else if(tot.Items[i][1] == "setrep")
		{
			s.appendFormat('{0} Total: {1}<br/>', tot.Items[i][0], tot.Items[i][4]);
		}
	}
	return s.toString();
}

function GetDayTitle(di, isHtml)
{
	var s = new String.Builder();
	if(di)
	{
		if(di.Health)
		{
			s.append(di.Health.ToDayTitle(isHtml));
		}
		if(di.Activities)
		{
			for(var i=0;i<di.Activities.Count;i++)
			{
				s.append(di.Activities.Items[i].ToDayTitle(isHtml));
			}
		}
		if(di.Notes)
		{
			s.append(di.Notes.ToDayTitle(isHtml));
		}
	}
	return s.toString();
}

function RenderCalendarDay(di)
{
	var str = new String.Builder();
	if(di)
	{
		if(di.Attachments && di.Attachments.Count > 0)
		{
			str.appendFormat('<img src="./images/attach.gif" title="An attachment has been made to this day"/>');
		}
		if(di.Notes)
		{
			if(di.Notes.HasCoachNote())
			{
				str.appendFormat('<img src="./images/note.gif" title="Someone has made a comment on your log" />');
			}
			str.appendFormat('<span class="dayTitle" title="{0}">{0}</span>', di.Notes.DayTitle);
		}
		RenderDetail(str, CurLog.UserOptions, di);
	}
	return str.toString();
}

function RenderDetail(str, ops, itm)
{
	// Iterate through all the user options and print out the necessary information
	str.append('<span class="caldetail">');
	for(var i=0; i<ops.Count; i++)
	{
		switch(ops.Ops[i][0])
		{
			case "Weight":
				//alert("lastWeightUnit: " + LastWeightUnit + "\n" + "itm.Health.Weight: " + itm.Health.Weight);
				// display weight in lbs
				if (WeightInLbs == 1) { 
					//if ((LastWeightUnit == 1) || (LastWeightUnit == -1)) {
					//if (LastWeightUnit == 1) {
						UserOption(str, ops.Ops[i][1] + ' lbs', itm.Health.Weight.toFixed(1));
					//}
					//else {
					//	var weightInLbs = itm.Health.Weight * 2.20462262;
					//	UserOption(str, ops.Ops[i][1] + ' lbs', weightInLbs.toFixed(1));
					//}
				}
				// display weight in kgs
				else { 
					// the user has submitted a weight in lbs or this is a fresh page
					//if ((LastWeightUnit == 1) || (LastWeightUnit == -1)) {
						//var weightInKgs = itm.Health.Weight/2.20462262;
						//UserOption(str, ops.Ops[i][1] + ' kgs', weightInKgs.toFixed(1));						
					//}
					// the user has submitted a weight in kgs 
					//else if (LastWeightUnit == 0) {					
					//	UserOption(str, ops.Ops[i][1] + ' kgs', itm.Health.Weight);
					//}
					
					if (FreshPage == 1) {
						var weightInKgs = itm.Health.Weight/2.20462262;
						UserOption(str, ops.Ops[i][1] + ' kgs', weightInKgs.toFixed(1));					
					}
					else {
						UserOption(str, ops.Ops[i][1] + ' kgs', itm.Health.Weight.toFixed(1));
					}
				}
				break;
			case "Fat":
				UserOption(str, ops.Ops[i][1], itm.Health.Fat);break;
			case "Pulse":
				UserOption(str, ops.Ops[i][1], itm.Health.Pulse);break;
			case "Sleep":
				UserOption(str, ops.Ops[i][1], itm.Health.Sleep);break;
		}
	}
	if(itm.Activities)
	{
		str.append(itm.Activities.ToMonthlyString(ops));
	}
	str.append('</span>');
}

function UserOption(str, fmt, arg)
{
	if(arg && arg > 0)
	{
		str.appendFormat(fmt+'<br/>', arg);
	}
}

function RenderDayNames(tr, curr)
{
	var th;
	for(var i=0; i<7; i++)
	{
		th = document.createElement('th');
		th.innerHTML = curr.getDayName();
		tr.appendChild(th);
		curr = curr.addDays(1);
	}
	th = document.createElement('th');
	th.className = 'monTot';
	th.innerHTML = 'Total';
	tr.appendChild(th);
	th = null;
}

function RenderMonthName(tr, month)
{
	var th = document.createElement('th');
	th.style.textAlign = "left";
	th.innerHTML = '<a onclick="SetPrevMonth()" title="Go back one month" href="#">&lt;</a>';
	tr.appendChild(th);
	
	th = document.createElement('th');
	th.colSpan = 6;
	RenderMonthNameDropdown(th, month);
	tr.appendChild(th);
	
	th = document.createElement('th');
	th.style.textAlign = "right";
	th.innerHTML = '<a onclick="SetNextMonth()" title="Go forward one month" href="#">&gt;</a>';
	tr.appendChild(th);
	th = null;
}

function RenderMonthNameDropdown(ele, month)
{
	var start = month.addMonths(-12);
	var monthName = month.monthName() + ' ' + month.getFullYear();
	var sel = CrEl("SELECT");
	Attach(sel, "onchange", MonthNameChange);
	ApCh(ele, sel);
	
	for(var i=0; i<24; i++)
	{
		var curr = start.monthName() + ' ' + start.getFullYear();
		sel.options[i] = new Option(curr, start);
		sel.options[i].selected = monthName == curr;
		start = start.addMonths(1);
	}
	sel = null;
}

function MonthNameChange(event)
{
	var ele = GetTarget(event);
	var value = ele.value;
	
	StartDate = new Date(value);
	RenderMonth();
}

function RefreshDay(itm)
{	
	// Get today's date
	var dt = itm.Date;
	// Get reference to the table row
	if(typeof(dt) != 'date') 
	{
		dt = new Date(dt);
	}
	itm.Date = dt;
	CurLog.Add(itm);
	
	var cid = (RequestedViewType == 'teamView') ? RequestedUser + "'" + itm.Date.toShortDate() : itm.Date.toShortDate();
	var a = document.getElementById(cid);
	var tr = a.parentNode.parentNode;
	
	// Find out the first day of this week
	var currdt = dt;
	dt = dt.getFirstWeekDay(FirstDayOfWeek);
	
	// Remove the cells in the row
	while(tr.childNodes.length > 0)
	{
		tr.removeChild(tr.childNodes[0]);
	}
		
	RenderCalendarWeek(tr, dt);
	SelectDate(currdt);
}

function SetNextMonth()
{
	MonthWeekChange(1);
}

function SetPrevMonth()
{
	MonthWeekChange(-1);
}

function MonthWeekChange(val)
{
	switch(RequestedViewType)
	{
		case 'monthView':
			StartDate = StartDate.getFirstCalendarDay(FirstDayOfWeek);
			StartDate = StartDate.addDays(7);
			StartDate = StartDate.addMonths(val);
			break;
		case 'weekView':
		case 'teamView':
			StartDate = StartDate.getFirstWeekDay(FirstDayOfWeek);
			StartDate = StartDate.addDays(val * 7);
			break;
	}
	W_Onload();
}

function SelectDate(dt)
{
	var a = document.getElementsByTagName('a');
	for(var i=0; i<a.length; i++)
	{
		a[i].className = (a[i].id == dt.toShortDate()) ? "selected" : "";
	}
}

function ViewChange(event)
{
	event = event || window.event;
	var target = event.target || event.srcElement;
	
	RequestedViewType = target.id;
	if(!CheckForValidTeam()) 
	{
		return;
	}
	var today = new Date();
	today.setMonth(today.getMonth()+1);	
	SetCookie("CurrentView", RequestedViewType, today, null, null, false);
	ConfigureView();
	RenderMonthlyCalendar();
}

function ViewTeamPrint(event)
{
	var ele = GetTarget(event);
	var selectedTeam = parseInt(GetSelectedValue(GID("teamdrop")));
	if(selectedTeam == 0)
	{
		alert("Cannot do a team view on everyone.");
		ele.href = "#";
		return false;
	}
	ele.href = "./teamprint.aspx?teamid="+selectedTeam;
	return true;
}

function CheckForValidTeam()
{
	if(RequestedViewType == 'teamView' && document.getElementById('teamdrop').selectedIndex == 0)
	{
		alert('You must select a team from the team drop down list in order to use this view. You can not do a team view on everyone. Please click either the Month or day view. You can also select a specific team to see this view.');
		return false;
	}
	return true;
}

function ConfigureView()
{
	Toggle('monthView', RequestedViewType != 'monthView');
	Toggle('weekView', RequestedViewType != 'weekView');
	Toggle('teamView', RequestedViewType != 'teamView');
}

function KeepStats()
{
	var session = GetCookie('SessionCheck');
	
	if(!session)
	{
		var s = new String.Builder('./xml.ashx?type=tracking');
			
		// Set the cookie
		SetCookie('SessionCheck', 'true', null, null, null, null);
		
		// Send the request
		GetPage(s.toString());
	}
}

// This is the client side cache manager
function CacheManager()
{
	var _this = this;
	var key = "{0}'{1}'{2}";
	var _Items = new Array();
	
	this.GetMonthXml = function(user, date)
	{
		var startdate = date.getFirstCalendarDay(FirstDayOfWeek);
		var enddate = startdate.addDays(35);
		return GetCacheXml(user, startdate, enddate);
	}
	
	this.GetWeekXml = function(user, date)
	{
		var startdate = date.getFirstWeekDay(FirstDayOfWeek);
		var enddate = startdate.addDays(7);
		return GetCacheXml(user, startdate, enddate);
	}
	
	function Get(username, startdate, enddate)
	{
		return _Items[key.format(username, startdate.toShortDate(), enddate.toShortDate())];
	}
	
	function Set(log)
	{
		_Items[key.format(log.UserName, log.StartDate.toShortDate(), log.EndDate.toShortDate())] = log;
	}
	
	function GetCacheXml(user, startdate, enddate)
	{
		// To help with boundary cases for different first day of weeks, we need to subtract one day at the
		// beginning and add one day at the end.
		startdate = startdate.addDays(-1);
		enddate = enddate.addDays(1);
		var log = Get(user, startdate, enddate);
		if(!log)
		{
			var xml = GetXml('./xml.ashx?username=' + user + '&startdate=' + startdate.toShortDate() + '&enddate=' + enddate.toShortDate() + '&type=view');
			log = new Log();
			log.ReadXml(xml);
			Set(log);
		}
		return log;
	}
}

