////////////////////////////////////////////////////////////////////////////////
// Utility Functions
////////////////////////////////////////////////////////////////////////////////

// <script language="javascript">
// Copyright (c) Home Automation, Inc. All rights reserved.          
// Copyright (c) HomeRun Software Systems LLC. All rights reserved.

////////////////////////////////////////////////////////////////////////////////
// Global Variables
////////////////////////////////////////////////////////////////////////////////
var g_bPageScaledDown = false;	// Set to true is page is scaled to under 1024 horizontal resolution
var g_LastKeyChar;				// Last keyboard input
var g_szLastSound;				// Last Sound played
var g_iSoundsEnabled = false;	// Enable Sounds
var g_iNotificationsEnabled = true;	// Enable notifications

////////////////////////////////////////////////////////////////////////////////
// onRemoteEvent: Handle remote control entry
////////////////////////////////////////////////////////////////////////////////
function onRemoteEvent(keyChar)
{
	g_LastKeyChar = keyChar;

    try
    {
        switch (keyChar)
        {
        case 0x0D:				// Enter key selected
			eval(g_aryFocusTable[g_CurrentFocus][6].substr(1,g_aryFocusTable[g_CurrentFocus][6].length-2));
			return true;
			break;
			
        case 0x26:				// Up button selected
        case 0x38:
            SetFocus(0);
            return true;
            break;

        case 0x28:				// Down button selected
        case 0x40:
            SetFocus(1);
            return true;
            break;

        case 0x25:				// Left button selected
        case 0x37:
            SetFocus(2);
            return true;
            break;

        case 0x27:				// Right button selected
        case 0x39:
            SetFocus(3);
            return true;
            break;

        case 0xA6:				// Browser Back button selected; Media Center will already perform a Back
        case 0x08:				// Keyboard Backspace selected
			// If the current focus is an input field then disregard
			if ( IsMCERunning() )
			{
				// If the internal navigation history is not empty then supress the navigation
				if (g_NavHistory.length > 1)
				{
					ShowPreviousPage();
					return true;
				}
			}
			else
			{
				if (event.srcElement.tagName != "INPUT")
				{
					// If the internal navigation history is not empty then supress the navigation
					if (g_NavHistory.length > 1)
					{
						ShowPreviousPage();
						event.keyCode = 0;
						return false;
					}
					else
						return true;
				}
				else
					return true;
			}
            break;

        case 0x21:				// Page up (plus) selected; page-up scrolling menu
			if(null != g_VM_VerticalMenu)
			{
				g_VM_VerticalMenu.ScrollPage(VM_DIRECTION_UP)
			}
            return true;
            break;
            
        case 0x22:				// Page down (minus) selected; page-down scrolling menu
			if(null != g_VM_VerticalMenu)
			{
				g_VM_VerticalMenu.ScrollPage(VM_DIRECTION_DOWN)
			}
            return true;
            break;

        default:
            return false;		// ignore all other clicks
        }
    }
    catch(oError)
    {
		ErrorHandler(oError);
    }
}

////////////////////////////////////////////////////////////////////////////////
// PlaySound: Play a sound
////////////////////////////////////////////////////////////////////////////////
function PlaySound
(
	szSound
)
{	
	// if Sounds are disabled then bail
	if (!g_iSoundsEnabled)
		return;
		
	var bPlaySound = true;
	// If the navigation sound is playing then we need to ignore 
	// the next sound since most pages have a sound that plays.

	if (g_szLastSound == SOUND_NAVIGATE && szSound != SOUND_NAVIGATE)
		bPlaySound = false;
		
		
	if (g_szLastSound == SOUND_WELCOME)
		bPlaySound = false;
		
	g_szLastSound = szSound;
	
	try
	{
		if (bPlaySound)
			g_oHAI.Utils.PlaySound(szSound);
	}
	catch (oError)
	{
	}
}

////////////////////////////////////////////////////////////////////////////////
// ShowProcessWait: Display the processing animation
////////////////////////////////////////////////////////////////////////////////
function ShowProcessWait()
{
	// Get the screen height and width
	var iWidth  = document.body.clientWidth;
	var iHeight = document.body.clientHeight;
	var iAnimationWidth  = 60;	// Width of the animation
	var iAnimationHeight = 60;	// Height of the animation
	
	// Center the animation horizontally
	if (iWidth > iAnimationWidth)
		divWait.style.left = Math.round(iWidth/2) - Math.round(iAnimationWidth/2);

	// Center the animation vertically
	if (iHeight > iAnimationHeight)
		divWait.style.top = Math.round(iHeight/2) - Math.round(iAnimationHeight/2);
	
	// Show the animation
	divWait.style.display = "block";
}

////////////////////////////////////////////////////////////////////////////////
// HideProcessWait: Hide the processing animation
////////////////////////////////////////////////////////////////////////////////
function HideProcessWait()
{
	divWait.style.display = "none";
}

////////////////////////////////////////////////////////////////////////////////
// ErrorHandler: Display error message
////////////////////////////////////////////////////////////////////////////////
function ErrorHandler
(
	oError,
	szErrorID,
	szErrorMessage,
	szErrorNumber
)
{
	var szErrDesc;
	var szErrNum;
	
	// First see if an error object was passed in and use it
	if (null != oError)
	{
		szErrDesc = oError.description;
		szErrNum  = oError.number + 4294967296;
		szErrNum  = "0x" + szErrNum.toString(16);
	}
	else if (szErrorID)
	{
		szErrDesc = szErrorID.substring(szErrorID.indexOf(":")+1);
		szErrNum  = szErrorID.substring(0,szErrorID.indexOf(":"));
	}
	else
	{
		szErrDesc = szErrorMessage;
		if (null == szErrorNumber)
			szErrNum = "80004005";
		else
			szErrNum = szErrorNumber;
	}
	
	// Try displaying the error in MCE first, then use default method
	try
	{
		window.external.MediaCenter.Dialog("Error #" + szErrNum + ": " + szErrDesc, PI_ShortName + " Error",1,30,true); 
	}
	catch(e)
	{
		alert(PI_ShortName + " Error #" + szErrNum + ": " + szErrDesc);
	}
}

////////////////////////////////////////////////////////////////////////////////
// MessageHandler: Display message to user
////////////////////////////////////////////////////////////////////////////////
function MessageHandler
(
	szMessage
)
{
	
	// Try displaying the message in MCE first, then use default method
	try
	{
		window.external.MediaCenter.Dialog(szMessage, PI_ShortName,1,30,true); 
	}
	catch(e)
	{
		alert(szMessage);
	}
}

////////////////////////////////////////////////////////////////////////////////
// formatDateTime: Formats a given date/time into specified format
// Params: 1 = m/d/y, 2 = hh:mm AM/PM, 3 = m/d, 4 = hhmmss
////////////////////////////////////////////////////////////////////////////////
function formatDateTime
(
	dtDateTime, 
	iFormat
)	
{
	var szDateTime;
	if (dtDateTime != "Unknown")
	{
		switch (iFormat)	
		{
			case 1:	// m/d/y
				szDateTime = dtDateTime.getMonth() + 1 + "/" + dtDateTime.getDate() + "/" + dtDateTime.getYear() + " ";
				break;
			case 2:	// hh:mm AM/PM	
				var szAMPM = "AM";		
				var szHours = dtDateTime.getHours();
				
				if(szHours >= 12)	
				{
						szAMPM = "PM";
						if (szHours > 12)
							szHours -= 12;
				}
				else	
				{
						if(szHours == 0)
							szHours = 12;
				}
				
				var szMinutes = dtDateTime.getMinutes();
				
				if(szMinutes < 10)
					szMinutes = "0" + szMinutes;
					
				szDateTime = szHours + ":" + szMinutes + " " + szAMPM;
				break;
			case 3:	// m/d
				szDateTime = dtDateTime.getMonth() + 1 + "/" + dtDateTime.getDate() + " ";
				break;
			case 4: // mmddyyhhmmss
				var szMonth = dtDateTime.getMonth() + 1;
				var szDay = dtDateTime.getDate();
				var szYear = new String(dtDateTime.getYear());
				var szHours = dtDateTime.getHours();
				var szMinutes = dtDateTime.getMinutes();
				var szSeconds = dtDateTime.getSeconds();
				
				if (szDay < 10)
					szDay = "0" + szDay;

				if (szMonth < 10)
					szMonth = "0" + szMonth;

				if (szSeconds < 10)
					szSeconds = "0" + szSeconds;

				if (szHours < 10)
					szHours = "0" + szHours;

				if(szMinutes < 10)
					szMinutes = "0" + szMinutes;
					
				szDateTime  = szMonth + "" + szDay + "" + szYear.substr(2,2);
				szDateTime += szHours + "" + szMinutes + "" + szSeconds + "";
				break;
		}
	}
	else
		szDateTime = "Unknown";
		
	// There may be cases where an invalid date was created so override it to unknown
	if (szDateTime.indexOf("NaN",0) != -1)
		szDateTime = "Unknown";
		
	return(szDateTime);
}

////////////////////////////////////////////////////////////////////////////////
// IsArray: Determines if a specified variable is an array
////////////////////////////////////////////////////////////////////////////////
function IsArray
(
	oVariable
)
{
   if (oVariable.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

////////////////////////////////////////////////////////////////////////////////
// IsMCEEnabled: Let's MCE know these pages are designed for MCE
////////////////////////////////////////////////////////////////////////////////
function IsMCEEnabled()
{
	return true;
}

////////////////////////////////////////////////////////////////////////////////
// IsMCERunning: Determines if page is running within MCE
////////////////////////////////////////////////////////////////////////////////
function IsMCERunning()
{
	var bResult = true;
	
	try
	{
		var lTemp = window.external.MediaCenter.MajorVersion
	}
	catch (oError)
	{
		bResult = false;
	}
	
	return bResult;
}

////////////////////////////////////////////////////////////////////////////////
// IsVideoSupported: Determines if recording video is supported
////////////////////////////////////////////////////////////////////////////////
function IsVideoSupported()
{
	return true;
}

////////////////////////////////////////////////////////////////////////////////
// HTMLEncode: Encodes HTML so that it can be properly displayed
////////////////////////////////////////////////////////////////////////////////
function HTMLEncode
(
	szInput
)
{
	//return escape(szInput).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27');
	return szInput
}

////////////////////////////////////////////////////////////////////////////////
// NoOp: No Operation...do nothing
////////////////////////////////////////////////////////////////////////////////
function NoOp()
{
}

////////////////////////////////////////////////////////////////////////////////
// LoadSettings: Load settings from registry
////////////////////////////////////////////////////////////////////////////////
function LoadSettings()
{
	// Get Startup Page
	try
	{
		g_szStartupPage = parseInt(g_oHAI.Utils.GetProperty("Startup"));
		if (isNaN(g_szStartupPage))
			g_szStartupPage = PAGE_WELCOME;
	}
	catch(oError)
	{
		g_szStartupPage = PAGE_WELCOME;
	}
	
	
	// Get audio setting
	try
	{
		var szAudio = g_oHAI.Utils.GetProperty("Audio");
		if (szAudio == "True")
			g_iSoundsEnabled = true;
		else
			g_iSoundsEnabled = false;
	}
	catch(oError)
	{
		g_iSoundsEnabled = false;
	}
	
	
	// Get Notification setting
	try
	{
		var szNotify = g_oHAI.Utils.GetProperty("Notifications");
		if (szNotify != "True")
			g_iNotificationsEnabled = false;
		else
			g_iNotificationsEnabled = true;
	}
	catch(oError)
	{
		g_iNotificationsEnabled = true;
	}
}

////////////////////////////////////////////////////////////////////////////////
// SaveSettings: Save settings to registry
////////////////////////////////////////////////////////////////////////////////
function SaveSettings()
{
	ErrorHandler(null, ERR_DEMO_COMMANDS);
	return;
}

////////////////////////////////////////////////////////////////////////////////
// GetXMLValue -- Get the value of the specified XML node
////////////////////////////////////////////////////////////////////////////////
function GetXMLValue
(
	szNode
)
{
	var szResult = "";
	
	try
	{
		var nodeResult = oXMLDoc.selectSingleNode(szNode);
		szResult = new String(nodeResult.childNodes(0).text);
	}
	catch (oError)
	{
		szResult = "";
	}
	
	return szResult;
}

////////////////////////////////////////////////////////////////////////////////
// GotoRecordedTVPlace -- Navigates to the MCE Recorded TV Place
////////////////////////////////////////////////////////////////////////////////
function GotoRecordedTVPlace()
{
	if (IsMCERunning())
	{
		window.external.mediacenter.NavigateToPage(MCE_PAGE_RECORDED_TV, null);
	}
	else
	{
		ErrorHandler(null, ERR_UNSUPPORTED_REQUIRES_MCE);
	}
}

////////////////////////////////////////////////////////////////////////////////
// ClearServerLog -- Clears the ServerLog
////////////////////////////////////////////////////////////////////////////////
function ClearServerLog()
{
	try
	{		
		// Create XML & XSL DOMs
		g_oHAI.Utils.ClearServerLog();
	}
	catch (oError)
	{
		ErrorHandler(oError);
	}
}

////////////////////////////////////////////////////////////////////////////////
// isValidIPAddress -- Checks validatity of specified IP Address
////////////////////////////////////////////////////////////////////////////////
function isValidIPAddress
(
	szIPAddress
) 
{
   var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;

   if ( re.test(szIPAddress) ) 
   {
      var parts = szIPAddress.split(".");
      if ( parseInt(parseFloat(parts[0])) == 0 ) { return false; }
      
      for (var i=0; i<parts.length; i++) 
      {
         if ( parseInt(parseFloat(parts[i])) > 255 ) { return false; }
      }
      return true;
   } 
   else 
      return false;
}

////////////////////////////////////////////////////////////////////////////////
// IsViewportVisible -- Determines if sharedviewport is displayed
////////////////////////////////////////////////////////////////////////////////
function IsViewportVisible()
{
	var bResult = false;
	
	try
	{
		bResult = window.external.MediaCenter.SharedViewPort.Visible;
	}
	catch(e)
	{
		bResult = false;
	}
	
	return bResult;
}