////////////////////////////////////////////////////////////////////////////////
//   Rules & Events Library
////////////////////////////////////////////////////////////////////////////////

// <script language="javascript">
// Copyright (c) Home Automation, Inc. All rights reserved.          
// Copyright (c) HomeRun Software Systems LLC. All rights reserved.

////////////////////////////////////////////////////////////////////////////////
// Globals
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// GetRulesXML: Gets the Rules in XML 
////////////////////////////////////////////////////////////////////////////////
function GetRulesXML()
{
	var oEventMgr;
	var oRules;
	var szXML = "<RULES>";
	
	try
	{
		oEventMgr = g_oHAI.Extensions("Event Manager");
		oRules = oEventMgr.Rules;
	}
	catch (oError)
	{
		szErrNum  = oError.number + 4294967296;
		szErrNum  = "0x" + szErrNum.toString(16);
		return "<RULES><RULEERROR><NUMBER>" + szErrNum + "</NUMBER></RULEERROR></RULES>";
	}

	try
	{
		// Loop through all rules and generate XML
		for (idx = 1; idx <= oRules.count; idx++)
		{
			oRule = oRules.Item(idx);
			oEvent = oRule.Event;
			oHandler = oRule.EventHandler;

			// Format the date/time of the event if it has occurred
			dtRule = new Date(oRule.LastOccurred);
			if (dtRule.valueOf() > 631180800000 )	// 1/1/1990
			{
				szDate = formatDateTime(dtRule,1);
				szTime = formatDateTime(dtRule,2);
			}
			else
			{
				szDate = "None";
				szTime = "";
			}
			szXML += "<RULE><ID>" + idx + "</ID><STATUS>" + oRule.Enabled + "</STATUS>";
			szXML += "<NAME>" + oRule.Name + "</NAME>";
			szXML += "<LAST_NOTIFY>" + szDate + " " + szTime + "</LAST_NOTIFY>";
			szXML += "<EVENT><EVENT_TYPE>" + oEvent.Type + "</EVENT_TYPE><NAME>" + oEvent.Name + "</NAME>";
			szXML += getEventDetails(oEvent.Type) + "</EVENT>";
			szXML += "<NOTIFICATION><NOTIFY_TYPE>" + oHandler.Name + "</NOTIFY_TYPE>";
			szXML += getNotificationDetails(oHandler.Name) + "</NOTIFICATION></RULE>";
		}
	
		szXML += "</RULES>";
	}
	catch (oError)
	{
	}
	return szXML;
}

////////////////////////////////////////////////////////////////////////////////
// GetRuleXML: Gets the Rules in XML only for the specified rule
////////////////////////////////////////////////////////////////////////////////
function GetRuleXML
(
	iRule
)
{
	var oEventMgr = g_oHAI.Extensions("Event Manager");

	var oRules = oEventMgr.Rules;
	var szXML = "";

	var oRule = oRules.Item(parseInt(iRule));
	var oEvent = oRule.Event;
	var oHandler = oRule.EventHandler;

	// Format the date/time of the event if it has occurred
	dtRule = new Date(oRule.LastOccurred);
	if (dtRule.valueOf() > 631180800000 )	// 1/1/1990
	{
		szDate = formatDateTime(dtRule,1);
		szTime = formatDateTime(dtRule,2);
	}
	else
	{
		szDate = "None";
		szTime = "";
	}
	szXML += "<RULE><ID>" + iRule + "</ID><STATUS>" + oRule.Enabled + "</STATUS>";
	szXML += "<NAME>" + oRule.Name + "</NAME>";
	szXML += "<LAST_NOTIFY>" + szDate + " " + szTime + "</LAST_NOTIFY>";
	szXML += "<EVENT><EVENT_TYPE>" + oEvent.Type + "</EVENT_TYPE><NAME>" + oEvent.Name + "</NAME>";
	szXML += getEventDetails(oEvent) + "</EVENT>";
	szXML += "<NOTIFICATION><NOTIFY_TYPE>" + oHandler.Name + "</NOTIFY_TYPE>";
	szXML += getNotificationDetails(oHandler) + "</NOTIFICATION></RULE>";

	return szXML;
}

////////////////////////////////////////////////////////////////////////////////
// getNotificationDetails: Get any notification details for the given handler
////////////////////////////////////////////////////////////////////////////////
function getNotificationDetails
(
	oRuleHandler
)
{
	var szReturn = "";
	
	switch (oRuleHandler.Name)
	{
		case "Send Email":
			szReturn += "<EMAILTYPE>" + oRuleHandler.EmailType + "</EMAILTYPE>";
		case "Send Email (Plain Text)":
			szReturn += "<EMAILNAME>" + HTMLEncode(oRuleHandler.EmailName) + "</EMAILNAME>";
			if (oRuleHandler.SMTPServer != "")
				szReturn += "<SMTPSERVER>" + HTMLEncode(oRuleHandler.SMTPServer) + "</SMTPSERVER>";
			break;
		case "Record Video":
			szReturn += "<CHANNEL>" + HTMLEncode(oRuleHandler.Channel) + "</CHANNEL>";
			var iRecordDuration = ( (oRuleHandler.RecordDuration - 0) / 60000);
			szReturn += "<RECORDDURATION>" + iRecordDuration + "</RECORDDURATION>";
			break;
		case "Send Instant Message":
			// No additional details needed.
			break;
		case "Record MCE Video":
			szReturn += "<CHANNEL>" + oRuleHandler.Channel + "</CHANNEL>";
			szReturn += "<RECORDDURATION>" + oRuleHandler.RecordDuration + "</RECORDDURATION>";
			szReturn += "<GUARANTEEDRECORDING>" + oRuleHandler.Guaranteed + "</GUARANTEEDRECORDING>";
			break;
	}
	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getEventDetails: Get any specific event details for the specified type
////////////////////////////////////////////////////////////////////////////////
function getEventDetails
(
	oRuleEvent
)
{
	var szReturn = "";
	
	switch (oRuleEvent.Type)
	{
		case EC_ALARM:
			var szArea;
			var iArea;
			
			if (g_oHAI.Areas(0,oRuleEvent.Area) == "(Unknown)")
			{
				szArea = "Any";
				iArea  = -1;
			}
			else
			{
				szArea = g_oHAI.Areas(0,oRuleEvent.Area);
				iArea  = oRuleEvent.Area;
			}
			
			if (szArea == "")
				szArea = "Area #" + oRuleEvent.Area;
				
			szReturn += "<AREA>" + szArea + "</AREA>";
			szReturn += "<AREAID>" + oRuleEvent.Area + "</AREAID>";
			szReturn += "<ALARMTYPE>" + HTMLEncode(getAlarmTypeName(oRuleEvent.AlarmType)) + "</ALARMTYPE>";
			szReturn += "<ALARMTYPEID>" + oRuleEvent.AlarmType + "</ALARMTYPEID>";
			break;
		case EC_ALL_ON_OFF:
			var szArea;
			
			if (g_oHAI.Areas(0,oRuleEvent.Area) == "(Unknown)")
				szArea = "Any";
			else
				szArea = HTMLEncode(g_oHAI.Areas(0,oRuleEvent.Area));

			if (szArea == "")
				szArea = "Area #" + oRuleEvent.Area;

			szReturn += "<AREA>" + szArea + "</AREA>";
			szReturn += "<STATE>" + HTMLEncode(getStateName(oRuleEvent.State)) + "</STATE>";
			break;
		case EC_ANY:
			// Nothing to do here
			break;
		case EC_BUTTON:
			var szButton;
			if (g_oHAI.Buttons(0,oRuleEvent.Button) == "(Unknown)")
				szButton = "Any";
			else
				szButton = HTMLEncode(g_oHAI.Buttons(0,oRuleEvent.Button));
				
			szReturn += "<BUTTON>" + szButton + "</BUTTON>";
			break;
		case EC_SECURITY:	// Security Event
			var szSecurityCode;
			var szArea;
			var iArea;
			
			if (g_oHAI.Areas(0,oRuleEvent.Area) == "(Unknown)")
			{
				szArea = "Any";
				iArea  = -1;
			}
			else
			{
				szArea = g_oHAI.Areas(0,oRuleEvent.Area);
				iArea  = oRuleEvent.Area;
			}
			
			if (szArea == "")
				szArea = "Area #" + oRuleEvent.Area;

			szReturn += "<AREA>" + szArea + "</AREA>";
			szReturn += "<AREAID>" + iArea + "</AREAID>";
			szReturn += "<SECURITYMODE>" + HTMLEncode(getSecurityModeName(oRuleEvent.SecurityMode - 0)) + "</SECURITYMODE>";
			szReturn += "<SECURITYMODEID>" + oRuleEvent.SecurityMode + "</SECURITYMODEID>";
			szReturn += "<SECURITYCODE>" + oRuleEvent.SecurityCode + "</SECURITYCODE>";
			
			if (g_oHAI.codes(0,oRuleEvent.SecurityCode).Name == "(Unknown)")
				szSecurityCode = "User #" + oRuleEvent.SecurityCode;
			else
				szSecurityCode = g_oHAI.codes(0,oRuleEvent.SecurityCode).Name;
				
			if (szSecurityCode == "")
				szSecurityCode = "User #" + oRuleEvent.SecurityCode;
			
			szReturn += "<SECURITYUSER>" + HTMLEncode(szSecurityCode) + "</SECURITYUSER>";
			break;
		case EC_UNIT:
			var szUnit;
			var iUnit;
			
			if (g_oHAI.Units(0,oRuleEvent.Unit) == "(Unknown)")
			{
				szUnit = "Any";
				iUnit  = -1;
			}
			else
			{
				szUnit = HTMLEncode(g_oHAI.Units(0,oRuleEvent.Unit));
				iUnit  = oRuleEvent.Unit;
			}
				
			szReturn += "<UNIT>" + szUnit + "</UNIT>";
			szReturn += "<UNITID>" + iUnit + "</UNITID>";
			szReturn += "<STATE>" + HTMLEncode(getStateName(oRuleEvent.State)) + "</STATE>";
			szReturn += "<STATEID>" + oRuleEvent.State + "</STATEID>";
			break;
		case EC_BATTERY:
		case EC_DCM:
		case EC_PHONE:
			szReturn += "<STATE>" + oRuleEvent.State + "</STATE>";
			break;
		case EC_ENERGY:
		case EC_POWER:
			//szReturn += "<STATE>" + HTMLEncode(getStateName(oEvent.State)) + "</STATE>";
			szReturn += "<STATE>" + oRuleEvent.State + "</STATE>";
			break;
		case EC_ZONE:
			var szZone;
			var iZone;
			
			if (g_oHAI.Zones(0,oRuleEvent.Zone) == "(Unknown)")
			{
				szZone = "Any";
				iZone  = -1;
			}
			else
			{
				szZone = HTMLEncode(g_oHAI.Zones(0,oRuleEvent.Zone))
				iZone  = oRuleEvent.Zone;
			}
				
			szReturn += "<ZONE>" + szZone + "</ZONE>";
			szReturn += "<ZONEID>" + oRuleEvent.Zone + "</ZONEID>";
			szReturn += "<STATE>" + getZoneStateName(oRuleEvent.State) + "</STATE>";
			szReturn += "<STATEID>" + oRuleEvent.State + "</STATEID>";
			break;
		case EC_X10:
			szReturn += "<STATE>" + getStateName(oRuleEvent.State) + "</STATE>";
			szReturn += "<UNIT>" + ((oRuleEvent.Unit - 0) + 1) + "</UNIT>";
			szReturn += "<HOUSECODE>" + getHouseCode(oRuleEvent.HouseCode) + "</HOUSECODE>";
			szReturn += "<ALLUNITS>" + oRuleEvent.AllUnits + "</ALLUNITS>";
			break;
	}

	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getStateName: get the state of the item
////////////////////////////////////////////////////////////////////////////////
function getStateName
(
	iState
)
{
	var szReturn = iState;
	
	switch (iState)
	{
		case 1:
			szReturn = "On";
			break;
		case 0:
			szReturn = "Off";
			break;
		case -1:
			szReturn = "Any";
			break;
	}
	
	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getZoneStateName: get the state of the zone item
////////////////////////////////////////////////////////////////////////////////
function getZoneStateName
(
	iState
)
{
	var szReturn = iState;
	
	switch (iState)
	{
		case 1:
			szReturn = "Not Ready";
			break;
		case 0:
			szReturn = "Secure";
			break;
		case -1:
			szReturn = "Secure or Not Ready";
			break;
	}
	
	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getHouseCode: get the house code
////////////////////////////////////////////////////////////////////////////////
function getHouseCode
(
	iHouseCode
)
{
	var szReturn = iHouseCode;
	
	switch (iHouseCode)
	{
		case 0:
			szReturn = "A";
			break;
		case 1:
			szReturn = "B";
			break;
		case 2:
			szReturn = "C";
			break;
		case 3:
			szReturn = "D";
			break;
		case 4:
			szReturn = "E";
			break;
		case 5:
			szReturn = "F";
			break;
		case 6:
			szReturn = "G";
			break;
		case 7:
			szReturn = "H";
			break;
		case 8:
			szReturn = "I";
			break;
		case 9:
			szReturn = "J";
			break;
		case 10:
			szReturn = "K";
			break;
		case 11:
			szReturn = "L";
			break;
		case 12:
			szReturn = "M";
			break;
		case 13:
			szReturn = "N";
			break;
		case 14:
			szReturn = "O";
			break;
		case 15:
			szReturn = "P";
		case -1:
			szReturn = "Any";
			break;
	}
	
	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getSecurityModeName
////////////////////////////////////////////////////////////////////////////////
function getSecurityModeName
(
	iSecurityMode
)
{
	var szReturn = iSecurityMode;
	
	switch (iSecurityMode)
	{
		case areamodeOff:
			szReturn = "Disarm";
			break;
		case areamodeDay:
			szReturn = "Day";
			break;
		case areamodeNight:
			szReturn = "Night";
			break;
		case areamodeAway:
			szReturn = "Away";
			break;
		case areamodeVacation:
			szReturn = "Vacation";
			break;
		case areamodeDayInstant:
			szReturn = "Day Instant";
			break;
		case areamodeNightDelayed:
			szReturn = "Night Delayed";
			break;
		case areamodeAny:
			szReturn = "Any";
			break;
	}
	
	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// getAlarmTypeName
////////////////////////////////////////////////////////////////////////////////
function getAlarmTypeName
(
	iAlarmType
)
{
	var szReturn = iAlarmType;
	
	switch (iAlarmType)
	{
		case -1:	// Any
			szReturn = "Any";
			break;
		case atBurglary:
			szReturn = "Burglary";
			break;
		case atFire:
			szReturn = "Fire";
			break;
		case atGas:
			szReturn = "Gas";
			break;
		case atAuxiliary:
			szReturn = "Auxiliary";
			break;
		case atFreeze:
			szReturn = "Freeze";
			break;
		case atWater:
			szReturn = "Water";
			break;
		case atDuress:
			szReturn = "Duress";
			break;
		case atTemperature:
			szReturn = "Temperature";
			break;
	}

	return (szReturn);
}

////////////////////////////////////////////////////////////////////////////////
// SaveVideoRule -- Save the video rule
////////////////////////////////////////////////////////////////////////////////
function SaveVideoRule()
{
	MessageHandler("Creating rules is not enabled when running in demo mode.");
	return;
}

////////////////////////////////////////////////////////////////////////////////
// ToggleRuleState -- Toggles the state of the specified rule
////////////////////////////////////////////////////////////////////////////////
function ToggleRuleState
(
	iRule
)
{
	var oEventMgr = g_oHAI.Extensions("Event Manager");
	var oRules = oEventMgr.Rules;

	var oRule = oRules.Item(parseInt(iRule));
	
	if (oRule.Enabled == true)
		oRule.Enabled = false;
	else
		oRule	.Enabled = true;
}

////////////////////////////////////////////////////////////////////////////////
// DeleteRule -- Toggles the state of the specified rule
////////////////////////////////////////////////////////////////////////////////
function DeleteRule
(
	iRule
)
{
	var oEventMgr = g_oHAI.Extensions("Event Manager");
	var oRules = oEventMgr.Rules;

	oRules.Delete(parseInt(iRule));
}
