Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

375 lines
9.3 KiB

// preload.js
//
// This file contains the script necessary for the initial load of the page.
// We want to minimize this size as much as possible to mitigate the initial
// hit at load time.
//
/*-------------------------------------------------------------------------
Purpose: Display a generic message box if we hit a script error.
*/
function EatErrors(szMsg, szUrl, iLine)
{
// Prevent scripting errors from displaying ugly messages
alert("An unexpected error occurred.\n\n" + szMsg + "\n" + szUrl + "\nLine: " + iLine);
window.event.returnValue = true; // Suppress IE error messaging
}
/*-------------------------------------------------------------------------
Purpose: Load the given script file into the tree
*/
function LoadScriptFile(szScriptID, szUrl)
{
// Is the script loaded?
if (null == g_docAll(szScriptID))
{
// No; create it
var elemScript = document.createElement("<SCRIPT id=" + szScriptID + " src='" + szUrl + "' language='javascript'></SCRIPT>");
if (elemScript)
{
// Load it by adding it to the body
document.body.insertBefore(elemScript);
}
}
}
/*-------------------------------------------------------------------------
Purpose: Returns true or false for the given policy
*/
function Dso_IsRestricted(szPolicy)
{
var bResult;
bResult = g_docAll.idCtlAppsDso.IsRestricted(szPolicy);
/* Fake version
// alert("IsRestricted: " + szPolicy);
bResult = false; // default
switch (szPolicy)
{
case "ShowPostSetup": bResult = true; break;
case "NoRemovePage": bResult = false; break;
case "NoAddPage": bResult = false; break;
case "NoWindowsSetupPage": bResult = false; break;
case "NoAddFromCDorFloppy": bResult = false; break;
case "NoAddFromInternet": bResult = false; break;
case "NoAddFromNetwork": bResult = false; break;
case "NoComponents": bResult = false; break;
case "NoServices": bResult = false; break;
case "NoSupportInfo": bResult = false; break;
}
*/
return bResult;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
/*-------------------------------------------------------------------------
Purpose: Determine which page to show at startup
*/
function _ParseCmdLine()
{
var szCmdLine = g_docAll.idAppARP.commandLine;
// The command line will be something like:
// "c:\lfnpath\default.hta <params>"
var ichParam = szCmdLine.indexOf("default.hta") + 12;
var cch = szCmdLine.length;
while (ichParam < cch)
{
if (szCmdLine.charAt(ichParam) != ' ')
break;
ichParam++;
}
// First parameter is the button index indicating which page
// to open
var nPage = parseInt(szCmdLine.charAt(ichParam));
if (isNaN(nPage) || 2 < nPage)
nPage = g_iPageDefault;
// Set the page by pushing the button
g_docAll.idPlaces.currentButton = nPage;
}
/*-------------------------------------------------------------------------
Purpose: Initialize the Places bar.
*/
function _InitPlacesBar()
{
var _idPlaces = g_docAll.idPlaces;
if (Dso_IsRestricted("NoRemovePage"))
{
_idPlaces.ShowButton('idChangeRemove', false);
g_iPageDefault++;
}
if (Dso_IsRestricted("NoAddPage"))
{
_idPlaces.ShowButton('idAdd', false);
if (1 == g_iPageDefault)
g_iPageDefault++;
}
if (Dso_IsRestricted("NoWindowsSetupPage"))
{
_idPlaces.ShowButton('idConfig', false);
if (2 == g_iPageDefault)
g_iPageDefault++;
}
}
/*-------------------------------------------------------------------------
Purpose: Handle the 'onload' event for the whole page.
This function processes the commandline paremeters passed in and launches
the correct page.
*/
function Body_OnLoad()
{
window.onerror = EatErrors; // Catch onerror events
if (document.dir == "rtl")
{
//
// BiDi. Adjust alignment of the "Close", "CD or Floppy"
// and "Windows Update" buttons
//
g_docAll.idTdClose.align = "left";
g_docAll.idTdCDFloppy.align = "left";
g_docAll.idTdWindowsUpdate.align = "left";
}
// Bind to some events
document.body.onkeydown = Body_OnKeyDown;
g_docAll.idBtnClose.onclick = _CloseWindow;
// Determine whether to make the Config page simply exec the OC Manager or not
var bExecOCMgr;
bExecOCMgr = !g_docAll.idCtlAppsDso.ShowPostSetup;
/* Fake version
bExecOCMgr = true;
*/
// The 'ShowPostSetup' policy overrides this. If this is true, show the config page.
if (Dso_IsRestricted("ShowPostSetup"))
bExecOCMgr = false;
else if (Dso_IsRestricted("NoServices"))
bExecOCMgr = true;
// Allow the places bar to switch to this page using ctrl-tab
// (normally clicking the button would exec the Optional Components Manager)
var _idPlaces = g_docAll.idPlaces;
_idPlaces.SetExecButton("idConfig", bExecOCMgr);
// Set the width of the places column. We set this once at start up. We avoid
// expressions since those are more expensive.
//
// Trick: we need to set the width of the dummy image too, to make sure
// idColPlaces isn't squeezed.
g_docAll.idColPlaces.width = g_docAll.idPlaces.offsetWidth;
g_docAll.idImgDummy1.width = g_docAll.idPlaces.offsetWidth;
g_docAll.idImgDummy2.width = g_docAll.idPlaces.offsetWidth;
g_docAll.idImgDummy3.width = g_docAll.idPlaces.offsetWidth;
// Parse the command line and set the active page
_ParseCmdLine();
}
/*-------------------------------------------------------------------------
Purpose: Handle the 'onkeydown' for the documents
*/
function Body_OnKeyDown()
{
// Is this a F5 key?
if (KC_F5 == event.keyCode)
{
// Call the correct refresh functions
switch (g_idCur)
{
case 'idChangeRemove':
Dso_Refresh("Remove");
break;
case 'idAdd':
Dso_Refresh("Categories");
Dso_Refresh("Add");
break;
case 'idConfig':
Dso_Refresh("ocsetup");
break;
}
// Block this event
event.returnValue=false;
}
}
function _CloseWindow()
{
window.parent.close();
}
/*-------------------------------------------------------------------------
Purpose: Switch pages based upon the given idElem (button id)
*/
function _SetPage(idElem)
{
// Load the corresponding script first
switch (idElem)
{
case 'idChangeRemove':
LoadScriptFile("idScriptRemove", "remove.js");
break;
case 'idAdd':
LoadScriptFile("idScriptAdd", "add.js");
break;
case 'idConfig':
LoadScriptFile("idScriptConfig", "config.js");
break;
}
// Clean up after the current page
switch (g_idCur)
{
case 'idChangeRemove':
Remove_Deactivate();
break;
case 'idAdd':
Add_Deactivate();
break;
case 'idConfig':
Config_Deactivate();
break;
}
// Now set up for the new page
switch (idElem)
{
case 'idChangeRemove':
Remove_Activate();
break;
case 'idAdd':
Add_Activate();
break;
case 'idConfig':
Config_Activate(false);
break;
}
g_idCur = idElem;
}
/*-------------------------------------------------------------------------
Purpose: Handle the 'onexecitem' for the places bar.
*/
function Places_OnExecItem()
{
var idElem = window.event.srcID;
if ('idConfig' == idElem)
{
LoadScriptFile("idScriptConfig", "config.js");
Config_Activate(true);
}
}
/*-------------------------------------------------------------------------
Purpose: Handle the 'onselectitem' for the places bar
*/
function Places_OnSelectItem()
{
if (g_idCur == window.event.srcID)
{
switch (g_idCur)
{
case 'idChangeRemove':
Remove_SetFocus();
break;
case 'idAdd':
Add_SetFocus();
break;
case 'idConfig':
Config_SetFocus();
break;
}
return;
}
_SetPage(window.event.srcID);
}
/*-------------------------------------------------------------------------
Purpose: Handle the 'onreadystatechange' for the places bar
*/
function Places_OnComplete()
{
// Depending on the speed of the machine, this event might get
// fired before the inline <SCRIPT> in default.hta is run. If this
// is the case, then initialize g_docAll here, since this code uses
// it.
if ("undefined" == typeof g_docAll)
g_docAll = document.all;
_InitPlacesBar();
}
var KC_SPACE = 32;
var KC_RETURN = 13;
/*-------------------------------------------------------------------------
Purpose: Handle the onKeyDown event
*/
function _OnKeyDownFakeAnchor()
{
var keyCode = window.event.keyCode;
if (KC_SPACE == keyCode || KC_RETURN == keyCode)
{
window.event.srcElement.click();
}
}