////////////////////////////////////////////////////////////////////////////////
// Data Handler
////////////////////////////////////////////////////////////////////////////////

// <script language="javascript">
// Copyright (c) Home Automation, Inc. All rights reserved.          
// Copyright (c) HomeRun Software Systems LLC. All rights reserved.

////////////////////////////////////////////////////////////////////////////////
// Globals
////////////////////////////////////////////////////////////////////////////////
var g_oHAI;			// HAI Communications Server object
var g_guidLogin;	// Login guid

var bLocalData	 = true;	// Location of data source
var szDataServer = ""		// Server for remote data

var oXMLDoc = new ActiveXObject("MICROSOFT.XMLDOM");
    oXMLDoc.onreadystatechange = eventXMLDocReadyStateChange;
    oXMLDoc.async = true;
   
var oXSLDoc = new ActiveXObject("MICROSOFT.XMLDOM");
    oXSLDoc.async = false;

var g_GlobalInfoXML;

////////////////////////////////////////////////////////////////////////////////
// InitCommServer: Create CommServer object
////////////////////////////////////////////////////////////////////////////////
function InitCommServer()
{
	var Result = S_OK;

	try	
	{
		g_oHAI = new ActiveXObject("OmniLink.HAIServer");
		
		// If server was loaded we need to make sure it's not in a failure state
		if (g_oHAI.status != ssFailure)
			InitEventHandlers();	// Hook up event handlers
		else
			Result = new Error(10000101, ERR_COMMSERVER_INIT_FAILURE);
	}
	catch(oError)	
	{
		Result = oError;
	}
	
	return Result;
}

////////////////////////////////////////////////////////////////////////////////
// InitEventHandlers: Initialize Event Handlers
////////////////////////////////////////////////////////////////////////////////
function InitEventHandlers()
{
	try	
	{
		// Hook up event handlers
		g_oHAI.OnEvent = HAI_OnEventHandler;
		g_oHAI.OnSystemEvent = HAI_OnSystemEventHandler;
		g_oHAI.OnServerStatusChange = HAI_OnServerStatusChange;
	}
	catch(oError)	
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// KillEventHandlers: UnInitialize Event Handlers
////////////////////////////////////////////////////////////////////////////////
function KillEventHandlers()
{
	try	
	{
		// Hook up event handlers
		g_oHAI.OnEvent				= null;
		g_oHAI.OnSystemEvent		= null;
		g_oHAI.OnServerStatusChange = null;
	}
	catch(oError)	
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// eventXMLDocReadyStateChange -- Event handler for oXMLDoc DOM Document
////////////////////////////////////////////////////////////////////////////////
function eventXMLDocReadyStateChange()	
{
	var iState = oXMLDoc.readyState;

	if (iState == 4)	
	{
		// If valid XML returned then process it
		if (null != oXMLDoc.documentElement)	
		{
			// Check for errors
			nodeResult = oXMLDoc.selectSingleNode(".//ERROR");
			
			if (null != nodeResult)	
			{
				var iErrorNum = nodeResult.childNodes(0).text - 0;
				
				if ((iErrorNum == 0) || (iErrorNum == -1073741818) || (iErrorNum == -1073741819))	
				{
					ErrorHandler(ERR_INVALID_CREDENTIALS);
					ShowPage(PAGE_LOGIN);
					return;
				}
				
				ErrorHandler(null,null,nodeResult.childNodes(1).text,nodeResult.childNodes(0).text);
			}
			
			// If page is zoomed then added additonal info to XML DOM for XSL processing
			if (g_PageZoom < 1)
			{
				// Get the root node
				var nodeRoot = oXMLDoc.documentElement.selectSingleNode(".");
				
				// Create new node
				var nodeItem = oXMLDoc.createElement("ZOOM");
				var textNode = oXMLDoc.createTextNode(g_PageZoom);
				nodeItem.appendChild(textNode);
				nodeRoot.appendChild(nodeItem);
			}

			// Transform XML
			divMain.filters[0].Apply();		// Set state for beginning of transition 
			divMain.innerHTML = oXMLDoc.transformNode(oXSLDoc.documentElement);

			// Initialize the page
			eval("PG_Init_" + g_szCurrentPage + "()");

			// Fade the page in
			divMain.filters[0].Play();
		}

		//HideProcessWait();  // Hide process animation
	}
}

////////////////////////////////////////////////////////////////////////////////
// GetPageData: Get page data from local or remote source
// Params: iPage = page to get data for, 
//         szURL = URL containing data for remote acquisition only
////////////////////////////////////////////////////////////////////////////////
function GetPageData
(
	szPage,
	vData
)
{
	// Abort any current requests since the new one has precedence
	oXMLDoc.abort();
	
	// Load the data asyncronously
	eval("var szResult = Get_" + szPage + "_PageData(vData)")

	if (szResult != 0)
		oXMLDoc.loadXML(szResult);
	else
		ErrorHandler(null, ERR_XML_DATA_LOAD_FAILURE);
}

////////////////////////////////////////////////////////////////////////////////
// Get_Welcome_PageData -- Get the Welcome page data
////////////////////////////////////////////////////////////////////////////////
function Get_Welcome_PageData()
{
	var szResult;
	
	// Load Welcome menu from XML file
	var oXMLMenuDoc = new ActiveXObject("MICROSOFT.XMLDOM");
	oXMLMenuDoc.async = false;

	var bXMLResult = oXMLMenuDoc.load("xml_Welcome.xml");

	// If video isn't supported then remove the surveillance menu option
	if (!IsVideoSupported())
	{
		var nodeSurveillance = oXMLMenuDoc.documentElement.selectSingleNode("//NAVIGATION/Menu[Title='SURVEILLANCE']");
		oXMLMenuDoc.documentElement.removeChild(nodeSurveillance);
	}
	
	if ( bXMLResult == true )
		szResult = oXMLMenuDoc.xml;
	else
		szResult = 0;
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Home_PageData -- Get the Home page data
////////////////////////////////////////////////////////////////////////////////
function Get_Home_PageData()
{
	var szResult;
	
	if (DEMO_MODE)	// Get static data for if running demo
	{
		szResult = Get_Static_Demo_Data("home");
	}
	else	// Get live data from the controller
	{
		szResult = getHomeXML();	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Control_PageData -- Get the Control page data
////////////////////////////////////////////////////////////////////////////////
function Get_Control_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("control");
	}
	else	// Get live data from the controller
	{
		g_oHAI.Units.SaveXML(oXMLDoc);	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Control_Outputs_PageData -- Get the Control page data
////////////////////////////////////////////////////////////////////////////////
function Get_Control_Outputs_PageData()
{
	return Get_Control_PageData();
}

////////////////////////////////////////////////////////////////////////////////
// Get_Control_Command_PageData -- Get the Control command page data
////////////////////////////////////////////////////////////////////////////////
function Get_Control_Command_PageData
(
	vData
)
{
	var szResult;
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		var oTempXML = new ActiveXObject("MICROSOFT.XMLDOM");
		oTempXML.loadXML( Get_Static_Demo_Data("control") );

		// Get the root node
		var nodeRoot = oTempXML.documentElement.selectSingleNode("//UNITS/UNIT[ID = " + vData + "]");
		szResult = nodeRoot.xml;
	}
	else
	{
		g_oHAI.Units(0,vData).SaveXML(oXMLDoc);	// Get Data
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Control_Command_PageData -- Get the Control command page data
////////////////////////////////////////////////////////////////////////////////
function Get_Control_Command_Aplnc_PageData
(
	vData
)
{
	var szResult;

	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		var oTempXML = new ActiveXObject("MICROSOFT.XMLDOM");
		oTempXML.loadXML( Get_Static_Demo_Data("control") );

		// Get the root node
		var nodeRoot = oTempXML.documentElement.selectSingleNode("//UNITS/UNIT[ID = " + vData + "]");
		szResult = nodeRoot.xml;
	}
	else
	{
		g_oHAI.Units(0,vData).SaveXML(oXMLDoc);	// Get Data
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Security_PageData -- Get the Security page data
////////////////////////////////////////////////////////////////////////////////
function Get_Security_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("security");
	}
	else	// Get live data from the controller
	{
		g_oHAI.Areas.SaveXML(oXMLDoc);	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Security_Zones_PageData -- Get the Security Zones page data
////////////////////////////////////////////////////////////////////////////////
function Get_Security_Zones_PageData
(
	vArea
)
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("security_zones");
	}
	else	// Get live data from the controller
	{
		szResult = getZonesByArea(vArea);		// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Security_Zone_PageData -- Get the Security details for a specific zone
////////////////////////////////////////////////////////////////////////////////
function Get_Security_Zone_PageData
(
	vZone
)
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("security_zone");
	}
	else	// Get live data from the controller
	{
		g_oHAI.Zones(0,vZone).SaveXML(oXMLDoc);	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Temperature_PageData -- Get the Temperature page data
////////////////////////////////////////////////////////////////////////////////
function Get_Temperature_PageData()
{
	var szResult;
	
	if (DEMO_MODE)	// Get static data for if running demo
	{
		szResult = Get_Static_Demo_Data("temperature");
	}
	else	// Get live data from the controller
	{
		szResult = getTemperatureXML();	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Temp_PESM_PageData -- Get the PESM Temperature page data
////////////////////////////////////////////////////////////////////////////////
function Get_Temp_PESM_PageData
(
	vPESM
)
{
	var szResult;
	
	if (DEMO_MODE)	// Get static data for if running demo
	{
		szResult = Get_Static_Demo_Data("Temp_TempSensor");
	}
	else	// Get live data from the controller
	{
		itmTemp = g_oHAI.TemperatureSensors(0,vPESM);

		var szXML = "<TEMPERATURESENSOR>\n";
		szXML += "<ID>" + itmTemp.ID + "</ID>\n";
		szXML += "<INDEX>" + itmTemp.Index + "</INDEX>\n";
		szXML += "<TYPE>" + itmTemp.Type + "</TYPE>\n";
		szXML += "<NAME>" + HTMLEncode(itmTemp.Name) + "</NAME>\n";
		szXML += "<STATUS>" + itmTemp.Unit.Status + "</STATUS>\n";
		szXML += "<COOLSETPOINTC>" + Math.round(itmTemp.CoolSetpointC) + "</COOLSETPOINTC>\n";
		szXML += "<COOLSETPOINTF>" + Math.round(itmTemp.CoolSetpointF) + "</COOLSETPOINTF>\n";
		szXML += "<HEATSETPOINTC>" + Math.round(itmTemp.HeatSetpointC) + "</HEATSETPOINTC>\n";
		szXML += "<HEATSETPOINTF>" + Math.round(itmTemp.HeatSetpointF) + "</HEATSETPOINTF>\n";
		szXML += "<TEMPERATUREC>" + Math.round(itmTemp.TemperatureC) + "</TEMPERATUREC>\n";
		szXML += "<TEMPERATUREF>" + Math.round(itmTemp.TemperatureF) + "</TEMPERATUREF>";
		szXML += "<TEMP_FORMAT>" + g_oHAI.TemperatureFormat + "</TEMP_FORMAT>";

		// Get duration details for PESMs only
		if ( (itmTemp.Type - 0) == tstEnergySaver)
			szXML += "<TIMEREMAINING>" + itmTemp.Unit.TimeRemaining + "</TIMEREMAINING>";
				
		szXML += "</TEMPERATURESENSOR>\n";
		
		oXMLDoc.loadXML(szXML);
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Temp_TempSensor_PageData -- Get the Temperature Sensor page data
////////////////////////////////////////////////////////////////////////////////
function Get_Temp_TempSensor_PageData
(
	vTempSensor
)
{
	var szResult;
	
	if (DEMO_MODE)	// Get static data for if running demo
	{
		//szResult = Get_Static_Demo_Data("Temp_TempSensor");
		var oTempXML = new ActiveXObject("MICROSOFT.XMLDOM");
		oTempXML.loadXML( Get_Static_Demo_Data("temperature") );

		// Get the root node
		var nodeRoot = oTempXML.documentElement.selectSingleNode("//TEMPERATURE/TEMPERATURESENSORS/TEMPERATURESENSOR[ID = " + vTempSensor + "]");
		szResult = nodeRoot.xml;
	}
	else	// Get live data from the controller
	{
		var oXML = new ActiveXObject("MICROSOFT.XMLDOM");
		
		g_oHAI.TemperatureSensors(0,vTempSensor).SaveXML(oXML);	// Get Data
		
		// Get the root node
		var nodeRoot = oXML.documentElement.selectSingleNode(".");
		
		// Command
		var nodeItem = oXML.createElement("TEMP_FORMAT");
		var textNode = oXML.createTextNode(g_oHAI.TemperatureFormat);
		nodeItem.appendChild(textNode);
		nodeRoot.appendChild(nodeItem);

		oXMLDoc.loadXML(oXML.xml);
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Temp_Humidity_PageData -- Get the Humidity Sensor page data
////////////////////////////////////////////////////////////////////////////////
function Get_Temp_Humidity_PageData
(
	vTempSensor
)
{	
	return Get_Temp_TempSensor_PageData(vTempSensor);
}

////////////////////////////////////////////////////////////////////////////////
// Get_Temp_Thermostat_PageData -- Get the thermostat page data
////////////////////////////////////////////////////////////////////////////////
function Get_Temp_Thermostat_PageData
(
	vThermostat
)
{
	var szResult;
	
	if (DEMO_MODE)	// Get static data for if running demo
	{
		szResult = Get_Static_Demo_Data("Temp_Thermostat");
	}
	else	// Get live data from the controller
	{
		var oXML = new ActiveXObject("MICROSOFT.XMLDOM");
		
		g_oHAI.Thermostats(0,vThermostat).SaveXML(oXML);	// Get Data
		
		// Get the root node
		var nodeRoot = oXML.documentElement.selectSingleNode(".");
		
		// Command
		var nodeItem = oXML.createElement("TEMP_FORMAT");
		var textNode = oXML.createTextNode(g_oHAI.TemperatureFormat);
		nodeItem.appendChild(textNode);
		nodeRoot.appendChild(nodeItem);

		oXMLDoc.loadXML(oXML.xml);

	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Button_PageData -- Get the Button page data
////////////////////////////////////////////////////////////////////////////////
function Get_Button_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("button");
	}
	else	// Get live data from the controller
	{
		szResult = g_oHAI.Buttons.SaveXML(oXMLDoc);	// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Event_PageData -- Get the Event page data
////////////////////////////////////////////////////////////////////////////////
function Get_Event_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("event");
	}
	else	// Get live data from the controller
	{
		szResult = getEventXML(EVENT_PAGE_EVENTS_DISPLAY);		// Get Data
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Rule_List_PageData -- Get the Rule List page data
////////////////////////////////////////////////////////////////////////////////
function Get_Rule_List_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("rules");
	}
	else	// Get live data from the controller
	{
		szResult = GetRulesXML();
	}
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Login_PageData -- Get the Login page data
////////////////////////////////////////////////////////////////////////////////
function Get_Login_PageData
(
	vData
)
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("login");
	}
	else	// Get live data from the controller
	{		
		var oXML = new ActiveXObject("MICROSOFT.XMLDOM");
		
		szResult = g_oHAI.Codes.SaveXML(oXML);		// Get Data
		
		// Add the command data to the XML DOM so we can pass it on
		var nodeRoot = oXML.documentElement.selectSingleNode(".");
		
		// create a node for storing data
		var nodeCommand = oXML.createElement("COMMAND");

		// Command
		var nodeItem = oXML.createElement("CMD");
		var textNode = oXML.createTextNode(vData[0]);
		nodeItem.appendChild(textNode);
		nodeCommand.appendChild(nodeItem);
		
		// ID
		nodeItem = oXML.createElement("ID");
		textNode = oXML.createTextNode(vData[1]);
		nodeItem.appendChild(textNode);
		nodeCommand.appendChild(nodeItem);
		
		// ITEMTYPE
		nodeItem = oXML.createElement("ITEMTYPE");
		textNode = oXML.createTextNode(vData[2]);
		nodeItem.appendChild(textNode);
		nodeCommand.appendChild(nodeItem);

		nodeRoot.appendChild(nodeCommand);
		
		oXMLDoc.loadXML(oXML.xml);
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Settings_Main_PageData -- Get the Settings_Main page data
////////////////////////////////////////////////////////////////////////////////
function Get_Settings_Main_PageData
(
	bLoadError
)
{
	if (bLoadError)
		return("<SETTINGS><SHOWDEMOOPTION /></SETTINGS>");
	else
		return("<SETTINGS></SETTINGS>");
}

////////////////////////////////////////////////////////////////////////////////
// Get_Settings_Controller_PageData -- Get the Settings_Controller page data
////////////////////////////////////////////////////////////////////////////////
function Get_Settings_Controller_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("settings_controller");
	}
	else	// Get live data from the controller
	{
		szResult = getControllerSettings();		// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Settings_Sync_PageData -- Get the Settings Sync data
////////////////////////////////////////////////////////////////////////////////
function Get_Settings_Sync_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("settings_controller");
	}
	else	// Get live data from the controller
	{
		szResult = getControllerSettings();		// Get Data
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_ServerLog_PageData -- Get the ServerLog page data
////////////////////////////////////////////////////////////////////////////////
function Get_ServerLog_PageData()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("srvrlog.xml");
	}
	else	// Get live data from the controller
	{
		// Load Welcome menu from XML file
		var oXMLSrvrLogDoc = new ActiveXObject("MICROSOFT.XMLDOM");
		oXMLSrvrLogDoc.async = false;

		var bXMLResult = oXMLSrvrLogDoc.load("..\\srvrlog.xml");

		if ( bXMLResult == true )
			szResult = oXMLSrvrLogDoc.xml;
		else
		{
			szResult = "<SERVERLOG></SERVERLOG>";
		}
	}
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Help_PageData -- Get the Help page data
////////////////////////////////////////////////////////////////////////////////
function Get_Help_PageData()
{
	var szResult;
	
	// Load Welcome menu from XML file
	var oXMLHelpDoc = new ActiveXObject("MICROSOFT.XMLDOM");
	oXMLHelpDoc.async = false;

	var bXMLResult = oXMLHelpDoc.load("xml_help.xml");
	if ( bXMLResult == true )
		szResult = oXMLHelpDoc.xml;
	else
	{
		szErrDesc = ERR_HELP_LOAD_FAILURE.substring(szErrorID.indexOf(":")+1);
		szErrNum  = ERR_HELP_LOAD_FAILURE.substring(0,szErrorID.indexOf(":"));

		szResult = "<HELP><ERROR><ID>" + szErrNum + "</ID><DESC>" + szErrDesc + "</DESC></ERROR></HELP>";
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Updates_PageData -- Get the Updates page data
////////////////////////////////////////////////////////////////////////////////
function Get_Updates_PageData()
{
	return("<NYI><DESC>Not Yet Implemented</DESC></NYI>");
}

////////////////////////////////////////////////////////////////////////////////
// Get_Static_Demo_Data -- Get the static demo data
////////////////////////////////////////////////////////////////////////////////
function Get_Static_Demo_Data
(
	szPage
)
{
	var szResult = "";
	var oDemoData = new ActiveXObject("MICROSOFT.XMLDOM");
		oDemoData.async = false;

	var bXMLResult = oDemoData.load(".\\DemoData\\xml_" + szPage + ".xml");

	if ( bXMLResult == true )
		szResult = oDemoData.xml;
	else
		szResult = 0;

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_No_Controller_PageData -- Get the 'No Controller' page data
////////////////////////////////////////////////////////////////////////////////
function Get_No_Controller_PageData()
{
	var szResult;
	
	szResult = "<APPLICATION><NAME>" + PI_ShortName + "</NAME></APPLICATION>";
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Message_Capabilities -- Gets the number of supported messages for the controller
////////////////////////////////////////////////////////////////////////////////
function Get_Message_Capabilities()
{
	var szModel = new String(g_oHAI.Model);
	var iMessages = 0;
	
	szModel = szModel.toUpperCase();
	
	// Determine the number of supported messages
	switch(szModel)
	{
		// Omni Line of controllers
		case "HAI OMNI":
		case "ONQ HMS 925":
			iMessages = 0;
			break;
			
		// OmniLT Line of controllers
		case "HAI OMNILT":
		case "SIEMENS BCM":
		case "FSN":
		case "ONQ HMS 800":
		case "AEGIS 1000":
		case "AIKE D42":
		case "Sistema Casa SC2000/1":
			iMessages = 16;
			break;
			
		// Omni II Line of controllers
		case "HAI OMNI II":
		case "SIEMENS ECM":
		case "AEGIS 1500":
		case "ONQ HMS 950":
		case "Sistema Casa SC2000/2+":
		case "AIKE D62":
			iMessages = 64;
			break;

		// OmniPro, Aegis & OmniPro2 Line of controllers
		case "HAI OMNIPRO II":
		case "SIEMENS CCM":
		case "HAI OMNIPRO":			
		case "ONQ HMS 1100":
		case "HSP AEGIS 3000":
		case "AEGIS 2000":			
		case "ONQ HMS 1050":		
		case "AIKE D82":
		case "Sistema Casa SC2000/4":
			iMessages = 128;
			break;	
	}
	return (iMessages);
}

////////////////////////////////////////////////////////////////////////////////
// Get_Zone_Capabilities -- Gets the number of extended zones for the controller
////////////////////////////////////////////////////////////////////////////////
function Get_Zone_Capabilities()
{
	// Need to determine where the extended zones begin
	var szModel = new String(g_oHAI.Model);
	var iExtendedZones = 97;
	szModel = szModel.toUpperCase();

	switch (szModel)
	{
		case "HAI OMNI":
		case "ONQ HMS 925":
			iExtendedZones = 33;
			break;
		case "HAI OMNILT":
		case "SIEMENS BCM":
		case "FSN":
		case "ONQ HMS 800":
		case "AEGIS 1000":
		case "AIKE D42":
		case "SISTEMA CASA SC2000/1":
			iExtendedZones = 26;
			break;
		case "HAI OMNI II":
		case "SIEMENS ECM":
		case "AEGIS 1500":
		case "ONQ HMS 950":
		case "AIKE D62":
		case "SISTEMA CASA SC2000/2+":
			iExtendedZones = 49;
			break;
		case "HAI OMNIPRO II":
		case "SIEMENS CCM":
		case "ONQ HMS 1100":
		case "HSP AEGIS 3000":
		case "AIKE D82":
		case "SISTEMA CASA SC2000/4":
			iExtendedZones = 177;
			break;
		case "HAI OMNIPRO":	
		case "AEGIS 2000":	
		case "ONQ HMS 1050":
			iExtendedZones = 97;
		default:
			iExtendedZones = 97;
			break;
	}

	return (iExtendedZones);
}

////////////////////////////////////////////////////////////////////////////////
// Get_ConfigInfoXML -- Gets controller configuration information
////////////////////////////////////////////////////////////////////////////////
function Get_ConfigInfoXML()
{
	var szXML = "<CONFIG>";
	
	try
	{
		szXML += "<MESSAGES>" + g_oHAI.Messages.count + "</MESSAGES>";
		szXML += "<TEMPERATURE>" + (g_oHAI.Thermostats.count + g_oHAI.TemperatureSensors.count) + "</TEMPERATURE>";
		szXML += "<UNITS>" + g_oHAI.Units.count + "</UNITS>";
		szXML += "<BUTTONS>" + g_oHAI.Buttons.count + "</BUTTONS>";
	}
	catch (oError)
	{
	}
	
	szXML += "</CONFIG>";
	
	return szXML;
}

////////////////////////////////////////////////////////////////////////////////
// HAI_OnEventHandler -- Event Handler for Controller Events
////////////////////////////////////////////////////////////////////////////////
function HAI_OnEventHandler(oEvent)
{
	// Get the events description
	var szDescription = GetOnEventDescription(oEvent);
	
	// Display the event notification popup
	if (szDescription != "")
		DisplayEventNotificationPopup(szDescription);

	// Update page elements with new state
	UpdatePageElements(oEvent);
}

////////////////////////////////////////////////////////////////////////////////
// HAI_OnSystemEventHandler -- Event Handler for Controller System Events
////////////////////////////////////////////////////////////////////////////////
function HAI_OnSystemEventHandler(oEvent)
{
	// Get the events description
	var szDescription = GetOnSystemEventDescription(oEvent);

	// Display the event notification popup
	if (szDescription != "")
		DisplayEventNotificationPopup(szDescription);
		
	// Update page elements with new state
	UpdatePageElements(oEvent);
}

////////////////////////////////////////////////////////////////////////////////
// HAI_OnServerStatusChange -- Event Handler for Controller Status Comm Change
////////////////////////////////////////////////////////////////////////////////
function HAI_OnServerStatusChange
(
	nServerStatus
)
{
	if (g_iCurrentPage == PAGE_CTRLR_WIZ_FINISH)
	{
		var szServerStatus;
		switch (nServerStatus)
		{
			case 1:
				szServerStatus = "Starting Controller Communication...";
				break;
			case 2:
				szServerStatus = "Syncing Setup Information...";
				break;
			case 3:
				szServerStatus = "Syncing Names Information...";
				break;
			case 4:
				szServerStatus = "Loading Extensions...";
				break;
			case 5:
				szServerStatus = "Initializing Controller...";
				break;
			case 16:
				szServerStatus = "Initialization Complete! Ready for Use.";
				break;
			case 17:
				szServerStatus = "Stopping Controller Communication...";
				break;
			case 18:
				szServerStatus = "Controller Communication Stopped!";
				break;
			case 128:
				szServerStatus = "Failure!";
				break;
			default:
				szServerStatus = "Unknown Failure!";
				break;
		}
		ConnectionTestResults.innerHTML = szServerStatus;
		
	}
}

////////////////////////////////////////////////////////////////////////////////
// DisplayEventNotificationPopup: Display the event notification popup
////////////////////////////////////////////////////////////////////////////////
function DisplayEventNotificationPopup
(
	szEventDescription
)
{
	// Bail if notifications are disabled
	if (!g_iNotificationsEnabled)
		return;
		
	// Display the description
	divEventNotification.filters[0].Apply();		// Set state for beginning of transition                 
	spnEventNotificationText.innerText = szEventDescription;
	
	// Position vertically
	divEventNotification.style.top = document.body.clientHeight - tblEventNotification.clientHeight - 50;
	
	
	// Position horizontally (need to move it away from shared viewport if its displayed)
	try
	{
		if (window.external.MediaCenter.SharedViewPort.Visible == true)
		{
			divEventNotification.style.left = 360;
		}
		else
			divEventNotification.style.left = 75;
	}
	catch (oError)
	{
	}
	
	divEventNotification.style.visibility = "visible";
	
	divEventNotification.filters[0].Play();
	
	PlaySound(SOUND_EVENT);

	// Start timer to hide notification 
	window.setTimeout('HideEventNotificationPopup()', EVENT_NOTIFY_POPUP_TIME);

}

////////////////////////////////////////////////////////////////////////////////
// HideEventNotificationPopup: Hide the event notification popup
////////////////////////////////////////////////////////////////////////////////
function HideEventNotificationPopup()
{
	// Display the description
	divEventNotification.filters[0].Apply();		// Set state for beginning of transition                 
	divEventNotification.style.visibility = "hidden";
	divEventNotification.filters[0].Play();
}

////////////////////////////////////////////////////////////////////////////////
// GetOnEventDescription: Get the OnEvent description
////////////////////////////////////////////////////////////////////////////////
function GetOnEventDescription
(
	oEventItem
)
{
	iType = oEventItem.Type-0;
			
	// Get the event description
	switch (iType)	
	{
		case eZoneBypass:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " bypassed by " + oEventItem.Code;
			break;
		case eZoneRestored:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " restored by " + oEventItem.Code;
			break;
		case eAllAreaZonesRestored:
			if (oEventItem.AllZones-0)
				szDescription = "All Zones in All Areas restored";
			else			
				szDescription = "All Zones restored";
			szDescription = szDescription + " by " + oEventItem.Code;
			break;
		case eZoneTripped:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " tripped";
			break;
		case eZoneTrouble:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " trouble";
			break;
		case eRemotePhoneAccess:
			szDescription = "Remote phone access by " + oEventItem.Code;
			break;
		case eRemotePhoneLockout:
			szDescription = "Remote phone lockout";
			break;
		case eZoneAutoBypass:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " bypassed by system";
			break;
		case eZoneTroubleCleared:
			szDescription = HTMLEncode(oEventItem.Zone.Name) + " trouble cleared";
			break;
		case ePCAccess:
			szDescription = "PC access to system by " + oEventItem.Code;
			break;
		case eAreaAlarmActivated:
		case eAreaAlarmReset:
			switch(oEventItem.AlarmType-0)	
			{
				case atAny:
					szAlarmType = "Alarm";
					break;
				case atBurglary:
					szAlarmType = "Burglary alarm";
					break;
				case atFire:
					szAlarmType = "Fire alarm";
					break;
				case atGas:
					szAlarmType = "Gas alarm";
					break;
				case atAuxiliary:
					szAlarmType = "Auxiliary alarm";
					break;
				case atFreeze:
					szAlarmType = "Freeze alarm";
					break;
				case atWater:
					szAlarmType = "Water alarm";
					break;
				case atDuress:
					szAlarmType = "Duress alarm";
					break;
				case atTemperature:
					szAlarmType = "Temperature alarm";
					break;
				default:
					szAlarmType = "Unknown alarm (#" + oEventItem.AlarmType + ")";
			}
			
			if(iType == eAreaAlarmActivated)
				szDescription = HTMLEncode(oEventItem.Area.Name) + " " + szAlarmType + " activated";
			else
				szDescription = HTMLEncode(oEventItem.Area.Name) + " " + szAlarmType + " reset";
			break;
			
		case eSystemReset:
			szDescription = "System reset";
			break;
		case eMessageLogged:
			if (oEventItem.Message.Name != "")
				szMessageName = HTMLEncode(oEventItem.Message.Name);
			else
				szMessageName = "Unknown Message";
			szDescription = "'" + szMessageName + "' logged";
			break;
		default:
			if (iType >= 48 && iType <= 54)	
			{
				strUser = "<b><i>-Unknown-</b></i>";
				switch (oEventItem.SecurityMode)	
				{
					case areamodeOff:
						strState = "Disarmed";
						break;
					case areamodeDay:
						strState = "Armed Day";
						break;
					case areamodeNight:
						strState = "Armed Night";
						break;
					case areamodeAway:	
						strState = "Armed Away";
						break;
					case areamodeVacation:
						strState = "Armed Vacation";
						break;
					case areamodeDayInstant:
						strState = "Armed Day Instant";
						break;
					case areamodeNightDelayed:
						strState = "Armed Night Delayed";
						break;
					default:
						strState = "Unknown Security Mode: " + oEventItem.SecurityMode;
				}
				strUser = HTMLEncode(oEventItem.Code);
				if (oEventItem.AllAreas-0)
					szDescription = "All Areas " + strState + " by " + strUser;
				else	
				{
					var iAreaCount = g_oHAI.Areas.count;
					strAreaName = HTMLEncode(oEventItem.Area.Name);
					if (strAreaName == "" && iAreaCount > 1)
					{
						strAreaName = "Area #" + oEventItem.Area.Index;
					}
					else if (strAreaName == "" && iAreaCount == 1)
					{
						strAreaName = "Security";
					}
					if (strAreaName == "(Unknown)")
						szDescription = strState + " by " + strUser;
					else
						szDescription = strAreaName + " " + strState + " by " + strUser;
				}
			}
			else
				szDescription = "";
	}
	
	return szDescription;
}

////////////////////////////////////////////////////////////////////////////////
// GetOnSystemEventDescription: Get the OnSystemEvent description
////////////////////////////////////////////////////////////////////////////////
function GetOnSystemEventDescription
(
	oEventItem
)
{
	iType = oEventItem.Type-0;
			
	// Get the event description
	switch (iType)	
	{
		case seACPowerOff:
			szDescription = "A/C Power is Off";
			break;
		case seACPowerRestored:
			szDescription = "A/C Power has been restored";
			break;
		case seBatteryLow:
			szDescription = "Controller battery is low";
			break;
		case seEnergyCostLow:
			szDescription = "Energy cost is low";
			break;
		case seEnergyCostMid:
			szDescription = "Energy cost is medium";
			break;
		case seEnergyCostHigh:
			szDescription = "Engery cost is high";
			break;
		case seEnergyCostCritical:
			szDescription = "Energy cost is critical";
			break;
		case seZoneStateChange:
			szDescription = oEventItem.Zone.Name + " is ";
			if (oEventItem.Zone.CurrCondition == 0)
				szDescription += "now secure";
			else
				szDescription += "not ready";
			break;
		case seUnitStateChange:
			szDescription = new String(oEventItem.Unit.Name);
			if (szDescription.substr(szDescription.length-1).toUpperCase() == "S")
				szDescription += " are now "
			else
				szDescription += " is now ";
				
			if (oEventItem.Unit.Status == 0)
				szDescription += "off";
			else
				szDescription += "on";
			break;
		default:
			szDescription = "";
	}
	
	return szDescription;
}

////////////////////////////////////////////////////////////////////////////////
// getControllerSettings: Get controller information for the settings page
////////////////////////////////////////////////////////////////////////////////
function getControllerSettings()
{
	var szXML = "<CONTROLLER>";

	// Show demo mode option
	if (g_ShowDemoOption)
		szXML += "<SHOWDEMOOPTION />";
			
	try
	{
		// Get Model Name
		szXML += "<MODEL>" + HTMLEncode(g_oHAI.Model) + "</MODEL>";
		
			
		// Download Names/Setup
		szXML += "<DOWNLOADSETUP>" + g_oHAI.DownloadSetup + "</DOWNLOADSETUP>";
		szXML += "<DOWNLOADNAMES>" + g_oHAI.DownloadNames + "</DOWNLOADNAMES>";
		szXML += "<SETUPLASTDOWNLOAD>" + formatDateTime(new Date(g_oHAI.SetupLastDownload),2) + " on " + formatDateTime(new Date(g_oHAI.SetupLastDownload),1) + "</SETUPLASTDOWNLOAD>";
		szXML += "<NAMESLASTDOWNLOAD>" + formatDateTime(new Date(g_oHAI.NamesLastDownload),2) + " on " + formatDateTime(new Date(g_oHAI.NamesLastDownload),1) + "</NAMESLASTDOWNLOAD>";
		szXML += "<SETCONTROLLERTIME>" + g_oHAI.SetControllerTime + "</SETCONTROLLERTIME>";
		szXML += "<ACCESSCODE>" + g_oHAI.AccessCode + "</ACCESSCODE>";

		// Status
		szXML += "<STATUS>" + g_oHAI.Status + "</STATUS>";
		
		// Comm Handler Info
		szXML += "<COMMHANDLERS>";
		szXML += "<CURRENT>" + g_oHAI.CommunicationsHandler.Name + "</CURRENT>";
		
		var oCommHandlers = g_oHAI.CommHandlers;
		
		for (idx = 1; idx <= oCommHandlers.count; idx++)
		{
			oItem = oCommHandlers.Item(idx);
			switch (oItem.Name)
			{
				case "Network":
					// Get Comm Handler Network Information
					szXML += "<COMMHANDLER>";
					szXML += "<NAME>" + oItem.Name + "</NAME>";
					szXML += "<INDEX>" + idx + "</INDEX>";
					szXML += "<ADDRESS>" + oItem.Address + "</ADDRESS>";
					
					var aryIP = oItem.Address.split(".");
					szXML += "<IP1>" + aryIP[0] + "</IP1>";
					szXML += "<IP2>" + aryIP[1] + "</IP2>";
					szXML += "<IP3>" + aryIP[2] + "</IP3>";
					szXML += "<IP4>" + aryIP[3] + "</IP4>";

					szXML += "<PORT>" + oItem.Port + "</PORT>";
					szXML += "<PRIVATEKEY1>" + oItem.PrivateKey.substring(0,23) + "</PRIVATEKEY1>";
					szXML += "<PRIVATEKEY2>" + oItem.PrivateKey.substring(24) + "</PRIVATEKEY2>";
					szXML += "</COMMHANDLER>";
					break;
					
				case "Remote":
					// Get Comm Handler Network Information
					szXML += "<COMMHANDLER>";
					szXML += "<NAME>" + oItem.Name + "</NAME>";
					szXML += "<INDEX>" + idx + "</INDEX>";
					szXML += "<ADDRESS>" + oItem.Address + "</ADDRESS>";
					szXML += "<PORT>" + oItem.Port + "</PORT>";
					szXML += "</COMMHANDLER>";
					break;
									
				case "Serial":
					// Get Comm Handler Serial Information
					szXML += "<COMMHANDLER>";
					szXML += "<NAME>" + oItem.Name + "</NAME>";
					szXML += "<INDEX>" + idx + "</INDEX>";
					szXML += "<BAUDRATE>" + oItem.BaudRate + "</BAUDRATE>";
					szXML += "<PORT>" + oItem.Port + "</PORT>";
					szXML += "</COMMHANDLER>";
					break;
			}
		}


		szXML += "</COMMHANDLERS>";
	}
	catch (oError)
	{
	}
	szXML += "</CONTROLLER>";
	return szXML;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Connection_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Connection_PageData()
{
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("settings_controller");
	}
	else	// Get live data from the controller
	{
		szResult = getControllerSettings();		// Get Data
	}
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Address_Port_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Address_Port_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Serial_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Serial_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Nwrk_Encrypt_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Nwrk_Encrypt_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Code_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Code_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Ctrlr_Finish_PageData -- Get the Controller Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Ctrlr_Finish_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Edit_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Rule_Edit_PageData
(
	iRule
)
{
	return GetRuleXML(iRule);
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Condition_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Condition_PageData()
{
	var bEdit;
	GetXMLValue("/RULE/EVENT/EVENT_TYPE") == "" ? bEdit = false : bEdit = true; 
	
	// If an EventType exists then we know we are editing a rule or moved backward
	// in the wizard so we need to preserve the XML.
	if (bEdit)
		return oXMLDoc.xml;
	else
		return "<RULE><TYPE>New</TYPE><EVENT></EVENT><NOTIFICATION></NOTIFICATION></RULE>";
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Unit_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Unit_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Alarm_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Alarm_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Zone_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Zone_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Security_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Security_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Zone_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Zone_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Video_Properties_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Video_Properties_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Wiz_Rule_Name_PageData -- Get the Rule Wizard Data
////////////////////////////////////////////////////////////////////////////////
function Get_Wiz_Rule_Name_PageData()
{
	return oXMLDoc.xml;
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements -- Update current page elements if their state changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements
(
	oEventItem
)
{
	iType = oEventItem.Type-0;

	// Get the event description
	switch (iType)	
	{
		case eZoneBypass:
		case eZoneRestored:
		case eZoneTripped:
		case eZoneTrouble:
		case seZoneStateChange:
			if (g_iCurrentPage == PAGE_SECURITY_ZONES)
			{
				UpdatePageElements_Security_Zones(oEventItem);
			}
			break;
		case seUnitStateChange:
			// Only handle event if current page is Lights, Appliances, Lights_Command or Appliances_Command
			switch (g_iCurrentPage)
			{
				case PAGE_CONTROL:					// Lights List Page
				case PAGE_CONTROL_OUTPUTS:			// Appliances List Page
					UpdatePageElements_ControlList(oEventItem);
					break;
				case PAGE_CONTROL_COMMAND:			// Lights Command Page
				case PAGE_CONTROL_COMMAND_APLNC:	// Appliances Command Page
					UpdatePageElements_ControlCmd(oEventItem);
					break;
			}
			break;
		case eAreaAlarmActivated:
		case eAreaAlarmReset:
		case eAreaDisarmed:
		case eAreaArmedDay:
		case eAreaArmedNight:
		case eAreaArmedAway:
		case eAreaArmedVacation:
		case eAreaArmedDayInstant:
		case eAreaArmedNightDelayed:
			switch (g_iCurrentPage)
			{
				case PAGE_HOME:
					UpdatePageElements_Home(oEventItem);
					break;
				case PAGE_SECURITY:
					UpdatePageElements_Security(oEventItem);
					break;
				case PAGE_SECURITY_ZONES:
					UpdatePageElements_Security_Zones_Area(oEventItem);
					break;
			}
			break;
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_ControlList -- Update control list page elements if changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_ControlList
(
	oEventItem
)
{
	try
	{
		var iEventID = oEventItem.Unit.ID-0;
		var iElementID;
		
		// Loop through all page elements until you find a match
		for (idx = 0; idx < spnVMItem.length; idx++)
		{
			iElementID = spnVMItem[idx].DataID-0;

			if (iEventID == iElementID)
			{
				var oElement = spnVMItem[idx].children(0).children(0).children(0);
				var szImage = new String(oElement.children(0).children(0).filters(0).src);
				
				var szTimeRemaining = "";
				if (oEventItem.Unit.TimeRemaining != "00:00:00")
					szTimeRemaining = "<br/><font style='font-size:smaller'>Time remaining = " + oEventItem.Unit.TimeRemaining + "</font>";
					
				// Update table row
				if (oEventItem.Unit.Status == 0)
				{
					oElement.children(2).innerHTML = "Off" + szTimeRemaining;
					var re = /_on/g;
					oElement.children(0).children(0).filters(0).src = szImage.replace(re,"_off");
				}
				else
				{
					oElement.children(2).innerHTML = "On" + szTimeRemaining;
					var re = /_off/g;
					oElement.children(0).children(0).filters(0).src = szImage.replace(re,"_on");
				}
			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_ControlCmd -- Update control command page elements if changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_ControlCmd
(
	oEventItem
)
{
	try
	{
		var iEventID = oEventItem.Unit.ID-0;
		var iElementID = tblControlItem.DataID-0;
		
		if (iEventID == iElementID)
		{
			var oElement = tblControlItem.children(0).children(0);
			var szImage = new String(spnWatermark.filters(0).src);

			var szTimeRemaining = "";
			if (oEventItem.Unit.TimeRemaining != "00:00:00")
				szTimeRemaining = "<br/><font style='font-size:smaller'>Time remaining = " + oEventItem.Unit.TimeRemaining + "</font>";
			
			// Update table row
			if (oEventItem.Unit.Status == 0)
			{
				oElement.children(1).innerHTML = "Off" + szTimeRemaining;
				var re = /_on/g;
				spnWatermark.filters(0).src = szImage.replace(re,"_off");
			}
			else
			{
				oElement.children(1).innerHTML = "On" + szTimeRemaining;
				var re = /_off/g;
				spnWatermark.filters(0).src = szImage.replace(re,"_on");
			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_Security_Zones -- Update zones page elements if changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_Security_Zones
(
	oEventItem
)
{
	try
	{
		var iEventID = oEventItem.Zone.ID-0;
		var iElementID;
		
		// Loop through all page elements until you find a match
		for (idx = 0; idx < spnVMItem.length; idx++)
		{
			iElementID = spnVMItem[idx].DataID-0;

			if (iEventID == iElementID)
			{
				var oElement = spnVMItem[idx].children(0).children(0).children(0);
				var oImage = oElement.children(0).children(0).filters(0);
				var szStatus = new String();
				
				// Determine updated status
				if (oEventItem.Zone.AlarmStatus > 0)
				{
					if (oEventItem.Zone.AlarmStatus == 1)
					{
						szStatus = "<Font color='Red' style='font-weight:bold'>Tripped</Font>: ";
						oImage.src = IMG_ONNOTSECURE;
					}
					if (oEventItem.Zone.AlarmStatus == 2)
						szStatus = "<Font color='Red' style='font-weight:bold'>Reset</Font>: ";
						
				}
				else
				{
					if (oEventItem.Zone.ArmingStatus == 0)
						oImage.src = IMG_OFFNOTSECURE;
						
					if (oEventItem.Zone.ArmingStatus == 1)
					{
						szStatus = "Armed: ";
						oImage.src = IMG_ONSECURE;
					}
					
					if (oEventItem.Zone.ArmingStatus == 2 || oEventItem.Zone.ArmingStatus == 3)
					{
						szStatus = "<Font color='#FEFAF7' style='font-weight:bold'>Bypassed</Font>: ";
						oImage.src = IMG_BYPASSED;
					}
				}
				
				switch (oEventItem.Zone.CurrCondition)
				{
					case 0:
						szStatus += "Secure";
						break;
					case 1:
						szStatus += "Not Ready";
						break;
					case 2:
						szStatus += "<Font color='Red' style='font-weight:bold'>Trouble now</Font>";
						oImage.src = IMG_STATUSNOTOK;
						break;
					default:
						if (oEventItem.Zone.HadTrouble)
						{
							szStatus += "Had Trouble";
							oImage.src = IMG_STATUSNOTOK;
						}
				}

				// Update table row
				oElement.children(2).innerHTML = szStatus;
			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_Security_Zones_Area -- Update area information on security zones page
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_Security_Zones_Area
(
	oEventItem
)
{
	try
	{
		var iAreaID = parseInt(spnPageSubTitle.DataID);
		var iEventID = parseInt(oEventItem.Area.ID);
		
		// Update Page Subtitle with Area Armed State
		if (iAreaID == iEventID)
		{
			var szStatus
			
			switch (oEventItem.Area.SecurityMode)
			{
				case areamodeOff:
					szStatus = "Disarmed";
					break;
				case areamodeDay:
					szStatus = "Armed Day";
					break;
				case areamodeNight:
					szStatus = "Armed Night";
					break;
				case areamodeAway:
					szStatus = "Armed Away";
					break;
				case areamodeVacation:
					szStatus = "Armed Vacation";
					break;
				case areamodeDayInstant:
					szStatus = "Armed Day Instant";
					break;
				case areamodeNightDelayed:
					szStatus = "Armed Night Delayed";
					break;
			}

			var szAreaName = oEventItem.Area.Name;
			if (szAreaName == "")
				szAreaName = "Security";

			spnPageSubTitle.innerText = szAreaName + " - " + szStatus;
		}
	
		// Update the state of each zone
		var iElementID;
		
		// Loop through all page elements until you find a match
		for (idx = 0; idx < spnVMItem.length; idx++)
		{
			iElementID = spnVMItem[idx].DataID-0;

			var oElement = spnVMItem[idx].children(0).children(0).children(0);
			var oImage = oElement.children(0).children(0).filters(0);
			var szStatus = new String();
			var oZone = g_oHAI.Zones.Item(0,iElementID);
			
			// Determine updated status
			if (oZone.AlarmStatus > 0)
			{
				if (oZone.AlarmStatus == 1)
				{
					szStatus = "<Font color='Red' style='font-weight:bold'>Tripped</Font>: ";
					oImage.src = IMG_ONNOTSECURE;
				}
				if (oZone.AlarmStatus == 2)
					szStatus = "<Font color='Red' style='font-weight:bold'>Reset</Font>: ";
					
			}
			else
			{
				if (oZone.ArmingStatus == 0)
					oImage.src = IMG_OFFNOTSECURE;
					
				if (oZone.ArmingStatus == 1)
				{
					szStatus = "Armed: ";
					oImage.src = IMG_ONSECURE;
				}
				
				if (oZone.ArmingStatus == 2 || oZone.ArmingStatus == 3)
				{
					szStatus = "<Font color='#FEFAF7' style='font-weight:bold'>Bypassed</Font>: ";
					oImage.src = IMG_BYPASSED;
				}
			}
			
			switch (oZone.CurrCondition)
			{
				case 0:
					szStatus += "Secure";
					break;
				case 1:
					szStatus += "Not Ready";
					break;
				case 2:
					szStatus += "<Font color='Red' style='font-weight:bold'>Trouble now</Font>";
					oImage.src = IMG_STATUSNOTOK;
					break;
				default:
					if (oZone.HadTrouble)
					{
						szStatus += "Had Trouble";
						oImage.src = IMG_STATUSNOTOK;
					}
			}

			// Update table row
			oElement.children(2).innerHTML = szStatus;
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_Home -- Update home page security elements if changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_Home
(
	oEventItem
)
{
	try
	{
		var iEventID = oEventItem.Area.ID-0;
		var iElementID;
		
		var iNumAreas = parseInt(trArea.length);
		if (isNaN(iNumAreas))
			iNumAreas = 1;
			
		// Loop through all page elements until you find a match
		for (idx = 0; idx < iNumAreas; idx++)
		{
			if (iNumAreas == 1)
				iElementID = trArea.DataID-0;
			else			
				iElementID = trArea[idx].DataID-0;

			if (iEventID == iElementID)
			{
				var oElement;
				if (iNumAreas == 1)
					oElement = trArea.children(1);
				else
					oElement = trArea[idx].children(1);
					
				var szStatus = new String();
				
				switch (oEventItem.Area.SecurityMode)
				{
					case areamodeOff:
						szStatus = "Disarmed<br/>";
						break;
					case areamodeDay:
						szStatus = "Armed Day<br/>";
						break;
					case areamodeNight:
						szStatus = "Armed Night<br/>";
						break;
					case areamodeAway:
						szStatus = "Armed Away<br/>";
						break;
					case areamodeVacation:
						szStatus = "Armed Vacation<br/>";
						break;
					case areamodeDayInstant:
						szStatus = "Armed Day Instant<br/>";
						break;
					case areamodeNightDelayed:
						szStatus = "Armed Night Delayed<br/>";
						break;
				}

				// Loop through zones for alerts and create nodes for them
				var oZones = oEventItem.Area.Zones;
				var iZoneCount = oZones.count;

				for (idxZ=1; idxZ<=iZoneCount; idxZ++)	
				{
					oZoneItem = oZones(idxZ);
					iZoneArea = (oZoneItem.Area.Index-0);
					if(iZoneArea == iEventID)	
					{
						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 += "Burglary Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Burglary Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztFire:
							case ztFireEmergency:
								if(iAS == alarmTripped)
									szZoneDetails += "Fire Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Fire Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztGas:
								if(iAS == alarmTripped)
									szZoneDetails += "Gas Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Gas Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztAuxEmergency:
								if(iAS == alarmTripped)
									szZoneDetails += "Auxiliary Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Auxiliary Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztFreeze:
								if(iAS == alarmTripped)
									szZoneDetails += "Freeze Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Freeze Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztWater:
								if(iAS == alarmTripped)
									szZoneDetails += "Water Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Water Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							case ztTemperatureAlarm:
								if(iAS == alarmTripped)
									szZoneDetails += "Temperature Alarm";
								else if(iAS == alarmReset)
									szZoneDetails += "Temperature Alarm Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "Zone Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "Zone Had Trouble";
								break;
							default:
								if(iAS == alarmTripped)
									szZoneDetails += "Trouble Alert";
								else if(iAS == alarmReset)
									szZoneDetails += "Trouble Alert Reset";
								if(iCC == zoneTrouble)
									szZoneDetails += "System Trouble";
								else if(oZoneItem.HadTrouble)
									szZoneDetails += "System Had Trouble";
						}

						// Get the Arming Status
						if ( (iArmStatus == armingUserBypass) || (iArmStatus == armingSystemBypass) )
							szZoneDetails += "Zone Bypassed";
						
						if (szZoneDetails != "")
							szStatus += "<font class='ZoneInfo'><b>" + szZoneDetails + "</b> (" + oZoneItem.Name + ")</font><br/>";
							
						szZoneDetails = "";
					}
				}

				// Update table row
				oElement.innerHTML = szStatus;

			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// UpdatePageElements_Security -- Update security page elements if changed
////////////////////////////////////////////////////////////////////////////////
function UpdatePageElements_Security
(
	oEventItem
)
{
	try
	{
		var iEventID = oEventItem.Area.ID-0;
		var iElementID;
		
		// Loop through all page elements until you find a match
		for (idx = 0; idx < spnVMItem.length; idx++)
		{
			iElementID = spnVMItem[idx].DataID-0;

			if (iEventID == iElementID)
			{
				var oElement = spnVMItem[idx].children(0).children(0).children(0);
				var oImage = oElement.children(0).children(0).filters(0);
				var szStatus = new String();
				
				switch (oEventItem.Area.SecurityMode)
				{
					case areamodeOff:
						szStatus = "Disarmed";
						break;
					case areamodeDay:
						szStatus = "Armed Day";
						break;
					case areamodeNight:
						szStatus = "Armed Night";
						break;
					case areamodeAway:
						szStatus = "Armed Away";
						break;
					case areamodeVacation:
						szStatus = "Armed Vacation";
						break;
					case areamodeDayInstant:
						szStatus = "Armed Day Instant";
						break;
					case areamodeNightDelayed:
						szStatus = "Armed Night Delayed";
						break;
				}

				// Update table row
				oElement.children(2).innerHTML = szStatus;

				if (oEventItem.Area.SecurityMode == 0)
					oImage.src = IMG_SECURITYOFFNOTSECURE;
				else
					oImage.src = IMG_SECURITYONSECURE
			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// ForceAllOnOff -- Force everything on the control list page to be On or Off 
////////////////////////////////////////////////////////////////////////////////
function ForceAllOnOff
(
	iMode
)
{
	try
	{
		// Loop through all page elements
		for (idx = 0; idx < spnVMItem.length; idx++)
		{
			var oElement = spnVMItem[idx].children(0).children(0).children(0);
			var szImage = new String(oElement.children(0).children(0).filters(0).src);
			
			// Update table row
			if (iMode == control_all_off)
			{
				oElement.children(2).innerHTML = "Off";
				var re = /_on/g;
				oElement.children(0).children(0).filters(0).src = szImage.replace(re,"_off");
			}
			else
			{
				oElement.children(2).innerHTML = "On";
				var re = /_off/g;
				oElement.children(0).children(0).filters(0).src = szImage.replace(re,"_on");
			}
		}
	}
	catch(oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// data_Download -- Download information from controller
////////////////////////////////////////////////////////////////////////////////
function data_Download
(
	iDownloadType
)
{
	// If in demo mode then bail
	if (DEMO_MODE)
	{
		ErrorHandler(null, ERR_DEMO_COMMANDS);
		return;
	}

	MessageHandler(MSG_DOWNLOAD_DATA);
	
	switch (iDownloadType)
	{
		case DL_SETUP:
			g_oHAI.DownloadSetupNow();
			break;
		case DL_NAMES:
			g_oHAI.DownloadNamesNow();
			break;
		default:
			return;
	}
	
	RefreshCurrentPage();
}

////////////////////////////////////////////////////////////////////////////////
// SaveSyncSettings -- Save Controller Sync Preference Settings
////////////////////////////////////////////////////////////////////////////////
function SaveSyncSettings()
{
	// If in demo mode then bail
	if (DEMO_MODE)
	{
		ErrorHandler(null, ERR_DEMO_COMMANDS);
		return;
	}

	// Set Download Setup
	CheckBox_Checked(spnDownloadSetup) ? g_oHAI.DownloadSetup = true : g_oHAI.DownloadSetup = false;

	// Set Download Names
	CheckBox_Checked(spnDownloadNames) ? g_oHAI.Downloadnames = true : g_oHAI.DownloadNames = false;

	// Set Set Controller Time
	CheckBox_Checked(spnSyncTime) ? g_oHAI.SetControllerTime = true : g_oHAI.SetControllerTime = false;
	
	g_oHAI.SaveSetup();
}

////////////////////////////////////////////////////////////////////////////////
// Get_Units_XML -- Get Units XML
////////////////////////////////////////////////////////////////////////////////
function Get_Units_XML()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("control");
	}
	else	// Get live data from the controller
	{
		var oXMLTemp = new ActiveXObject("MICROSOFT.XMLDOM");
			oXMLTemp.async = false;
		g_oHAI.Units.SaveXML(oXMLTemp);	// Get Data
		szResult = oXMLTemp.xml;
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Areas_XML -- Get Areas XML
////////////////////////////////////////////////////////////////////////////////
function Get_Areas_XML()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("security");
	}
	else	// Get live data from the controller
	{
		var oXMLTemp = new ActiveXObject("MICROSOFT.XMLDOM");
			oXMLTemp.async = false;
		g_oHAI.Areas.SaveXML(oXMLTemp);	// Get Data
		szResult = oXMLTemp.xml;
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Users_XML -- Get Users XML
////////////////////////////////////////////////////////////////////////////////
function Get_Users_XML()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("users");
	}
	else	// Get live data from the controller
	{
		var oXMLTemp = new ActiveXObject("MICROSOFT.XMLDOM");
			oXMLTemp.async = false;
		g_oHAI.Codes.SaveXML(oXMLTemp);	// Get Data
		szResult = oXMLTemp.xml;
	}

	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// Get_Zones_XML -- Get Zones XML
////////////////////////////////////////////////////////////////////////////////
function Get_Zones_XML()
{
	var szResult;
	
	// If running in demo mode then use static data
	if (DEMO_MODE)
	{
		szResult = Get_Static_Demo_Data("security_zones");
	}
	else	// Get live data from the controller
	{
		var oXMLTemp = new ActiveXObject("MICROSOFT.XMLDOM");
			oXMLTemp.async = false;
		g_oHAI.Zones.SaveXML(oXMLTemp);	// Get Data
		szResult = oXMLTemp.xml;
	}

	return szResult;
}

