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