<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>