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.
 
 
 
 
 
 

1751 lines
45 KiB

<HTML>
<HEAD>
<TITLE>Microsoft Out-of-Box Experience</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language=jscript src="oobeutil.js"></script>
<script language=jscript>
// This is intended to hold all the script needed
// in the default & offline OOBE HTML pages.
//
// We want to separate the layout (HTML) from the script.
// At the same time, it's helpful to have all the code
// in one place to make it easier to understand the flow
// from page to page.
// Status location constants
var STATUS_MSN = 0;
var STATUS_OEM = 1;
var STATUS_NONE = 2;
var STATUS_OFF = 3;
var STATUS_MAX = 4;
var SNDX_WELCOME = 0;
var SNDX_MSN_ISP = 1;
var SNDX_MSN_REG = 2;
var SNDX_MSN_FINISH = 3;
var SNDX_OEM_REG = 1;
var SNDX_OEM_ISP = 2;
var SNDX_OEM_FINISH = 3;
var SNDX_NONE_REG = 1;
var SNDX_NONE_FINISH = 2;
function CheckPoint(strURL, i1, i2, i3, i4)
{
this.strURL = strURL;
this.rgindex = new Array(STATUS_MAX);
this.rgindex[STATUS_MSN] = i1;
this.rgindex[STATUS_OEM] = i2;
this.rgindex[STATUS_NONE] = i3;
this.rgindex[STATUS_OFF] = i4;
}
// Checkpoint constants
var CKPT_START = 1;
var CKPT_TAPI = 2;
var CKPT_CONNECT = 3;
var CKPT_MODEMCANCEL = 4;
var CKPT_DIALTONE = 5;
var CKPT_NOTAVAIL = 6;
var CKPT_SRVERROR = 7;
var CKPT_TOOBUSY = 8;
var CKPT_CONNECTERROR = 9;
var CKPT_NOANSWER = 10;
var CKPT_HANDSHAKE = 11;
var CKPT_INSERROR = 12;
var CKPT_ISPTOOBUSY = 13;
var CKPT_ISPNOCONNECT = 14;
var CKPT_ISPRESET = 15;
var CKPT_MAX = 16; // ALWAYS set this to be the biggest value!
var dnCKPT = new Array(CKPT_MAX);
// Checkpoint breadcrumbs
var g_CurrentCKPT = null;
var g_DialCKPT = null;
var HKEY_LOCAL_MACHINE = 0x80000002;
var OOBE_MAIN_REG_KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\OOBE";
var CKPT_REG_KEY = "\\CKPT";
var TOS_REG_VALUE = "TOS";
// CheckDialReady errors
var ERR_COMM_NO_ERROR = 0;
var ERR_COMM_OOBE_COMP_MISSING = 1;
var ERR_COMM_UNKNOWN = 2; // Unknow error, check input parameters
var ERR_COMM_NOMODEM = 3; // There is no modem installed
var ERR_COMM_RAS_TCP_NOTINSTALL = 4;
// Dialing errors. Look at raserror.h for details
var DERR_DIALTONE = 680;
var DERR_BUSY = 676;
var DERR_VOICEANSWER = 677;
var DERR_NOANSWER = 678;
var DERR_NO_CARRIER = 679;
var DERR_HARDWARE_FAILURE = 630; // modem turned off
var DERR_PORT_ALREADY_OPEN = 602; // procomm/hypertrm/RAS has COM port
var DERR_PORT_OR_DEVICE = 692; // got this when hypertrm had the device open -- jmazner
var DERR_PPP_TIMEOUT = 718;
// Finish errors
var FINISH_OK = 0x00000000;
var FINISH_REBOOT = 0x00000001;
// Language reboot return codes
var LANGUAGE_REBOOT_NEVER = 0;
var LANGUAGE_REBOOT_NOW = 1;
var LANGUAGE_REBOOT_END = 2;
// on-the-fly button hiding
var HIDE_BACK = 0x0001;
var HIDE_NEXT = 0x0002;
var HIDE_CANCEL = 0x0004;
var HIDE_RESTORE = 0x0008;
// BUGBUG temp GUIDs
var NOLAUNCHISPSIGNUP = "{C37D92A5-CA34-11d2-B71C-00C04F794977}";
var MSNCOMPLETED = "{1C0A22F2-CB6B-11d2-B544-00A0C949DA70}";
// window.external object caches
var TapiObj = null;
var InfoObj = null;
var StatusObj = null;
var DirObj = null;
var ApiObj = null;
// general globals and status
var g_strISPFile = "";
var g_bStartup;
var g_LastButtonText = null;
var g_FirstFocusElement = null;
var g = null;
var g_SpecialChars = ".'-` ";
var g_OOBEDir = "file://" + window.external.API.get_SystemDirectory() + "\\oobe\\";
var g_bRedial = false;
var g_LineProblem = 0;
var g_bFirstServerError = true;
var g_status = STATUS_OFF;
var g_ServerErrorCount = 0;
var g_DialingAvailableInCountry = true;
var g_ModalDialogUp = false;
// preload image caches
var g_ImgClick = new Image();
var g_ImgDisabled = new Image();
var g_ImgHover = new Image();
var g_ImgDefault = new Image();
var g_ImgLeftClickSingle = new Image();
var g_ImgLeftDefaultSingle = new Image();
var g_ImgLeftDisabledSingle = new Image();
var g_ImgLeftHoverSingle = new Image();
var g_ImgRightClickSingle = new Image();
var g_ImgRightDefaultSingle = new Image();
var g_ImgRightDisabledSingle = new Image();
var g_ImgRightHoverSingle = new Image();
var g_ImgLeftClick = new Image();
var g_ImgLeftDefault = new Image();
var g_ImgLeftDisabled = new Image();
var g_ImgLeftHover = new Image();
var g_ImgRightClick = new Image();
var g_ImgRightDefault = new Image();
var g_ImgRightDisabled = new Image();
var g_ImgRightHover = new Image();
var g_ImgLeftClickWide = new Image();
var g_ImgLeftDefaultWide = new Image();
var g_ImgLeftDisabledWide = new Image();
var g_ImgLeftHoverWide = new Image();
var g_ImgRightClickWide = new Image();
var g_ImgRightDefaultWide = new Image();
var g_ImgRightDisabledWide = new Image();
var g_ImgRightHoverWide = new Image();
var ImgDialingAni = new Image();
var ImgNegotiatingAni = new Image();
var ImgConnectedAni = new Image();
var ImgLastConnectImage = new Image();
ImgDialingAni.src = g_OOBEDir + "images/dial_ani.gif";
ImgNegotiatingAni.src = g_OOBEDir + "images/neg_ani.gif";
ImgConnectedAni.src = g_OOBEDir + "images/con_ani.gif";
var g_ImagesAtStage = new Array(4);
var g_ImgConfetti = new Image();
var g_ImgFlagAni = new Image();
g_ImgFlagAni.src = g_OOBEDir + "images/flagani.gif"
g_ImgClick.src = g_OOBEDir + "images/click.gif";
g_ImgDisabled.src = g_OOBEDir + "images/disabled.gif";
g_ImgHover.src = g_OOBEDir + "images/hover.gif";
g_ImgDefault.src = g_OOBEDir + "images/default.gif";
g_ImgLeftClickSingle.src = g_OOBEDir + "images/clickl.gif";
g_ImgLeftDefaultSingle.src = g_OOBEDir + "images/defaultl.gif";
g_ImgLeftDisabledSingle.src = g_OOBEDir + "images/disabldl.gif";
g_ImgLeftHoverSingle.src = g_OOBEDir + "images/hoverl.gif";
g_ImgRightClickSingle.src = g_OOBEDir + "images/clickr.gif";
g_ImgRightDefaultSingle.src = g_OOBEDir + "images/defaultr.gif";
g_ImgRightDisabledSingle.src = g_OOBEDir + "images/disabldr.gif";
g_ImgRightHoverSingle.src = g_OOBEDir + "images/hoverr.gif";
g_ImgLeftClick.src = g_OOBEDir + "images/lftclk.gif";
g_ImgLeftDefault.src = g_OOBEDir + "images/lftdef.gif";
g_ImgLeftDisabled.src = g_OOBEDir + "images/lftdsld.gif";
g_ImgLeftHover.src = g_OOBEDir + "images/lfthvr.gif";
g_ImgRightClick.src = g_OOBEDir + "images/rhtclk.gif";
g_ImgRightDefault.src = g_OOBEDir + "images/rhtdef.gif";
g_ImgRightDisabled.src = g_OOBEDir + "images/rhtdsld.gif";
g_ImgRightHover.src = g_OOBEDir + "images/rhthvr.gif";
g_ImgLeftClickWide.src = g_OOBEDir + "images/lftclkw.gif";
g_ImgLeftDefaultWide.src = g_OOBEDir + "images/lftdefw.gif";
g_ImgLeftDisabledWide.src = g_OOBEDir + "images/lftdsldw.gif";
g_ImgLeftHoverWide.src = g_OOBEDir + "images/lfthvrw.gif";
g_ImgRightClickWide.src = g_OOBEDir + "images/rhtclkw.gif";
g_ImgRightDefaultWide.src = g_OOBEDir + "images/rhtdefw.gif";
g_ImgRightDisabledWide.src = g_OOBEDir + "images/rhtdsldw.gif";
g_ImgRightHoverWide.src = g_OOBEDir + "images/rhthvrw.gif";
// Mandatory Initialization Code
if (null == ApiObj)
{
ApiObj = new Object;
ApiObj = window.external.API;
}
if (null == StatusObj)
{
StatusObj = new Object;
StatusObj = window.external.Status;
}
if (null == DirObj)
{
DirObj = new Object;
DirObj = window.external.Directions;
}
if (null == InfoObj)
{
InfoObj = new Object;
InfoObj = window.external.UserInfo;
}
// END Initialization Code
//////////////////////////////////////////////////////////////////////////////////////
// tapi.htm
//////////////////////////////////////////////////////////////////////////////////////
function TapiLoadMe()
{
InitFrameRef();
ResetDialing();
g_FirstFocusElement = g.selCountry;
if (null == TapiObj)
{
TapiObj = new Object;
TapiObj = window.external.Tapi;
}
RetrieveTapi();
Tapi_CountryChange();
g_FirstFocusElement.focus();
}
function Tapi_AreaCodeChange()
{
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
if (window.external.Tapi.IsAreaCodeRequired(g.selCountry.selectedIndex) &&
window.external.CheckPhoneBook("msobe.isp") &&
g.edtAreaCode.value.length == 0)
g.btnNext.disabled = true;
else
g.btnNext.disabled = false;
InitButtons();
}
function Tapi_CountryChange()
{
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
TapiObj.set_CountryIndex = g.selCountry.selectedIndex;
if (window.external.CheckPhoneBook("msobe.isp"))
{
g.div_MSNNotAvailable.style.visibility = "hidden";
g.spn_AdditionalSettings.style.visibility = "visible";
g_DialingAvailableInCountry = true;
}
else
{
g.div_MSNNotAvailable.style.visibility = "visible";
g.spn_AdditionalSettings.style.visibility = "hidden";
g_DialingAvailableInCountry = false;
}
tapi_OutsideLineClicked();
Tapi_AreaCodeChange();
}
function StoreTapi()
{
TapiObj.set_CountryIndex = g.selCountry.selectedIndex;
TapiObj.set_AreaCode = g.edtAreaCode.value;
if(g.radioTouchToneYes.checked)
TapiObj.set_PhoneSystem = 1; //touch tone
else
TapiObj.set_PhoneSystem = 0; //rotary
TapiObj.set_DialOut = g.edtOutsideLine.value;
}
function RetrieveTapi()
{
var fTapi = TapiObj.IsTAPIConfigured;
g.selCountry.selectedIndex = TapiObj.get_CountryIndex;
g.edtAreaCode.value = TapiObj.get_AreaCode;
if(1 == TapiObj.get_PhoneSystem)
g.radioTouchToneYes.checked = true; //touch tone
else
g.radioTouchToneNo.checked = true; //rotary
g.edtOutsideLine.value = TapiObj.get_DialOut;
if(g.edtOutsideLine.value != "")
g.radioOutSideLineYes.checked = true; //use a number to dial out
else
g.radioOutSideLineNo.checked = true; //don't use a number to dial out
}
function tapi_OutsideLineClicked()
{
var L_OutSideLine_Text = "9"; //global variable number used to dial outside line
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
if (g.radioOutSideLineYes.checked == true &&
g.spn_AdditionalSettings.style.visibility == "visible")
{
g.spanOutsideLine.style.visibility = "visible";
g.edtOutsideLine.style.visibility = "visible";
g.edtOutsideLine.value = TapiObj.get_DialOut;
if (g.edtOutsideLine.value.length == 0)
g.edtOutsideLine.value = L_OutSideLine_Text;
}
else
{
g.spanOutsideLine.style.visibility = "hidden";
g.edtOutsideLine.style.visibility = "hidden";
g.spanOutsideLine.style.visibility = "hidden";
g.edtOutsideLine.value = ""; //nuke out any outside line value
}
}
// END tapi.htm
//////////////////////////////////////////////////////////////////////////////////////
// connect.htm
//////////////////////////////////////////////////////////////////////////////////////
function connect_LoadMe()
{
InitFrameRef();
g_FirstFocusElement = g.btnCancelText;
if (g != null)
{
if (g.btnBack != null)
{
g.btnBack.disabled = true;
}
}
InitButtons();
setTimeout("DoDialExternal()" , 40); //BUGBUG #define this at the top, and why do we have to wait 40 milliseconds anyway?
g_FirstFocusElement.focus();
}
function ResetDialing()
{
g_bRedial = false;
g_LineProblem = 0;
g_bFirstServerError = true;
g_strISPFile = "";
window.external.Hangup();
}
function SetDialing(strISPFile)
{
g_strISPFile = strISPFile;
g_DialCKPT = g_CurrentCKPT;
g_ModalDialogUp = false;
}
function DoDialExternal()
{
SetDialing("msobe.isp");
DoDial();
}
function DoDial()
{
if (g != null)
{
if (g.spnDialing != null)
g.spnDialing.style.color = 0x990000;
if (g.imgDialing != null)
{
ImgLastConnectImage.src = g.imgDialing.src;
g.imgDialing.src = ImgDialingAni.src;
}
}
if (g_bRedial)
{
window.external.ReDial(g_strISPFile);
}
else
{
window.external.Dial(g_strISPFile);
}
}
function Redial()
{
if (g != null && g.Connect_REDIALINFO != null)
{
g.Connect_REDIALINFO.style.visibility = "visible";
}
if (g != null && g.btnBack != null)
{
g.btnBack.disabled = true;
}
DoDial();
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnDialingEx()
{
g_bRedial = true;
if (g != null && g.spnDialing != null)
g.spnDialing.innerText = window.external.get_DialNumber;
if (g != null)
{
if (g.btnBack != null)
{
g.btnBack.disabled = false;
}
InitPairedButton(g.spanBack, g.btnBack, g.btnBackText, g_ImgLeftDefault, g_ImgLeftDisabled,
g_ImgLeftDefaultSingle, g_ImgLeftDisabledSingle,
g.spanNext, "backButton", "backButtonText");
}
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnConnectingEx()
{
//alert("Connecting");
if (g != null)
{
if (g.spnDialing != null)
g.spnDialing.style.color = 0x999999;
if (g.imgDialing != null)
g.imgDialing.src = "../images/dial_off.gif";
if (g.imgNegotiating != null)
{
ImgLastConnectImage.src = g.imgNegotiating.src;
g.imgNegotiating.src = ImgNegotiatingAni.src;
}
}
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnDownloadingEx()
{
//alert("Downloading");
if (g != null)
{
if (g.spnDialing != null)
g.spnDialing.style.color = 0x999999;
if (g.imgNegotiating != null)
g.imgNegotiating.src = "../images/neg_off.gif";
if (g.imgConnected != null)
g.imgConnected.src = ImgConnectedAni.src;
}
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnDisconnectEx()
{
//alert("Disconnected");
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnDialingErrorEx(derr)
{
if (g_ModalDialogUp)
{
g_ModalDialogUp = false;
return;
}
window.external.Hangup();
g_LineProblem++;
if (g_CurrentCKPT == g_DialCKPT)
{
switch (derr)
{
case DERR_PORT_OR_DEVICE:
case DERR_PORT_ALREADY_OPEN:
case DERR_HARDWARE_FAILURE:
case DERR_DIALTONE:
GoNavigate(CKPT_DIALTONE);
break;
case DERR_BUSY:
if (g_LineProblem < 3)
{
window.setTimeout("Redial()", 1000);
}
else
GoNavigate(CKPT_TOOBUSY);
break;
case DERR_VOICEANSWER:
case DERR_PPP_TIMEOUT:
GoNavigate(CKPT_HANDSHAKE);
break;
case DERR_NO_CARRIER:
GoNavigate(CKPT_CONNECTERROR);
break;
case DERR_NOANSWER:
if (g_LineProblem < 3)
{
window.setTimeout("Redial()", 1000);
}
else
{
GoNavigate(CKPT_HANDSHAKE);
}
break;
default:
GoNavigate(CKPT_SRVERROR);
break;
}
}
}
<!--REQUIRED FUNCTION NAME:: DO NOT OVERLOAD OR ALTER-->
function OnServerErrorEx(derr)
{
if (g_CurrentCKPT == g_DialCKPT)
{
if (g_bFirstServerError)
{
var url = window.external.GetReconnectURL
if (url != null && url.length !=0)
ifrmMainFrame.window.navigate(url);
g_bFirstServerError = false;
}
else
{
GoNavigate(CKPT_SRVERROR);
}
}
}
// END connect.htm
//////////////////////////////////////////////////////////////////////////////////////
// General Default LoadMe function
//////////////////////////////////////////////////////////////////////////////////////
function _Default_LoadMe()
{
InitFrameRef();
if (g.btnCancelText != null)
g_FirstFocusElement = g.btnCancelText;
else if (g.btnRestoreText != null)
g_FirstFocusElement = g.btnRestoreText;
else if (g.btnBackText != null)
g_FirstFocusElement = g.btnBackText;
else if (g.btnNextText != null)
g_FirstFocusElement = g.btnNextText;
InitButtons();
if (g_FirstFocusElement != null)
g_FirstFocusElement.focus();
else
g.document.body.focus();
}
//////////////////////////////////////////////////////////////////////////////////////
// usemodem.htm
//////////////////////////////////////////////////////////////////////////////////////
function usemodem_LoadMe()
{
InitFrameRef();
ResetDialing();
g_FirstFocusElement = g.UseModem_Yes;
InitButtons();
g_FirstFocusElement.focus();
}
//////////////////////////////////////////////////////////////////////////////////////
// hndshake.htm
//////////////////////////////////////////////////////////////////////////////////////
function hndshake_OnKeyPress()
{
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
// Treat the enter key like the next button
// since the user hasn't gone through the mouse tutorial yet.
if ((g.event.keyCode == 13) &&
(g.btnNext.disabled == false))
{
GoNext();
}
else
{
KeyPressIsValid();
}
}
function hndshake_CheckEdits()
{
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
if (g.event.srcElement != g.edtMSNPhoneNumber)
{
hndshake_CheckEnableNextButton();
}
}
function hndshake_CheckEnableNextButton()
{
try
{
if (g.event == null)
return;
}
catch(e)
{
return;
}
if (g.edtMSNPhoneNumber.value.length)
{
g.btnNext.disabled = false;
}
else
{
g.btnNext.disabled = true;
}
InitButtons();
}
function hndshake_LoadMe()
{
InitFrameRef();
g_FirstFocusElement = g.edtMSNPhoneNumber;
hndshake_CheckEnableNextButton();
g_FirstFocusElement.focus();
}
//////////////////////////////////////////////////////////////////////////////////////
// MISC Functions
//////////////////////////////////////////////////////////////////////////////////////
// Page Navigation
// InitCKPT, PushCKPT, PopCKPT, CKPTFromVal are meant to handle the behavior for GoBack.
// We only go back to certain pages (i.e., Mouse Tutorial, Sound Check).
// And on some of the pages, we only go back if they haven't been
// completed (i.e., EULA, PID).
//
// So, we push checkpoints if we intend to all coming back to that page.
// We pop checkpoints if we no longer want to come back (e.g., we've
// completed that page.
function InitCKPT()
{
dnCKPT[CKPT_START] = new CheckPoint("msnsetup\\mstart.htm", SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME);
dnCKPT[CKPT_TAPI] = new CheckPoint("msnsetup\\mtapi.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_CONNECT ] = new CheckPoint("msnsetup\\mconnect.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_MODEMCANCEL] = new CheckPoint("msnsetup\\musemode.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_DIALTONE] = new CheckPoint("msnerror\\mdialton.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_NOTAVAIL] = new CheckPoint("msnerror\\mnotavai.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_SRVERROR] = new CheckPoint("msnerror\\msrverro.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_TOOBUSY] = new CheckPoint("msnerror\\mtoobusy.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_CONNECTERROR] = new CheckPoint("msnerror\\mcnncter.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_NOANSWER] = new CheckPoint("msnerror\\mnoanswe.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_HANDSHAKE] = new CheckPoint("msnerror\\mhndshak.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_INSERROR] = new CheckPoint("msnerror\\minserro.htm", SNDX_MSN_ISP, SNDX_OEM_REG, SNDX_NONE_REG, 0);
dnCKPT[CKPT_ISPTOOBUSY] = new CheckPoint("msnerror\\misp2bus.htm", 0, SNDX_OEM_ISP, 0, 0);
dnCKPT[CKPT_ISPNOCONNECT] = new CheckPoint("msnerror\\mispcnnc.htm", 0, SNDX_OEM_ISP, 0, 0);
dnCKPT[CKPT_ISPRESET] = new CheckPoint("msnerror\\misprese.htm", 0, SNDX_OEM_ISP, 0, 0);
PopCKPT();
}
function PushCKPT(ckpt)
{
if (ckpt > 0 && ckpt < CKPT_MAX)
{
var tos = 0;
try
{
tos = ApiObj.get_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, TOS_REG_VALUE);
}
catch (e) {}
ApiObj.set_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, tos.toString(), ckpt);
ApiObj.set_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, TOS_REG_VALUE, ++tos);
g_CurrentCKPT = ckpt;
}
}
function PopCKPT(ckptCheck)
{
var ckpt = 0;
try
{
var tos = ApiObj.get_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, TOS_REG_VALUE);
if (tos > 0)
{
ckpt = ApiObj.get_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, (tos - 1).toString());
if (null == ckptCheck || ckpt == ckptCheck)
{
ApiObj.set_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, TOS_REG_VALUE, --tos);
ApiObj.DeleteRegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + CKPT_REG_KEY, tos.toString());
}
}
}
catch (e) {}
if (ckpt > 0 && ckpt < CKPT_MAX)
{
g_CurrentCKPT = ckpt;
}
else
g_CurrentCKPT = null;
}
function URLFromCKPT(ckpt)
{
var str = "";
if (ckpt > 0 && ckpt < CKPT_MAX)
{
str = dnCKPT[ckpt].strURL;
}
return str;
}
function IndexFromCKPT(ckpt, status)
{
var index = 0;
if (ckpt > 0 && ckpt < CKPT_MAX)
{
var checkpoint = dnCKPT[ckpt];
index = checkpoint.rgindex[status];
}
return index;
}
function SetButtonImageToClick()
{
try
{
if (g.event != null)
{
switch(g.event.srcElement.parentElement.id)
{
case "spanCancel":
if (g.spanRestore != null && true != g.spanRestore.Hide)
{
g.btnCancel.src = g_ImgLeftClickWide.src;
}
else
{
g.btnCancel.src = g_ImgClick.src;
}
break;
case "spanRestore":
if (g.spanCancel != null && true != g.spanCancel.Hide)
{
g.btnRestore.src = g_ImgRightClickWide.src;
}
else
{
g.btnRestore.src = g_ImgClick.src;
}
break;
case "spanBack":
if (g.spanNext != null && true != g.spanNext.Hide)
{
g.btnBack.src = g_ImgLeftClick.src;
}
else
{
g.btnBack.src = g_ImgLeftClickSingle.src;
}
break;
case "spanNext":
if (g.spanBack != null && true != g.spanBack.Hide)
{
g.btnNext.src = g_ImgRightClick.src;
}
else
{
g.btnNext.src = g_ImgRightClickSingle.src;
}
break;
}
}
}
catch(e)
{
return;
}
}
function IsLocalFile()
{
try
{
return (-1 != g.location.protocol.indexOf("file"));
}
catch (e)
{
return false;
}
}
//////////////////////////////////////////////////////////////////////////////////////
// public navigation APIs
//////////////////////////////////////////////////////////////////////////////////////
//Some server page is calling this function that used to set g_OEMAddBackURL.
function SetBack(strURL)
{
}
function GoCancel(ckpt)
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
SetButtonImageToClick();
switch (g_CurrentCKPT)
{
case CKPT_CONNECT:
ResetDialing();
// fall through...
case CKPT_TAPI:
GoNavigate(CKPT_MODEMCANCEL);
break;
}
}
function GoBack(ckpt)
{
var ckptPrevious = g_CurrentCKPT;
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
SetButtonImageToClick();
if (g_CurrentCKPT == g_DialCKPT)
ResetDialing();
PopCKPT();
if (ckptPrevious == g_CurrentCKPT)
{
// This handles the case where the current page pushed itself on the stack.
PopCKPT();
}
if (g_CurrentCKPT > 0 && g_CurrentCKPT < CKPT_MAX)
{
GoNavigate(g_CurrentCKPT);
}
}
function StatusNavigate()
{
var iMove = IndexFromCKPT(g_CurrentCKPT, g_status) - window.external.get_StatusIndex;
while (iMove > 0)
{
window.external.MoveNext();
--iMove;
}
while (iMove < 0)
{
window.external.MovePrevious();
++iMove;
}
}
////////////////////////////////////////////////////////////////////
// DON'T MUCK WITH THE POSITIONING OF THE CASES IN THE SWITCHS BELOW
////////////////////////////////////////////////////////////////////
function GoNavigate(ckptGoHere)
{
try
{
if (g_bStartup == false)
{
if (IsLocalFile())
{
if (g.event != null)
{
g.event.returnValue = false;
g.event.cancelBubble = true;
}
}
}
else
g_bStartup = false;
}
catch(e)
{
return;
}
SetButtonImageToClick();
switch (ckptGoHere)
{
case CKPT_START:
PushCKPT(CKPT_START); //BUGBUG do we want to do this?
g.navigate(g_OOBEDir + URLFromCKPT(g_CurrentCKPT));
break;
case CKPT_TAPI:
PushCKPT(CKPT_TAPI);
g.navigate(g_OOBEDir + URLFromCKPT(g_CurrentCKPT));
break;
case CKPT_CONNECT:
g_CurrentCKPT = CKPT_CONNECT;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_CONNECT));
break;
case CKPT_NOTAVAIL:
g_CurrentCKPT = CKPT_NOTAVAIL;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_NOTAVAIL));
break;
case CKPT_DIALTONE:
g_CurrentCKPT = CKPT_DIALTONE;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_DIALTONE));
break;
case CKPT_TOOBUSY:
g_CurrentCKPT = CKPT_TOOBUSY;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_TOOBUSY));
break;
case CKPT_SRVERROR:
g_CurrentCKPT = CKPT_SRVERROR;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_SRVERROR));
break;
case CKPT_MODEMCANCEL:
g_CurrentCKPT = CKPT_MODEMCANCEL;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_MODEMCANCEL));
break;
case CKPT_INSERROR:
g_CurrentCKPT = CKPT_INSERROR;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_INSERROR));
break;
case CKPT_HANDSHAKE:
g_CurrentCKPT = CKPT_HANDSHAKE;
g.navigate(g_OOBEDir + URLFromCKPT(CKPT_HANDSHAKE));
break;
case CKPT_CONNECTERROR:
g_CurrentCKPT = CKPT_CONNECTERROR;
g.navigate(g_OOBEDir + URLFromCKPT(g_CurrentCKPT));
break;
case CKPT_ISPTOOBUSY:
g_CurrentCKPT = CKPT_ISPTOOBUSY;
g.navigate(g_OOBEDir + URLFromCKPT(g_CurrentCKPT));
break;
case CKPT_ISPRESET:
g_CurrentCKPT = CKPT_ISPRESET;
g.navigate(g_OOBEDir + URLFromCKPT(g_CurrentCKPT));
break;
}
StatusNavigate();
}
function GoNext()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
SetButtonImageToClick();
switch (g_CurrentCKPT)
{
case CKPT_HANDSHAKE:
window.external.set_DialNumber(g.edtMSNPhoneNumber.value);
case CKPT_SRVERROR:
case CKPT_ISPRESET:
case CKPT_CONNECTERROR:
case CKPT_DIALTONE:
case CKPT_TOOBUSY:
GoNavigate(g_DialCKPT);
break;
case CKPT_START:
GoNavigate(CKPT_TAPI);
break;
case CKPT_TAPI:
StoreTapi();
if ( dnCKPT[CKPT_CONNECT].strURL.toUpperCase() == "MSNSETUP\\MLAN.HTM" || window.external.CheckPhoneBook("msobe.isp") )
{
GoNavigate(CKPT_CONNECT);
}
break;
default:
// BUGBUG should we remove the default altogether?
break;
}
}
// BUGBUG temporary until MSN changes code
function GoOffline()
{
GoNext();
}
// Button Event Handlers and Initialization
function SetLastButtonText()
{
if (g.btnNext != null)
g_LastButtonText = g.btnNextText;
else if (g.btnBack != null)
g_LastButtonText = g.btnBackText;
else if (g.btnRestore != null)
g_LastButtonText = g.btnRestoreText;
else if (g.btnCancel != null)
g_LastButtonText = g.btnCancelText;
}
// Function: InitFrameRef
// Description: Sets up globals to point to buttons
// Since the buttons exist on the child frame,
// we want to have quick access to them without
// going through the collections.
// WARNING: Call this function at the top of XXX_LoadMe()
//
function InitFrameRef()
{
g_LastButtonText = null;
g_FirstFocusElement = null;
g_LastKeyDown = null;
g = document.frames("msoobeMain");
try
{
if (g.StageImage != null && g.StageImage.readyState == "complete")
{
g.StageImage.style.display = "none";
}
g.document.body.onkeydown = OnKeyDown;
SetLastButtonText();
}
catch(e){}
}
function HideButtons(buttons)
{
if (null != g.spanBack && (buttons & HIDE_BACK))
{
g.spanBack.Hide = true;
g.btnBack.Hide = true;
}
if (null != g.spanNext && (buttons & HIDE_NEXT))
{
g.spanNext.Hide = true;
g.btnNext.Hide = true;
}
if (null != g.spanCancel && (buttons & HIDE_CANCEL))
{
g.spanCancel.Hide = true;
g.btnCancel.Hide = true;
}
if (null != g.spanRestore && (buttons & HIDE_RESTORE))
{
g.spanRestore.Hide = true;
g.btnRestore.Hide = true;
}
}
function InitButtons()
{
if (g.btnNextText && (g.btnBackText && (g.btnBack.Hide == null || g.btnBack.Hide == false)))
g.btnNextText.style.textAlign="left";
else if (g.btnNextText)
g.btnNextText.style.textAlign="center";
if (g.btnBackText && (g.btnNextText && (g.btnNext.Hide == null || g.btnNext.Hide == false)))
g.btnBackText.style.textAlign="right";
else if (g.btnBackText)
g.btnBackText.style.textAlign="center";
if (g.btnRestoreText && (g.btnCancelText && (g.btnCancel.Hide == null || g.btnCancel.Hide == false)))
g.btnRestoreText.style.textAlign="left";
else if (g.btnRestoreText)
g.btnRestoreText.style.textAlign="center";
if (g.btnCancelText && (g.btnRestoreText && (g.btnRestore.Hide == null || g.btnRestore.Hide == false)))
g.btnCancelText.style.textAlign="right";
else if(g.btnCancelText)
g.btnCancelText.style.textAlign="center";
InitPairedButton(g.spanNext, g.btnNext, g.btnNextText, g_ImgRightDefault, g_ImgRightDisabled,
g_ImgRightDefaultSingle, g_ImgRightDisabledSingle,
g.spanBack, "backButton", "backButtonText");
InitPairedButton(g.spanBack, g.btnBack, g.btnBackText, g_ImgLeftDefault, g_ImgLeftDisabled,
g_ImgLeftDefaultSingle, g_ImgLeftDisabledSingle,
g.spanNext, "backButton", "backButtonText");
InitPairedButton(g.spanRestore, g.btnRestore, g.btnRestoreText, g_ImgRightDefaultWide, g_ImgRightDisabledWide,
g_ImgDefault, g_ImgDisabled,
g.spanCancel, "cancelButton", "cancelButtonText");
InitPairedButton(g.spanCancel, g.btnCancel, g.btnCancelText, g_ImgLeftDefaultWide, g_ImgLeftDisabledWide,
g_ImgDefault, g_ImgDisabled,
g.spanRestore, "cancelButton", "cancelButtonText");
}
function InitPairedButton(span, btn, btnText, img, imgDisabled,
imgSingle, imgSingleDisabled,
span2, btnClass, btnTextClass)
{
if (span != null)
{
if (span2 == null || true == span2.Hide)
{
btn.className = btnClass;
btnText.className = btnTextClass;
btnText.style.textAlign="center";
}
if (btn.disabled == null || !btn.disabled)
{
if (span2 == null || true == span2.Hide)
{
btn.src = imgSingle.src;
}
else
{
btn.src = img.src;
}
btnText.style.color= "black";
}
else
{
if (span2 == null || true == span2.Hide)
{
btn.src = imgSingleDisabled.src;
}
else
{
btn.src = imgDisabled.src;
}
btnText.style.color= "gray";
}
span.onmouseover = HoverOnButton;
span.onmouseout = HoverOffButton;
btnText.onblur = BlurBtnText;
btnText.onkeydown = KeyDownBtnText;
btnText.onfocus = FocusBtnText;
// set sibling associations.
btn.sibling = btnText;
btnText.sibling = btn;
if (null == btn.Hide || false == btn.Hide)
{
btn.style.visibility = "visible";
btnText.style.visibility = "visible";
switch (btnText.style.textAlign.toUpperCase())
{
case "CENTER":
btnText.style.posLeft = btn.offsetLeft + (btn.width / 2 - btnText.offsetWidth / 2);
break;
case "RIGHT":
btnText.style.posLeft = btn.offsetLeft + btn.width - ( btnText.offsetWidth + 10);
break;
}
}
}
}
///////////////////////////////////////////////////////////
// Function: HoverOnButton
// Description: This function is attached to a onmouseover
// event for a button span. We use the event source to
// determine which button it occured on and change that
// button to it's higlighted or hover state.
//
function HoverOnButton()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
switch (g.event.srcElement.parentElement)
{
case g.spanCancel:
case g.btnCancelText:
HoverOnPairedButton(g.btnCancel, g.btnCancelText, g_ImgLeftHoverWide, g_ImgHover, g.btnRestore);
break;
case g.spanRestore:
case g.btnRestoreText:
HoverOnPairedButton(g.btnRestore, g.btnRestoreText, g_ImgRightHoverWide, g_ImgHover, g.btnCancel);
break;
case g.spanBack:
case g.btnBackText:
HoverOnPairedButton(g.btnBack, g.btnBackText, g_ImgLeftHover, g_ImgLeftHoverSingle, g.btnNext);
break;
case g.spanNext:
case g.btnNextText:
HoverOnPairedButton(g.btnNext, g.btnNextText, g_ImgRightHover, g_ImgRightHoverSingle, g.btnBack);
break;
}
}
function HoverOnPairedButton(btn, btnText, img, imgSingle, btn2)
{
if (btn.disabled == null || !btn.disabled)
{
if (!btn.parentElement.contains(g.event.fromElement))
{
if (btn2 == null || true == btn2.Hide)
{
btn.src = imgSingle.src;
}
else
{
btn.src = img.src;
}
btnText.style.fontWeight = "bold";
switch (btnText.style.textAlign.toUpperCase())
{
case "CENTER":
btnText.style.posLeft = btn.offsetLeft + (btn.offsetWidth / 2 - btnText.offsetWidth / 2);
break;
case "RIGHT":
btnText.style.posLeft = btn.offsetLeft + btn.offsetWidth - ( btnText.offsetWidth + 10);
break;
}
}
}
}
var g_LastKeyDown = null;
function OnKeyDown()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
if (g.event.altKey)
{
g_LastKeyDown = String.fromCharCode(g.event.keyCode);
if (g_LastKeyDown != null)
g_LastKeyDown = g_LastKeyDown.toUpperCase();
}
else
g_LastKeyDown = null;
}
function FocusBtnText()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
if (g.event.srcElement.sibling == null ||
g.event.srcElement.sibling.disabled == null ||
g.event.srcElement.sibling.disabled == false)
{
var accessKey = g.event.srcElement.accessKey;
if(g.event.altKey &&
!g.event.button &&
accessKey != null &&
g_LastKeyDown == accessKey.toUpperCase())
g.event.srcElement.parentElement.click();
}
else
g.event.srcElement.blur();
g.event.returnValue = false;
g.event.cancelBubble = true;
}
function KeyDownBtnText()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
var keyPressed = String.fromCharCode(g.event.keyCode);
if (g.event.keyCode == 13 || (g.event.altKey && keyPressed.toUpperCase() == g.event.srcElement.accessKey.toUpperCase()))
{
g.event.keyCode = 0;
g.event.returnValue = false;
g.event.cancelBubble = true;
g.event.srcElement.parentElement.click();
}
if (g_LastButtonText != null && g.event.srcElement == g_LastButtonText &&
g.event.keyCode == 9 && null != g_FirstFocusElement && g_FirstFocusElement.isTextEdit &&
!g.event.altKey)
{
g_FirstFocusElement.focus();
g_FirstFocusElement.select();
g.event.returnValue = false; // BUGBUG should we keyCode 0 here?
g.event.keyCode = 0;
}
}
function BlurBtnText()
{
// need this stinking thing here for the
// case when we have an onblur happen and the page is not valid
// so we are in a transition. this way we don't get a mesagebox
// about an error
try
{
if (g.event.type == "blur")
{
if (!g.event.altKey &&
g_LastButtonText != null &&
g_FirstFocusElement != null &&
g.event.srcElement == g_LastButtonText)
{
g_FirstFocusElement.focus();
}
}
}
catch(e)
{
return;
}
}
///////////////////////////////////////////////////////////
// Function: HoverOffButton
// Description: This function is attached to a onmouseout
// event for a button span. We use the event source to
// determine which button it occured on and change that
// button back to it's normal state.
//
function HoverOffButton()
{
// need this stinking thing here for the
// case when we have an onblur happen and the page is not valid
// so we are in a transition. this way we don't get a mesagebox
// about an error
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
switch (g.event.srcElement.parentElement)
{
case g.spanCancel:
case g.btnCancelText:
HoverOffPairedButton(g.btnCancel, g.btnCancelText, g_ImgLeftDefaultWide, g_ImgDefault, g.btnRestore);
break;
case g.spanRestore:
case g.btnRestoreText:
HoverOffPairedButton(g.btnRestore, g.btnRestoreText, g_ImgRightDefaultWide, g_ImgDefault, g.btnCancel);
break;
case g.spanBack:
case g.btnBackText:
HoverOffPairedButton(g.btnBack, g.btnBackText, g_ImgLeftDefault, g_ImgLeftDefaultSingle, g.btnNext);
break;
case g.spanNext:
case g.btnNextText:
HoverOffPairedButton(g.btnNext, g.btnNextText, g_ImgRightDefault, g_ImgRightDefaultSingle, g.btnBack);
break;
}
// BlurText();
}
function HoverOffPairedButton(btn, btnText, img, imgSingle, btn2)
{
if (btn.disabled == null || !btn.disabled)
{
if (!btn.parentElement.contains(g.event.toElement))
{
if (btn2 == null || true == btn2.Hide)
{
btn.src = imgSingle.src;
}
else
{
btn.src = img.src;
}
btnText.style.fontWeight = "normal";
btnText.style.color = "black";
switch (btnText.style.textAlign.toUpperCase())
{
case "CENTER":
btnText.style.posLeft = btn.offsetLeft + (btn.offsetWidth / 2 - btnText.offsetWidth / 2);
break;
case "RIGHT":
btnText.style.posLeft = btn.offsetLeft + btn.offsetWidth - ( btnText.offsetWidth + 10);
break;
}
}
}
}
// END Button Event Handlers and Initialization
// VALIDATION ROUTINES
function KeyPressIsNumeric()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
if (!IsNumeric(g.event.keyCode))
{
g.event.keyCode = 0;
g.event.returnValue = false;
}
}
function IsNumeric(keyCode)
{
if ((keyCode >= 48/*0*/) && (keyCode <= 57/*9*/))
return true;
else
return false;
}
function IsSpecial(keyCode)
{
// BUGBUG DISABLED FOR BETA
/*
var bFound = false;
var iPosition = 0;
for (;iPosition < g_SpecialChars.length; iPosition++)
{
if (g_SpecialChars.charCodeAt(iPosition) == keyCode)
{
bFound = true;
break;
}
}
return bFound;
*/
return false;
}
function KeyPressIsValid()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
if (!IsAlpha(g.event.keyCode) &&
!IsSpecial(g.event.keyCode) &&
!IsNumeric(g.event.keyCode))
{
g.event.keyCode = 0;
g.event.returnValue = false;
}
}
function KeyPressIsAlpha()
{
try
{
if (IsLocalFile() && g.event == null)
return;
}
catch(e)
{
return;
}
if (!IsAlpha(g.event.keyCode))
{
g.event.keyCode = 0;
g.event.returnValue = false;
}
}
function IsAlpha(keyCode)
{
// BUGBUG DISABLED FOR BETA
/*
var strKeyCode = String.fromCharCode(keyCode);
var re1 = new RegExp("\w");
var re2 = new RegExp("\D");
strKeyCode.match(re1);
strKeyCode.match(re2);
//return ((strKeyCode.match(re1) != null) && (strKeyCode.match(re2) != null));
*/
// if ((keyCode >= 97/*a*/ && keyCode <= 122/*z*/) ||
// (keyCode >= 65/*A*/ && keyCode <= 90 /*Z*/))
return true;
// else
// return false;
}
function NumberOfSpaces(strValue)
{
/*
var NASexp = RegExp("\s");
var result = strValue.match(NASexp);
return ((result == null) || (result.length != strValue.length));
*/
var iSpaceCount = 0;
for (iPosition = 0; iPosition < strValue.length; iPosition ++)
{
if (strValue.charAt(iPosition) == ' ')
{
iSpaceCount++;
}
}
return iSpaceCount;
}
function KeyCodeToUpper()
{
var strKeyCode = String.fromCharCode(g.event.keyCode);
strKeyCode = strKeyCode.toUpperCase();
g.event.keyCode = strKeyCode.charCodeAt(0);
}
// END VALIDATION ROUTINES
function SetupPageLayout()
{
document.all.ifrmMainFrame.style.height = document.body.clientHeight;
}
window.onresize = SetupPageLayout;
function ReCheckModem()
{
if ( 1 == DirObj.get_Offline() || window.external.CheckDialReady() != ERR_COMM_NO_ERROR)
{
g_status = STATUS_OFF;
StatusObj.set_Status(NOLAUNCHISPSIGNUP, true);
}
else
{
g_status = STATUS_MSN;
}
}
function InitApplication()
{
SetupPageLayout();
g_bStartup = true;
InitFrameRef();
if ( 1 == DirObj.get_Offline() || window.external.CheckDialReady() != ERR_COMM_NO_ERROR)
{
g_status = STATUS_OFF;
StatusObj.set_Status(NOLAUNCHISPSIGNUP, true);
}
else
{
g_status = STATUS_MSN;
}
InitCKPT();
do
{
PopCKPT();
}
while (null != g_CurrentCKPT);
GoNavigate(CKPT_START);
spnPage.style.visibility = "visible";
}
</script>
</HEAD>
<BODY bgColor=#ffffff leftMargin=0 onload=InitApplication(); scroll=no tabIndex=-1 topMargin=0>
<SPAN id=spnPage style="VISIBILITY: hidden" tabIndex=-1>
<SPAN id=spnMainFrame style="LEFT: 0px; POSITION: absolute; TOP: 0px" tabIndex=-1>
<IFRAME frameBorder=no height="100%" id=ifrmMainFrame name=msoobeMain src="about:blank" tabIndex=-1 width="100%"></IFRAME>
</SPAN>
</SPAN>
</BODY>
</HTML>