////////////////////////////////////////////////////////////////////////////////
// Home Page Data
////////////////////////////////////////////////////////////////////////////////

// <script language="javascript">
// Copyright (c) Home Automation, Inc. All rights reserved.          
// Copyright (c) HomeRun Software Systems LLC. All rights reserved.

////////////////////////////////////////////////////////////////////////////////
// getHomeXML: Obtain Home Page Data
////////////////////////////////////////////////////////////////////////////////
function getHomeXML()	
{
	var szXML;

	szXML = "<HOME>";
	try
	{
		var dtSunrise = "Unknown";
		var dtSunset = "Unknown";
		var dtDateTime = "Unknown";
		dtSunrise = new Date(g_oHAI.Sunrise);
		dtSunset = new Date(g_oHAI.Sunset);
		dtDateTime = new Date(g_oHAI.Date);
		szXML += "<SUNRISE>" + formatDateTime(dtSunrise,2) + "</SUNRISE>";
		szXML += "<SUNSET>" + formatDateTime(dtSunset,2) + "</SUNSET>";
		szXML += "<DATE>" + formatDateTime(dtDateTime,1) + " " + formatDateTime(dtDateTime,2) + "</DATE>";
	}
	catch(oError)
	{
		// Ignore error and continue
		szXML += "<SUNRISE>Unknown</SUNRISE>";
		szXML += "<SUNSET>Unknown</SUNSET>";
		szXML += "<DATE>Unknown	</DATE>";
	}
	dtSunrise = null;
	dtSunset = null;
	dtDateTime = null;
		
	// Create XML for Messages
	szXML += "<MESSAGES HAS_STATUS='" + g_oHAI.Messages.HasStatus + "'>";
	var oMsgItem;
	for (idx=1; idx<= g_oHAI.Messages.count; idx++)	
	{
		oMsgItem = g_oHAI.Messages.Item(idx);
		if (oMsgItem.Displayed)	
		{
			szXML += "<MESSAGE><NAME>" + HTMLEncode(oMsgItem.Name) + "</NAME>";
			szXML += "<ID>" + oMsgItem.ID + "</ID></MESSAGE>";
		}
	}
	szXML += "</MESSAGES>";
	oMsgItem = null;

	// Create XML for Thermostats
	szXML += "<TEMPERATURES>";
	var szTemp;
	var szStatus;
	var szName;

	for (idx=1; idx<= g_oHAI.Thermostats.count; idx++)	
	{
		oTempItem = g_oHAI.Thermostats.Item(idx);
		szName = oTempItem.Name;
		if (szName == "")
			szName = "Unknown Thermostat";
				
		if(g_oHAI.TemperatureFormat == 1)
			szTemp = Math.round(oTempItem.TemperatureF) + "&#176; F";
		else
			szTemp = Math.round(oTempItem.TemperatureC) + "&#176; C";
						
		switch (oTempItem.Status)	
		{
				case tsfCommFailure:
					szStatus = "Communication Failure!";
					break;
				case tsfFreezeAlarm:
					szStatus = "Freeze Alarm!";
					break;
				default:
					szStatus = szTemp;
		}
		szXML += "<TEMPERATURE><TYPE>THERMOSTAT</TYPE><NAME>" + HTMLEncode(szName);
		szXML += "</NAME><TEMP>" + szStatus + "</TEMP><ID>" + oTempItem.ID + "</ID></TEMPERATURE>";
	}

	// Create XML for Temperature Sensors as part of TEMPERATURES node
	for (idx=1; idx<= g_oHAI.TemperatureSensors.count; idx++)	
	{
		oTempItem = g_oHAI.TemperatureSensors.Item(idx);
		szName = oTempItem.Name;
		
		if (szName == "")
			szName = "Unknown Sensor";

		if ( (oTempItem.Type - 0) == 4) 
		{
			szTemp = Math.round(oTempItem.TemperatureF) + "% RH";
		}
		else
		{
			if(g_oHAI.TemperatureFormat == 1)
				szTemp = Math.round(oTempItem.TemperatureF) + "&#176; F";
			else
				szTemp = Math.round(oTempItem.TemperatureC) + "&#176; C";
		}
				
		// Get duration details for PESMs only
		szTR = "";
		szTS = "";
		if ( (oTempItem.Type - 0) == tstEnergySaver)
		{
			szTR = "<TimeRemaining>" + oTempItem.Unit.TimeRemaining + "</TimeRemaining>";
			szTS = oTempItem.Unit.Status;
		}
		else
		{
			szTS = oTempItem.Status;	
		}
		
		szXML += "<TEMPERATURE><TYPE>" + oTempItem.Type + "</TYPE><NAME>" + HTMLEncode(szName);
		szXML += "</NAME><TEMP>" + szTemp + "</TEMP><ID>" + oTempItem.ID + "</ID><STATUS>" + szTS;
		szXML += "</STATUS>" + szTR + "</TEMPERATURE>";

	}
	szXML += "</TEMPERATURES>";
	oTempItem = null;

	// Create XML for AREAS
	var oAreaItem;
	var oZoneItem;
	var szSecurityMode;
	var szName;
	var szZoneDetails = new String();
	var iMode;
	szXML += "<AREAS>";
	var iAreaCount = g_oHAI.Areas.count;
	
	for (idxA=1; idxA<=iAreaCount; idxA++)	
	{
		oAreaItem = g_oHAI.Areas(idxA);
		szName =  HTMLEncode(oAreaItem.Name);
		
		if(szName == "" && iAreaCount > 1)
		{
			szName = "Area #" + idxA;
		}
		else if (szName == "" && iAreaCount == 1)
			szName = "Security";			
			
		szXML += "<AREA><ID>" + oAreaItem.ID + "</ID><NAME>" + szName + "</NAME>";

		// Get the Areas Security mode
		iMode = oAreaItem.SecurityMode - 0;
		switch (iMode)	
		{
			case areamodeOff:
				szSecurityMode = "Disarmed";
				break;
			case areamodeDay:
				szSecurityMode = "Armed Day";
				break;
			case areamodeNight:
				szSecurityMode = "Armed Night";
				break;
			case areamodeAway:
				szSecurityMode = "Armed Away";
				break;
			case areamodeVacation:
				szSecurityMode = "Armed Vacation";
				break;
			case areamodeDayInstant:
				szSecurityMode = "Armed Day instant";
				break;
			case areamodeNightDelayed:
				szSecurityMode = "Armed Night delayed";
				break;
			default:
				szSecurityMode = "Unknown security mode: (" + oAreaItem.SecurityMode + ")";
		}
		szXML += "<MODE>" + szSecurityMode + "</MODE>";
			
		// Loop through zones for alerts and create nodes for them
		var oZones = oAreaItem.Zones;
		var iZoneCount = oZones.count;
		
		for (idxZ=1; idxZ<=iZoneCount; idxZ++)	
		{
			oZoneItem = oZones(idxZ);
			iZoneArea = (oZoneItem.Area.Index-0);
			if(iZoneArea == idxA)	
			{
				szZoneDetails = "";
				iAS = oZoneItem.AlarmStatus-0;
				iArmStatus = oZoneItem.ArmingStatus-0;
				iCC = oZoneItem.CurrCondition-0;
				iType = oZoneItem.Type-0;
				switch(iType)	
				{
					case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 10: 
					case 11: case 12: case 13: case 14: case 16: case 17: case 18: case 19: case 20:  // Burglary
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Burglary Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Burglary Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztFire:
					case ztFireEmergency:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Fire Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Fire Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztGas:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Gas Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Gas Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztAuxEmergency:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Auxiliary Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Auxiliary Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztFreeze:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Freeze Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Freeze Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztWater:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Water Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Water Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					case ztTemperatureAlarm:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Temperature Alarm</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Temperature Alarm Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>Zone Had Trouble</ZONE_ALERT>";
						break;
					default:
						if(iAS == alarmTripped)
							szZoneDetails += "<ZONE_ALERT>Trouble Alert</ZONE_ALERT>";
						else if(iAS == alarmReset)
							szZoneDetails += "<ZONE_ALERT>Trouble Alert Reset</ZONE_ALERT>";
						if(iCC == zoneTrouble)
							szZoneDetails += "<ZONE_ALERT>System Trouble</ZONE_ALERT>";
						else if(oZoneItem.HadTrouble)
							szZoneDetails += "<ZONE_ALERT>System Had Trouble</ZONE_ALERT>";
				}

				// Get the Arming Status
				if ( (iArmStatus == armingUserBypass) || (iArmStatus == armingSystemBypass) )
					szZoneDetails += "<ZONE_ALERT>Zone Bypassed</ZONE_ALERT>";
						
				// Write xml if error found in zone
				if(szZoneDetails != "")	
				{
					szXML += "<ZONE><ID>" + oZoneItem.ID + "</ID><NAME>";
					szXML += HTMLEncode(oZoneItem.Name) + "</NAME>" + szZoneDetails + "</ZONE>\n";
				}
			}
		}
		szXML += "</AREA>";
	}
	szXML += "</AREAS>";
	oZoneItem = null;
	szZoneDetails = null;
		
	// Display the most recent events
	szXML += getEventXML(HOME_PAGE_EVENTS_DISPLAY);

	szXML += "</HOME>";
	
	return (szXML);
}


