home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / settings.js_22 < prev    next >
Text (UTF-16)  |  2009-07-13  |  58KB  |  819 lines

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //    THIS CODE IS NOT APPROVED FOR USE IN/ON ANY OTHER UI ELEMENT OR PRODUCT COMPONENT.
  4. //    Copyright (c) 2009 Microsoft Corporation.    All rights reserved.
  5. //
  6. ////////////////////////////////////////////////////////////////////////////////
  7.  
  8. var gDefaultWeatherLocation = getLocalizedString('DefaultCity');
  9. var gDefaultWeatherLocationCode = getLocalizedString('DefaultLocationCode');
  10. var gDefaultDisplayDegreesIn = getLocalizedString('DefaultUnit');
  11. var gDefaultInputHelperString = getLocalizedString('EnterACityName');
  12.  
  13. var MicrosoftGadget    = new Object();
  14. MicrosoftGadget.currentState = LOCATION_SENSING_STATE_DISABLED;// if state is not saved / not known, do not allow calls to api as default setting
  15.  
  16.  
  17. if ( gDefaultDisplayDegreesIn !== 'Celsius' )
  18. {
  19.         gDefaultDisplayDegreesIn = 'Fahrenheit';
  20. }
  21.  
  22. ////////////////////////////////////////////////////////////////////////////////
  23. //
  24. // onAPIStatusChange( status )    - disables Find my location automatically
  25. //    radio box and labelif location reports cannot be retrieved
  26. //    (no change to selected radio box option)
  27. ////////////////////////////////////////////////////////////////////////////////
  28. MicrosoftGadget.onAPIStatusChange = function ( status )
  29. {
  30.     if ( status == 4 )
  31.     {
  32.         try
  33.         {
  34.             var report = getAPILatLongReport( this );
  35.             radioAutomatically.disabled = false;
  36.             LabelAutomatically.disabled = false;
  37.             return;
  38.         }
  39.         catch(err)
  40.         {
  41.             System.Debug.outputString( "Error getting geo-coordinates from Location API");
  42.             System.Debug.outputString( "Error Description: " + err.description + "");
  43.         }
  44.     }
  45.     radioAutomatically.disabled = true;
  46.     LabelAutomatically.disabled = true;
  47. }
  48.  
  49.  
  50. ////////////////////////////////////////////////////////////////////////////////
  51. //
  52. // disableAutomaticallyOption( )    - disables automatically radio box and label
  53. //    also checks Manually option
  54. ////////////////////////////////////////////////////////////////////////////////
  55. function disableAutomaticallyOption()
  56. {
  57.     radioAutomatically.disabled = true;
  58.     LabelAutomatically.disabled = true;
  59.     radioManually.checked = true;
  60. }
  61.  
  62. ////////////////////////////////////////////////////////////////////////////////
  63. //
  64. // reConfigManual() - triggered when focus set on manual radio box or text field
  65. //
  66. ////////////////////////////////////////////////////////////////////////////////
  67. function reConfigManual( ) 
  68. {
  69.     if ( !radioManually.checked )
  70.     {
  71.         radioManually.checked = true;
  72.     }
  73. }
  74.  
  75. ////////////////////////////////////////////////////////////////////////////////
  76. //
  77. // reConfigAuto() - triggered when focus set on automatically
  78. //
  79. ////////////////////////////////////////////////////////////////////////////////
  80. function reConfigAuto( ) 
  81. {
  82.  
  83.     if ( !radioAutomatically.checked )
  84.     {
  85.         radioAutomatically.checked = true;
  86.     }
  87. }
  88.  
  89. ////////////////////////////////////////////////////////////////////////////////
  90. //
  91. // setup() - triggered by body.onload event
  92. //
  93. ////////////////////////////////////////////////////////////////////////////////
  94. function setup() 
  95. {
  96.     // If we are in BIDI Mode, apply some special css 
  97.     // to help folks read things Right to Left
  98.     if (gBIDIMode) 
  99.     {
  100.         document.body.className = 'BIDI'; 
  101.     }
  102.  
  103.     // Fetch and place all of the localized strings
  104.     document.getElementById('txtInputPlace').innerText    = gDefaultInputHelperString;
  105.     document.getElementById('lblFahrenheit').innerHTML = getLocalizedString('Fahrenheit');
  106.     document.getElementById('lblCelsius').innerHTML = getLocalizedString('Celsius');
  107.     document.getElementById('lgdDisplayTemperatureIn').innerHTML = getLocalizedString('DisplayTemperatureIn');
  108.  
  109.     document.getElementById('LabelSelectLocation').innerHTML = getLocalizedString('SelectLocation');
  110.     document.getElementById('LabelAutomatically').innerHTML = getLocalizedString('Automatically');
  111.     document.getElementById('privacyArticleLink').href = getLocalizedString('HelperArticleLink');
  112.     document.getElementById('privacyArticleLink').innerText = getLocalizedString('HelperArticleLinkText');
  113.     document.getElementById('btnSearchForPlace').title = getLocalizedString('Search');
  114.     document.getElementById('radioManuallyAccName').innerText = getLocalizedString('EnterACityName');
  115.     document.getElementById('txtInputPlaceAccName').innerText = getLocalizedString('EnterACityName');
  116.  
  117.     document.getElementById('lblFahrenheit').innerHTML = getLocalizedString('Fahrenheit');
  118.  
  119.     document.getElementById('radioManually').tabIndex = 1;
  120.     document.getElementById('txtInputPlace').tabIndex = 2;
  121.     document.getElementById('btnSearchForPlace').tabIndex = 3;
  122.     document.getElementById('radioAutomatically').tabIndex = 4;
  123.     document.getElementById('privacyArticleLink').tabIndex = 5;
  124.     document.getElementById('radioFahrenheit').tabIndex = 6;
  125.     document.getElementById('radioCelsius').tabIndex = 7;
  126.  
  127.  
  128.     MicrosoftGadget.factory = document.getElementById("factory").object;
  129.  
  130.     loadAndApplySettingsToPage();
  131.  
  132.     // If we are in "Gadget Mode" then hook the OnSettingsClosing event 
  133.     // (triggered when user clicks "OK" from the Settings Pane) to our 
  134.     // custom "Save Settings" function
  135.     if (gGadgetMode) 
  136.     {
  137.         System.Gadget.onSettingsClosing    = function(event) 
  138.         { 
  139.             if (event.closeAction == event.Action.commit) 
  140.             {
  141.  
  142.             // If search field has some content, then settings dialog will not dismiss on pressing OK.
  143.                 if(document.getElementById('txtInputPlace').value!=gDefaultInputHelperString && radioManually.checked )
  144.                 {
  145.                         doMouseUpSearchButton();
  146.                         event.cancel=true;
  147.                 }
  148.                 else
  149.                 {
  150.                         extractAndSaveSettingsFromPage(); 
  151.                 }
  152.             }
  153.         }
  154.     }
  155.     document.body.attachEvent('onclick', function() { showSearchStatus(false, false, ''); });
  156.     if ( radioManually.checked )
  157.     {
  158.         doResetHelperText();
  159.     }
  160. }
  161.  
  162. ////////////////////////////////////////////////////////////////////////////////
  163. //
  164. // loadAndApplySettingsToPage() - Loads settings and applies them to page 
  165. //
  166. ////////////////////////////////////////////////////////////////////////////////
  167. function loadAndApplySettingsToPage() 
  168. {
  169.     // Load Settings
  170.     var theWeatherLocation    = unescape(readSetting("WeatherLocation")) || gDefaultWeatherLocation;
  171.     var theWeatherLocationCode    = readSetting("WeatherLocationCode") || gDefaultWeatherLocationCode;
  172.     var theDisplayDegreesIn    = readSetting("DisplayDegreesIn")    || gDefaultDisplayDegreesIn;
  173.  
  174.     var LocationAPIAvailable = readSetting ( "LocationAPIAvailable" ) || false;
  175.  
  176.     if ( LocationAPIAvailable && MicrosoftGadget.factory !== null )
  177.     {
  178.         MicrosoftGadget.currentState = readSetting( "CurrentState" ) || LOCATION_SENSING_STATE_ERROR_MANUAL;
  179.         MicrosoftGadget.currentState = parseInt( MicrosoftGadget.currentState );
  180.  
  181.         if ( LOCATION_SENSING_AUTO_STATES_ARRAY.exists( MicrosoftGadget.currentState ) )
  182.         {
  183.             radioAutomatically.checked = true;
  184.         }
  185.         else
  186.         {
  187.             radioManually.checked = true;
  188.             txtInputPlace.focus();
  189.         }
  190.         MicrosoftGadget.onAPIStatusChange( getAPIStatus( MicrosoftGadget ) );
  191.     }
  192.     else
  193.     {
  194.         disableAutomaticallyOption();
  195.     }
  196.  
  197.  
  198.     // Apply Settings
  199.     document.getElementById("PlaceTitle").innerHTML = getLocalizedString('CurrentCity');
  200.     document.getElementById("PlaceCurrent").innerText = theWeatherLocation;
  201.     document.getElementById("radio" + theDisplayDegreesIn).checked="checked";
  202.     document.getElementById('WeatherLocation').value = theWeatherLocation;
  203.     document.getElementById('WeatherLocationCode').value = theWeatherLocationCode;
  204.  
  205.     // Create instance of MSNServices.dll and attach to our Global Object
  206.     var oMSN = new ActiveXObject("wlsrvc.WLServices");
  207.     MicrosoftGadget.oMSN = oMSN.GetService("weather"); 
  208.     MicrosoftGadget.bPlacePossibilitiesDisplayed = false;
  209.     MicrosoftGadget.bHaveSearched =false;
  210.     MicrosoftGadget.buttonState = 'btnSearch';
  211.     MicrosoftGadget.bInputBoxHasFocus=true; 
  212.     MicrosoftGadget.spinner = new getSpinner( "PleaseWaitLoadingSpinner" );    
  213.     MicrosoftGadget.spinner.hide();
  214. }
  215. ////////////////////////////////////////////////////////////////////////////////
  216. //
  217. // extractAndSaveSettingsFromPage() - Extracts values from page and saves them
  218. //
  219. ////////////////////////////////////////////////////////////////////////////////
  220. function extractAndSaveSettingsFromPage() 
  221. {
  222.     // Extract Settings
  223.     var theWeatherLocation    = document.getElementById('WeatherLocation').value;
  224.     var theWeatherLocationCode    = document.getElementById('WeatherLocationCode').value.split('|')[0];
  225.     var theDisplayDegreesIn    = "Fahrenheit";
  226.  
  227.     if (document.getElementById("radioCelsius").checked) 
  228.     {
  229.         theDisplayDegreesIn    = "Celsius";
  230.     }
  231.  
  232.  
  233.     if ( MicrosoftGadget.currentState != LOCATION_SENSING_STATE_DISABLED && LOCATION_SENSING_VALID_STATES_ARRAY.exists( MicrosoftGadget.currentState ) )
  234.     {
  235.         if ( !radioManually.checked && ( LOCATION_SENSING_MANUAL_STATES_ARRAY.exists( MicrosoftGadget.currentState ) ) )
  236.         {
  237.             switch( MicrosoftGadget.currentState )
  238.             {
  239.                 case LOCATION_SENSING_STATE_ERROR_MANUAL:
  240.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_ERROR_AUTO;
  241.                 break;
  242.  
  243.                 case LOCATION_SENSING_STATE_OK_MANUAL:
  244.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_OK_AUTO;
  245.                 break;
  246.  
  247.                 case LOCATION_SENSING_STATE_DISCONNECTED_MANUAL:
  248.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_DISCONNECTED_AUTO;
  249.                 break;
  250.             }
  251.         }
  252.         else if ( radioManually.checked && ( LOCATION_SENSING_AUTO_STATES_ARRAY.exists( MicrosoftGadget.currentState ) ) )
  253.         {
  254.             switch( MicrosoftGadget.currentState )
  255.             {
  256.                 case LOCATION_SENSING_STATE_ERROR_AUTO:
  257.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_ERROR_MANUAL;
  258.                 break;
  259.  
  260.                 case LOCATION_SENSING_STATE_OK_AUTO:
  261.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_OK_MANUAL;
  262.                 break;
  263.  
  264.                 case LOCATION_SENSING_STATE_DISCONNECTED_AUTO:
  265.                     MicrosoftGadget.currentState = LOCATION_SENSING_STATE_DISCONNECTED_MANUAL;
  266.                 break;
  267.             }
  268.         }
  269.     }
  270.  
  271.     // Save Settings
  272.     saveSetting("WeatherLocation", theWeatherLocation);
  273.     saveSetting("WeatherLocationCode", theWeatherLocationCode);
  274.     saveSetting("DisplayDegreesIn", theDisplayDegreesIn); 
  275.     saveSetting("CurrentState", MicrosoftGadget.currentState ); 
  276. }
  277. ////////////////////////////////////////////////////////////////////////////////
  278. //
  279. // doSetHelperText() - sets input box to looks "Active" for further input
  280. //
  281. ////////////////////////////////////////////////////////////////////////////////
  282. function doSetHelperText() 
  283. {
  284.     if ( document.getElementById('txtInputPlace').value == gDefaultInputHelperString ) {
  285.         document.getElementById('txtInputPlace').className = 'TextInputInactiveDefaultText';
  286.     } 
  287.     else 
  288.     {
  289.         document.getElementById('txtInputPlace').className = 'TextInputActive';
  290.     }
  291. }
  292. ////////////////////////////////////////////////////////////////////////////////
  293. //
  294. // doResetHelperText() - resets Helper text to default "Enter Location here" 
  295. //    and also resets the className of the input box
  296. //
  297. ////////////////////////////////////////////////////////////////////////////////
  298. function doResetHelperText() 
  299. {
  300.     var theInputElement = document.getElementById('txtInputPlace');
  301.  
  302.     if ( isEmpty() ) 
  303.     {
  304.         theInputElement.value = gDefaultInputHelperString;
  305.         theInputElement.className = 'TextInputInactiveDefaultText';
  306.         document.getElementById('btnSearchForPlace').className = 'btnSearch';
  307.         if ( MicrosoftGadget.bInputBoxHasFocus ) 
  308.         {
  309.             setCaretPos( theInputElement, 0, 0 );
  310.         }
  311.     }
  312. }
  313. ////////////////////////////////////////////////////////////////////////////////
  314. //
  315. // doMouseOverSearchButton() - set mouseover image for Search Button
  316. //
  317. ////////////////////////////////////////////////////////////////////////////////
  318. function doMouseOverSearchButton() 
  319. {
  320.     if ( !radioManually.checked )
  321.     {
  322.         return;
  323.     }
  324.     var theClassName = 'btnClearOver';
  325.     if ( MicrosoftGadget.buttonState=='btnSearch' ) 
  326.     {
  327.         theClassName = 'btnSearchOver'; 
  328.     }
  329.     document.getElementById('btnSearchForPlace').className = theClassName;    
  330. }
  331. ////////////////////////////////////////////////////////////////////////////////
  332. //
  333. // doMouseOutSearchButton() - sets mouseout image for Search Button
  334. //
  335. ////////////////////////////////////////////////////////////////////////////////
  336. function doMouseOutSearchButton() 
  337. {
  338.     if ( !radioManually.checked )
  339.     {
  340.         return;
  341.     }
  342.     if (MicrosoftGadget.bInputBoxHasFocus == true) 
  343.     {
  344.         if ( MicrosoftGadget.buttonState=='btnSearch' )
  345.         {
  346.             document.getElementById('btnSearchForPlace').className = 'btnSearchInsertionPoint';
  347.         }
  348.         else
  349.         {
  350.             document.getElementById('btnSearchForPlace').className = 'btnClearInsertionPoint';
  351.         }
  352.     } 
  353.     else 
  354.     {
  355.         if ( MicrosoftGadget.buttonState=='btnSearch' )
  356.         {
  357.             document.getElementById('btnSearchForPlace').className = 'btnSearch';
  358.         }
  359.         else
  360.         {
  361.             document.getElementById('btnSearchForPlace').className = 'btnClear';
  362.         }
  363.         
  364.     }
  365. }
  366.  
  367. ////////////////////////////////////////////////////////////////////////////////
  368. //
  369. // doMouseDownSearchButton() - sets mousedown image for Search Button
  370. //
  371. ////////////////////////////////////////////////////////////////////////////////
  372. function doMouseDownSearchButton() 
  373. {
  374.     if ( !radioManually.checked )
  375.     {
  376.         return;
  377.     }
  378.     if ( MicrosoftGadget.buttonState=='btnSearch' )
  379.     {
  380.         document.getElementById('btnSearchForPlace').className = 'btnSearchDown';    
  381.     }
  382.     else
  383.     {
  384.         document.getElementById('btnSearchForPlace').className = 'btnClearDown';    
  385.     }
  386. }
  387. ////////////////////////////////////////////////////////////////////////////////
  388. //
  389. // doMouseUpSearchButton() - sets mouseup image for Search Button
  390. //
  391. ////////////////////////////////////////////////////////////////////////////////
  392. function doMouseUpSearchButton() 
  393. {
  394.     if ( !radioManually.checked )
  395.     {
  396.         return;
  397.     }
  398.     if (MicrosoftGadget.buttonState == 'btnSearch') 
  399.     {
  400.         doSearch();
  401.     } 
  402.     else if (MicrosoftGadget.buttonState == 'btnClear') 
  403.     {
  404.         var theInputElement = document.getElementById('txtInputPlace');
  405.         theInputElement.value = '';
  406.         doResetHelperText();
  407.         showSearchStatus(false, false, '');
  408.         MicrosoftGadget.buttonState='btnSearch';
  409.     }
  410.     
  411.     if ( MicrosoftGadget.buttonState=='btnSearch' )
  412.     {
  413.         document.getElementById('btnSearchForPlace').className = 'btnSearchOver';    
  414.     }
  415.     else
  416.     {
  417.         document.getElementById('btnSearchForPlace').className = 'btnClearOver';    
  418.     }
  419. }
  420. ////////////////////////////////////////////////////////////////////////////////
  421. //
  422. // doFocusInputBox() - sets image for Search Button based on keyboard focus
  423. //
  424. ////////////////////////////////////////////////////////////////////////////////
  425. function doFocusInputBox() 
  426. {
  427.     document.getElementById('txtSearchedLocationFoundOnDialogDismiss').innerText = "";
  428.     showOrHide('txtSearchedLocationFoundOnDialogDismiss', false);
  429.     
  430.     MicrosoftGadget.bInputBoxHasFocus = true;
  431.     setCaretPos( document.getElementById('txtInputPlace'), 0, 0 );
  432.     if ( MicrosoftGadget.buttonState=='btnClear' ) 
  433.     {
  434.         document.getElementById('btnSearchForPlace').className = 'btnClearInsertionPoint';
  435.     }
  436. }
  437. ////////////////////////////////////////////////////////////////////////////////
  438. //
  439. // doBlurInputBox() - sets image for Search Button when mouse leaves input box
  440. //
  441. ////////////////////////////////////////////////////////////////////////////////
  442. function doBlurInputBox() 
  443. {
  444.     MicrosoftGadget.bInputBoxHasFocus = false; 
  445.     if ( MicrosoftGadget.buttonState=='btnSearch' )
  446.     {
  447.         document.getElementById('btnSearchForPlace').className = 'btnSearch';
  448.     }
  449.     else
  450.     {
  451.         document.getElementById('btnSearchForPlace').className = 'btnClear';
  452.     }
  453.     doResetHelperText();    
  454. }
  455. ////////////////////////////////////////////////////////////////////////////////
  456. //
  457. // isEmpty() - indicates whether a value has been entered into the search box
  458. //
  459. ////////////////////////////////////////////////////////////////////////////////
  460. function isEmpty() 
  461. {
  462.     var theInputElement = document.getElementById('txtInputPlace');
  463.     return    ((theInputElement.value == '') || (theInputElement.value==gDefaultInputHelperString));
  464. }
  465. ////////////////////////////////////////////////////////////////////////////////
  466. //
  467. // possiblyResetPlacePossibilities() - reset the PlacePossibilities DIV 
  468. // if we have an error state or otherwise no meaningful data to display
  469. //
  470. ////////////////////////////////////////////////////////////////////////////////
  471. function possiblyResetPlacePossibilities() 
  472. {
  473.     if ((document.getElementById('txtInputPlace').value == gDefaultInputHelperString) || (document.getElementById('PlacePossibilities').innerHTML == getLocalizedString("LocationDontExist")) || (document.getElementById('PlacePossibilities').innerHTML == getLocalizedString("ServiceNotAvailable"))) 
  474.     {
  475.         showSearchStatus(false, false, '');
  476.     }    
  477. }
  478. ////////////////////////////////////////////////////////////////////////////////
  479. //
  480. // doBeginInput() - triggered when a user clicks in the input box.    
  481. //    Blanks out Helper text.    
  482. //
  483. ////////////////////////////////////////////////////////////////////////////////
  484. function doBeginInput() 
  485. {
  486.     var theInputElement = document.getElementById('txtInputPlace');
  487.  
  488.     document.getElementById('txtSearchedLocationFoundOnDialogDismiss').innerText = "";
  489.     showOrHide('txtSearchedLocationFoundOnDialogDismiss', false);
  490.     possiblyResetPlacePossibilities();
  491.     
  492.     if (theInputElement.value == gDefaultInputHelperString) 
  493.     {
  494.         theInputElement.value = '';
  495.         theInputElement.className = 'TextInputActive';
  496.     }
  497.     MicrosoftGadget.buttonState='btnSearch';
  498.     document.getElementById('btnSearchForPlace').className = 'btnSearchInsertionPoint';
  499. }
  500. ////////////////////////////////////////////////////////////////////////////////
  501. //
  502. // doSearch() - triggered when user clicks "Search" button
  503. //
  504. ////////////////////////////////////////////////////////////////////////////////
  505. function doSearch() 
  506. {
  507.     showSearchStatus(false, false, '');
  508.     MicrosoftGadget.bHaveSearched = false;
  509.     // Store original request for later use in disambiguating search results
  510.     MicrosoftGadget.locationSearched = document.getElementById('txtInputPlace').value;    
  511.  
  512.     // If we have something meaningful to search for, go ahead...
  513.     if ( !isEmpty() )
  514.     {
  515.         searchForLocation();
  516.         MicrosoftGadget.buttonState = 'btnClear';
  517.     } 
  518.     else 
  519.     {
  520.         showSearchStatus(true, true, getLocalizedString('NoSearchQuery'));
  521.         document.getElementById('txtInputPlace').focus();
  522.     }
  523. }
  524. ////////////////////////////////////////////////////////////////////////////////
  525. //
  526. // searchForLocation() - searches for location string set in locationsearched property
  527. //
  528. ////////////////////////////////////////////////////////////////////////////////
  529. function searchForLocation( ) 
  530. {
  531.     MicrosoftGadget.bHaveSearched = true;
  532.     // Map event handler to refresh display(s) when fresh data received
  533.     MicrosoftGadget.oMSN.OnDataReady = doDisplayPlacePossibilities;
  534.     showSearchStatus(true, true, getLocalizedString("Searching"));
  535.     // Trigger Search by Location
  536.     MicrosoftGadget.oMSN.SearchByLocation( encodeURIComponent( MicrosoftGadget.locationSearched ) );    
  537. }
  538. ////////////////////////////////////////////////////////////////////////////////
  539. //
  540. // showSearchStatus(bool bVisible, bool bBorder, string sMessage) - 
  541. //    bVisible == Show/Hide Search Status Box, 
  542. //    bBorder == special state with borders around Status Box (for error states), 
  543. //    sMessage == Message to display 
  544. //    *Note that sending in default value of "Searching" for sMessage 
  545. //    results in display of Spinner animation.
  546. //
  547. ////////////////////////////////////////////////////////////////////////////////
  548. function showSearchStatus(bVisible, bBorder, sMessage) 
  549. {
  550.     showOrHide('PlacePossibilities', bVisible);
  551.  
  552.     if (sMessage == getLocalizedString("Searching")) 
  553.     { 
  554.         MicrosoftGadget.spinner.show();
  555.         MicrosoftGadget.spinner.start();
  556.         sMessage = "      " + sMessage;
  557.     } 
  558.     else 
  559.     {
  560.         MicrosoftGadget.spinner.hide();
  561.         MicrosoftGadget.spinner.stop();
  562.     }
  563.     
  564.     document.getElementById('PlacePossibilities').innerText = sMessage;
  565.     if(bVisible && bBorder && sMessage == '' && radioManually.checked )
  566.     {
  567.         document.getElementById('txtInputPlace').focus();
  568.         document.getElementById('txtInputPlace').select();
  569.     }
  570.  
  571.     if(bBorder) 
  572.     {
  573.         document.getElementById('PlacePossibilities').className = "border";
  574.     } 
  575.     else 
  576.     {
  577.         document.getElementById('PlacePossibilities').className = '';
  578.     }
  579. }
  580. ////////////////////////////////////////////////////////////////////////////////
  581. //
  582. // doDisplayPlacePossibilities(object data) - this is the callback function 
  583. // triggered by the .DLL that will be called when we have data returned
  584. //
  585. ////////////////////////////////////////////////////////////////////////////////
  586. function doDisplayPlacePossibilities(data) 
  587. {
  588.     if (data.Count && (data.Count > 0)) 
  589.     {
  590.         showSearchStatus(true, false, '');
  591.  
  592.         if (data.Count > 1) 
  593.         {
  594.             var oSelect = document.createElement("SELECT");
  595.             oSelect.id = "selectPlace";
  596.             oSelect.size = 5;
  597.             oSelect.onclick = function() {setSelectedPlace(this)}
  598.             oSelect.onkeydown = function() {onKeyDown(event, this)}
  599.             for (var i=0; i<data.count; i++) 
  600.             {
  601.                 var theDisambiguatedLocation = disambiguatedLocation( data.item(i), data.Count );
  602.                 var oOption = document.createElement("OPTION");
  603.                 oOption.value = data.item(i).LocationCode + '|' + data.item(i).ZipCode;
  604.                 oOption.innerText = theDisambiguatedLocation;
  605.                 oSelect.appendChild(oOption); 
  606.             }
  607.             document.getElementById('PlacePossibilities').appendChild(oSelect);
  608.             setTimeout("if (document.getElementById('selectPlace')) {        document.getElementById('selectPlace').focus(); }",150);
  609.             MicrosoftGadget.bPlacePossibilitiesDisplayed = true;
  610.         } 
  611.         else 
  612.         {    
  613.             // We have an exact "hit", so auto-select it
  614.             showOrHide('PlacePossibilities', false);
  615.             var theWeatherLocationCode = data.item(0).LocationCode + '|' + data.item(0).ZipCode; 
  616.             var theWeatherLocation = disambiguatedLocation( data.item(0), 1 );
  617.  
  618.             document.getElementById('txtSearchedLocationFoundOnDialogDismiss').innerText = '\n' + getLocalizedString('SearchedLocationFoundClickOK').replace("%1",theWeatherLocation);
  619.             showOrHide('txtSearchedLocationFoundOnDialogDismiss', true);
  620.  
  621.             // Reset the "currently Selected Location" string
  622.             document.getElementById("PlaceCurrent").innerText = theWeatherLocation;    
  623.             // Reset Search Box value
  624.             document.getElementById('txtInputPlace').value = '';    
  625.             doResetHelperText();
  626.  
  627.             document.getElementById('WeatherLocation').value = theWeatherLocation;
  628.             document.getElementById('WeatherLocationCode').value = theWeatherLocationCode;
  629.             
  630.             MicrosoftGadget.buttonState='btnSearch';
  631.             // Mimic Vista behavior of moving to next tabIndex element 
  632.             document.getElementById('txtInputPlace').blur();
  633.         }
  634.     } 
  635.     else 
  636.     {
  637.         showSearchStatus(true, true, '');
  638.         if ( data.RetCode != 200 ) 
  639.         {
  640.             document.getElementById('PlacePossibilities').innerHTML = getLocalizedString("ServiceNotAvailable");
  641.         } 
  642.         else 
  643.         {
  644.             if ( radioAutomatically.checked )
  645.             {
  646.                 document.getElementById('PlacePossibilities').innerHTML = getLocalizedString("EC4");
  647.             }
  648.             else
  649.             {
  650.                 document.getElementById('PlacePossibilities').innerHTML = getLocalizedString("LocationDontExist");
  651.             }
  652.         }
  653.     }
  654. }
  655. ////////////////////////////////////////////////////////////////////////////////
  656. //
  657. // disambiguatedLocation( obj oMSNWeatherLocation ) - returns an unambiguous 
  658. // location when result does not obviously relate to search term. This happens
  659. // when a weather observation point is at a distance (ie in a nearby city).
  660. // 
  661. ////////////////////////////////////////////////////////////////////////////////
  662. function disambiguatedLocation( oMSNWeatherLocation, theCount ) {
  663.     var retVal = oMSNWeatherLocation.Location;
  664.     var theLocationSearched = MicrosoftGadget.locationSearched.toLowerCase();
  665.     var bShowDisambiguation = true;
  666.  
  667.     // Determine if we have an "Exact Match" (ie disambiguation NOT required)
  668.     if    
  669.     ( //    a) A Zip Code was entered in the search box and Location has matching
  670.         ( theLocationSearched == oMSNWeatherLocation.ZipCode )    || 
  671.         //    b) Location Fullname contains the exact string entered into search box
  672.         ( oMSNWeatherLocation.Fullname.toLowerCase().indexOf( theLocationSearched ) > -1 ) ||
  673.         //    c) Search Distance is "0"
  674.         ( parseFloat( oMSNWeatherLocation.SearchDistance ) == 0 ) 
  675.     )
  676.     { 
  677.         bShowDisambiguation = false; 
  678.     }    
  679.     if ( bShowDisambiguation ) 
  680.     { 
  681.         if (( parseFloat(oMSNWeatherLocation.SearchScore) > .94 ) && ( theCount==1 ))
  682.         {
  683.             // example (search=="Newcastle,wa"), return="Bryn Mawr, WA (closest location for Newcastle, King, Washington, United States)"
  684.             retVal = oMSNWeatherLocation.Location + ' (' + getLocalizedString('SearchNearbyDisambiguation') + ' ' + oMSNWeatherLocation.SearchLocation + ')';
  685.         }
  686.         else
  687.         {
  688.             // example: search="mkul", return="Mukkul [Mukgul], South Chungcheong, South Korea (closest location: Boryeong, KOR)" 
  689.             retVal = oMSNWeatherLocation.SearchLocation + ' (' + getLocalizedString('SearchFuzzyDisambiguation') + ' ' + oMSNWeatherLocation.Location + ')';
  690.         }
  691.     }
  692.     // an exact match was found. Return (full) weather location
  693.     else
  694.     { 
  695.         if ( oMSNWeatherLocation.Fullname && (oMSNWeatherLocation.Fullname.length > 0) )
  696.         {
  697.             retVal = oMSNWeatherLocation.Fullname;
  698.         }
  699.     }
  700.     return retVal;
  701. }
  702. ////////////////////////////////////////////////////////////////////////////////
  703. //
  704. // onKeyDown(event, obj) - used by PlacePossibilities Select list 
  705. //    to handle keyboard navigation and selection
  706. //
  707. ////////////////////////////////////////////////////////////////////////////////
  708. function onKeyDown(event, obj) 
  709. {
  710.     if (event.keyCode==13) 
  711.     { 
  712.         // Enter 
  713.         setSelectedPlace(obj); 
  714.     } 
  715.     else if (event.keyCode==27) 
  716.     { 
  717.         // escape
  718.         showSearchStatus(false, false, '');
  719.     }
  720. }
  721. ////////////////////////////////////////////////////////////////////////////////
  722. //
  723. // textBoxSearch() - Monitors keypresses while typing in the Search box.
  724. //
  725. ////////////////////////////////////////////////////////////////////////////////
  726. function textBoxSearch() 
  727. {
  728.     if (event.keyCode==9)
  729.     {    
  730.         return true;
  731.     }
  732.  
  733.     if ( !radioManually.checked )
  734.     {
  735.         reConfigManual();
  736.     }
  737.     doSetHelperText();
  738.     doBeginInput();
  739.     var retVal = true;
  740.     if ( ( event.keyCode == 13 ) || ( event.srcElement.id == "btnSearchForPlace" && event.keyCode == 32 ) )
  741.     {    
  742.         // Enter Key 
  743.         MicrosoftGadget.buttonState = 'btnSearch';
  744.         doSearch();
  745.         if ( MicrosoftGadget.buttonState=='btnSearch' )
  746.         {
  747.             document.getElementById('btnSearchForPlace').className = 'btnSearch';    
  748.         }
  749.         else
  750.         {
  751.             document.getElementById('btnSearchForPlace').className = 'btnClear';    
  752.         }
  753.         // Prevent this keyboard event from bubbling out of the HTML window 
  754.         // the "ENTER" key has special meaning to SideBar
  755.         retVal = false; 
  756.     }
  757.     
  758.     if (event.keyCode == 27) 
  759.     {    
  760.         // Escape Key
  761.         showSearchStatus(false, false, '');
  762.         // "ESC" key has special meaning to SideBar, 
  763.         // so prevent this event from bubbling out of the HTML window
  764.         retVal = false; 
  765.     }
  766.     
  767.     // Limit input to 125 characters
  768.     var theInputString = document.getElementById('txtInputPlace');
  769.     if ( theInputString.value.length>125 ) 
  770.     {
  771.         theInputString.value=theInputString.value.substring(0,125);
  772.     }
  773.  
  774.     return retVal;
  775. }
  776. ////////////////////////////////////////////////////////////////////////////////
  777. //
  778. // setSelectedPlace(oHTMLElement Select aPickList) -- extracts selected element
  779. // from (programmatically generated) Select list.    
  780. // Saves off these values to hidden form elements.
  781. //
  782. ////////////////////////////////////////////////////////////////////////////////
  783. function setSelectedPlace(aPickList) 
  784. {
  785.     if(aPickList.selectedIndex > -1) 
  786.     {
  787.         if(aPickList.selectedIndex > 0)
  788.         {
  789.             radioManually.checked = true;
  790.  
  791.             reConfigManual();
  792.  
  793.         }
  794.         var theWeatherLocationCode = aPickList(aPickList.selectedIndex).value;
  795.         var theWeatherLocation = aPickList(aPickList.selectedIndex).text;
  796.         // Clear out old Select Statement
  797.         document.getElementById('PlacePossibilities').innerHTML = "";
  798.         // Hide the PlacePossibilities Area
  799.         showOrHide('PlacePossibilities', false);    
  800.  
  801.         // Reset the "currently Selected Location" string
  802.         document.getElementById("PlaceCurrent").innerText = theWeatherLocation;    
  803.  
  804.         // Set hidden form field values for later use when saving off values
  805.         document.getElementById('WeatherLocation').value = theWeatherLocation;
  806.         document.getElementById('WeatherLocationCode').value = theWeatherLocationCode;
  807.         MicrosoftGadget.bPlacePossibilitiesDisplayed = false;
  808.  
  809.         if ( radioManually.checked == true )
  810.         {
  811.             // Reset Search Box value
  812.             document.getElementById('txtInputPlace').value    = '';    
  813.             doResetHelperText();
  814.             MicrosoftGadget.buttonState = 'btnSearch';    
  815.         }
  816.     }
  817. }
  818.  
  819.