home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / library.js_8 < prev    next >
Text (UTF-16)  |  2012-05-19  |  44KB  |  692 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.  
  9. var gGadgetMode    = (window.System !== undefined);
  10. var gBIDIMode    = (document.dir=='rtl');    
  11.  
  12. ////////////////////////////////////////////////////////////////////////////////
  13. //
  14. // PICKLIST UTILITIES for use on SELECT Lists
  15. //
  16. ////////////////////////////////////////////////////////////////////////////////
  17.  
  18. ////////////////////////////////////////////////////////////////////////////////
  19. //
  20. // DoAdd(object oPickList, string anOptionValue, OPTIONAL string anOptionText)
  21. //    Adds an Option to passed-in oPickList (SELECT Object)
  22. //
  23. ////////////////////////////////////////////////////////////////////////////////
  24. function DoAdd(oPickList, anOptionValue, anOptionText) 
  25. {
  26.     if (oPickList && anOptionValue.length) 
  27.     {
  28.         var anOption = new Option;
  29.         anOption.value = anOptionValue;
  30.         // If we've been given a display value different than the option value, use it
  31.         if (anOptionText)
  32.         {
  33.             anOption.text    = anOptionText;
  34.         }
  35.         else
  36.         {
  37.             anOption.text    = anOptionValue;
  38.         }
  39.         
  40.         if (oPickList.selectedIndex > -1) 
  41.         { // If something is selected, then insertion point is below that item
  42.             // Insert new option above currently selected row
  43.             oPickList.add(anOption, oPickList.selectedIndex);
  44.             // Set selectedIndex of Picklist to newly inserted item
  45.             oPickList.selectedIndex -= 1;
  46.         } 
  47.         else 
  48.         {
  49.             oPickList.add(anOption);
  50.             oPickList.selectedIndex = DoFindIndex(oPickList, anOption.value);
  51.         }
  52.     }
  53. }
  54. ////////////////////////////////////////////////////////////////////////////////
  55. //
  56. // DoRemoveOption(object oPickList, OPTIONAL int anOptionIndex) 
  57. // Removes option from passed-in Select List. Default is to remove Selected-
  58. // Index but fn also accepts literal index in OPTIONAL param anOptionIndex
  59. //
  60. ////////////////////////////////////////////////////////////////////////////////
  61. function DoRemoveOption(oPickList, anOptionIndex) 
  62. {
  63.     var selectedItem    = anOptionIndex;
  64.     if (anOptionIndex===undefined)
  65.     {
  66.         selectedItem    = oPickList.selectedIndex;
  67.     }
  68.     if (selectedItem > -1) 
  69.     {
  70.         oPickList.options[selectedItem] = null;
  71.     }
  72.     // Set selectedIndex of Picklist to item above the one just removed 
  73.     // (or to the top of the list if we were already there)
  74.     if (selectedItem>0)
  75.     {
  76.         oPickList.selectedIndex = selectedItem-1;
  77.     }
  78.     else
  79.     {
  80.         oPickList.selectedIndex = 0;
  81.     }
  82. }
  83. ////////////////////////////////////////////////////////////////////////////////
  84. //
  85. // DoMoveUp(object oPickList) - Moves the currently selected option from 
  86. //    passed-in Select List Up one line
  87. //
  88. ////////////////////////////////////////////////////////////////////////////////
  89. function DoMoveUp(oPickList) 
  90. {
  91.     var selectedItem    = oPickList.selectedIndex;
  92.     if (selectedItem > 0) 
  93.     {
  94.         // If we're not already at the top of the list ...
  95.         var theOption = oPickList[selectedItem];
  96.         var theOptionB4 = oPickList[selectedItem-1];
  97.         for (prop in theOption) 
  98.         {
  99.             if ((prop=="text") || (prop=="value")) 
  100.             {
  101.                 // Swap the salient properties of the two options
  102.                 var theOptionProp = theOption[prop];
  103.                 theOption[prop] = theOptionB4[prop];
  104.                 theOptionB4[prop] = theOptionProp;
  105.             }
  106.         }
  107.         oPickList.selectedIndex = selectedItem - 1;
  108.     }
  109. }
  110. ////////////////////////////////////////////////////////////////////////////////
  111. //
  112. // DoMoveDown(object oPickList) - Moves the currently selected option from 
  113. //    passed-in Select List Up one line
  114. //
  115. ////////////////////////////////////////////////////////////////////////////////
  116. function DoMoveDown(oPickList) 
  117. {
  118.     var selectedItem    = oPickList.selectedIndex;
  119.     if ( (selectedItem > -1) && (selectedItem < oPickList.length-1) ) 
  120.     {
  121.         var theOption = oPickList[selectedItem];
  122.         var theOptionB4 = oPickList[selectedItem+1];
  123.         for (prop in theOption) 
  124.         {
  125.             if ((prop=="text") || (prop=="value")) 
  126.             {
  127.                 // Swap the salient properties of the two options
  128.                 var theOptionProp = theOption[prop];
  129.                 theOption[prop] = theOptionB4[prop];
  130.                 theOptionB4[prop] = theOptionProp;
  131.             }
  132.         }
  133.         oPickList.selectedIndex = selectedItem + 1;
  134.     }
  135. }
  136. ////////////////////////////////////////////////////////////////////////////////
  137. //
  138. // DoFindIndex(object oPickList, string anOptionValue, string anOptionText)
  139. // returns index value from a passed-in oPickList for either an 
  140. // optionValue or optionText (both OPTIONAL)
  141. //
  142. ////////////////////////////////////////////////////////////////////////////////
  143.  function DoFindIndex(oPickList, anOptionValue, anOptionText) 
  144. {
  145.     var theIndex = -1;
  146.     if (oPickList.length) 
  147.     {
  148.         for (var i=0; i<oPickList.length; i++) 
  149.         {
  150.             if (anOptionText!==undefined) 
  151.             {
  152.                 // Search based on option.text if we have anOptionText
  153.                 if (oPickList[i].text == anOptionText) 
  154.                 {
  155.                     theIndex=i;
  156.                     break;
  157.                 }
  158.             } 
  159.             else 
  160.             {
  161.                 // otherwise, search based on option.value
  162.                 if (oPickList[i].value == anOptionValue) 
  163.                 {
  164.                     theIndex=i;
  165.                     break;
  166.                 }
  167.             }
  168.         }
  169.     }
  170.     return theIndex;
  171.  }
  172.  
  173. ////////////////////////////////////////////////////////////////////////////////
  174. //
  175. // SETTINGS UTILITIES
  176. //
  177. ////////////////////////////////////////////////////////////////////////////////
  178.  
  179. ////////////////////////////////////////////////////////////////////////////////
  180. //
  181. // saveSetting(string theSettingName, string aSettingValue)- Saves a Setting
  182. //
  183. ////////////////////////////////////////////////////////////////////////////////
  184. function saveSetting(theSettingName, aSettingValue) 
  185. {
  186.     try
  187.     {
  188.         if (gGadgetMode) 
  189.         {
  190.             // If we are in "Gadget Mode", save off the value using that mechanism
  191.             System.Gadget.Settings.write(theSettingName, aSettingValue);
  192.         } 
  193.         else 
  194.         {
  195.             // If we are in "development mode" - use a cookie instead
  196.             writeCookie(theSettingName,aSettingValue);
  197.         }
  198.     }
  199.     catch (objException) 
  200.     {
  201.     }
  202. }
  203. ////////////////////////////////////////////////////////////////////////////////
  204. //
  205. // readSetting(string theSettingName)- Reads a Setting
  206. //
  207. ////////////////////////////////////////////////////////////////////////////////
  208. function readSetting(theSettingName) 
  209. {
  210.     var retVal = "";
  211.     try
  212.     {
  213.         if (gGadgetMode) 
  214.         {
  215.             // If we are in "Gadget Mode", read value using that mechanism
  216.             retVal = System.Gadget.Settings.read(theSettingName);
  217.         } 
  218.         else 
  219.         {
  220.             // If we are in "development mode" - read from a cookie instead
  221.             retVal = readCookie(theSettingName);
  222.         }
  223.     }
  224.     catch (objException) 
  225.     {
  226.         retVal = null;
  227.     }
  228.     return retVal;
  229. }
  230. ////////////////////////////////////////////////////////////////////////////////
  231. //
  232. // writeCookie(string theCookieName, string aCookieValue) - Writes a cookie
  233. //
  234. ////////////////////////////////////////////////////////////////////////////////
  235. function writeCookie(theCookieName, aCookieValue) 
  236. {
  237.     var theCookieExpirationDate = new Date ();
  238.     // Set cookie to expire in 1 year
  239.     theCookieExpirationDate.setYear(theCookieExpirationDate.getYear() + 1);
  240.     // Convert to GMT
  241.     theCookieExpirationDate = theCookieExpirationDate.toGMTString ();
  242.     document.cookie = escape(theCookieName) + "=" + escape(aCookieValue) + "; expires=" + theCookieExpirationDate;
  243. }
  244. ////////////////////////////////////////////////////////////////////////////////
  245. //
  246. // readCookie(string theCookieName) - Reads a cookie
  247. //
  248. ////////////////////////////////////////////////////////////////////////////////
  249. function readCookie(theCookieName) 
  250. {
  251.     var aCookieValue = "";
  252.     var theCookies = ("" + document.cookie).split("; ");
  253.     for (var i=0; i < theCookies.length; i++)
  254.     {
  255.         if (theCookies[i].indexOf("=") > -1) 
  256.         {    
  257.             // If we have a non-empty cookie, extract the Cookie Name
  258.             var aCookieName = theCookies[i].split("=")[0];
  259.             if (aCookieName == theCookieName) 
  260.             {
  261.                 // If this is the one we're looking for, set that as our return value and get out
  262.                 aCookieValue = theCookies[i].split("=")[1];    
  263.                 break;
  264.             }
  265.         }
  266.     }
  267.     return aCookieValue; 
  268. }
  269.  
  270. ////////////////////////////////////////////////////////////////////////////////
  271. //
  272. // GENERAL UTILITIES
  273. //
  274. ////////////////////////////////////////////////////////////////////////////////
  275.  
  276. ////////////////////////////////////////////////////////////////////////////////
  277. //
  278. // showOrHide([object|string] oHTMLElement, boolean bShowOrHide)
  279. //    Shows or Hides an HTMLElement.    
  280. //    You can pass in the id to an object or the actual object
  281. //
  282. ////////////////////////////////////////////////////////////////////////////////
  283. function showOrHide(oHTMLElement, bShowOrHide) 
  284. {
  285.     try 
  286.     {
  287.         if (typeof(oHTMLElement)=="string") 
  288.         { 
  289.             oHTMLElement = document.getElementById(oHTMLElement); 
  290.         }
  291.         if (oHTMLElement && oHTMLElement.style) 
  292.         {
  293.             if (bShowOrHide == 'inherit') 
  294.             {
  295.                 oHTMLElement.style.visibility = 'inherit';
  296.             } 
  297.             else 
  298.             {
  299.                 if (bShowOrHide)
  300.                 {
  301.                     oHTMLElement.style.visibility = 'visible';
  302.                 }
  303.                 else
  304.                 {
  305.                     oHTMLElement.style.visibility = 'hidden';
  306.                 }
  307.                 try 
  308.                 {
  309.                     if (bShowOrHide)
  310.                     {
  311.                         oHTMLElement.style.display = 'block';
  312.                     }
  313.                     else
  314.                     {
  315.                         oHTMLElement.style.display = 'none';
  316.                     }
  317.                 }
  318.                 catch (ex) 
  319.                 {
  320.                 }
  321.             }
  322.         }
  323.     }
  324.     catch (ex) 
  325.     {
  326.     }
  327. }
  328. ////////////////////////////////////////////////////////////////////////////////
  329. //
  330. // setImage(oHTMLElement, imageURL) - places an image into an element
  331. //    applying alphaImageLoader as necessary
  332. //
  333. ////////////////////////////////////////////////////////////////////////////////
  334. function setImage(oHTMLElement, imageURL) {    
  335.     if (typeof(oHTMLElement)=="string") 
  336.     { 
  337.         oHTMLElement = document.getElementById(oHTMLElement); 
  338.     }
  339.     if (gGadgetMode) 
  340.     {
  341.         oHTMLElement.src = imageURL;
  342.     } 
  343.     else 
  344.     {
  345.         oHTMLElement.style.backgroundImage = "url(images/1px.gif)";
  346.         oHTMLElement.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imageURL + "',sizingMethod='scale')";
  347.     }
  348. }
  349. ////////////////////////////////////////////////////////////////////////////////
  350. //
  351. // getSpinner( string spinnerDivID ) - establishes a Spinner Object.
  352. //
  353. ////////////////////////////////////////////////////////////////////////////////
  354. function getSpinner( spinnerDivID ) 
  355. {
  356.     var self = this;
  357.     this.id = spinnerDivID;
  358.     this.parentDiv = document.getElementById( self.id );
  359.     this.fps = 1000/30;    
  360.     with ( this.parentDiv.style ) 
  361.     {
  362.         fontSize=0;
  363.         posWidth=16;
  364.         posHeight=16;
  365.         backgroundImage = 'url("images/activity16v.png")';
  366.         backgroundPositionY = 0;
  367.     }
  368.     this.hide    = function() 
  369.     { 
  370.         self.parentDiv.style.display='none';    
  371.     }
  372.     this.show    = function() 
  373.     { 
  374.         self.parentDiv.style.display='block'; 
  375.     }
  376.     this.stop    = function() 
  377.     { 
  378.         clearInterval( self.animationInterval ); 
  379.     }
  380.     this.start = function() 
  381.     {
  382.         clearInterval( self.animationInterval );
  383.         this.animationInterval = setInterval( 'animateSpinner(' + self.id + ')', 30 );
  384.     }
  385. ////////////////////////////////////////////////////////////////////////////////
  386. //
  387. // animateSpinner( oHTMLElement spinnerDiv ) - animates spinner image
  388. //
  389. ////////////////////////////////////////////////////////////////////////////////
  390. function animateSpinner(spinnerDiv) 
  391. {
  392.     spinnerDiv.style.backgroundPositionY=parseInt(spinnerDiv.style.backgroundPositionY)-16; 
  393. }
  394. ////////////////////////////////////////////////////////////////////////////////
  395. //
  396. // isVisible([object|string] oHTMLElement) - boolean of if Object visible.
  397. // You can pass in the id to an object or the actual object
  398. //
  399. ////////////////////////////////////////////////////////////////////////////////
  400. function isVisible(oHTMLElement) 
  401. {
  402.     var bIsVisible = true;
  403.     if (typeof(oHTMLElement)=="string") 
  404.     { 
  405.         oHTMLElement = document.getElementById(oHTMLElement); 
  406.     }
  407.     if (oHTMLElement && oHTMLElement.style) 
  408.     {
  409.         bIsVisible =    (oHTMLElement.style.display=='block');
  410.     }
  411.     return bIsVisible;
  412. }
  413. ////////////////////////////////////////////////////////////////////////////////
  414. //
  415. // getLocalizedString(string key) - returns localized string.
  416. //    Defaults to English version if not found
  417. //
  418. ////////////////////////////////////////////////////////////////////////////////
  419. function getLocalizedString(key) 
  420. {
  421.  var retVal = key;
  422.  try 
  423.  {
  424.     retVal = L_localizedStrings_Text[key];
  425.     if (retVal === undefined) 
  426.     {
  427.         retVal = key
  428.     }
  429.  }
  430.  catch (ex) 
  431.  {
  432.  }
  433.  return retVal;
  434. }
  435. ////////////////////////////////////////////////////////////////////////////////
  436. //
  437. // commify(string aNumber) - returns a number properly "commified" 
  438. //    with a comma every three digits nnn,nnn,nnn.nn
  439. //
  440. ////////////////////////////////////////////////////////////////////////////////
  441. function commify(aNumber) {
  442.     var retVal = aNumber;
  443.     var theDecimalValue="";
  444.     var oRegExp = new RegExp("[0-9]");
  445.     if (aNumber.length) 
  446.     {
  447.         if (aNumber.lastIndexOf(".") > -1) 
  448.         {
  449.             // If we have a number with decimal places, save off the value to the 
  450.             // right of the decimal place for later use
  451.             theDecimalValue = aNumber.substring(aNumber.lastIndexOf("."), aNumber.length);
  452.             // Strip off the decimal portion of the number
  453.             retVal = retVal.substring(0, retVal.lastIndexOf("."));
  454.         }
  455.         // Reverse the number
  456.         var aNewNumber = "";
  457.         for (var i=0;i<retVal.length;i++) 
  458.         {
  459.             var aChar = retVal.substring(i,i+1);
  460.             if (oRegExp.exec(aChar)) 
  461.             { 
  462.                 // So long as we have a numeric character, use it. Has the 
  463.                 // effect of stripping out any previous formatting from the number.
  464.                 aNewNumber = aChar + aNewNumber;
  465.             }
  466.         }
  467.         // Rebuild number from the beginning, adding a comma every 3 characters
  468.         retVal = "";
  469.         for (var i=0;i<aNewNumber.length;i++) 
  470.         {
  471.             retVal = aNewNumber.substring(i,i+1) + retVal;
  472.             if (((i+1) % 3 == 0) && (i+1<aNewNumber.length)) 
  473.             {
  474.                 retVal = ',' + retVal;
  475.             }
  476.         }
  477.         // Add the decimal value back to the end of the string
  478.         retVal += theDecimalValue;
  479.     }
  480.     return retVal;
  481. }
  482. ////////////////////////////////////////////////////////////////////////////////
  483. //
  484. // cleanURL(string aURL) - formats URLS like 
  485. //    http://www.microsoft.com/gadgets.html into 
  486. //    http:\/\/www.microsoft.com\/gadgets.html.    
  487. // Useful if Hyperlinks myst be passed around as strings via Javascript 
  488. //
  489. ////////////////////////////////////////////////////////////////////////////////
  490. function cleanURL(aURL) 
  491. {
  492.     return aURL.split('/').join('\\/');
  493. }
  494. ////////////////////////////////////////////////////////////////////////////////
  495. //
  496. // URLDecode(string aString) - decodes URLEncoded strings
  497. //
  498. ////////////////////////////////////////////////////////////////////////////////
  499. function URLDecode(aString) 
  500. {
  501.     aString = aString.replace("%2F", "/");
  502.     aString = aString.replace("%7C", "|");
  503.     aString = aString.replace("%3F", "?");
  504.     aString = aString.replace("%21", "!");
  505.     aString = aString.replace("%40", "@");
  506.     aString = aString.replace("%5C", "");
  507.     aString = aString.replace("%23", "#");
  508.     aString = aString.replace("%24", "$");
  509.     aString = aString.replace("%5E", "^");
  510.     aString = aString.replace("%26", "&");
  511.     aString = aString.replace("%25", "%");
  512.     aString = aString.replace("%2A", "*");
  513.     aString = aString.replace("%28", "(");
  514.     aString = aString.replace("%29", ")");
  515.     aString = aString.replace("%7D", "}");
  516.     aString = aString.replace("%3A", ":");
  517.     aString = aString.replace("%2C", ",");
  518.     aString = aString.replace("%7B", "{");
  519.     aString = aString.replace("%2B", "+");
  520.     aString = aString.replace("%2E", ".");
  521.     aString = aString.replace("%2D", "-");
  522.     aString = aString.replace("%7E", "~");
  523.     aString = aString.replace("%2D", "-");
  524.     aString = aString.replace("%5B", "[");
  525.     aString = aString.replace("%5F", "_");
  526.     aString = aString.replace("%5D", "]");
  527.     aString = aString.replace("%60", "`"); 
  528.     aString = aString.replace("%3D", "=");
  529.     aString = aString.replace("%27", "'");
  530.     aString = aString.replace("+", " ");
  531.     aString = aString.replace("%22", '"');
  532.     return aString;
  533. }
  534. ////////////////////////////////////////////////////////////////////////////////
  535. //
  536. // function setCaretPos(anInputElement, int startPoint, int endPoint)
  537. //    sets cursor selection within an input element
  538. //
  539. ////////////////////////////////////////////////////////////////////////////////
  540. function setCaretPos( anInputElement, startPoint, endPoint ) 
  541. {
  542.     var startPoint = startPoint || 0;
  543.     var endPoint    = endPoint || startPoint;
  544.     var theInputElement = anInputElement.createTextRange();
  545.     with ( theInputElement ) 
  546.     {
  547.         collapse(true);
  548.         moveEnd('character', endPoint);
  549.         moveStart('character', startPoint);
  550.         select();
  551.     } 
  552.     theInputElement = null;    
  553. }
  554.  
  555. ////////////////////////////////////////////////////////////////////////////////
  556. //
  557. // LOCATION AWARE API UTILITIES
  558. //
  559. ////////////////////////////////////////////////////////////////////////////////
  560.  
  561. ////////////////////////////////////////////////////////////////////////////////
  562. //
  563. // getAPILatLongReport( )    - returns a location report (latitude/longitude)
  564. //    throws an exception if values out of acceptable range
  565. //    polling report from api can also throw an exception on internal error
  566. ////////////////////////////////////////////////////////////////////////////////
  567. function getAPILatLongReport( MicrosoftGadgetObject )
  568. {
  569.     var report = MicrosoftGadgetObject.factory.LatLongReport;
  570.     if ( !( (report.Latitude >= -90) && (report.Latitude <= 90) && (report.Longitude <= 180) && (report.Longitude >= -180) ) )
  571.     {
  572.         throw "Latitude/Longitude outside acceptable range";
  573.     }
  574.     return report;
  575. }
  576.  
  577. ////////////////////////////////////////////////////////////////////////////////
  578. //
  579. // getAPIStatus( )    - returns current status from location API
  580. //    in case of exception, returns -1
  581. ////////////////////////////////////////////////////////////////////////////////
  582. function getAPIStatus( MicrosoftGadgetObject )
  583. {
  584.     var status = -1;
  585.  
  586.     try
  587.     {
  588.         status = MicrosoftGadgetObject.factory.Status;
  589.     }
  590.     catch ( err )
  591.     {
  592.         System.Debug.outputString ( "API returned error, polling for status. Gadget state indeterminate" );
  593.     }
  594.  
  595.     return status;
  596. }
  597.  
  598.  
  599. ////////////////////////////////////////////////////////////////////////////////
  600. //
  601. // DistanceMovedSinceLastPositionUpdate( )    - returns distance since last position update
  602. ////////////////////////////////////////////////////////////////////////////////
  603. function DistanceMovedSinceLastPositionUpdate(positionPrevious, positionCurrent)
  604. {
  605.     // KNOWN CONSTANTS
  606.     var degreesToRadians = Math.PI / 180;
  607.     var earthRadius = 6371; // approximation in kilometers assuming earth to be spherical
  608.  
  609.     // CONVERT LATITUDE AND LONGITUDE VALUES TO RADIANS
  610.     var previousRadianLat = positionPrevious.Latitude * degreesToRadians;
  611.     var previousRadianLong = positionPrevious.Longitude * degreesToRadians;
  612.     var currentRadianLat = positionCurrent.Latitude * degreesToRadians;
  613.     var currentRadianLong = positionCurrent.Longitude * degreesToRadians;
  614.  
  615.     // CALCULATE RADIAN DELTA BETWEEN THE TWO POSITIONS
  616.     var latitudeRadianDelta = currentRadianLat - previousRadianLat;
  617.     var longitudeRadianDelta = currentRadianLong - previousRadianLong; 
  618.  
  619.     var expr1 = ( Math.sin(latitudeRadianDelta / 2) * Math.sin(latitudeRadianDelta / 2) ) +
  620.                 ( Math.cos(previousRadianLat) * Math.cos(currentRadianLat) * Math.sin(longitudeRadianDelta/2) * Math.sin(longitudeRadianDelta/2) );
  621.     var expr2 = 2 * Math.atan2( Math.sqrt( expr1 ), Math.sqrt( 1 - expr1 ) );
  622.     var distanceValue = earthRadius * expr2;
  623.  
  624.     return distanceValue;
  625. }
  626.  
  627.  
  628. ////////////////////////////////////////////////////////////////////////////////
  629. //
  630. // CONSTANTS
  631. //
  632. ////////////////////////////////////////////////////////////////////////////////
  633.  
  634.     ////////////////////////////////////////////////////////////////////////////////
  635.     //
  636.     // GADGET STATES FOR LOCATION AWARENESS
  637.     //
  638.     ////////////////////////////////////////////////////////////////////////////////
  639.  
  640.     var LOCATION_SENSING_STATE_DISABLED = 0;
  641.     var LOCATION_SENSING_STATE_ERROR_AUTO = 1;
  642.     var LOCATION_SENSING_STATE_ERROR_MANUAL = 2;
  643.     var LOCATION_SENSING_STATE_OK_AUTO = 3;
  644.     var LOCATION_SENSING_STATE_OK_MANUAL = 4;
  645.     var LOCATION_SENSING_STATE_DISCONNECTED_AUTO = 5;
  646.     var LOCATION_SENSING_STATE_DISCONNECTED_MANUAL = 6;
  647.     var LOCATION_SENSING_STATE_INVALID = 7;
  648.  
  649.     var LOCATION_SENSING_VALID_STATES_ARRAY = new Array( LOCATION_SENSING_STATE_DISABLED ,
  650.     LOCATION_SENSING_STATE_ERROR_AUTO ,
  651.     LOCATION_SENSING_STATE_ERROR_MANUAL ,
  652.     LOCATION_SENSING_STATE_OK_AUTO ,
  653.     LOCATION_SENSING_STATE_OK_MANUAL ,
  654.     LOCATION_SENSING_STATE_DISCONNECTED_AUTO ,
  655.     LOCATION_SENSING_STATE_DISCONNECTED_MANUAL
  656.  );
  657.  
  658.     var LOCATION_SENSING_MANUAL_STATES_ARRAY = new Array( LOCATION_SENSING_STATE_ERROR_MANUAL ,
  659. LOCATION_SENSING_STATE_OK_MANUAL ,
  660. LOCATION_SENSING_STATE_DISCONNECTED_MANUAL
  661.  );
  662.  
  663.     var LOCATION_SENSING_AUTO_STATES_ARRAY = new Array(    LOCATION_SENSING_STATE_ERROR_AUTO ,
  664.     LOCATION_SENSING_STATE_OK_AUTO ,
  665.     LOCATION_SENSING_STATE_DISCONNECTED_AUTO );
  666.  
  667.  
  668. ////////////////////////////////////////////////////////////////////////////////
  669. //
  670. // ARRAY UTILITIES
  671. //
  672. ////////////////////////////////////////////////////////////////////////////////
  673. if ( !Array.prototype.exists )
  674. {
  675.     Array.prototype.exists = function( elementToSearch )
  676.     {
  677.         var numElements = this.length;
  678.  
  679.         var counter;
  680.  
  681.         for ( counter = 0 ; counter < numElements ; counter++ )
  682.         {
  683.             if ( counter in this && this[counter] === elementToSearch )
  684.                 return (true);
  685.         }
  686.  
  687.         return (false);
  688.     };
  689. }
  690.  
  691.