|
|
<!--
TODO: * replace _MODULE_ with the name of your module. * replace %windir%\system32\oobe\msobshel.htm on your test system with this file. --> <HTML> <HEAD> <TITLE>Microsoft Out-of-Box Experience</TITLE> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <LINK REL="stylesheet" TYPE="text/css" HREF="setup\oobestyl.css">
<!-- Begin Agent Specific Code -->
<!-- The majority of the Agent code is in AgtCore.js --> <!-- The AgtXXXX.js files contain all of the script --> <!-- code that needs to be localized. --> <!-- NOTE: Agent is not initialized until the first --> <!-- time someone clicks on the Assistant image. -->
<script language=jscript src="AgtCore.js"></script> <script language=jscript src="AgtScrpt.js"></script>
<!-- Agent Event Handler Declarations -->
<script language=jscript for=Agent event="Command(userInput)")> Agent_OnCommand(userInput); </script>
<script language=jscript for=Agent event="Hide(characterID)"> Agent_OnHide(characterID); </script>
<script language=jscript for=Agent event="IdleStart(characterID)"> Agent_OnIdleStart(characterID); </script>
<script language=jscript for=Agent event="IdleComplete(characterID)"> Agent_OnIdleComplete(characterID); </script>
<script language=jscript for=Agent event="Bookmark(id)"> Agent_OnBookmark(id); </script>
<script language=jscript for=Agent event="Click(characterID, button, shift, x, y)"> Agent_OnClick(characterID, button, shift, x, y); </script>
<script language=jscript for=Agent event="DragComplete(characterID, button, shift, x, y)"> Agent_OnDragComplete(characterID, button, shift, x, y); </script>
<script language=jscript for=Agent event="RequestComplete(request)"> Agent_OnRequestComplete(request); </script>
<!-- End Agent Specific Code -->
<script language=jscript src="_MODULE_.js"></script>
<script language=jscript src="mousetut.js"></script>
<script language=jscript src="migrate.js"></script>
<script language=jscript src="dialmgr.js"></script>
<script language=jscript src="error.js"></script>
<script language=jscript src="icsmgr.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.
var APP_OOBE_MODE = 0; var APP_MSN_MODE = 1; var APP_DESKTOP_MODE = 2;
// Status location constants var STATUS_ISP = 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; var SNDX_OFF_EULA = 1; var SNDX_OFF_PID = 2; var SNDX_OFF_FINISH = 3;
// OLD STATUS PANE FOR B1 // var SNDX_WELCOME = 0; // var SNDX_HW1 = 1; // var SNDX_HW2 = 2; // var SNDX_HW3 = 3; // var SNDX_LEGAL1 = 4; // var SNDX_LEGAL2 = 5; // var SNDX_REG1 = 6; // var SNDX_REG2 = 7; // var SNDX_ISP = 8; // var SNDX_FINI = 9;
// For the new status pane, don't allow half way status var SNDX_WELCOME = 0; var SNDX_HW = 1; var SNDX_LEGAL = 2; var SNDX_REG = 3; var SNDX_ISP = 4; var SNDX_FINI = 6;
// holds non-checkpoint next navigation var g_SimpleNavMap = null;
function CheckPoint(strURL, i1, i2, i3, i4) { this.strURL = strURL; this.rgindex = new Array(STATUS_MAX); this.rgindex[STATUS_ISP] = i1; this.rgindex[STATUS_OEM] = i2; this.rgindex[STATUS_NONE] = i3; this.rgindex[STATUS_OFF] = i4; }
var curCKPT=1; var CKPT_HWCHK = curCKPT++; var CKPT_WELCOME = curCKPT++; var CKPT__MODULE_ = curCKPT++; var CKPT_MOUSETUT1 = curCKPT++; var CKPT_IMETUTORIAL = curCKPT++; var CKPT_OEMHW = curCKPT++; var CKPT_REGION_KEYBD = curCKPT++; var CKPT_REGKB_COMMIT = curCKPT++; var CKPT_TIMEZONE = curCKPT++; var CKPT_EULA = curCKPT++; var CKPT_EULA_DECLINE = curCKPT++; var CKPT_PRODUCTKEY = curCKPT++; var CKPT_BADPRODUCTKEY = curCKPT++; var CKPT_ICSCHOICE = curCKPT++; var CKPT_REGISTER1 = curCKPT++; var CKPT_REGISTER3 = curCKPT++; var CKPT_ISPSIGNUP = curCKPT++; var CKPT_MIGLIST = curCKPT++; var CKPT_ISPDIAL = curCKPT++; var CKPT_REFDIAL = curCKPT++; var CKPT_MIGDIAL = curCKPT++; var CKPT_REGDIAL = curCKPT++; var CKPT_OEMISP = curCKPT++; var CKPT_OEMCUST = curCKPT++; var CKPT_DONE = curCKPT++; var CKPT_MAX = curCKPT; // ALWAYS set this to be the biggest value!
var dnCKPT = new Array(CKPT_MAX);
var g_LastMouseTutPage="mouse_k.htm"; var g_Last_MODULE_Page = "";
// 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 CLSID_FLASH_PLAYER = "{D27CDB6E-AE6D-11cf-96B8-444553540000}"; var PROGID_FLASH_PLAYER = "ShockwaveFlash.ShockwaveFlash"; var CKPT_REG_KEY = "\\CKPT"; var TOS_REG_VALUE = "TopOfStack";
// CheckDialReady errors var ERR_COMM_NO_ERROR = 0; var ERR_COMM_OOBE_COMP_MISSING = 1; var ERR_COMM_UNKNOWN = 2; // Unknown 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; var DERR_REMOTE_DISCONNECT = 629; // Connection interrupted
// Types of dialing using ISP files. e.g. Dial to registration, ISP, referral server var CONNECTED_REFFERAL = 1 var CONNECTED_ISP_SIGNUP = 2 var CONNECTED_ISP_MIGRATE = 3 var CONNECTED_REGISTRATION = 4
// Finish errors var FINISH_OK = 0x00000000; var FINISH_REBOOT = 0x00000001; var FINISH_BAD_PID = 0x00000002; var FINISH_BAD_EULA = 0x00000004; var FINISH_BAD_STAMP = 0x00000008;
// 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;
// keycode consts var KeyEsc = 0x1B; var KeyEnter = 0xD; var KeyBackSpc = 0x8; var KeyDelete = 0x2E; var KeyTab = 0x9; var KeyDwnArrow = 0x28; var KeyUpArrow = 0x26; var KeyLeftArrow = 0x25; var KeyRightArrow = 0x27;
// Data comparison modes var CompareModeBinary = 0; var CompareModeText = 1;
// BUGBUG temp GUIDs var NOLAUNCHISPSIGNUP = "{C37D92A5-CA34-11d2-B71C-00C04F794977}"; var MSNCOMPLETED = "{1C0A22F2-CB6B-11d2-B544-00A0C949DA70}"; var LANGUAGECOMPLETED = "{F744DA40-617C-11D3-8B99-00A0C91E7F3C}"; var MS_REGISTRATION = "{1C956940-8617-11D3-8B99-00A0C91E7F3C}"; var OEM_REGISTRATION = "{ECD24360-B210-11D3-8B99-00A0C91E7F3C}"; var ICS_FOR_INTERNET = "{67252E44-C8B7-4b6c-B6CC-E3D0E1D3BF9B}"; var ICS_FOR_OOBE = "{7664797B-1A07-4755-AF19-2A73EC92E03B}";
// LANGUAGE SETTINGS
// sort order var SORT_DEFAULT = 0x0; // sorting default // primary languages var LANG_JAPANESE = 0x11; var LANG_KOREAN = 0x12; var LANG_CHINESE = 0x04; // sub languages var SUBLANG_KOREAN = 0x01; // Korean (Extended Wansung) var SUBLANG_CHINESE_TRADITIONAL = 0x01; // Taiwan var SUBLANG_CHINESE_SIMPLIFIED = 0x02; // Chinese (PR China) var SUBLANG_DEFAULT = 0x01; // user default
// window.external object caches var TapiObj = null; var InfoObj = null; var EulaObj = null; var LangObj = null; var PidObj = null; var StatusObj = null; var DirObj = null; var ApiObj = null; var SysClockObj = null; var RegisterObj = null; var FileSystemObj = null; var DebugObj = null;
// Localizeable strings for welcome.htm var L_StrVowelBeginningPrepender_Text = "an"; var L_StrPrepender_Text = "a";
// 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_OOBEDirPath = window.external.API.get_SystemDirectory() + "\\oobe\\"; var g_WaterMarkFileNameStr= window.external.API.get_SystemDirectory() + "\\OOBE\\images\\watermrk.gif"; var g_WaterMarkFileSize = 29683; // size of default watermrk.gif var g_bRedial = false; var g_LineProblem = 0; var g_bFirstServerError = true; var g_status = STATUS_OFF; var g_ServerErrorCount = 0; var g_IMEExists = false; var g_OEMAddBackURL = ""; var g_DialingAvailableInCountry = true; var g_ModalDialogUp = false; var bKeyboardPresent = true; var bMousePresent = true; var g_OEMNameStr = window.external.Signup.get_OEMName(); var g_bTapiDone = false;
// Mandatory Initialization Code if (null == DebugObj){ DebugObj = new Object; DebugObj = window.external.Debug; } if (null == FileSystemObj) { FileSystemObj = new ActiveXObject("Scripting.FileSystemObject"); }
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; } if (null == TapiObj) { TapiObj = new Object; TapiObj = window.external.Tapi; } if (null == RegisterObj) { RegisterObj = new Object; RegisterObj = window.external.Register; } if (null == SysClockObj) { SysClockObj = new Object; SysClockObj = window.external.SystemClock; SysClockObj.Init(); }
if (null == LangObj) { LangObj = new Object; LangObj = window.external.Language; }
// END Initialization Code
// make standard ClickNext Str var L_ContStr_Text="To continue, click"; var L_NextStr_Text="Next"; var L_Period_Text="."; var L_ClickNextLocStr_Text=""; // for localizers to add stuff without affecting L_Period_Text
var L_ClickNextStrTopPercent800_Text="87%"; var L_ClickNextStrTopPercent1024_Text="84%"; var L_ClickNextStrLeftPercent_Text="62%";
var g_ClickNextStr = "<table tabindex=-1 border=0 style=\"position:absolute; top: " + ((window.top.screen.width < 1024) ? L_ClickNextStrTopPercent800_Text : L_ClickNextStrTopPercent1024_Text) + "; left:2%;\"><tr><td width="+L_ClickNextStrLeftPercent_Text+"></td>" +"<td class=\"text-primary\" ID=NextText>"+L_ContStr_Text+" <span class=\"emphasis-lesser\">" +L_NextStr_Text+"</span>"+L_ClickNextLocStr_Text+L_Period_Text+"</td></tr></table>";
var L_NextStrTopPercent_Text="83%";
function trace(sMsg) { DebugObj.Trace(sMsg + "\n"); }
function logError(funcName, err) { trace( "Exception in " + funcName + ": " + err.number.toString(16) + ": " + err.description ); if (DebugObj.get_MsDebugMode())�� { alert("OOBE Exception\n" + "\nFunction: " + funcName + "\nError: " + err.number.toString(16) + "\nDescription: " + err.description ); } }
////////////////////////////////////////////////////////////////////////////////////// // IMETut1.htm //////////////////////////////////////////////////////////////////////////////////////
function imetut_LoadMe() { InitFrameRef(); g_FirstFocusElement = g.btnNextText;
if (1 != DirObj.get_DoRegionalKeyboard()) HideButtons(HIDE_BACK);
InitButtons(); g_FirstFocusElement.focus(); }
////////////////////////////////////////////////////////////////////////////////////// // theatre.htm ////////////////////////////////////////////////////////////////////////////////////// function Theatre_LoadMe( ) { InitFrameRef( ); g_FirstFocusElement = g.btnNext;
InitButtons( ); }
function Theatre_OnFSCommand(command, args) { if ("MOVIE_COMPLETE" == command) { g.btnNext.click( ); } }
////////////////////////////////////////////////////////////////////////////////////// // welcome.htm ////////////////////////////////////////////////////////////////////////////////////// function Start_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 == KeyEnter) && (g.btnNext.disabled == false)) { GoNext(); } else { KeyPressIsValid(); } }
function MAKELANGID(p, s) { return (( s << 10) | p); }
function MAKELCID(lgid, srtid) { return ((srtid << 16) | lgid); }
function IsKoreanLocale() { var language = ApiObj.get_UserDefaultLCID(); if (language == MAKELCID(MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), SORT_DEFAULT)) { return true; }
return false; }
function IsFarEastLocale() { // if local is Korean, Simplified Chinese, // Traditional Chinese,or Japanese then we return true var language = ApiObj.get_UserDefaultLCID();
if (language == MAKELCID(MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), SORT_DEFAULT) || language == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_DEFAULT) || language == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT) || language == MAKELCID(MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), SORT_DEFAULT)) return true else return false; } // Function: Start_LoadMe // Description: This function is called after start.htm is // loaded. we then initialize Items on the page. // we also populate the edits with any values already // found in the registry. //
var L_Thanks1_Text="thank you"; var L_Welc_Text="Welcome"; var L_Comma_Text=",";
var g_bNeedtoRunWelcomeFadeIn= (DirObj.get_DoWelcomeFadeIn()>0); var g_bNeedtoRunAnimation=false; // will be set in InitApplication var g_RunAnimInitVal = DirObj.get_DoRunAnimation(); var g_bAnimationRunning = false;
function Start_LoadMe() { InitFrameRef();
var WaterMarkFileHandle=FileSystemObj.GetFile(g_WaterMarkFileNameStr); if(WaterMarkFileHandle.size != g_WaterMarkFileSize) { g.WelcomeImg.style.display="none"; }
g_FirstFocusElement = g.btnNext; g.btnNext.disabled = false;
var strOEMName = g_OEMNameStr; var strPrepend = "";
var FirstName=window.external.UserInfo.get_FirstName(); var LastName=window.external.UserInfo.get_LastName();
if((FirstName.length>0) || (LastName.length>0)) { var NameStr="";
if (IsFarEastLocale()) { // switch first & last name order var tmpstr=FirstName; FirstName=LastName; LastName=tmpstr; }
// get the right # of spaces b/w words if(FirstName!=null) { NameStr=FirstName; } if(LastName!=null && LastName!="") { if(NameStr!="") { NameStr=NameStr+" "+LastName; } else { NameStr=LastName; } } g.welcome_namestr.innerText = L_Welc_Text+ " " +NameStr+L_Comma_Text + " " + L_Thanks1_Text + " "; }
// put an "a" or an "an" before the OEM name in welcome page
if (strOEMName.length != 0) { var Query = strOEMName.charAt(0); if (Query.match(/A|E|I|O|U|a|e|i|o|u/) != null) strPrepend = L_StrVowelBeginningPrepender_Text; else strPrepend = L_StrPrepender_Text;
g.spanOEMName.innerText = strPrepend + " " + strOEMName; }
g.WelcomePageText.style.display="inline";
InitButtons();
if(g_bNeedtoRunWelcomeFadeIn) { // this entire 'junkspan' sequence is done so that the necessary DLL's for blendtrans //(ddraw.dll/ddrawex.dll/dxtmsft.dll/dxtrans.dll/atl.dll) are preloaded before the // real blend is done after the movie
junkspan.style.filter="blendTrans(duration=10.0)"; // 10.0 is junk placeholder junkspan.filters[0].duration=0.1; junkspan.filters[0].enabled=true; junkspan.filters[0].Apply(); junkspan.style.backgroundColor="red"; junkspan.style.display="inline"; junkspan.filters[0].Play();
junkspan.style.display="none"; junkspan.filters[0].enabled=false; junkspan.style.filter=null; }
window.external.ShowOOBEWindow(); // we've done all the init preprocessing we can
// see if we need to run movie if((g_RunAnimInitVal>0) && (g_bNeedtoRunAnimation || (g_RunAnimInitVal==99))) { g_bAnimationRunning = true; MovieFrame.style.display="inline"; // start movie
ScreenFrame.style.visibility = "visible"; ScreenFrame.style.display = "inline"; } else if(g_bNeedtoRunWelcomeFadeIn) {
// transition still not visible on direct boot, too much disk activity // 7 seconds appears to be visible. may need to fine tune that 4.5 number. // want to consider machine speed as well, longer number may be too long // for slow machine? (or you may need longer, since it takes longer to load?) // want fast machine to work well
RunWelcomeFadeIn(3.0);
} else { ScreenFrame.style.visibility = "visible"; ScreenFrame.style.display = "inline"; OOBEDocBody.style.cursor = "default"; g_FirstFocusElement.focus(); window.setTimeout("Agent_Activate('Welcome');",1000); }
g_bNeedtoRunAnimation=false; g_RunAnimInitVal=0; }
function RunWelcomeFadeIn(duration) { // need to turn off so fade transition is visible // needed if nav'ing from USB pages
if(ScreenFrame.style.display!="none") { ScreenFrame.style.display="none"; ScreenFrame.style.visibility = "hidden"; }
ScreenFrame.style.filter="blendTrans(duration=10.0)"; // 10.0 is junk placeholder ScreenFrame.filters[0].duration=duration; ScreenFrame.filters[0].enabled=true; ScreenFrame.onfilterchange=DisableScreenTransition;
ScreenFrame.filters[0].Apply(); MovieFrame.style.display="none"; // dont know if this works w/transition below ScreenFrame.style.visibility = "visible"; ScreenFrame.style.display = "inline"; ScreenFrame.filters[0].Play(); }
function PostMovieWelcomeInit() {
if(g_bNeedtoRunWelcomeFadeIn && (g_CurrentCKPT==CKPT_WELCOME)) {
g_bAnimationRunning = false; RunWelcomeFadeIn(3.0);
} else {
MovieFrame.style.display="none"; // dont know if this works w/transition below ScreenFrame.style.visibility = "visible"; ScreenFrame.style.display = "inline"; g_FirstFocusElement.focus(); OOBEDocBody.style.cursor = "default";
// want to make sure screen is drawn before agent pops up if(g_CurrentCKPT==CKPT_WELCOME) { window.setTimeout("Agent_Activate('Welcome');",1000); } else if(g_CurrentCKPT==CKPT_HWCHK) { g_bAnimationRunning = false; // want to prevent OnDeviceArrival from doing anything until now
// check if USB device was attached during movie, possible nav to welcome OnDeviceArrival(); } }
g_bAnimationRunning = false; }
function DisableScreenTransition() { // called when transition completed
g_bNeedtoRunWelcomeFadeIn=false;
ScreenFrame.filters[0].enabled=false; ScreenFrame.style.filter=null; g_FirstFocusElement.focus(); // bugbug need to add this back to filter too OOBEDocBody.style.cursor = "default"; window.setTimeout("Agent_Activate('Welcome');",700); }
// Function: Start_CheckEdits // Description: This function is called everytime an OnClick // event fires on the page. This is done so if the user // loses focus from one of the edits we can push them // in the right direction and hint them along the way // Or if all elements are filled then we enabled // the next button or if any value is 0 then we // disable the next button // function Start_CheckEdits() { try { if (g.event == null) return; } catch(e) { return; }
if ((g.event.srcElement != g.edt_FirstName) && (g.event.srcElement != g.edt_LastName)) { Start_CheckEnableNextButton(); } }
// Function: Start_CheckEnableNextButton // Description: This function is called everytime a keyup // event fires on a edit box for first, middle, or last // name. We then see if we should enable or disable the // next button based on if every field has a value. // First || Last // function Start_CheckEnableNextButton() { try { if (g.event == null) return; } catch(e) { return; }
if (Start_CheckLengthRequirement() && Start_CheckLengthNotEqualSpaces()) { g.btnNext.disabled = false; } else { g.btnNext.disabled = true; } InitButtons(); }
function Start_CheckLengthRequirement() { if ((g.edt_FirstName.value.length != 0) || (g.edt_LastName.value.length != 0)) return true; else return false; }
function Start_CheckLengthNotEqualSpaces() { if ((g.edt_FirstName.value.length != NumberOfSpaces(g.edt_FirstName.value)) || (g.edt_LastName.value.length != NumberOfSpaces(g.edt_LastName.value))) return true; else return false; } // END welcome.htm
// reg1.htm ////
var g_Reg1Yes=true;
function HandleReg1Click() { g_Reg1Yes=(g.event.srcElement==g.radioRegNeedPP); }
function Reg1_LoadMe() { InitFrameRef();
if (1 == RegisterObj.get_PostToOEM) { g.OEMName.innerText=g_OEMNameStr+ " " + L_And_Text + " " ; g.OEMName5.innerText=g.OEMName.innerText; if(g.OEMName.innerText=="") { g.OEMName.innerText="Error: Missing OEM Name in oobeinfo.ini [Branding] section "; } }
g.Reg1Title.style.visibility="visible"; g.Reg1Intro.style.visibility="visible";
g_FirstFocusElement = g.btnNext;
if(g_Reg1Yes) { g.radioRegNeedPP.checked=true; } else { g.radioRegLater.checked=true; }
g.radioRegNeedPP.onclick=HandleReg1Click; g.radioRegLater.onclick=HandleReg1Click;
InitButtons();
if (g_FirstFocusElement != null) g_FirstFocusElement.focus(); }
// reg2.htm //////
var g_Reg2EmailName=""; var g_Reg2MachineName=""; var g_Reg2PW="";
function Reg2SaveSettings() { // restore fields g_Reg2EmailName= g.emailname.value; g_Reg2MachineName= g.machinename.value; g_Reg2PW=g.passwd.value; }
function Reg2_LoadMe() { InitFrameRef(); g_FirstFocusElement = g.emailname;
// restore fields g.emailname.value = g_Reg2EmailName; g.machinename.value = g_Reg2MachineName; g.passwd.value = g_Reg2PW;
InitButtons();
if (g_FirstFocusElement != null) g_FirstFocusElement.focus(); }
function Reg2_RemindMe() { // BUGBUG: need to fill in later /* Following Windows Welcome, Microsoft will send you an e-mail message explaining how to retrieve your password. You can then register Windows from the Start menu. */ }
function Default_radioClicked() { try { if (g.event == null) return; } catch(e) { return; }
g.btnNext.disabled = false; InitButtons(); }
//// reg3.htm ///////////////////////
var StateAbbrevs = new Array("","AL","AK","AZ","AR","CA","CO","CT","DC","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","PR","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY"); var FullStateNames = new Array("Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Washington, D.C.","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Carolina","North Dakota","Ohio","Oklahoma","Oregon","Pennsylvania","Puerto Rico","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"); var ProvinceNames = new Array("","Alberta","British Columbia","Manitoba","New Brunswick","Newfoundland","Northwest Territories","Nova Scotia","Nunavut","Ontario","Prince Edward Island","Quebec","Saskatchewan","Yukon");
// need ability to map state name string to index into StateAbbrevs var g_StateName2IndexMap= new ActiveXObject("Scripting.Dictionary"); g_StateName2IndexMap.CompareMode = CompareModeText; var g_ProvinceName2IndexMap= new ActiveXObject("Scripting.Dictionary"); g_ProvinceName2IndexMap.CompareMode = CompareModeText;
// windows scripting host -- used to send fake keybd events for keyboard helper on PID page var WshShell = new ActiveXObject("WScript.Shell");
// init hash table var ii; for(ii=1;ii<=FullStateNames.length;ii++) { // add both full name and abbrev to hash table g_StateName2IndexMap.Add(FullStateNames[ii-1].toUpperCase(),ii); g_StateName2IndexMap.Add(StateAbbrevs[ii].toUpperCase(),ii);
if(ii < ProvinceNames.length) { g_ProvinceName2IndexMap.Add(ProvinceNames[ii].toUpperCase(),ii); } }
var L_Postal_Text = "Postal or <u>Z</u>IP code:"; var L_AsteriskPostal_Text = "*Postal or <u>Z</u>IP code:"; var L_Province_Text= "State/<u>P</u>rovince:"; var L_AsteriskProvince_Text= "*State/<u>P</u>rovince:";
var L_Canada_Text="Canada"; var L_UnitedStates_Text="United States of America";
function Reg3UserCountryChanged() { // AGENT: notify Agent of the change
Agent_OnSelectChange(g.selCountry);
g_Country=g.selCountry.options(g.selCountry.selectedIndex).text;
if(g_Country == L_UnitedStates_Text) { // when changing to US, try to translate any textbox string to state index if(g.UserStateTextBox.value!="") { var res=g_StateName2IndexMap.Item(g.UserStateTextBox.value.toUpperCase()); if(res!=null) { g.selUSState.selectedIndex=res; } } g.selCAProvince.style.display="none"; g.UserStateTextBox.style.display="none";
if(g.selUSState.style.display!="inline") { g.selUSState.style.display="inline"; } g.LabelZIP.innerHTML = L_AsteriskPostal_Text; g.StateLabel.innerHTML = L_AsteriskProvince_Text; g.StateLabel.htmlFor="selUSState";
} else if(g_Country == L_Canada_Text) { // when changing to Canada, try to translate any textbox string to province index if(g.UserStateTextBox.value!="") { var res=g_ProvinceName2IndexMap.Item(g.UserStateTextBox.value.toUpperCase()); if(res!=null) { g.selCAProvince.selectedIndex=res; } } g.selUSState.style.display="none"; g.UserStateTextBox.style.display="none"; g.selCAProvince.style.display="inline"; g.LabelZIP.innerHTML = L_AsteriskPostal_Text; g.StateLabel.innerHTML = L_AsteriskProvince_Text; g.StateLabel.htmlFor="selCAProvince";
} else { g.selUSState.style.display="none"; g.selCAProvince.style.display="none"; g.UserStateTextBox.style.display="inline"; g.LabelZIP.innerHTML = L_Postal_Text; g.StateLabel.innerHTML = L_Province_Text; g.StateLabel.htmlFor="UserStateTextBox"; }
g_CountryIdx=g.selCountry.selectedIndex;
Reg3UserStateChanged(); }
function Reg3UserStateChanged() {
// AGENT: notify Agent of the change
// BUGBUG: ok for no notify on change to textbox? Agent_OnSelectChange((g.selUSState.style.display != "none") ? g.selUSState : g.selCAProvince);
if(g.selUSState.style.display!="none") { g_StateIdx=g.selUSState.selectedIndex; g_State=g.selUSState.options(g.selUSState.selectedIndex).text; } else if (g.selCAProvince.style.display!="none") { g_StateIdx=g.selCAProvince.selectedIndex; g_State=g.selCAProvince.options(g.selCAProvince.selectedIndex).text; } else { g_State = g.UserStateTextBox.value; } }
// store field info here:
var g_FirstName=InfoObj.get_FirstName(); var g_MiddleName=InfoObj.get_MiddleInitial(); // InfoObj.get_MiddleName(); BUGBUG need to add this fn var g_LastName=InfoObj.get_LastName(); var g_Address1=InfoObj.get_Address1(); var g_Address2=InfoObj.get_Address2(); var g_City=InfoObj.get_City(); var g_ZipCode=InfoObj.get_Zip(); var g_EmailAddr= InfoObj.get_PrimaryEmail(); var g_Country=InfoObj.get_Country(); var g_CountryIdx=-1; var g_State=InfoObj.get_State(); var g_StateIdx=0;
function Reg3SaveSettings() { g_FirstName=g.UserFirstName.value; g_MiddleName=g.UserMiddleName.value; g_LastName=g.UserLastName.value; g_Address1=g.UserAddress.value; g_Address2=g.UserAddress2.value; g_ZipCode=g.UserZipCode.value; g_EmailAddr=g.UserEmailAddress.value; g_City=g.UserCity.value; g_Country=g.selCountry.options(g.selCountry.selectedIndex).text;
if(g.UserStateTextBox.style.display!="none") { g_State=g.UserStateTextBox.value; } else if (g.selUSState.style.display!="none") { g_State=g.selUSState.options(g.selUSState.selectedIndex).text; } else { g_State=g.selCAProvince.options(g.selCAProvince.selectedIndex).text; }
InfoObj.set_FirstName(g_FirstName); InfoObj.set_LastName(g_LastName); InfoObj.set_MiddleInitial(g_MiddleName); InfoObj.set_Country(g_Country); InfoObj.set_State(g_State); InfoObj.set_Address1(g_Address1); InfoObj.set_Address2(g_Address2); InfoObj.set_PrimaryEmail(g_EmailAddr); InfoObj.set_Zip(g_ZipCode); InfoObj.set_City(g_City);
TapiObj.set_CountryIndex(g.selCountry.selectedIndex); }
var L_FullName_Text="*<u>F</u>ull Name:";
function Reg3_LoadMe() { // AGENT: we don't want Agent to process any events // that might occur as a result of initializing the // controls.
Agent_IgnoreEvents(true);
InitFrameRef();
if (1 == RegisterObj.get_PostToOEM) { g.OEMName.innerText=g_OEMNameStr+ " " + L_And_Text + " " ; if(g.OEMName.innerText=="") { g.OEMName.innerText="Error: Missing OEM Name in oobeinfo.ini [Branding] section "; } }
var fTapi = TapiObj.IsTAPIConfigured(); // init TAPI
var CountryOptStr=TapiObj.get_AllCountryName();
// we used to do a document.write() to put this into selCountry. IE 5.5 seems to // have redraw probs with long doc.writes, so parse it out and add it once in onload
var i; var oOption; var regexp1=/<OPTION>/g; var tmpOptsStr = CountryOptStr.replace(regexp1, ""); //delete <OPTION> var OptStrArray = tmpOptsStr.split("</OPTION>");
for(i=0; i < OptStrArray.length; i++) { oOption = g.document.createElement("OPTION"); oOption.text = OptStrArray[i]; g.selCountry.add(oOption); }
g.selCountry.onchange=Reg3UserCountryChanged;
g.Reg3Title.style.visibility="visible";
g_FirstFocusElement = g.UserFirstName;
if (IsFarEastLocale()) {
/*For JPN, CHT, CHS, Last Name First Name Country/Region Province City Address Zip E-Mail
For KOR only, Full Name Country/Region Province City Address Zip E-Mail */ g.MainPageCell.style.display="none"; // hide while we change order
// no middle name for far east langs g.MiddleNameRow.style.display="none";
g.FieldTable.moveRow(2,0); // move lastname in front of first g.FieldTable.moveRow(7,3); // move country to after firstname g.FieldTable.moveRow(7,4); // move province to after country g.FieldTable.moveRow(7,5); // move city to after province
g.FE_ZIPLabel.innerHTML=g.LabelRight.innerHTML; g.FE_ZIPInput.innerHTML=g.MenuRight.innerHTML; g.FE_ZIPRow.style.display="inline";
g.LabelRight.innerHTML=""; g.MenuRight.innerHTML="";
// no reason to limit these lengths for FE, so just make them match others g.UserZipCode.size=30; g.UserZipCode.maxlength=120;
g.UserStateTextBox.size=30; g.UserStateTextBox.maxlength=120;
g_FirstFocusElement = g.UserLastName;
if (IsKoreanLocale()) { g.LastNameRow.style.display="none"; g.LabelFirstName.innerHTML=L_FullName_Text; g_FirstFocusElement = g.UserFirstName; }
g.MainPageCell.style.display="inline"; }
// limit width of country menu since some text options are very long g.selCountry.style.width=g.UserEmailAddress.offsetWidth;
g.UserFirstName.value=g_FirstName; g.UserMiddleName.value=g_MiddleName; g.UserLastName.value=g_LastName; g.UserAddress.value=g_Address1; g.UserAddress2.value=g_Address2; g.UserZipCode.value=g_ZipCode; g.UserEmailAddress.value=g_EmailAddr; g.UserCity.value=g_City;
// placeholder idx 0 option is needed to fix 101447 // Due to a possible mshtml bug, the cursor is shifted right when the menu // expands to its full width.
g.selUSState.remove(0);
for (var i = 0; i < StateAbbrevs.length; i++) { var oOption = g.document.createElement("OPTION"); oOption.text = StateAbbrevs[i]; if (StateAbbrevs[i] == g_State) { g_StateIdx = i; } g.selUSState.add(oOption); }
for (i = 0; i < ProvinceNames.length; i++) { oOption = g.document.createElement("OPTION"); oOption.text = ProvinceNames[i]; if (ProvinceNames[i] == g_State) { g_StateIdx = i; } g.selCAProvince.add(oOption); }
// Note: the way code below is written, g_CountryIdx always >=0 so 2nd branch never // taken. causes no probs though
g_CountryIdx = TapiObj.get_CountryIndex();
if(g_CountryIdx>=0) { g.selCountry.selectedIndex=g_CountryIdx; if(g_Country == L_UnitedStates_Text) { g.selUSState.selectedIndex=g_StateIdx; } else if(g_Country == L_Canada_Text) { g.selCAProvince.selectedIndex=g_StateIdx; } else g.UserStateTextBox.value=g_State; } else { // get default value g.selCountry.selectedIndex = TapiObj.get_CountryIndex(); }
Reg3UserCountryChanged(); g.MainPageCell.style.visibility="visible";
if (1 == RegisterObj.get_PostToOEM) { if (bPostChkBxStateSaved) { g.sharems.checked = g_PostToMS; g.shareoem.checked = g_PostToOEM;
if(!g_PostToMS && !g_PostToOEM) { g.btnNext.onclick = GoCancel; // convert to Skip if nothing checked } else { g.btnNext.onclick = GoNext; } } g.OEMName2.innerText=g_OEMNameStr; g.OEMName3.innerText=g_OEMNameStr; g.RegChkBxGrp.style.display = "inline"; } else { g.MSPrivatePolicyLink.style.display = "inline"; g_PostToOEM = false; }
InitButtons();
g_FirstFocusElement.focus();
// AGENT: now we want event processing
Agent_IgnoreEvents(false); }
function GetCurrentProvince() { if(g.selCountry.options(g.selCountry.selectedIndex).text == L_UnitedStates_Text) { return g.selUSState.options(g.selUSState.selectedIndex).text; } else if(g.selCountry.options(g.selCountry.selectedIndex).text == L_Canada_Text) { return g.selCAProvince.options(g.selCAProvince.selectedIndex).text; } else return g.UserStateTextBox.value; }
function GetCurrentCountry() { return g.selCountry.options(g.selCountry.selectedIndex).text; }
var L_EnterValid_Text="Please fill in the required fields."; var L_Email_Text="Please enter a valid E-mail address or leave the E-mail text box empty."; var L_And_Text="and";
var g_PostToMS = true; var g_PostToOEM = true; var POST_TO_OEM = 1 var POST_TO_MS = 2 var bPostChkBxStateSaved = false;
function RegChkBoxOnClick() { g_PostToMS = g.sharems.checked; g_PostToOEM = g.shareoem.checked; bPostChkBxStateSaved = true;
if(!g_PostToMS && !g_PostToOEM) { g.btnNext.onclick = GoCancel; // convert to Skip if nothing checked } else { g.btnNext.onclick = GoNext; }
InitButtons(); }
function VerifyReg3Fields() { g.error_mesg.style.display="none"; var LastErrorField = null;
var CurReg3ErrStringArray = new Array();
// user needs to complete input of address/name // this dynamically builds the list of erroneous fields to give to the user
if(g.UserEmailAddress.value != "") { // do some validation on email address // Note special regexpr char like '\S' must be double-\'d because they are inside a string var re = new RegExp("^\\s*\\S+@\\S+\\.\\S\\S+",""); if(re.exec(g.UserEmailAddress.value) == null) { LastErrorField = g.UserEmailAddress; g.LabelEmail.style.color = "red"; } else { g.LabelEmail.style.color = "black"; } }
var CurCountry=GetCurrentCountry();
// dont require state or zip except for US/Canada if ((CurCountry == L_UnitedStates_Text)||(CurCountry == L_Canada_Text)) { if(g.UserZipCode.value == "") { LastErrorField = g.UserZipCode; g.LabelZIP.style.color = "red"; } else { g.LabelZIP.style.color = "black"; }
if(GetCurrentProvince() == "") { if(g.selUSState.style.display!="none") { LastErrorField = g.selUSState; } else { LastErrorField = g.selCAProvince; } g.StateLabel.style.color = "red";
} else { g.StateLabel.style.color = "black"; } }
if(g.UserCity.value == "") { LastErrorField = g.UserCity; g.LabelCity.style.color = "red"; } else { g.LabelCity.style.color = "black"; }
if(g.UserAddress.value == "") { LastErrorField = g.UserAddress; g.LabelAddress.style.color = "red"; } else { g.LabelAddress.style.color = "black"; }
if((g.UserLastName.value == "") && (g.LastNameRow.style.display!="none")) { LastErrorField = g.UserLastName; g.LabelLastName.style.color = "red"; } else { g.LabelLastName.style.color = "black"; }
if((g.UserFirstName.value == "")&&(g.UserMiddleName.value == "")) { g.LabelFirstName.style.color = "red"; LastErrorField = g.UserFirstName; } else { g.LabelFirstName.style.color = "black"; }
if(LastErrorField==null) { return true; }
// handle error
if(LastErrorField==g.UserEmailAddress) { g.error_mesg.innerText = L_Email_Text; } else { g.error_mesg.innerText = L_EnterValid_Text; }
g.error_mesg.style.color = "red"; g.error_mesg.style.display="inline";
try { g.btnNext.disabled=false; } catch(e) {} try { g.btnBack.disabled=false; } catch(e) {} try { g.btnSkip.disabled=false; } catch(e) {} InitButtons();
LastErrorField.focus();
return false; }
////////////////////////////////////////////////////////////////////////////////////// // 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() { 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 = "9"; } 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
// EULAWarn.htm var L_BadEulaOEM1_TEXT = "You have chosen not to agree to the "; var L_BadEulaOEM2_TEXT = " terms of the license agreement. If you do not accept the End User License Agreement, you cannot use Windows Whistler."; var L_BadEulaMSOEM1_TEXT = "You have chosen not to agree to the Microsoft or "; var L_BadEulaMSOEM2_TEXT = " terms of the license agreement. If you do not accept the End User License Agreements, you cannot use Windows Whistler.";
var BadEulaOEMStr = L_BadEulaOEM1_TEXT + g_OEMNameStr + L_BadEulaOEM2_TEXT; var BadEulaMSOEMStr = L_BadEulaMSOEM1_TEXT + g_OEMNameStr + L_BadEulaMSOEM2_TEXT;
function EULAWarn_LoadMe() { InitFrameRef();
g_FirstFocusElement = g.btnBack;
if (!g_AcceptMS_EULA && !g_AcceptOEM_EULA) g.EULAWarn_INFO1.innerText = BadEulaMSOEMStr; else if (!g_AcceptOEM_EULA) // just didn't accept OEM g.EULAWarn_INFO1.innerText = BadEulaOEMStr;
InitButtons();
g_FirstFocusElement.focus(); }
// END EULAWarn.htm
////////////////////////////////////////////////////////////////////////////////////// // General Default LoadMe function ////////////////////////////////////////////////////////////////////////////////////// function _Default_LoadMe(UseSimpleNavArg) { InitFrameRef();
if (g.btnNext != null) g_FirstFocusElement = g.btnNext; else if (g.btnSkip != null) g_FirstFocusElement = g.btnSkip; else if (g.btnBack != null) g_FirstFocusElement = g.btnBack;
InitButtons(UseSimpleNavArg);
if (g_FirstFocusElement != null) g_FirstFocusElement.focus(); else g.document.body.focus(); /* // small piddly things I dont want to create a new onload fn for switch(g_CurrentCKPT) { case CKPT_REGKB_COMMIT: break; } */
}
////////////////////////////////////////////////////////////////////////////////////// // eula.htm //////////////////////////////////////////////////////////////////////////////////////
function HandleTextAreaFocus() { g.event.srcElement.style.borderStyle="ridge"; }
function HandleTextAreaBlur() { g.event.srcElement.style.borderStyle=""; }
function EulaLoadMe() { if (window.external.GetNoWelcomeFinish()) { g.btnNext = g.btnFinish; g.btnFinish.style.display = "inline"; g.ToContinueFinishSpn.style.display = "inline"; } else { g.ToContinueNextSpn.style.display = "inline"; g.btnNext.style.display = "inline"; }
InitFrameRef();
if (1 == window.external.GetOEMEula()) // Show both MS and OEM Eula { g.txtEULA.rows = 5; // shorten the MS Eula txt to make room g.txtEULA2.innerText = ApiObj.LoadFile(window.external.GetOEMEulaText()); g.OEMEulaSpan.style.display = "inline"; } else { g.radioAgree2.checked = true; }
g.MSEulaSpan.style.display = "inline";
g_FirstFocusElement = g.txtEULA;
var fileEULA = EulaObj.ValidateEULA();
var L_strBadEULA_Text = "Setup was unable to display the User License Agreement. Setup will now close."; if (0 == fileEULA.length) { alert(L_strBadEULA_Text); window.external.PowerDown(0); }
g.txtEULA.innerText = ApiObj.LoadFile(fileEULA);
if (0 == g.txtEULA.innerText.length) { alert(L_strBadEULA_Text); window.external.PowerDown(0); }
// disable if both unchecked, in case we ever persist the radio click if(!(g.radioAgree.checked || g.radioDisAgree.checked)) g.btnNext.disabled = true;
InitButtons(); g.btnNext.onclick = EulaNextBtnHandler;
g_FirstFocusElement.focus();
try { g.document.body.onkeydown = EulaOnKeyDown; } catch(e){}
}
function EulaNextBtnHandler() { StoreEula(); GoNext(); }
function EulaOnKeyDown() {
if (KeyEsc == g.event.keyCode) { g.event.returnValue = false; g.event.keyCode = 0; }
OnKeyDown(); }
var g_AcceptMS_EULA = false; var g_AcceptOEM_EULA = false; function EulaRadioClicked() { // if they click on either button, enable next if(g.btnNext.disabled && ((g.radioAgree.checked || g.radioDisAgree.checked) && (g.radioAgree2.checked || g.radioDisAgree2.checked))) { g.btnNext.onmouseover = HandleButtonMouseOver; g.btnNext.onmouseout = HandleButtonMouseOut; g.btnNext.className="buttons"; g.btnNext.disabled = false; g.btnNext.onclick = EulaNextBtnHandler; g.btnNext.focus(); } g_AcceptMS_EULA = g.radioAgree.checked; g_AcceptOEM_EULA = g.radioAgree2.checked; }
function StoreEula() { EulaObj.set_EULAAcceptance = (g.radioAgree.checked && g.radioAgree2.checked); } // END eula.htm
var g_daylight=SysClockObj.get_AutoDaylight(); var g_CurTimeZoneIdx = SysClockObj.get_TimeZoneIdx();
function HandleTZChkBox() { g_daylight = g.daylight.checked; // this just persists on nav back
OnClick(); }
function HandleSelTZChange() { g_CurTimeZoneIdx = g.selTimeZone.selectedIndex; g.daylight.disabled = !SysClockObj.get_DaylightEnabled(g_CurTimeZoneIdx); }
function TimeZone_LoadMe() { InitFrameRef(); g_FirstFocusElement = g.selTimeZone; InitButtons();
g.daylight.checked = g_daylight; g.daylight.onclick = HandleTZChkBox; g.selTimeZone.onchange=HandleSelTZChange; g.selTimeZone.selectedIndex = 0; //(HACK to make selected item to be made visible in select menu, there is no official way to do this) g.selTimeZone.selectedIndex = g_CurTimeZoneIdx; g.daylight.disabled = !SysClockObj.get_DaylightEnabled(g_CurTimeZoneIdx);
g_FirstFocusElement.focus(); }
////////////////////////////////////////////////////////////////////////////////////// // keybdcmt.htm //////////////////////////////////////////////////////////////////////////////////////
var g_RegionSelIdx=LangObj.get_RegionIndex(); var g_LangSelIdx=LangObj.get_LangIndex(); var g_KeyboardSelIdx=LangObj.get_KeyboardLayoutIndex();
function RegKBCmt_LoadMe() { InitFrameRef(); g_FirstFocusElement = g.btnNext; InitButtons();
g.newkeybdname.innerText=LangObj.get_KeyboardLayoutName(g_KeyboardSelIdx); g.newregionname.innerText=LangObj.get_RegionName(g_RegionSelIdx); g.newlangname.innerText=LangObj.get_LangName(g_LangSelIdx);
g_FirstFocusElement.focus(); } // END keybdcmt.htm
////////////////////////////////////////////////////////////////////////////////////// // keybd.htm //////////////////////////////////////////////////////////////////////////////////////
var iMaxKeybdNameLen=1; var iMaxRegionNameLen=1; var iMaxLangNameLen=1;
function HandleKeybdPageSelMenuChange() { var namestr=g.event.srcElement.id.slice(3); eval('g.'+namestr+'Name.value=g.event.srcElement.options(g.event.srcElement.selectedIndex).text;'); eval('g_'+namestr+'SelIdx='+'g.event.srcElement.selectedIndex;'); }
function SetKeybdFocus() { g.selKeyboard.focus(); }
function SetRegionFocus() { g.selRegion.focus(); }
function SetLangFocus() { g.selLang.focus(); }
// keep separating mechanism in case we need to shorten these strings var L_LangStr_Text="Select your preferred language."; var LangStrSmall=L_LangStr_Text; var L_RegionStr_Text="Select the region closest to where you live."; var RegionStrSmall=L_RegionStr_Text; var L_KeybdStr_Text="The keyboard that came with your computer is designed for typing in a particular language and may have special function keys. Select the type of keyboard you have. (For a standard English language keyboard, click United States 101)"; var KeybdStrSmall=L_KeybdStr_Text; var L_KeybdTitleSmall_Text="Select Your System Settings";
function RegKBLoadMe() { InitFrameRef();
g_FirstFocusElement = g.selRegion;
InitButtons(); RetrieveRegKB();
g.selKeyboard.onchange = HandleKeybdPageSelMenuChange; g.selRegion.onchange = HandleKeybdPageSelMenuChange; g.selLang.onchange = HandleKeybdPageSelMenuChange;
// fix 110160
g.KeyboardName.onfocus = SetKeybdFocus; g.RegionName.onfocus = SetRegionFocus; g.LangName.onfocus = SetLangFocus;
// init name boxes g.RegionName.value=g.selRegion.options(g.selRegion.selectedIndex).text; g_RegionSelIdx=g.selRegion.selectedIndex; g.LangName.value=g.selLang.options(g.selLang.selectedIndex).text; g_LangSelIdx=g.selLang.selectedIndex; g.KeyboardName.value=g.selKeyboard.options(g.selKeyboard.selectedIndex).text; g_KeyboardSelIdx=g.selKeyboard.selectedIndex;
// need to shorten text for small screen to make things fit if(window.top.screen.width<1024) { g.KeybdStr.innerText=KeybdStrSmall; g.RegionStr.innerText=RegionStrSmall; g.LangStr.innerText=LangStrSmall;
for(i=3;i<=5;i++) { eval("g.LargeResSpc"+i.toString()+".style.display='none';"); } g.KeyBdTitle.innerText=L_KeybdTitleSmall_Text; } else { g.KeybdStr.innerText=L_KeybdStr_Text; g.RegionStr.innerText=L_RegionStr_Text; g.LangStr.innerText=L_LangStr_Text; }
g.LangStr.style.visibility="visible"; g.KeybdStr.style.visibility="visible"; g.RegionStr.style.visibility="visible";
g.selRegion.style.visibility="visible"; g.selKeyboard.style.visibility="visible"; g.selLang.style.visibility="visible";
g.KeyboardName.style.visibility="visible"; g.RegionName.style.visibility="visible"; g.LangName.style.visibility="visible";
g.KeyboardName.style.cursor="default"; g.RegionName.style.cursor="default"; g.LangName.style.cursor="default";
g_FirstFocusElement.focus(); }
// use this to enable "Enter" key as Next Button. // but I really need to select focus'd button with enter. // have next button be focused by default?? or is enter better, since // they might not click on next function RegKB_KeyPress() { try { if (g.event == null) return; } catch(e) { return; }
if (g.event.keyCode == KeyEnter) GoNext();
}
function RetrieveRegKB() { if(LangObj.get_RegionIndex() > 20000) { alert("error loading default region index: possible problem in locale.inf"); }
if(LangObj.get_KeyboardLayoutIndex() > 20000) { alert("error loading default keybd index: possible problem in locale.inf"); }
if(LangObj.get_LangIndex() > 20000 ) { alert("error loading default lang index: possible problem in locale.inf/content.inf"); }
var ilen = LangObj.get_NumOfRegions(); for (var i = 0; i < ilen; i++) { var oOption = g.document.createElement("OPTION"); oOption.text = LangObj.get_RegionName(i); g.selRegion.add(oOption);
if(oOption.text.length > iMaxRegionNameLen) { iMaxRegionNameLen=oOption.text.length; } }
ilen = LangObj.get_NumOfLangs(); for (var i = 0; i < ilen; i++) { var oOption = g.document.createElement("OPTION"); oOption.text = LangObj.get_LangName(i); g.selLang.add(oOption);
if(oOption.text.length > iMaxLangNameLen) { iMaxLangNameLen=oOption.text.length; } }
ilen = LangObj.get_NumOfKeyboardLayouts(); for (i = 0; i < ilen; i++) { var oOption = g.document.createElement("OPTION"); oOption.text = LangObj.get_KeyboardLayoutName(i); g.selKeyboard.add(oOption);
if(oOption.text.length > iMaxKeybdNameLen) iMaxKeybdNameLen=oOption.text.length; }
// BUGBUG g.selRegion.selectedIndex = 0; //(HACK to make selected item to be made visible in select menu, there is no official way to do this) g.selRegion.selectedIndex= g_RegionSelIdx; // BUGBUG: these hacks dont work anymore
g.selKeyboard.selectedIndex = 0; //(HACK to make selected item to be made visible in select menu, there is no official way to do this) g.selKeyboard.selectedIndex= g_KeyboardSelIdx;
g.selLang.selectedIndex = 0; //(HACK to make selected item to be made visible in select menu, there is no official way to do this) g.selLang.selectedIndex= g_LangSelIdx; } // END keybd.htm
// fini.htm var L_RegisterdWithMS_Text = "You registered your copy of Windows Codename Whistler with Microsoft."; var L_NotRegisterdWithMS_Text = "You did not register your copy of Windows Codename Whistler with Microsoft."; var L_RegisterdWith_Text = "You registered your computer with "; var L_NotRegisterdWith_Text = "You did not register your computer with "; var L_SignupWith_Text = "Your computer is configured for Internet access."; var L_NotSignupWith_Text = "Your computer is not configured for Internet access."; var L_NotSignupButChoseIcs_Text = "Selected the shared Internet Connection to access the Internet"; var L_DefaultOEM_Text = "the OEM";
function FinishPage_LoadMe() { InitFrameRef();
var WaterMarkFileHandle=FileSystemObj.GetFile(g_WaterMarkFileNameStr); if(WaterMarkFileHandle.size != g_WaterMarkFileSize) { g.ThanksImg.style.display="none"; }
if (LANGUAGE_REBOOT_END == LangObj.get_RebootState()) { g.finishmsg.style.display="none"; g.rebootfinishmsg.style.display="inline"; }
if (STATUS_NONE != g_status && STATUS_OFF != g_status) { g.FiniSummaryIntro2.style.display = "inline"; g.FiniSummaryWrapper.style.display = "inline";
if (1 != window.external.get_RegStatus()) // OEM didn't Pre-reg the machine { if (1 == RegisterObj.get_PostToOEM) { var strOEMName = g_OEMNameStr;
if (strOEMName == null || (strOEMName != null && strOEMName.length == 0)) strOEMName = L_DefaultOEM_Text; if (StatusObj.get_Status(OEM_REGISTRATION)) g.FiniSummary1.innerText = L_RegisterdWith_Text + strOEMName + L_Period_Text; else g.FiniSummary1.innerText = L_NotRegisterdWith_Text + strOEMName + L_Period_Text; g.FiniSummaryBreak.style.display = "inline"; }
if (StatusObj.get_Status(MS_REGISTRATION)) g.FiniSummary2.innerText = L_RegisterdWithMS_Text; else g.FiniSummary2.innerText = L_NotRegisterdWithMS_Text; }
var bHasSignup = 0; try { bHasSignup = ApiObj.get_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + "\\TEMP", "ISPSignup"); } catch (e) { bHasSignup = 0;}
if (bHasSignup) g.FiniSummary3.innerText = L_SignupWith_Text; else if (StatusObj.get_Status(ICS_FOR_INTERNET)) { g.FiniSummary3.innerText = L_NotSignupButChoseIcs_Text; } else { g.FiniSummary3.innerText = L_NotSignupWith_Text; } }
g.msgspan.style.display="inline";
if (g.btnNext != null) g_FirstFocusElement = g.btnNext; else if (g.btnBack != null) g_FirstFocusElement = g.btnBack;
InitButtons(); g_FirstFocusElement.focus(); }
////////////////////////////////////////////////////////////////////////////////////// // badpid.htm ////////////////////////////////////////////////////////////////////////////////////// function badpid_LoadMe() { InitFrameRef(); g_FirstFocusElement=g.btnBack;
if (null == PidObj) { PidObj = new Object; PidObj = window.external.ProductID; } var strPid = PidObj.get_PID(); for (var i = 0; i < 5; i++) { g.lblPID[i].innerText = strPid.substr(i * 6, 5); } if (strPid.length == 0) g.PidEntered.style.visibility = "hidden"; else g.PidEntered.style.visibility = "visible";
InitButtons();
g_FirstFocusElement.focus();
g_CameFromBadPkeyPage=true; }
////////////////////////////////////////////////////////////////////////////////////// // prodkey.htm //////////////////////////////////////////////////////////////////////////////////////
var g_CameFromBadPkeyPage=false;
var g_LastFocusedPidBox; var g_SelectionExistsBeforeKeyPress=null;
function PIDBox_HandleBlur() { g_LastFocusedPidBox=g.event.srcElement; }
function PIDBox_HandleFocus() { g_LastFocusedPidBox=g.event.srcElement; OnFocus(); }
function PID_LoadMe() { InitFrameRef(); g_FirstFocusElement = g.edtProductKey[0]; RetrievePid();
g_FirstFocusElement.focus(); var rangefocus = g_FirstFocusElement.createTextRange(); rangefocus.collapse(); rangefocus.moveStart("word", 0); rangefocus.select();
g_TabForward = false; g_TabBackward = false;
PID_CheckLength(false);
if(DebugObj.get_MsDebugMode) { g.btnSkip.style.visibility="visible"; }
for (i = 0; i <= 4; i++) { g.edtProductKey[i].onblur=PIDBox_HandleBlur; g.edtProductKey[i].onfocus=PIDBox_HandleFocus; }
g_LastFocusedPidBox=g.edtProductKey[0];
InitButtons();
if(g_CameFromBadPkeyPage) { g.edtProductKey[0].select(); g_CameFromBadPkeyPage=false; } }
var g_CharCode0_plus1=("0".charCodeAt(0))+1;
function KeyboardHelperClick() { try { if (g.event == null) return; } catch(e) { return; }
g.event.returnValue = false; // if false, cancels default action on button g.event.cancelBubble = true;
if (g.event.srcElement.tagName == "BUTTON") {
g_LastFocusedPidBox.focus();
if(g.document.selection.type=="Text") { g.document.execCommand("Delete");
if(g.event.srcElement.name=="{BACKSPACE}") return; }
if(g.event.srcElement.name=="{BACKSPACE}") { var tr=g_LastFocusedPidBox.createTextRange(); tr.collapse(false); tr.moveStart("character",-1); tr.execCommand("Delete"); return; }
var i=g_LastFocusedPidBox.id.charCodeAt(3)-g_CharCode0_plus1;
if((i<4) && (g_LastFocusedPidBox.value.length == 5) && CursorAtEndOfField(i) && (!g_SelectionExistsBeforeKeyPress)) { TabForward(i,false); // should change to g_LastFocusedPidBox, but isn't working due to some IE5.5 regression (focus handler event srcElement is not new event pidbox but current event one) }
if (g_LastFocusedPidBox.value.length != 5) {
g_LastFocusedPidBox.value+=g.event.srcElement.name;
// AGENT: notify Agent of the event, NOTE: code in AgtScrpt.js.
Agent_OnProductKeyKeyboardHelper(g_LastFocusedPidBox, g.event.srcElement.name);
if (g_TabBackward) { TabBackward(i,false); } else if(g_TabForward) { TabForward(i,false); }
g_TabForward = false; g_TabBackward = false; } }
}
function PID_CheckLength(KnownIncomplete) { // call this only if box reaches length 5 for speed?
if(KnownIncomplete) { g.btnNext.onclick = null; g.btnNext.disabled = true; g.btnNext.className="buttons-disabled"; return; }
var TotLength=g.edtProductKey[0].value.length+g.edtProductKey[1].value.length+ g.edtProductKey[2].value.length+g.edtProductKey[3].value.length+ g.edtProductKey[4].value.length;
if (TotLength == 25) { g.btnNext.disabled = false; g.btnNext.className="buttons"; g.btnNext.onclick = GoNext; } else { g.btnNext.onclick = null; g.btnNext.disabled = true; g.btnNext.className="buttons-disabled"; } }
function RetrievePid() { // retrieves the pid if avialable. var strPid = PidObj.get_PID();
// if there is no PID then we set the // focus to the first field if (strPid.length == 0) { g.edtProductKey[0].focus(); } // else we populate the fields with the // sections of the PID else { var re = new RegExp("(.*)-(.*)-(.*)-(.*)-(.*)",""); if(re.exec(strPid) == null) { throw "Internal error: RegExp pattmatch failed!"; }
g.edtProductKey[0].value = RegExp.$1; g.edtProductKey[1].value = RegExp.$2; g.edtProductKey[2].value = RegExp.$3; g.edtProductKey[3].value = RegExp.$4; g.edtProductKey[4].value = RegExp.$5; } }
function StorePid() { var strPid = "";
for (var i = 0; i < 4; i++) { strPid += g.edtProductKey[i].value; strPid += '-'; }
strPid += g.edtProductKey[i].value;
PidObj.set_PID(strPid); }
var g_TabForward = false; function TabForward(currentEdit,DoSelectAll) { g_TabForward = false;
if(currentEdit==4) { // deselect any existing selection before moving focus to back button if(g.document.selection.type!="None") { g.document.selection.empty(); } g.btnBack.focus(); return; }
currentEdit++;
g.edtProductKey[currentEdit].focus();
if(DoSelectAll) { g.edtProductKey[currentEdit].select(); return; }
var tr = g.edtProductKey[currentEdit].createTextRange(); tr.collapse(true); tr.moveStart("word", 0); tr.select();
}
var g_TabBackward = false; function TabBackward(currentEdit,DoSelectAll) { g_TabBackward = false;
if (currentEdit == 0) { // deselect any existing selection before moving focus to button if(g.document.selection.type!="None") { g.document.selection.empty(); } if(g.btnNext.disabled) { g.btnBack.focus(); } else { g.btnNext.focus(); }
return; }
currentEdit--;
g.edtProductKey[currentEdit].focus();
if(DoSelectAll) { g.edtProductKey[currentEdit].select(); return; }
var tr = g.edtProductKey[currentEdit].createTextRange(); tr.collapse(false); tr.moveStart("word", 1); tr.select(); }
function CursorAtStartOfField(currentEdit) { var tr = g.edtProductKey[currentEdit].createTextRange(); var tr2 = g.document.selection.createRange();
tr2.moveEnd("textedit",1);
if(tr.isEqual(tr2)){ return true; } else { return false; } }
function CursorAtEndOfField(currentEdit) { // assumes selection is current edit field
var tr = g.edtProductKey[currentEdit].createTextRange(); var tr2 = g.document.selection.createRange();
tr2.moveStart("textedit",-1);
if(tr.isEqual(tr2)){ return true; } else { return false; } }
function IsProductIDKey(keyCode) { var str = String.fromCharCode(keyCode);
var result = str.match(/B|C|D|F|G|H|J|K|M|P|Q|R|T|V|W|X|Y|2|3|4|6|7|8|9/);
return (null != result); }
var g_keyPressKeyCode = 0;
function ProductIDPropertyChange() { try { if (g.event == null) return; } catch(e) { return; }
// enable Next Btn when PID is full, and automatically move to // next/previous field when entering/deleting chars
if ("value" == g.event.propertyName) {
// find the index at which we are. var i=g.event.srcElement.id.charCodeAt(3)-g_CharCode0_plus1;
// our g_Tab variables can be booleans instead of counts because they can // have a max value of 1, becase there will only ever be 1 call to OnPropertyChange if the // length of the edit is 0 or 5 switch(g.edtProductKey[i].value.length) { case 5: g_TabForward = (i<4); // dont tab forward if on last PID box PID_CheckLength(false); break;
case 4: case 0: case 1: PID_CheckLength(true); //change from 25char-state could have occurred with any of these lengths }
// see if we want to tab backward // if pixbox is empty, and last keypress was not a pidkey (which adds a char), // and nothing was selected.
// BUGBUG: this currently only fully works for the delete key. when backspace // is pressed, g.document.selection.type is always "None" even if there was a selection if ((g.edtProductKey[i].value.length == 0) && (i > 0) && (g_keyPressKeyCode==KeyBackSpc)&&(g_keyPressKeyCode==KeyDelete)&& (g.document.selection.type=="None")) {
g_TabBackward = true; // IsProd check is to handle the case where they select everything then press a 2, etc. } }
g_keyPressKeyCode = 0; }
//As of IE 4.0, the onkeypress event fires and can be canceled for the following keys: // //Letters: a - z //Numerals: 0 - 9 //Symbols: ! @ # $ % ^ & * ( ) _ - + = < > [ ] { } , . / ? \ | ' ` " ~ //System: ESCAPE, SPACE, SHIFT
function ProductIDKeyPress() { try { if (g.event == null) return; } catch(e) { return; }
// BUGBUG: hack workaround: KeyBackSpc event should arrive at KeyDown handler, but it comes here instead // I dont know why
if (g.event.keyCode == KeyBackSpc) { ProductIDKeyDown(); return; }
KeyCodeToUpper();
g_keyPressKeyCode = g.event.keyCode;
if (!IsProductIDKey(g_keyPressKeyCode)) { g.event.keyCode = 0; return; } else {
var i=g.event.srcElement.id.charCodeAt(3)-g_CharCode0_plus1;
if((i<4) && (g.edtProductKey[i].value.length == 5) && CursorAtEndOfField(i) && (!g_SelectionExistsBeforeKeyPress)) { TabForward(i,false); } } }
//In IE 5.0, the onkeydown event fires for the following keys: // //Editing: DELETE, INSERT,BACKSPACE //Function: F1 - F12 //Letters: a - z //Navigation: HOME, END, Left Arrow, Right Arrow, Up Arrow, Down Arrow, PAGE UP, PAGE DOWN //Numerals: 0 - 9 //Symbols: ! @ # $ % ^ & * ( ) _ - + = < > [ ] { } , . / ? \ | ' ` " ~ //System: ESCAPE, SPACE, SHIFT, TAB, SHIFT+TAB // // the following keys and key combinations can be canceled by specifying event.returnValue=false: // //Editing: BACKSPACE, DELETE //Letters: a - z //Navigation: PAGE UP, PAGE DOWN, END, HOME, Left Arrow, Right Arrow, Up Arrow, Down Arrow //Numerals: 0 - 9 //Symbols: ! @ # $ % ^ & * ( ) _ - + = < > [ ] { } , . / ? \ | ' ` " ~ //System: SPACE, ESCAPE, TAB, SHIFT+TAB
function ProductIDKeyDown() {
try { if (g.event == null) return; } catch(e) { return; }
var keyCode = g.event.keyCode;
g_SelectionExistsBeforeKeyPress=(g.document.selection.type!="None");
if(g.event.srcElement.tagName=="INPUT") { var i=g.event.srcElement.id.charCodeAt(3)-g_CharCode0_plus1; } else { var i=-1; }
switch(keyCode) {
case KeyTab: if(g.event.srcElement == g.edtProductKey[i]) { if(g.event.shiftKey) TabBackward(i,true); else TabForward(i,true);
g.event.returnValue = false; g.event.keyCode = 0; g.event.cancelBubble = true; break; } break;
case KeyLeftArrow: if((i>0) && CursorAtStartOfField(i)) { TabBackward(i,false); g.event.returnValue = false; } break;
case KeyRightArrow: if((i<4) && CursorAtEndOfField(i)) { TabForward(i,false); g.event.returnValue = false; } break;
case KeyBackSpc: case KeyDelete:
// if there is already 5 characters in a field, and the user puts the cursor in it, we want to // fill in the next box with the character. we have to do this here because there is no propertychange, // and keyup is too late //if(g.edtProductKey[i].value.length == 5 && IsProductIDKey(keyCode) && g.document.selection==null) // TabForward(i); // cgeorges note: I enabled this feature tried it and didnt like it
//////// // we want the delete/backspace to move the previous edit box if:
// there is 0 characters, and the user puts the cursor in it, and selection is non-null // OR backspc && cursor is at start of field
if ((i > 0) && ( ((g.document.selection.type=="None") && (g.edtProductKey[i].value.length == 0)) ||((keyCode==KeyBackSpc)&& CursorAtStartOfField(i)))) {
TabBackward(i,false); g.event.returnValue = false; // so no deletion occurs when backspace moves to prev pidbox g.event.keyCode = 0; }
break;
case KeyEnter: if((g.btnNext.disabled == false)&&(g.event.srcElement!=g.btnBack)) { g.btnNext.click(); g.event.returnValue = false; g.event.keyCode = 0; g.event.cancelBubble = true; } break; } }
function ProductIDKeyUp() { try { if (g.event == null) return; } catch(e) { return; }
if((!g_TabForward) && (!g_TabBackward)) { return; }
var i=g.event.srcElement.id.charCodeAt(3)-g_CharCode0_plus1;
if (g_TabBackward) { TabBackward(i,false); return; } else if(g_TabForward) { TabForward(i,false); } }
// called on every mouse click into PID page body, to make sure focus never leaves PID fields function PID_SetCorrectFocus() { try { if (g.event == null) return; } catch(e) { return; }
if((g.event.srcElement.tagName == "INPUT")||(g.event.srcElement.tagName == "BUTTON")) { return; }
// only get here if we clicked on something unexpected
for (var i = 0; i < 5; i++) { if (g.event.srcElement == g.edtProductKey[i]) { return; } }
// if full key is entered then pass events directly to buttons without doing the stuff below if((g.btnNext.disabled == false) && (g.btnNext.contains(g.event.srcElement) || g.btnBack.contains(g.event.srcElement) || g.btnSkip.contains(g.event.srcElement))) return;
for (var i = 4; i >= 0; i--) { if (g.edtProductKey[i].value.length < 5 && g.edtProductKey[i].value.length > 0) { g.edtProductKey[i].focus(); var range = g.edtProductKey[i].createTextRange(); range.collapse(); range.moveStart("word", 1); range.select(); return; } }
if (i < 0) { g.edtProductKey[0].focus(); var range = g.edtProductKey[0].createTextRange(); range.collapse(); range.moveStart("word", 0); range.select(); return; } } // END pid.htm
////////////////////////////////////////////////////////////////////////////////////// // 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 == KeyEnter) && (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() {
// STATUS_ISP(0) STATUS_OEM STATUS_NONE STATUS_OFF // ------------ ------------- ------------- -------------- dnCKPT[CKPT_HWCHK] = new CheckPoint("", SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME); dnCKPT[CKPT_WELCOME] = new CheckPoint("setup\\welcome.htm", SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME); dnCKPT[CKPT__MODULE_] = new CheckPoint("html\\_MODULE_\\_MODULE_.htm", SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME, SNDX_WELCOME); dnCKPT[CKPT_MOUSETUT1] = new CheckPoint("html\\mouse\\mouse.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_IMETUTORIAL] = new CheckPoint("html\\IME\\IMETut1.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_OEMHW] = new CheckPoint("html\\oemhw\\oemhw.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_REGION_KEYBD] = new CheckPoint("setup\\keybd.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_REGKB_COMMIT] = new CheckPoint("setup\\keybdcmt.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_TIMEZONE] = new CheckPoint("setup\\timezone.htm", SNDX_HW, SNDX_HW, SNDX_HW, SNDX_HW); dnCKPT[CKPT_EULA] = new CheckPoint("setup\\neweula.htm", SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL); dnCKPT[CKPT_EULA_DECLINE] = new CheckPoint("setup\\badeula.htm", SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL); dnCKPT[CKPT_PRODUCTKEY] = new CheckPoint("setup\\prodkey.htm", SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL); dnCKPT[CKPT_BADPRODUCTKEY] = new CheckPoint("setup\\badpkey.htm", SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL, SNDX_LEGAL); dnCKPT[CKPT_ICSCHOICE] = new CheckPoint("setup\\ics.htm", SNDX_REG, SNDX_REG, SNDX_REG, SNDX_REG); dnCKPT[CKPT_REGISTER1] = new CheckPoint("setup\\reg1.htm", SNDX_REG, SNDX_REG, SNDX_REG, SNDX_REG); dnCKPT[CKPT_REGISTER3] = new CheckPoint("setup\\reg3.htm", SNDX_REG, SNDX_REG, SNDX_REG, SNDX_REG); dnCKPT[CKPT_REGDIAL] = new CheckPoint("setup\\drdyoem.htm", SNDX_REG, SNDX_REG, SNDX_REG, SNDX_REG); dnCKPT[CKPT_ISPSIGNUP] = new CheckPoint("setup\\isp.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_MIGLIST] = new CheckPoint("setup\\miglist.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_ISPDIAL] = new CheckPoint("setup\\drdyisp.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_REFDIAL] = new CheckPoint("setup\\drdyref.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_MIGDIAL] = new CheckPoint("setup\\drdymig.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_OEMISP] = new CheckPoint("html\\ispsgnup\\ispsgnup.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_OEMCUST] = new CheckPoint("html\\oemcust\\oemcust.htm", SNDX_ISP, SNDX_ISP, SNDX_ISP, SNDX_ISP); dnCKPT[CKPT_DONE] = new CheckPoint("setup\\fini.htm", SNDX_FINI, SNDX_FINI, SNDX_FINI, SNDX_FINI);
PopCKPT();
// init simple navigation mappings
g_SimpleNavMap= new ActiveXObject("Scripting.Dictionary"); g_SimpleNavMap.CompareMode = CompareModeText;
InitSimpleNavMap_MouseTut(); _MODULE__InitSimpleNavMap(); g_Last_MODULE_Page = _MODULE_GetLastPage();
}
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 IsLocalFile() { try { return (-1 != g.location.protocol.indexOf("file")); } catch (e) { return false; } }
////////////////////////////////////////////////////////////////////////////////////// // public navigation APIs //////////////////////////////////////////////////////////////////////////////////////
function SetBack(strURL) { g_OEMAddBackURL = strURL; }
// this handles the user's "Skip" requests function GoCancel(ckpt) { try { if (IsLocalFile() && g.event == null && (g_CurrentCKPT != g_DialCKPT)) return; } catch(e) { return; }
DisableAllButtons();
switch (g_CurrentCKPT) { case CKPT_HWCHK: GoNavigate(CKPT_WELCOME); break;
case CKPT_REGION_KEYBD: // need to avoid handling any existing input info, which GoNext does GoNavigate(CKPT_TIMEZONE); break;
case CKPT_MOUSETUT1: SimpleNavNext(g_LastMouseTutPage); // go to ckpt after last mouse tut page break;
case CKPT_PRODUCTKEY: // skip button only exists in debug mode. lets you skip PID page PopCKPT(CKPT_PRODUCTKEY); // make sure we go back to reg1.htm if ( StatusObj.get_Status(MS_REGISTRATION) || StatusObj.get_Status(OEM_REGISTRATION) || window.external.get_RegStatus ) GoNavigate(CKPT_ISPSIGNUP); else GoNavigate(CKPT_REGISTER1); break;
// We do not allow User to skip for CKPT_ICSCHOICE.
case CKPT_REGISTER3: Reg3SaveSettings(); // save field settings in case we return to page GoNavigate(CKPT_ISPSIGNUP); break;
case CKPT_ISPSIGNUP: GoNavigate(CKPT_OEMCUST); break;
case CKPT_MIGLIST: // When skip on the referral dialing, go to finish GoNavigate(CKPT_OEMCUST); break;
case CKPT_REGDIAL: GoNavigate(CKPT_ISPSIGNUP); break;
case CKPT_REFDIAL: case CKPT_MIGDIAL: case CKPT_ISPDIAL: // When skip on the referral dialing, go to finish GoNavigate(CKPT_OEMCUST); break;
case CKPT__MODULE_: SimpleNavNext(g_Last_MODULE_Page); break;
default: GoNext(); break; }
}
function GoBack(ckpt) { try { if (IsLocalFile() && g.event == null && (g_CurrentCKPT != g_DialCKPT)) return; } catch(e) { return; }
DisableAllButtons();
if(g_CurrentCKPT == g_DialCKPT) ResetDialing(); else if(g_CurrentCKPT == CKPT_ISPSIGNUP) ResetDialing(); else if(g_CurrentCKPT == CKPT_REGISTER3) Reg3SaveSettings(); // save field settings in case we return to page else if(g_CurrentCKPT == CKPT_PRODUCTKEY) StorePid();
{ var ckptPrevious = g_CurrentCKPT; PopCKPT();
if (ckptPrevious == g_CurrentCKPT) { // This handles the case where the current page pushed itself on the stack. PopCKPT(); }
if ((g_CurrentCKPT == CKPT_ICSCHOICE) && !(window.external.IsIcsAvailable())) { g_CurrentCKPT = ckptPrevious; // we remove the ICS page from the navigation stream if ICS is no longer available. StatusObj.set_Status(ICS_FOR_OOBE, false); GoBack(); }
else 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; } }
//////////////////////////////////////////////////////////////////// // Required API for USB mouse and/or keyboard checks //////////////////////////////////////////////////////////////////// function OnDeviceArrival(nDeviceType) { if ((CKPT_HWCHK == g_CurrentCKPT) && !g_bAnimationRunning) { var bKeyboardPresent = window.external.CheckKeyboard(); var bMousePresent = window.external.CheckMouse();
if ((0 == bKeyboardPresent) && (0 == bMousePresent)) { g.navigate("setup\\nousbkm.htm"); } else if (0 == bKeyboardPresent) { g.navigate("setup\\nousbkbd.htm"); } else if (0 == bMousePresent) { g.navigate("setup\\nousbms.htm"); } else { // Unregister all device notification so that // script will not be notifed of any device arrival GoNavigate(CKPT_WELCOME); } } }
//////////////////////////////////////////////////////////////////// // DON'T MUCK WITH THE POSITIONING OF THE CASES IN THE SWITCHS BELOW WITHOUT CONSIDERING FALL-THROUGH //////////////////////////////////////////////////////////////////// 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; }
switch (ckptGoHere) { case CKPT_HWCHK: trace("GoNavigate: CKPT_HWCHK"); PushCKPT(CKPT_HWCHK);
var bKeyboardPresent = window.external.CheckKeyboard(); var bMousePresent = window.external.CheckMouse();
if ((0 == bKeyboardPresent) || (0 == bMousePresent)) {
ScreenFrame.style.visibility = "visible"; ScreenFrame.style.display = "none";
if ((0 == bKeyboardPresent) && (0 == bMousePresent)) { g.navigate("setup\\nousbkm.htm"); } else if (0 == bKeyboardPresent) { g.navigate("setup\\nousbkbd.htm"); } else { // (0 == bMousePresent) g.navigate("setup\\nousbms.htm"); }
window.external.ShowOOBEWindow();
if((g_RunAnimInitVal>0) && (g_bNeedtoRunAnimation || (g_RunAnimInitVal==99))) {
g_bAnimationRunning = true; MovieFrame.style.display="inline"; // start movie g_bNeedtoRunAnimation=false; g_RunAnimInitVal=1; // reset from 99, which will trigger second running }
ScreenFrame.style.display = "inline";
break; }
// fall through...
case CKPT_WELCOME: trace("GoNavigate: CKPT_WELCOME"); if (!window.external.GetNoWelcomeFinish()) { PushCKPT(CKPT_WELCOME); //BUGBUG do we want to do this? g.navigate(g_OOBEDir + URLFromCKPT(CKPT_WELCOME)); break; } else { window.external.ShowOOBEWindow(); // should be needed for NoWelcome case if USB pages are not displayed }
// fall through...
case CKPT_MOUSETUT1: trace("GoNavigate: CKPT_MOUSETUT1"); var MT_INIstr=DirObj.get_DoMouseTutorial(); if ((MT_INIstr.length>0) && (MT_INIstr!="0")) { PushCKPT(CKPT_MOUSETUT1); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_MOUSETUT1)); break; }
// fall through...
case CKPT_IMETUTORIAL: trace("GoNavigate: CKPT_IMETUTORIAL"); if ((1 == DirObj.get_DoIMETutorial()) && g_IMEExists) { PushCKPT(CKPT_IMETUTORIAL); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_IMETUTORIAL)); break; }
// fall through...
case CKPT_OEMHW: trace("GoNavigate: CKPT_OEMHW"); if (1 == DirObj.get_DoOEMHardwareCheck()) { PushCKPT(CKPT_OEMHW); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_OEMHW)); break; }
// fall through...
case CKPT_REGION_KEYBD: trace("GoNavigate: CKPT_REGION_KEYBD"); if (1 == DirObj.get_DoRegionalKeyboard()) { PushCKPT(CKPT_REGION_KEYBD); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_REGION_KEYBD)); break; }
// fall through...
case CKPT_TIMEZONE: trace("GoNavigate: CKPT_TIMEZONE"); var TimeZonewasSet=SysClockObj.get_TimeZonewasPreset();
// only show timezone page if preset TimeZoneValue does not exist and TimeZone=1, // or if TimeZoneValue is invalid
if ((!TimeZonewasSet && ((1 == DirObj.get_DoTimeZone()) || (DirObj.get_TimeZoneValue() != "")))) { PushCKPT(CKPT_TIMEZONE); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_TIMEZONE)); break; }
// fall through...
case CKPT_EULA: trace("GoNavigate: CKPT_EULA"); if (null == EulaObj) { EulaObj = new Object; EulaObj = window.external.Eula; }
// skip EULA if user has already accepted in OOBE mode if (!EulaObj.get_EULAAcceptance) { PushCKPT(CKPT_EULA); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_EULA)); break; }
// fall through...
case CKPT_PRODUCTKEY: trace("GoNavigate: CKPT_PRODUCTKEY"); if (null == PidObj) { PidObj = new Object; PidObj = window.external.ProductID; }
// skips over PID if it's already validated? if (0 == PidObj.get_PID.length || !PidObj.ValidatePID) { PushCKPT(CKPT_PRODUCTKEY); //this sets g_CurrentCKPT=CPKT_PRODUCTKEY g.navigate(g_OOBEDir + URLFromCKPT(CKPT_PRODUCTKEY)); break; }
// fall through... case CKPT_ICSCHOICE: { trace("GoNavigate: CKPT_ICSCHOICE");
if ( g_status != STATUS_OFF ) { if ( window.external.IsIcsAvailable() ) { PushCKPT(CKPT_ICSCHOICE); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_ICSCHOICE)); break; } else { if ( StatusObj.get_Status(MS_REGISTRATION) || StatusObj.get_Status(OEM_REGISTRATION) || window.external.get_RegStatus() ) { GoNavigate(CKPT_ISPSIGNUP); break; } else { GoNavigate(CKPT_REGISTER1); break; } } } // fall through here for OFFLINE status }
case CKPT_REGISTER1: trace("GoNavigate: CKPT_REGISTER1"); if (g_status != STATUS_OFF && 1 != StatusObj.get_Status(MS_REGISTRATION) && 1 != StatusObj.get_Status(OEM_REGISTRATION) && !window.external.get_RegStatus()) { PushCKPT(CKPT_REGISTER1); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_REGISTER1)); break; }
// fall through...
case CKPT_ISPSIGNUP: trace("GoNavigate: CKPT_ISPSIGNUP"); if (g_status == STATUS_ISP) { PushCKPT(CKPT_ISPSIGNUP); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_ISPSIGNUP)); break; }
// fall through...
case CKPT_OEMISP: // PreConfig case trace("GoNavigate: CKPT_OEMISP"); if ((g_status == STATUS_OEM) && !window.external.GetNoIspPreconfig()) { PushCKPT(CKPT_OEMISP); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_OEMISP)); break; }
// fall through...
case CKPT_OEMCUST:
trace("GoNavigate: CKPT_OEMCUST"); // Next line of code added by TandyT to support special ISP signup process commands // Calls to function in agtcore.js
Agent_TurnOffISPSpecialCommands();
ResetDialing(); if (1 == DirObj.get_OEMCust) { PushCKPT(CKPT_OEMCUST); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_OEMCUST)); break; } // fall through...
case CKPT__MODULE_: trace("GoNavigate: CKPT__MODULE_"); PushCKPT(CKPT__MODULE_); g.navigate(g_OOBEDir + URLFromCKPT(CKPT__MODULE_)); break;
case CKPT_DONE: trace("GoNavigate: CKPT_DONE"); ResetDialing(); if (!window.external.GetNoWelcomeFinish()) { PushCKPT(CKPT_DONE); g.navigate(g_OOBEDir + URLFromCKPT(CKPT_DONE)); } else { PushCKPT(CKPT_DONE); GoNext(); }
break;
default: PushCKPT(ckptGoHere); // sets g_CurrentCKPT = ckptGoHere; g.navigate(g_OOBEDir + URLFromCKPT(ckptGoHere)); break; }
StatusNavigate();
// AGENT: notify Agent, code in AgtCore.js
Agent_OnNavigate(); }
function GoNext() { try { if (IsLocalFile() && g.event == null) return; } catch(e) { return; }
DisableAllButtons();
switch (g_CurrentCKPT) {
case CKPT_HWCHK: GoNavigate(CKPT_HWCHK); break;
case CKPT_WELCOME: ScreenFrame.style.filter=null; GoNavigate(CKPT__MODULE_); break;
case CKPT__MODULE_: GoNavigate(CKPT_MOUSETUT1); break;
case CKPT_MOUSETUT1: GoNavigate(CKPT_IMETUTORIAL); break;
case CKPT_IMETUTORIAL: GoNavigate(CKPT_OEMHW); break;
case CKPT_OEMHW: if (true == StatusObj.get_Status(LANGUAGECOMPLETED)) { GoNavigate(CKPT_TIMEZONE); } else GoNavigate(CKPT_REGION_KEYBD); break;
case CKPT_REGION_KEYBD: // setting these to null fixes hanging bug where user clicks on selmenus // during execution of SaveSettings
g.selKeyboard.disabled = true; g.selKeyboard.onchange = null; g.selRegion.disabled = true; g.selRegion.onchange = null; g.selLang.disabled = true; g.selLang.onchange = null;
g.document.body.style.cursor = "wait";
LangObj.set_RegionIndex(g.selRegion.selectedIndex) LangObj.set_LangIndex(g.selLang.selectedIndex); LangObj.set_KeyboardLayoutIndex(g.selKeyboard.selectedIndex);
// must always call SaveSettings() since apparently there is // no way to know current language setting of machine LangObj.SaveSettings();
if (LANGUAGE_REBOOT_NOW == LangObj.get_RebootState()) GoNavigate(CKPT_REGKB_COMMIT); else GoNavigate(CKPT_TIMEZONE);
g.document.body.style.cursor = "default";
break;
case CKPT_REGKB_COMMIT: // "Next" for this page indicates a restart
PopCKPT(CKPT_REGKB_COMMIT); // Don't want this in our history anymore after reboot PopCKPT(CKPT_REGION_KEYBD); PushCKPT(CKPT_TIMEZONE); // so when we come back after reboot we are on the mouse tut page StatusObj.set_Status(LANGUAGECOMPLETED, true); window.external.PowerDown(1); // reboot break;
case CKPT_TIMEZONE: SysClockObj.set_AutoDaylight(g.daylight.checked); SysClockObj.set_TimeZoneIdx(g.selTimeZone.selectedIndex); GoNavigate(CKPT_EULA); break;
case CKPT_EULA: if (EulaObj.get_EULAAcceptance) { PopCKPT(); GoNavigate(CKPT_PRODUCTKEY); } else GoNavigate(CKPT_EULA_DECLINE); break;
case CKPT_EULA_DECLINE: PopCKPT(); PushCKPT(CKPT_EULA); // go back to main eula page, not this one window.external.PowerDown(0); // shut down break;
case CKPT_PRODUCTKEY: StorePid();
if (PidObj.get_PID.length != 0 && PidObj.ValidatePID()) { PopCKPT(CKPT_PRODUCTKEY); GoNavigate(CKPT_ICSCHOICE); } else { GoNavigate(CKPT_BADPRODUCTKEY); } break;
case CKPT_BADPRODUCTKEY: PopCKPT(); // go back to prodkey page on restart, not this one PushCKPT(CKPT_PRODUCTKEY); // does this leave 2 pid pgs on stack? window.external.PowerDown(0); // shut down break; case CKPT_ICSCHOICE: // we update only the USER's preference. this does NOT mean that // ICS will ALWAYS be available!! if (g.radio_ChooseIcs.checked) { StatusObj.set_Status(ICS_FOR_OOBE, true); window.external.TriggerIcsCallback(true);
} else { window.external.TriggerIcsCallback(false); StatusObj.set_Status(ICS_FOR_OOBE, false); } // the decision below was previously made at the Product Key page. Not any more. if ( StatusObj.get_Status(MS_REGISTRATION) || StatusObj.get_Status(OEM_REGISTRATION) || window.external.get_RegStatus() ) { GoNavigate(CKPT_ISPSIGNUP); } else { GoNavigate(CKPT_REGISTER1); } break;
case CKPT_REGISTER1: if (g.radioRegNeedPP.checked) GoNavigate(CKPT_REGISTER3); else { // (g.radioRegLater.checked) GoNavigate(CKPT_ISPSIGNUP); } break;
case CKPT_REGISTER3: if(VerifyReg3Fields()) { Reg3SaveSettings();
if ( window.external.IsIcsAvailable() && StatusObj.get_Status(ICS_FOR_OOBE) ) { IcsConnect(ICS_CONN_TYPE_REG); } else { GoNavigate(CKPT_REGDIAL); } } break; case CKPT_ISPSIGNUP: if (g.radioGetNewISP.checked) { StatusObj.set_Status(ICS_FOR_INTERNET, false); if ((window.external.IsIcsAvailable() && StatusObj.get_Status(ICS_FOR_OOBE)) || (!window.external.IsIcsAvailable() && window.external.CheckOnlineStatus && window.external.CheckStayConnected("msobe.isp")) ) { PushCKPT(CKPT_ISPDIAL); if (window.external.IsIcsAvailable() && StatusObj.get_Status(ICS_FOR_OOBE)) { IcsConnect(ICS_CONN_TYPE_ISP); } else { window.external.Connect(CONNECTED_ISP_SIGNUP, "msobe.isp"); } } else { window.external.Hangup(); GoNavigate(CKPT_ISPDIAL); // Getting Online } } else if (g.radioMigrateISP.checked) { StatusObj.set_Status(ICS_FOR_INTERNET, false); if (true == StatusObj.get_Status(REFERALDLCOMPLETED)) { GoNavigate(CKPT_MIGLIST); } else { if ((window.external.IsIcsAvailable() && StatusObj.get_Status(ICS_FOR_OOBE)) || (window.external.CheckOnlineStatus && window.external.CheckStayConnected("migrate.isp")) ) { g_bTapiDone = false; GoNavigate(CKPT_REFDIAL); } else { window.external.Hangup(); GoNavigate(CKPT_REFDIAL); // Online } } } else if ( g.radioSelectICS.checked ) { StatusObj.set_Status(ICS_FOR_INTERNET, true); window.external.Hangup(); // this does nothing for LAN (ICS) connections. GoNavigate(CKPT_DONE); } else { StatusObj.set_Status(ICS_FOR_INTERNET, false); GoCancel(); // skip checked }
break;
case CKPT_ISPDIAL: GoNavigate(CKPT_OEMCUST); break;
case CKPT_REGDIAL: GoNavigate(CKPT_ISPSIGNUP); break;
case CKPT_OEMISP: GoNavigate(CKPT_OEMCUST); break;
case CKPT_OEMCUST: GoNavigate(CKPT_DONE); break;
case CKPT_DONE: var finish = window.external.Finish();
if (finish == FINISH_OK) // Finish was successful, so we execute script until our window goes away { Agent_OnFinish(); break; } else { // allow ourselves to go back to those pages if they gave us bad information if (finish & FINISH_BAD_EULA) { if (null == EulaObj) { EulaObj = new Object; EulaObj = window.external.Eula; }
EulaObj.set_EULAAcceptance(false); }
// BUGBUG nuke stack here
if (finish & FINISH_REBOOT) // language changed but didn't want to reboot earlier, so reboot now { window.external.PowerDown(1); Agent_OnFinish(); } else if (finish & FINISH_BAD_STAMP) // setupX "stamp" of user.exe failed, we should nav to the earliest page in the flow... GoNavigate(CKPT_WELCOME); // BUGBUG Bad stamp is really an internal error, should notify user? else if (finish & FINISH_BAD_EULA) GoNavigate(CKPT_EULA); else if (finish & FINISH_BAD_PID) GoNavigate(CKPT_PRODUCTKEY);
}
break;
default: // BUGBUG should we remove the default altogether? GoNavigate(Need_to_handle_this_CKPT_in_GoNext); break; } }
// BUGBUG temporary until MSN changes code function GoOffline() { GoNext(); }
function GetCurrentPageName() {
var re = new RegExp("\\\\([^\\\\]+)$"); re.exec(g.window.location.pathname);
return RegExp.$1; }
// these handle next/back navigation for non-checkpoint pages function SimpleNavBack() { g.window.history.back(); }
/* This version of SimpleNavNext contains the workaround for IE 90257. not enabled yet another part of 90527 fix is in InitButtons() */
function SimpleNavNext(CurPage) // original version that does not fix IE 90257 { if(CurPage==null) { CurPage=GetCurrentPageName(); }
var NextPage=g_SimpleNavMap.Item(CurPage);
// do specific per-page stuff switch(CurPage) { case g_LastMouseTutPage: GoNext(); // move on to next real checkpnt return; }
g.navigate(NextPage); }
// Description: Disable all the buttons // Used to prevent script error caused by // double clicking or rapid clicking // of two different buttons. E.g. when someone click // next and back quickly. // function DisableAllButtons() { try { if(g.btnNext!=null) { g.btnNext.onclick=null; } } catch (e) {}
try { if(g.btnBack!=null) { g.btnBack.onclick=null; } } catch (e) {}
try { if(g.btnSkip!=null) { g.btnSkip.onclick=null; } } catch (e) {}
try { g.btnNext.disabled=true; g.btnNext.className="buttons-disabled"; } catch(e) {} try { g.btnBack.disabled=true; g.btnBack.className="buttons-disabled"; } catch(e) {} try { g.btnSkip.disabled=true; g.btnSkip.className="buttons-disabled"; } catch(e) {} }
function SetBackgroundImg(SetExt) { g.document.body.style.backgroundPosition='top left';
if (SetExt != null) { if(window.top.screen.width>800) {g.document.body.style.backgroundImage = 'url(../../images/watermrk.gif)';} else {g.document.body.style.backgroundImage = 'url(../../images/watrmrk2.gif)';} } else { if(window.top.screen.width>800) {g.document.body.style.backgroundImage = 'url(../images/watermrk.gif)';} else {g.document.body.style.backgroundImage = 'url(../images/watrmrk2.gif)';} }
}
// 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(ExternalModule) { // Static control over online pages if ( window.external.IsIcsAvailable() && window.parent.StatusObj.get_Status(ICS_FOR_OOBE) ) { // do not modify any IFRAMEs } else { try { document.frames("connDelay").frameElement.style.display="none"; document.frames("connDelay").frameElement.style.zIndex=-1; } catch (e) { } }
g_LastButtonText = null; g_FirstFocusElement = null; g_LastKeyDown = null;
g = document.frames("msoobeMain");
if (ExternalModule != null) { SetBackgroundImg('Ext'); } else { SetBackgroundImg(); }
try { if (g != null) { if(g.btnNext!=null) g.btnNext.disabled=false;
if(g.btnBack!=null) g.btnBack.disabled=false;
if(g.btnSkip!=null) g.btnSkip.disabled=false; }
g.document.body.onkeydown = OnKeyDown; g.document.body.style.cursor = 'auto'; } catch(e){}
}
function HideButtons(buttons) { if (null != g.btnBack && (buttons & HIDE_BACK)) { g.btnBack.Hide = true; }
if (null != g.btnNext && (buttons & HIDE_NEXT)) { g.btnNext.Hide = true; }
if (null != g.spanCancel && (buttons & HIDE_CANCEL)) { g.btnSkip.Hide = true; } /* if (null != g.spanRestore && (buttons & HIDE_RESTORE)) { g.btnRestore.Hide = true; } */ }
function HandleButtonMouseOver() { if((!this.disabled)&&(this.tagName=="BUTTON")) this.className="buttons-hover"; }
function HandleButtonMouseOut() { if((!this.disabled)&&(this.tagName=="BUTTON")) this.className="buttons"; }
function InitButtons(SpecialArg) { if(g.btnSkip!=null) { g.btnSkip.onmouseover = HandleButtonMouseOver; g.btnSkip.onmouseout = HandleButtonMouseOut;
if(!g.btnSkip.disabled) { g.btnSkip.onclick = GoCancel;
// dont enable onfocus,onblur handlers until issues in 88615 are resolved // g.btnSkip.onfocus = HandleButtonMouseOver; // g.btnSkip.onblur = HandleButtonMouseOut;
g.btnSkip.className="buttons"; } else { g.btnSkip.className="buttons-disabled"; } }
if(g.btnNext != null) { g.btnNext.onmouseover = HandleButtonMouseOver; g.btnNext.onmouseout = HandleButtonMouseOut;
if(g.btnNext.disabled == false) {
if(SpecialArg==null) { g.btnNext.onclick = GoNext; } else { g.btnNext.onclick = SimpleNavNext; }
g.btnNext.className="buttons"; } else { g.btnNext.className="buttons-disabled"; } }
if(g.btnBack != null) { g.btnBack.onmouseover = HandleButtonMouseOver; g.btnBack.onmouseout = HandleButtonMouseOut;
if(g.btnBack.disabled == false) { if(SpecialArg==null) { g.btnBack.onclick = GoBack; } else { g.btnBack.onclick = SimpleNavBack; }
g.btnBack.className="buttons"; } else { g.btnBack.className="buttons-disabled"; } } }
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;
// AGENT: pass keydown to Agent, NOTE: code in AgtCore.js
Agent_OnKeyDown(g.event.srcElement); }
// AGENT: SelectClick is used by Agent
function OnSelectClick() {
Agent_OnSelectClick(g.event.srcElement); }
// AGENT: OnClick is used by Agent
function OnClick() { Agent_OnElementClick(g.event.srcElement); }
// AGENT: Focus functions are used by Agent
function OnFocus() {
// Put other code here that needs access to the focus event
Agent_OnFocus(g.event.srcElement); }
// 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"); // BUGBUG: should \ be escaped? var re2 = new RegExp("\D"); // BUGBUG: should \ be escaped?
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"); // BUGBUG: should \ be escaped? 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 FlashPlayerInstalled() { var fReturn = false; try { // Correlate the PROGID and CLSID sections of the registry, then determine // whether the inproc server exists. // // Trailing backslashes on registry paths are required to read default // value. // strProgId = WshShell.RegRead("HKCR\\CLSID\\" + CLSID_FLASH_PLAYER + "\\VersionIndependentProgID\\"); if ( PROGID_FLASH_PLAYER == strProgId && CLSID_FLASH_PLAYER == WshShell.RegRead( "HKCR\\" + strProgId + "\\CLSID\\") ) { strInprocServer32 = WshShell.RegRead( "HKCR\\CLSID\\" + CLSID_FLASH_PLAYER + "\\InprocServer32\\" ); fReturn = FileSystemObj.FileExists(strInprocServer32); }
} catch (err) { // if an exception is thrown, something grave is amiss. It is safer to // assume player is not installed. // fReturn = false; }
return fReturn; }
function InitApplication() { OOBEDocBody.style.cursor = "wait"; // show "wait" cursor while initializing
g_bStartup = true; InitFrameRef();
MSLogoImg.src='images/stbg'+((window.top.screen.width < 1024) ? '800.png' : '1024.png');
// reset all parameters that change if screen width > 800 if(window.top.screen.width > 800) {
StatusBackgndColor.style.width = 230; spnStatDividerBar.style.left = StatusBackgndColor.style.width; statpaneCell.style.width = parseInt(StatusBackgndColor.style.width) + parseInt(spnStatDividerBar.style.width); spnStatusPane.style.width = statpaneCell.style.width; spnStatusPane.style.top = 170; spnMainFrame.style.width = parseInt(window.top.screen.width) - parseInt(statpaneCell.style.width); // 784 for 1024
document.frames("ifrmConnDelay").frameElement.style.left=statpaneCell.style.width;
spnOEMLogo.style.left = 304; spnAssist.style.top = 590; spnAssist.style.width = StatusBackgndColor.style.width; }
if ( (1 == DirObj.get_Offline() || window.external.CheckDialReady() != ERR_COMM_NO_ERROR) ) { g_status = STATUS_OFF; StatusObj.set_Status(NOLAUNCHISPSIGNUP, true); window.external.LoadStatusItems("No Modem"); } else {
if ( StatusObj.get_Status(ICS_FOR_OOBE) ) { window.external.TriggerIcsCallback(true); } else { window.external.TriggerIcsCallback(false); }
var str = DirObj.get_ISPSignup().toUpperCase(); if ("MSN" == str) { g_status = STATUS_ISP; if ( window.external.get_RegStatus() ) window.external.LoadStatusItems("MSN(No Reg)"); else window.external.LoadStatusItems("MSN"); } else if ("OFFLINE" == str) { g_status = STATUS_ISP; if ( window.external.get_RegStatus() ) window.external.LoadStatusItems("Offline(No Reg)"); else window.external.LoadStatusItems("Offline"); } else if ("PRECONFIG" == str) { g_status = STATUS_OEM; if ( window.external.get_RegStatus() ) window.external.LoadStatusItems("Preconfig(No Reg)"); else window.external.LoadStatusItems("Preconfig"); } else { g_status = STATUS_NONE; StatusObj.set_Status(NOLAUNCHISPSIGNUP, true); if ( window.external.get_RegStatus() ) window.external.LoadStatusItems("None(No Reg)"); else window.external.LoadStatusItems("None"); } }
InitCKPT();
// IME handling
g_IMEExists = FileSystemObj.FileExists(ApiObj.get_SystemDirectory() + "\\OOBE\\HTML\\IME\\IMETut1.htm");
Agent_Init();
spnPage.style.visibility = "visible";
if (null == g_CurrentCKPT) { // run only if CKPT regkey didn't exist on start g_bNeedtoRunAnimation = FlashPlayerInstalled() && FileSystemObj.FileExists(g_OOBEDirPath+"images\\intro.swf"); GoNavigate(CKPT_HWCHK); } else { g_bNeedtoRunWelcomeFadeIn = false;
OOBEDocBody.style.cursor = "default"; ScreenFrame.style.visibility = "visible";
if(g_CurrentCKPT>CKPT_WELCOME) { //if we're not running init sequence, just show the window now // ScreenFrame.style.display = "inline"; window.external.ShowOOBEWindow(); }
GoNavigate(g_CurrentCKPT); } }
function ProcessQueuedEvents() { // flush all WM_ events in windows queue. // workaround for IE 103880, 'white flashes in statpane & button on page unload' window.external.ProcessQueuedEvents(); }
// Update status pane and navigate function navigatetoPrivacy(PrivPage) { if(g_CurrentCKPT == CKPT_REGISTER3) { Reg3SaveSettings(); }
if(PrivPage == "MS") g.navigate("prvcyMS.htm"); else g.navigate("OEMpriv.htm"); }
var g_iISPRadioActive=1; var g_bRadioMigrateISP=false; ////////////////////////////////////////////////////////////////////////////////////// // isp.htm ////////////////////////////////////////////////////////////////////////////////////// function IspLoadMe() { InitFrameRef();
if(g_iISPRadioActive==1) { g_FirstFocusElement = g.radioGetNewISP; } else if(g_iISPRadioActive==2) { g_FirstFocusElement = g.radioMigrateISP; } else if(g_iISPRadioActive==3) { g_FirstFocusElement = g.radioSelectICS; } else { g_FirstFocusElement = g.radioSkip; }
IspToggleAllRadioButtons(true);
g.ISP_ICS.style.display = "none"; g.radioSelectICS.style.display = "none"; if ( window.external.IsIcsAvailable() ) { g.ISP_ICS.style.display = "inline"; g.radioSelectICS.style.display = "inline"; }
InitButtons();
g_FirstFocusElement.checked=true; g_FirstFocusElement.focus(); }
function IspUnLoad() { try { if(g.radioGetNewISP.checked) { g_iISPRadioActive=1; } else if(g.radioMigrateISP.checked) { g_iISPRadioActive=2; } else if(g.radioSelectICS.checked) { g_iISPRadioActive=3; } else { g_iISPRadioActive=4; } g_bRadioMigrateISP = (g.event.srcElement==g.radioMigrateISP); } catch (e) {}
} function IspToggleAllRadioButtons(bSwitch) { try { g.radioGetNewISP.disabled = !bSwitch; g.ISP_New.disabled = !bSwitch; g.radioMigrateISP.disabled = !bSwitch; g.ISP_Migrate.disabled = !bSwitch; g.radioSelectICS.disabled = !bSwitch; g.ISP_ICS.disabled = !bSwitch; g.radioSkip.disabled = !bSwitch; g.skipISP.disabled = !bSwitch; } catch (e) { } }
// Place holder for the ISP page function function RegRadioClicked() { g.btnNext.disabled = false; InitButtons(); } ///////////////////////////////////////////////////////////////////////////////////// // ics.htm ///////////////////////////////////////////////////////////////////////////////////// function IcsLoadMe() { InitFrameRef();
InitButtons();
g_FirstFocusElement = g.radio_ChooseIcs; g_FirstFocusElement.focus(); }
function IcsRadioClicked() { g.btnNext.disabled = false; InitButtons(); }
//////////////////////////////////////////////////////////////////// // Do NOT REMOVE THIS FUNCTION< THIS WILL GET CALLED WHEN F1 is // PRESSED. //////////////////////////////////////////////////////////////////// function OnHelp() { // Invoke MSAgent Agent_OnUserRequestAssistant(); }
</script>
<SCRIPT LANGUAGE=VBScript> <!-- BUGBUG: Can this be changed to jscript?? --> <!-- Flash calls this VBScript fn when movie exits --> Sub IntroAnimation_FSCommand(ByVal command, ByVal args) call PostMovieWelcomeInit() end sub </SCRIPT>
</HEAD>
<BODY ID=OOBEDocBody leftMargin=0 DIR=LTR onload="InitApplication();" scroll=no tabIndex=-1 topMargin=0 language=javascript onhelp="Agent_OnUserRequestAssistant();" style="background-color: white"> <SPAN ID=junkspan style="height:2px;width:2px;background-color:black;z-index:99;display:none"></SPAN>
<SPAN ID=MovieFrame style="position:absolute; height:100%;width:100%;background-color:white;z-index:99999;display:none"> <OBJECT alt=Welcome classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" ID=IntroAnimation WIDTH=100% HEIGHT=100%> <PARAM NAME=movie VALUE="images\intro.swf"> <PARAM NAME=loop VALUE=false> <PARAM NAME=menu VALUE=false> <PARAM NAME=quality VALUE=best> <PARAM NAME=bgcolor VALUE=#FFFFFF> </OBJECT> </SPAN>
<SPAN ID=ScreenFrame style="height:100%; width:100%; position:absolute; display:none">
<IMG ID=MSLogoImg style="LEFT: 0px; TOP: 0px; POSITION: absolute; z-index:10;" alt="">
<SPAN ID=StatusBackgndColor style="width:180px; height:100%; background-color:#4F7FB5; position:absolute; top:0px; left:0px; z-index:-20"> </SPAN> <!-- height adjusted in InitApp-->
<SPAN id=spnStatDividerBar style="left:180px; height:100%; background-color:#80A2CF; position:absolute; width:10px; top:0px; z-index:6"> </SPAN>
<!-- two cell table contains statpane, mainbody--> <TABLE cellpadding=0 cellspacing=0 style="z-index:6; position:absolute; left:0px; top:0px; width:100%;height:100%"> <TR> <TD ID=statpaneCell style="width:190px; height:100%;z-index:6"> <SPAN id=spnStatusPane style="position:absolute;LEFT: 0px; TOP: 131px; z-index:66; width: 190px;"> <IFRAME id=ifrmStatusPane frameBorder=no scrolling=no style="width:100%; height:300px; background-color: #4F7FB5" name=StatusPane src="res://MSOBSHEL.DLL/STATPANE_RESOURCE" tabIndex=-1 ></IFRAME> </SPAN> </TD>
<TD style="height:100%" align=center>
<SPAN id=spnPage style="VISIBILITY: hidden;z-index:4;" tabIndex=-1> <!--hidden so users dont see initial load--> <SPAN id=spnMainFrame style="width: 610px; height:100%" tabIndex=-1 > <IFRAME id=ifrmMainFrame frameBorder=no scrolling=no width="100%" height="100%" name=msoobeMain tabIndex=0></IFRAME> <!-- tabindex=0 because we dont want IFRAME to get focus --> <IFRAME id=ifrmConnDelay frameBorder=no style="display:none; position:absolute; z-index:-1; left: 190px;" scrolling=no width="100%" height="100%" name=connDelay tabIndex=-1 src="setup/ISPWait.htm"></IFRAME> </SPAN> </SPAN>
</TD></TR> </TABLE>
<SPAN id=spnOEMLogo style="z-index:10;POSITION: absolute; TOP: 0px; HEIGHT: 48px; width:100%; LEFT: 243px; background-position: top left; background-repeat: no-repeat; background-image: url(images/oemlogo.gif);"> </SPAN>
<SPAN id=spnAssist class="emphasis-lesser" style="visibility:hidden; background-color:#4F7FB5; POSITION: absolute; LEFT: 0px; HEIGHT: 160px; TOP: 410px; WIDTH: 180px; z-index:9"> <TABLE width="95%" cellspacing=0 cellpadding=0 align=center class="emphasis-lesser" style="text-align:center;color:white;"> <TR><TD align=center> <IMG align=middle id=AssistImg alt=help border=0 src="images/merlin.png" style="visibility:hidden;z-index:9" language=javascript onclick="Agent_OnUserRequestAssistant()"><BR> </TD></TR> <TR><TD ID=MerlinStr1>If you want</TD></TR> <TR><TD ID=MerlinStr2>assistance, click Merlin</TD></TR> <TR><TD ID=MerlinStr3>or press F1.</TD></TR> </TABLE> </SPAN> </SPAN> </BODY> </HTML>
|