home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / RSSFeeds.js < prev    next >
Text (UTF-16)  |  2012-05-19  |  110KB  |  1,855 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. //
  10. // LOCALIZABLE VARIABLES
  11. //
  12. ////////////////////////////////////////////////////////////////////////////////
  13. var L_SI_ERRORMESSAGE    = "Die ausgewählten Einstellungen sind nicht mehr gültig.";
  14. var L_ZFI_ERRORMESSAGE    = "Keine anzuzeigenden Feedelemente vorhanden.";
  15.  
  16. var L_MS_ERRORMESSAGE    = "Es sind keine RSS-Feeds verfügbar.";
  17. var L_RRFD_ERRORMESSAGE    = "In diesem Gadget werden RSS-Feeds angezeigt, die Sie abonniert haben.";
  18. var L_MSIE_ERRORMESSAGE    = L_MS_ERRORMESSAGE;
  19. var L_ZF_ERRORMESSAGE    = L_RRFD_ERRORMESSAGE;
  20.  
  21. var L_FCE_ERRORMESSAGE    = "Schlagzeilen anzeigen";
  22. var L_FCEHOVER_ERRORMESSAGE    = "Schlagzeilen anzeigen (automatische Feedupdates werden aktiviert)";
  23. var L_LOADING_TEXT    = "Ladevorgang";
  24. var L_SHOWNEXT_TEXT    = "Nächster";
  25. var L_SHOWPREV_TEXT    = "Vorheriger";
  26. var L_NAVTITLE_TEXT    = "Schlagzeilen ";
  27. var L_TITLEFORDROP_TEXT    = "Alle Feeds";
  28. var L_ARTICLES_TEXT    = " Schlagzeilen";
  29. var articleArray    = new Array(10, 20, 40, 100);
  30. var L_ARTICLES_TEXT    = new Array();
  31. L_ARTICLES_TEXT[0]    = "10 Schlagzeilen";
  32. L_ARTICLES_TEXT[1]    = "20 Schlagzeilen";
  33. L_ARTICLES_TEXT[2]    = "40 Schlagzeilen";
  34. L_ARTICLES_TEXT[3]    = "100 Schlagzeilen";
  35. ////////////////////////////////////////////////////////////////////////////////
  36. //
  37. // GLOBAL VARIABLES
  38. //
  39. ////////////////////////////////////////////////////////////////////////////////
  40. var g_msFeedManagerProgID    = "Microsoft.FeedsManager";
  41. var g_msFeedManager    = null;
  42. var g_returnFeed    = null;
  43. var g_viewElements    = null;
  44. var g_noFeeds    = true;
  45. var g_downloadErrorFlag    = false;
  46. var g_feedNameLength;
  47. var g_showInBrowser    = "";
  48. var g_currentFeedPath    = "";
  49. var g_currentFeedUrl    = "";
  50. var g_totalViewableItems    = "";
  51. var g_feedTitleCharLength    = 36;
  52. var g_stringTitleLength    = 20;
  53. var g_countToView    = 4;
  54. var g_feedTotal    = 0;
  55. var g_currentArrayIndex    = 0;
  56. var g_timerMilliSecs    = 10000;
  57. var g_loadingMilliSecs    = 10000;
  58. var g_lastCalledArrayIndex; 
  59. var g_lastClickedUrl;
  60. var g_feedURL;
  61. var g_feedTitle;
  62. var g_feedForFlyout;
  63. var g_gadgetErrorFlag;
  64. var g_timer;
  65. var g_timerFlag;
  66. var g_drawerTimer;
  67. var g_alphaInTimer;
  68. var g_loadFirstTime;
  69. var g_feedClicked;
  70. var g_feedLocalID;
  71. var g_timerFlyoutFlag;
  72. var g_getFeedTimer;
  73. var g_interGetFeedInterval    = 30000;    // interval between getfeed calls (30 seconds)
  74. var g_interGetFeedIntervalOnFirstLoad    = 5000;    // interval between getfeed calls (first load-> 5 seconds)
  75. var g_currentInterGetfeedInterval;
  76. var g_totalFeedCount;
  77. var g_totalFeedItemCount;
  78. var g_totalEmptyFeedCount;
  79. var g_tempReturnFeed    = null;
  80. var g_feedPaths;
  81. var g_feedsCurrentlySelected;
  82. var g_currentFeedData;
  83. var g_feedDownloadTimes;
  84. var g_currentFeedItemIndex;
  85. var fFirstTime;
  86. var fInProgress;
  87. var fNewDataReady;
  88. var fSomethingToDo; // atleast one feed was queued for refresh
  89.  
  90. ////////////////////////////////////////////////////////////////////////////////
  91. //
  92. // CONSTANTS
  93. //
  94. ////////////////////////////////////////////////////////////////////////////////
  95. var ZERO_TIMESTAMP_MILLISECONDS = new Date(1899,11,30).getTime();    // MSDN documentation for IFeedItem::PubDate (http://msdn.microsoft.com/en-us/library/ms685800(VS.85).aspx)
  96.                                     // The interface returns 0 if pubdate is not specified in source and this constant represents the representative date for value 0 as per the above documentation
  97.  
  98. ////////////////////////////////////////////////////////////////////////////////
  99. //
  100. // System - Object Model settings
  101. //
  102. ////////////////////////////////////////////////////////////////////////////////
  103.  
  104. ////////////////////////////////////////////////////////////////////////////////
  105. //
  106. // SETTINGS
  107. //
  108. ////////////////////////////////////////////////////////////////////////////////
  109. function loadSettings()
  110. {
  111.     var tempSettings = new getRssSettings();
  112.     g_currentFeedPath = tempSettings.rssFeedPath;
  113.     g_currentFeedUrl = tempSettings.rssFeedUrl;
  114.     g_totalViewableItems = tempSettings.rssFeedCount;
  115.     g_loadFirstTime = tempSettings.loadFirstTime;
  116.     stopPolling();
  117. }
  118. ////////////////////////////////////////////////////////////////////////////////
  119. //
  120. //
  121. ////////////////////////////////////////////////////////////////////////////////
  122. function createFeedDropDown()
  123.     loadMSFeedManager(); 
  124.     AddFeedToDropDown(L_TITLEFORDROP_TEXT,"defaultGadg");
  125.     getFeedsFolders(g_msFeedManager.RootFolder);
  126.     g_msFeedManager = null;
  127.     for(var i = 0; i < L_ARTICLES_TEXT.length; i++)
  128.     {
  129.         rssTotalsSelection.options[i]=new Option(L_ARTICLES_TEXT[i], articleArray[i]);
  130.         rssTotalsSelection.options[i].title = L_ARTICLES_TEXT[i];
  131.     }
  132. }
  133. ////////////////////////////////////////////////////////////////////////////////
  134. //
  135. //
  136. ////////////////////////////////////////////////////////////////////////////////
  137. function getFeedsFolders(folderToAdd)
  138. {
  139.     var currentFolder;
  140.     var currentFeeds;
  141.     try
  142.     {
  143.         if (folderToAdd.IsRoot)
  144.         {
  145.             currentFeeds = folderToAdd.Feeds;
  146.             for (var feedIndex = 0; feedIndex < currentFeeds.Count; feedIndex++)
  147.             {
  148.                 AddFeedToDropDown(currentFeeds.Item(feedIndex).Name, currentFeeds.Item(feedIndex).Url);
  149.             }
  150.             getFeedsFolders(folderToAdd.SubFolders);
  151.             return;
  152.         }
  153.         for (var folderIndex = 0; folderIndex < folderToAdd.Count; folderIndex++)
  154.         {
  155.             currentFolder = folderToAdd.Item(folderIndex);
  156.             currentFeeds = currentFolder.Feeds;
  157.             AddFeedToDropDown(currentFolder.Path, currentFolder.Path);
  158.             for (var feedIndex = 0; feedIndex < currentFeeds.Count; feedIndex++)
  159.             {
  160.                 AddFeedToDropDown(currentFeeds.Item(feedIndex).Path, currentFeeds.Item(feedIndex).Url);
  161.             }
  162.             if (currentFolder.Subfolders.Count > 0)
  163.             {
  164.                 getFeedsFolders(currentFolder.Subfolders);
  165.             }
  166.         }
  167.     }
  168.     catch(e)
  169.     {
  170.         return;
  171.     }
  172. }
  173. ////////////////////////////////////////////////////////////////////////////////
  174. //
  175. //
  176. ////////////////////////////////////////////////////////////////////////////////
  177. function AddFeedToDropDown(_feedText, _feedValue)
  178. {
  179.     var tempChckSettings = new getRssSettings();
  180.     var objEntry = document.createElement("option");
  181.     objEntry.text = _feedText;
  182.     objEntry.value = _feedValue; 
  183.     objEntry.title = _feedText;
  184.     if(_feedText == tempChckSettings.rssFeedPath)
  185.     {
  186.         objEntry.selected = true;
  187.     }
  188.     rssFeedSelection.add(objEntry);
  189. }
  190. ////////////////////////////////////////////////////////////////////////////////
  191. //
  192. // GADGET
  193. //
  194. ////////////////////////////////////////////////////////////////////////////////
  195. function viewElementsObject()
  196. {
  197.     this.FeedItems = new Array();
  198.     this.FeedTitleLink = document.getElementById("FeedTitleLink");
  199.     this.FeedTitleCount = document.getElementById("FeedTitleCount");
  200.     for(var i = 0; i < 4; i++)
  201.     {
  202.         var newElement = document.getElementById("FeedItemLink" + i);
  203.         newElement.onfocusin = newElement.onmouseover;
  204.         newElement.onfocusout = newElement.onmouseout;
  205.         newElement.hideFocus = true;
  206.         this.FeedItems.push(newElement);
  207.     }
  208. }
  209. ////////////////////////////////////////////////////////////////////////////////
  210. //
  211. // set's alt tabs for navigation;
  212. //
  213. ////////////////////////////////////////////////////////////////////////////////
  214. function setAltLabels()
  215. {    
  216.     buttonRightNarrator.alt = buttonRightNarrator.title = L_SHOWNEXT_TEXT;
  217.     buttonLeftNarrator.alt = buttonLeftNarrator.title = L_SHOWPREV_TEXT;
  218. }
  219. ////////////////////////////////////////////////////////////////////////////////
  220. //
  221. // Clear HTML elements from ViewElements Object
  222. //
  223. ////////////////////////////////////////////////////////////////////////////////
  224. function clearViewElements()
  225. {
  226.     positionNumbers.innerText = "";
  227.     for(i=0; i < 4; i++)
  228.     {
  229.         if ( g_viewElements !== null )
  230.         {
  231.             g_viewElements.FeedItems[i].innerHTML = "";
  232.             g_viewElements.FeedItems[i].href = "";
  233.             g_viewElements.FeedItems[i].innerText = "";
  234.             g_viewElements.FeedItems[i].setAttribute("name", "");
  235.             g_viewElements.FeedItems[i].setAttribute("localId", "");
  236.         }
  237.  
  238.         eval("FeedItemName"+i).innerHTML = "";
  239.         eval("FeedItemName"+i).style.backgroundColor = "";
  240.         eval("FeedItemName"+i).innerText = "";
  241.         eval("FeedItemName"+i).setAttribute("title","");
  242.  
  243.         eval("FeedItemDate"+i).innerHTML = "";
  244.         eval("FeedItemDate"+i).style.backgroundColor = "";
  245.         eval("FeedItemDate"+i).innerText = "";
  246.         eval("FeedItemDate"+i).setAttribute("title","");
  247.  
  248.         eval("FeedItemLink"+i).style.textOverflow = "";
  249.         eval("FeedItemLink"+i).style.overflow = ""; 
  250.         eval("FeedItemLink"+i).style.whiteSpace = "";
  251.         eval("FeedItemLink"+i).style.width = "0px";
  252.     }
  253. }
  254. ////////////////////////////////////////////////////////////////////////////////
  255. //
  256. //
  257. ////////////////////////////////////////////////////////////////////////////////
  258. function startTimer()
  259. {
  260.     if(g_timerFlag)
  261.     {
  262.         stopTimer();
  263.         g_timer = setInterval(setNextViewItems, g_timerMilliSecs);
  264.     }
  265.  }
  266. ////////////////////////////////////////////////////////////////////////////////
  267. //
  268. //
  269. ////////////////////////////////////////////////////////////////////////////////
  270. function stopTimer()
  271. {
  272.     if(g_timerFlag)
  273.     {
  274.         clearInterval(g_timer);
  275.     }
  276. }
  277. ////////////////////////////////////////////////////////////////////////////////
  278. //
  279. //
  280. ////////////////////////////////////////////////////////////////////////////////
  281. function startPolling()
  282. {
  283.     stopPolling();
  284.     System.Debug.outputString("Start Polling : Pull feeds queued up in bursts"); //DEBUG CODE
  285.     g_getFeedTimer = setInterval(getDataForNextFeed, g_currentInterGetFeedInterval);
  286.  }
  287. ////////////////////////////////////////////////////////////////////////////////
  288. //
  289. //
  290. ////////////////////////////////////////////////////////////////////////////////
  291. function stopPolling()
  292. {
  293.     if (g_getFeedTimer!==undefined)
  294.     {
  295.         System.Debug.outputString("Stop Polling : Stop pull of queued feeds"); //DEBUG CODE
  296.         clearInterval(g_getFeedTimer);
  297.     }
  298. }
  299.  
  300. ////////////////////////////////////////////////////////////////////////////////
  301. // get feed data, put in array, update lastwritetime
  302. // return value: no of feed items pulled for current feed
  303. ////////////////////////////////////////////////////////////////////////////////
  304. function getItemsForQueuedFeed(currentFeedPathIndex)
  305. {
  306.     var itemsInCurrentFeed=0;
  307.     System.Debug.outputString("Pulling data. GETFEED: "+g_feedPaths[currentFeedPathIndex].Path); //DEBUG CODE
  308.     var feedToDownload = safeGetFeed(g_feedPaths[currentFeedPathIndex].Path);
  309.     g_tempReturnFeed = null;
  310.     g_tempReturnFeed = new makeFeed("","","");
  311.  
  312.     if (feedToDownload.Items.Count > 0)
  313.     {
  314.         for (var i = 0; i < feedToDownload.Items.Count; i++)
  315.         {
  316.             var currentFeedItem = feedToDownload.Items.item(i);
  317.             var tempFeedTitle = removeNewLines(currentFeedItem.Title);
  318.             if (tempFeedTitle != "")
  319.             {
  320.                 var tempFeedLink    = currentFeedItem.Link;
  321.                 var tempFeedIsRead    = currentFeedItem.IsRead;
  322.                 var tempFeedItemID    = currentFeedItem.LocalId;
  323.                 var tempFeedItemParent    = feedToDownload.name;
  324.                 var tempFeedItemParentPath    = feedToDownload.path;
  325.                 var tempFeedItemDate    = currentFeedItem.PubDate;
  326.                 if ( ZERO_TIMESTAMP_MILLISECONDS == (new Date(tempFeedItemDate)).getTime() )
  327.                 {
  328.                     tempFeedItemDate = currentFeedItem.Modified;
  329.                 }
  330.  
  331.                 var tempFeedItem    = new feedItem(
  332.                                                     tempFeedTitle, 
  333.                                                     tempFeedLink, 
  334.                                                     tempFeedIsRead, 
  335.                                                     tempFeedItemID, 
  336.                                                     tempFeedItemParent,
  337.                                                     tempFeedItemParentPath,
  338.                                                     tempFeedItemDate
  339.                                                 );
  340.                 g_tempReturnFeed.feedItems.push(tempFeedItem);
  341.             }
  342.         }
  343.         g_totalFeedItemCount = g_totalFeedItemCount + feedToDownload.UnreadItemCount;
  344.         itemsInCurrentFeed = feedToDownload.ItemCount;
  345.         g_currentFeedData[g_feedPaths[currentFeedPathIndex].GUID] = g_tempReturnFeed;
  346.     }
  347.     else
  348.     {
  349.         g_totalEmptyFeedCount = g_totalEmptyFeedCount + 1;
  350.     }
  351.  
  352.     g_feedDownloadTimes[g_feedPaths[currentFeedPathIndex].GUID] = (new Date(feedToDownload.LastWriteTime)).toUTCString();
  353.     feedToDownload = null;
  354.     
  355.     return itemsInCurrentFeed;
  356. }
  357.  
  358. ////////////////////////////////////////////////////////////////////////////////
  359. // at end of reading feeds in bursts, aggregate all data to the temporary
  360. // feed item holder. It will be copied to the main array in the next refresh
  361. ////////////////////////////////////////////////////////////////////////////////
  362. function aggregateAllItemsToTempArray()
  363. {
  364.         System.Debug.outputString("Data read cycle complete. Copying New data to temporary array."); //DEBUG CODE
  365.         stopPolling();
  366.         fNewDataReady = true; // new data is ready and present in g_tempReturnFeed (to be cleared when data is copied)
  367.         fInProgress = false;
  368.         fSomethingToDo = false;
  369.         g_currentFeedItemIndex = -1;
  370.  
  371.         //concatenate all feeditems , then sort and reverse and assign to the original array
  372.         g_tempReturnFeed = null;
  373.         g_tempReturnFeed = new makeFeed("","","");
  374.         for (var i in g_currentFeedData)
  375.         {
  376.             if ( g_currentFeedData[i] !== undefined && g_currentFeedData[i] !== null )
  377.             {
  378.                 g_tempReturnFeed.feedItems=g_tempReturnFeed.feedItems.concat(g_currentFeedData[i].feedItems);
  379.             }
  380.         }
  381.         g_tempReturnFeed.feedItems.sort(sortDates);
  382.         g_tempReturnFeed.feedItems.reverse();
  383.         g_tempReturnFeed.feedCount = ' (<b>'+g_totalFeedItemCount+'</b>) ';
  384.         g_tempReturnFeed.feedUrl = ''; 
  385.  
  386.         if ( g_tempReturnFeed.feedItems.length == 0 )
  387.         {
  388.             displayMessage(L_ZFI_ERRORMESSAGE, true);
  389.         }
  390. }
  391.  
  392. ////////////////////////////////////////////////////////////////////////////////
  393. // get feed data, put in array, update lastwritetime
  394. // return value: no of feed items pulled for current feed (-1 if no feed was pulled)
  395. ////////////////////////////////////////////////////////////////////////////////
  396. function getDataForNextFeed()
  397. {
  398.     loadMSFeedManager();
  399.     var itemsInCurrentFeed;
  400.     var currentFeedPathIndex = g_currentFeedItemIndex + 1;
  401.     g_currentFeedItemIndex = g_currentFeedItemIndex + 1;
  402.  
  403.     if (currentFeedPathIndex >= g_feedPaths.length) // DATA READ IS COMPLETE
  404.     {
  405.         aggregateAllItemsToTempArray();
  406.         return -1; // indicating no data was pulled in this run
  407.     }
  408.  
  409.     itemsInCurrentFeed=getItemsForQueuedFeed(currentFeedPathIndex);
  410.  
  411.     if (fFirstTime && itemsInCurrentFeed>0)
  412.     {
  413.         System.Debug.outputString("Set first feed data for Viewing and continue to pull other feeds in burst mode"); //DEBUG CODE
  414.         g_tempReturnFeed.feedItems.sort(sortDates);
  415.         g_tempReturnFeed.feedItems.reverse();
  416.         g_returnFeed = g_tempReturnFeed;
  417.         setNextViewItems();
  418.         fFirstTime = false;
  419.     }
  420.     
  421.     g_msFeedManager = null;
  422.     g_tempReturnFeed = null;
  423.     
  424.     return itemsInCurrentFeed;
  425. }
  426.  
  427. ////////////////////////////////////////////////////////////////////////////////
  428. //
  429. // create New FeedItem Object which gets pushed into MakeFeed.FeedItems
  430. //
  431. ////////////////////////////////////////////////////////////////////////////////
  432. function feedItem(_feedItemName, _feedItemUrl, _feedItemIsRead, _feedItemID, _feedItemParent, _feedItemParentPath, _feedItemDate)
  433. {    
  434.     this.feedItemDate    = _feedItemDate;
  435.     this.feedItemName    = _feedItemName;
  436.     this.feedItemUrl    = _feedItemUrl;
  437.     this.feedItemIsRead    = _feedItemIsRead;
  438.     this.feedItemID    = _feedItemID;
  439.     this.feedItemParent    = _feedItemParent;
  440.     this.feedItemParentPath = _feedItemParentPath;
  441. }
  442. ////////////////////////////////////////////////////////////////////////////////
  443. //
  444. // create New MakeFeed Object
  445. //
  446. ////////////////////////////////////////////////////////////////////////////////
  447. function makeFeed(_feedName, _feedUrl, _feedCount)
  448. {
  449.     this.feedItems    = new Array();
  450.     this.feedName    = _feedName;
  451.     this.feedUrl    = _feedUrl;
  452.     this.feedCount    = _feedCount;
  453. }
  454. ////////////////////////////////////////////////////////////////////////////////
  455. //
  456. // determine if gadget is visible
  457. //
  458. ////////////////////////////////////////////////////////////////////////////////
  459. function checkVisibility()
  460. {
  461.     isVisible = System.Gadget.visible;
  462.     if (!isVisible)
  463.     {
  464.         stopTimer();
  465.     }
  466.     if(isVisible)
  467.     {
  468.         startTimer();
  469.     }
  470. }
  471. ////////////////////////////////////////////////////////////////////////////////
  472. //
  473. // Gadget specific settings
  474. // determine if gadget is in sidebar - docked or on the desktop - undocked
  475. //
  476. ////////////////////////////////////////////////////////////////////////////////
  477. function checkStateLite()
  478. {
  479.     if(!System.Gadget.docked) 
  480.     {
  481.         g_curLinkWidth = "250px"; 
  482.         with(document.body.style)
  483.         { 
  484.             height = "232px";
  485.             width = "296px";
  486.         }
  487.         with(rssfeedBg.style)
  488.         {
  489.             height = "232px";
  490.             width = "296px";
  491.         } 
  492.         rssfeedBg.src = "url(images/rssBackBlue_undocked.png)";
  493.     } 
  494.     else if (System.Gadget.docked)
  495.     {
  496.         g_curLinkWidth = "113px"; 
  497.         with(document.body.style)
  498.         {
  499.             height = "173px";
  500.             width = "130px";
  501.         }
  502.         with(rssfeedBg.style)
  503.         {
  504.             height = "173px";
  505.             width = "130px";
  506.         } 
  507.         rssfeedBg.src = "url(images/rssBackBlue_docked.png)";
  508.     }
  509. }
  510.  
  511. ////////////////////////////////////////////////////////////////////////////////
  512. //
  513. // Gadget specific settings
  514. // determine if gadget is in sidebar - docked or on the desktop - undocked
  515. //
  516. ////////////////////////////////////////////////////////////////////////////////
  517. function checkState()
  518. {
  519.     if(!System.Gadget.docked) 
  520.     {
  521.         undockedState();
  522.     } 
  523.     else if (System.Gadget.docked)
  524.     {
  525.         dockedState(); 
  526.     }
  527. }
  528. ////////////////////////////////////////////////////////////////////////////////
  529. //
  530. // Gadget specific settings
  531. // determine if gadget is in sidebar - docked or on the desktop - undocked
  532. //
  533. ////////////////////////////////////////////////////////////////////////////////
  534. function checkFlyforTimer()
  535. {
  536.     if(!System.Gadget.Flyout.show)
  537.     {
  538.         startTimer();    
  539.     }
  540. }
  541.  
  542.  
  543. ////////////////////////////////////////////////////////////////////////////////
  544. //
  545. //
  546. ////////////////////////////////////////////////////////////////////////////////
  547. function loadMain()
  548. {
  549.     // Check direction
  550.     var pageDir = document.getElementsByTagName("html")[0].dir;
  551.     
  552.     if (pageDir == "rtl")
  553.     {
  554.         buttonLeftNarrator.style.right = "5px";
  555.         buttonRightNarrator.style.left = "-1px";
  556.     }
  557.     else
  558.     {
  559.         buttonLeftNarrator.style.left = "2px";
  560.         buttonRightNarrator.style.right = "2px";
  561.     }
  562.     
  563.     fFirstTime = true;
  564.     fInProgress = false;
  565.     fNewDataReady = false;
  566.     fSomethingToDo = false;
  567.     g_feedPaths = new Array();
  568.     g_feedsCurrentlySelected = new Array();
  569.     g_currentFeedData = new Array();
  570.     g_feedDownloadTimes = new Array();
  571.     g_currentInterGetFeedInterval = g_interGetFeedIntervalOnFirstLoad;
  572.     g_totalFeedCount = 0;
  573.     g_totalFeedItemCount = 0;
  574.     g_totalEmptyFeedCount = 0;
  575.     g_currentFeedItemIndex = -1;
  576.     g_returnFeed = null;
  577.     clearViewElements();
  578.     clearBorder();
  579.     
  580.     g_gadgetErrorFlag = 0;
  581.  
  582.     loadSettings();
  583.     g_viewElements = new viewElementsObject();
  584.     g_currentArrayIndex = 0; 
  585.     setAltLabels();
  586.  
  587.     System.Gadget.visibilityChanged = checkVisibility;
  588.     System.Gadget.Flyout.file = "flyout.html";
  589.     System.Gadget.onShowSettings = loadSettings;    
  590.  
  591.     checkStateLite();
  592.     showSpinner('35%');
  593.  
  594.     setTimeout(loadData, 1000);
  595.     document.body.focus();
  596. }
  597. ////////////////////////////////////////////////////////////////////////////////
  598. //
  599. // GADGET FUNCTIONS
  600. //
  601. ////////////////////////////////////////////////////////////////////////////////
  602. function loadData()
  603. {            
  604.     refreshRssFeedData();
  605.     checkState();
  606.     checkFlyforTimer();
  607.     System.Gadget.onUndock = checkState;
  608.     System.Gadget.onDock = checkState;
  609. }
  610. ////////////////////////////////////////////////////////////////////////////////
  611. //
  612. // Check Path Get path
  613. //
  614. ////////////////////////////////////////////////////////////////////////////////
  615. function refreshRssFeedData()
  616. {
  617.     loadMSFeedManager();
  618.     if(g_loadFirstTime == "defaultGadget" && g_msFeedManager.BackgroundSyncStatus == 0 )
  619.     {
  620.         g_msFeedManager = null;
  621.         displayMessage(L_FCE_ERRORMESSAGE, false); 
  622.         g_timerFlag = false;
  623.     }
  624.     else
  625.     {
  626.         g_msFeedManager = null;
  627.         if ( fNewDataReady && !fInProgress )    // if all feeds queued up last time have been pulled, point data pointers correctly
  628.         {
  629.             System.Debug.outputString("Data available. Copying new data main array."); //DEBUG CODE
  630.             g_returnFeed = g_tempReturnFeed;
  631.             g_tempReturnFeed = null;
  632.             fNewDataReady = false;
  633.  
  634.         }
  635.  
  636.         if ( fInProgress )    // if feeds queued up last time are being pulled, return doing nothing
  637.         {
  638.             return;
  639.         }
  640.         else    // queue up feeds for pulling and then trigger pull of first feed
  641.         {
  642.             System.Debug.outputString("Queue up feeds (that changed at publisher) for pull in this data refresh."); //DEBUG CODE
  643.             loadMSFeedManager();
  644.             g_feedTotal = 0;
  645.             countFeeds(g_msFeedManager.RootFolder);
  646.  
  647.             if (g_feedTotal > 0)
  648.             {
  649.                 fInProgress = true;
  650.                 if (!fFirstTime)
  651.                 {
  652.                     g_currentInterGetFeedInterval = g_interGetFeedInterval;
  653.                 }
  654.  
  655.                 g_feedPaths = null;
  656.                 g_feedsCurrentlySelected = null;
  657.                 g_feedPaths = new Array();
  658.                 g_feedsCurrentlySelected = new Array();
  659.  
  660.                 g_totalFeedCount = 0;
  661.                 g_totalFeedItemCount = 0;
  662.                 g_totalEmptyFeedCount = 0;
  663.                 g_currentFeedItemIndex = -1;
  664.  
  665.                 if (g_currentFeedPath == "" || g_msFeedManager.ExistsFolder(g_currentFeedPath))
  666.                 {
  667.                     queueRssByFolder(g_currentFeedPath);
  668.                     checkForFeedStoreChanges();
  669.                 }
  670.                 else
  671.                 {
  672.                     if (g_msFeedManager.ExistsFeed(g_currentFeedPath))
  673.                     {
  674.                         queueRssByFeed(g_currentFeedPath);
  675.                     }
  676.                     else    // parameter not valid / not present in feed store
  677.                     {
  678.                         displayMessage(L_SI_ERRORMESSAGE, true);
  679.                         g_timerFlag = false;
  680.                         g_msFeedManager = null;
  681.                         g_returnFeed = null;
  682.                         return null;
  683.                     }
  684.                 }
  685.             }
  686.             else    // total number of feeds in common store = 0
  687.             {
  688.                 displayMessage(L_ZF_ERRORMESSAGE, true);
  689.             }
  690.             g_msFeedManager = null;
  691.             
  692.             if (fSomethingToDo)
  693.             {
  694.                 System.Debug.outputString("One or more changed feeds were queued for refresh."); //DEBUG CODE
  695.                 g_timerFlag = true;
  696.                 if (fFirstTime)
  697.                 {
  698.                     getDataForNextFeed(); // this may not return items in which case there is no data to display
  699.                 }                
  700.                 startPolling();
  701.             }
  702.             else
  703.             {
  704.                 System.Debug.outputString("None of the feeds changed at the publisher since last refresh - No feeds were queued for pull."); //DEBUG CODE
  705.                 fInProgress = false;
  706.             }
  707.         }
  708.     }
  709. }
  710. ////////////////////////////////////////////////////////////////////////////////
  711. //
  712. //
  713. ////////////////////////////////////////////////////////////////////////////////
  714. function sortDates(a,b)
  715. {
  716.     return(b.feedItemDate<a.feedItemDate)-(a.feedItemDate<b.feedItemDate);
  717. }
  718. ////////////////////////////////////////////////////////////////////////////////
  719. //    
  720. // Load feed from FeedManager
  721. //
  722. ////////////////////////////////////////////////////////////////////////////////
  723. function loadMSFeedManager()
  724. {        
  725.     // Make sure we have a handle to the feed manager
  726.     if (g_msFeedManager == null)
  727.     {
  728.         try
  729.         {
  730.             g_msFeedManager = new ActiveXObject(g_msFeedManagerProgID);
  731.             if (g_msFeedManager == null)
  732.             {
  733.                 displayMessage(L_MS_ERRORMESSAGE, false);
  734.                 g_timerFlag = false;
  735.                 return null;
  736.             }
  737.         }
  738.         catch(e)
  739.         {
  740.             displayMessage(L_MS_ERRORMESSAGE, false); 
  741.             g_timerFlag = false;
  742.         }
  743.     }    
  744. }
  745. ////////////////////////////////////////////////////////////////////////////////
  746. //
  747. //
  748. ////////////////////////////////////////////////////////////////////////////////
  749. function countFeeds(folderToCheck)
  750. {    
  751.     g_feedTotal = g_feedTotal + folderToCheck.Feeds.Count;
  752.     for(var i=1;i<=folderToCheck.Subfolders.Count;i++)
  753.     {
  754.     countFeeds(folderToCheck.Subfolders.Item(i-1)); 
  755.     }
  756. }
  757. ////////////////////////////////////////////////////////////////////////////////
  758. //
  759. //
  760. ////////////////////////////////////////////////////////////////////////////////
  761. function getFirstFeed(folderToCheck)
  762. {
  763.     if(folderToCheck.Feeds.Count > 0)
  764.     {
  765.         for(var i=0;i<folderToCheck.Feeds.Count;i++)
  766.         {
  767.         if(g_msFeedManager.ExistsFeed(folderToCheck.Feeds.Item(i).path))
  768.         {
  769.                 g_currentFeedPath = folderToCheck.Feeds.Item(i).path;
  770.                 return null;
  771.         }
  772.         }
  773.     }
  774.     for(var i=1;i<=folderToCheck.Subfolders.Count;i++)
  775.     {
  776.     if(g_currentFeedPath != "")
  777.     {
  778.             return null;
  779.     }
  780.     getFirstFeed(folderToCheck.Subfolders.Item(i-1));
  781.     }
  782. }
  783.  
  784. ////////////////////////////////////////////////////////////////////////////////
  785. //
  786. // Bug #1779555: NULL Bstr can cause MS Feed manager crash because it doesn't
  787. //                accept NULL BSTR. Feed team won't change in their code. So we 
  788. //                have to make sure no NULL BSTR passed into GetFeed().
  789. //            
  790. // !!! Always call safeGetFeed, NOT g_msFeedManager.GetFeed() !!!
  791. //
  792. ////////////////////////////////////////////////////////////////////////////////
  793. function safeGetFeed(Path)
  794. {
  795.     if (Path == null || Path.Length == 0)
  796.     {
  797.         return g_msFeedManager.GetFeed("");
  798.     }
  799.     else
  800.     {
  801.         try
  802.         {
  803.             return g_msFeedManager.GetFeed(Path);
  804.         }
  805.         catch(e)
  806.         {
  807.             return g_msFeedManager.GetFeed("");
  808.         }
  809.     }
  810. }
  811. /////////////////////////////////////////////////////////////////////////////////
  812. //
  813. // Bug #94567: [TP34 Regression] RSS Feed-Headlines-
  814. // If title attributes contain a new line they are no longer displayed correctly.
  815. //
  816. /////////////////////////////////////////////////////////////////////////////////
  817. function removeNewLines(stringWithNewlines)
  818. {
  819.     var regEx; 
  820.  
  821.     regEx = new RegExp ('\r', 'gi') ;
  822.     stringWithNewlines = stringWithNewlines.replace(regEx," ");
  823.     regEx = new RegExp ('\n', 'gi') ;
  824.     stringWithNewlines = stringWithNewlines.replace(regEx," ");
  825.     regEx = new RegExp ('\t', 'gi') ;
  826.     stringWithNewlines = stringWithNewlines.replace(regEx," ");
  827.  
  828.     while(stringWithNewlines.indexOf("  ")>=0)
  829.     {
  830.         regEx = new RegExp ('  ', 'gi') ;
  831.         stringWithNewlines = stringWithNewlines.replace(regEx," ");
  832.     }
  833.     return stringWithNewlines;
  834. }
  835. ////////////////////////////////////////////////////////////////////////////////
  836. //
  837. // create New Feed Path Object
  838. //
  839. ////////////////////////////////////////////////////////////////////////////////
  840. function makeFeedPath(_feedPath, _feedGUID)
  841. {
  842.     this.Path = _feedPath;
  843.     this.GUID = _feedGUID;
  844. }
  845.  
  846. ////////////////////////////////////////////////////////////////////////////////
  847. //
  848. //
  849. ////////////////////////////////////////////////////////////////////////////////
  850. function queueRssByFolder(Path)
  851. {
  852.     var folder = g_msFeedManager.GetFolder(Path);
  853.  
  854.     for(var subfolderIndex=0; subfolderIndex < folder.Subfolders.Count; subfolderIndex++)
  855.     {
  856.         queueRssByFolder(folder.Subfolders.Item(subfolderIndex).Path);
  857.     }
  858.     
  859.     for (var folderIndex = 0; folderIndex < folder.Feeds.Count; folderIndex++)
  860.     {
  861.         var currentFeed = folder.Feeds.item(folderIndex);
  862.         var currentFeedLastWriteTime = (new Date(currentFeed.LastWriteTime)).toUTCString();
  863.         var currentFeedGUID = currentFeed.LocalId;
  864.         var currentFeedPath = currentFeed.Path;
  865.  
  866.         if ( g_feedDownloadTimes[currentFeedGUID]==undefined || g_feedDownloadTimes[currentFeedGUID] !== currentFeedLastWriteTime )
  867.         {
  868.             var tempFeedPath = new makeFeedPath(currentFeedPath,currentFeedGUID);
  869.             g_feedPaths.push(tempFeedPath);
  870.             fSomethingToDo = true;
  871.             System.Debug.outputString("Queueing feed: "+currentFeedPath); //DEBUG CODE
  872.         }
  873.         g_feedsCurrentlySelected[currentFeedGUID] = currentFeedPath;    // hash-store the GUID,path key-value pair
  874.         g_totalFeedCount ++;
  875.  
  876.         tempFeedPath = null;
  877.     }
  878. }
  879.  
  880. ////////////////////////////////////////////////////////////////////////////////
  881. //
  882. //
  883. ////////////////////////////////////////////////////////////////////////////////
  884. function checkForFeedStoreChanges()
  885. {
  886.     var bRefreshMainArray = false;
  887.     // Queueing done. Now check if any of the feed's data in feed data container must be removed (ie feed no longer exists in chosen folder)
  888.     for (var tmpFeedGUID in g_currentFeedData)
  889.     {
  890.         if ( g_currentFeedData[tmpFeedGUID] !== null && (g_feedsCurrentlySelected[tmpFeedGUID] == undefined || g_feedsCurrentlySelected[tmpFeedGUID] == null) ) // Data for feed Not already deleted, and feed doesnt exist in folder currently selected
  891.         {
  892.             g_currentFeedData[tmpFeedGUID] = null;
  893.             bRefreshMainArray = true;
  894.         }
  895.     }
  896.  
  897.     if ( bRefreshMainArray )
  898.     {
  899.         g_returnFeed = null;
  900.         g_returnFeed = new makeFeed("","","");
  901.         for (var i in g_currentFeedData)
  902.         {
  903.             if ( g_currentFeedData[i] !== undefined && g_currentFeedData[i] !== null )
  904.             {
  905.                 g_returnFeed.feedItems=g_returnFeed.feedItems.concat(g_currentFeedData[i].feedItems);
  906.             }
  907.         }
  908.         g_returnFeed.feedItems.sort(sortDates);
  909.         g_returnFeed.feedItems.reverse();
  910.         g_returnFeed.feedCount = ' (<b>'+g_totalFeedItemCount+'</b>) ';
  911.         g_returnFeed.feedUrl = ''; 
  912.  
  913.         if ( g_returnFeed.feedItems.length == 0 )
  914.         {
  915.             g_returnFeed = null;
  916.             displayMessage(L_ZFI_ERRORMESSAGE, true);
  917.         }
  918.     }
  919.  
  920.     if ( g_totalFeedCount == 0 )
  921.     {
  922.         displayMessage(L_ZF_ERRORMESSAGE, true);
  923.     }
  924.     g_feedsCurrentlySelected = null;
  925. }
  926.  
  927.  
  928. ////////////////////////////////////////////////////////////////////////////////
  929. //
  930. //
  931. ////////////////////////////////////////////////////////////////////////////////
  932. function queueRssByFeed(Path)
  933. {
  934.     var folderPath = Path.substring(0,Path.lastIndexOf("\\"));
  935.     var folder = g_msFeedManager.GetFolder(folderPath);
  936.  
  937.     for (var folderIndex = 0; folderIndex < folder.Feeds.Count; folderIndex++)
  938.     {
  939.         var currentFeed = folder.Feeds.item(folderIndex);
  940.         if (currentFeed.Path !== Path )
  941.             continue;
  942.         var currentFeedLastWriteTime = (new Date(currentFeed.LastWriteTime)).toUTCString();
  943.         var currentFeedGUID = currentFeed.LocalId;
  944.         var currentFeedPath = currentFeed.Path;
  945.         if ( g_feedDownloadTimes[currentFeedGUID]==undefined || g_feedDownloadTimes[currentFeedGUID] !== currentFeedLastWriteTime )
  946.         {
  947.             var tempFeedPath = new makeFeedPath(currentFeedPath,currentFeedGUID);
  948.             g_feedPaths.push(tempFeedPath);
  949.             fSomethingToDo = true;
  950.             System.Debug.outputString("Queueing feed: "+currentFeedPath); //DEBUG CODE
  951.         }
  952.         g_totalFeedCount = 1;
  953.         return; // we found the feed we were looking for, no need to query remaining feeds
  954.     }
  955. }
  956.  
  957.  
  958. ////////////////////////////////////////////////////////////////////////////////
  959. //
  960. //
  961. ////////////////////////////////////////////////////////////////////////////////
  962. function setPreviousViewItems()
  963. {
  964.     g_currentArrayIndex = g_currentArrayIndex - (g_countToView * 2);
  965.     setNextViewItems();
  966. }
  967. ////////////////////////////////////////////////////////////////////////////////
  968. //
  969. // Validate the URL starts with a valid prefix
  970. //
  971. ////////////////////////////////////////////////////////////////////////////////
  972. function checkHref(sURL)
  973. {
  974.     var safeURL = "";
  975.     var prefixIndex = sURL.search("http://");
  976.     if(prefixIndex == 0)
  977.     {
  978.         return sURL;
  979.     }
  980.     prefixIndex = sURL.search("https://");
  981.     if(prefixIndex == 0)
  982.     {
  983.         return sURL;
  984.     }
  985.     prefixIndex = sURL.search("ftp://");
  986.     if(prefixIndex == 0)
  987.     {
  988.         return sURL;
  989.     }
  990.     return safeURL;
  991. }
  992.  
  993.  
  994. ////////////////////////////////////////////////////////////////////////////////
  995. //
  996. // Show Hide UI Element Blocks
  997. //
  998. ////////////////////////////////////////////////////////////////////////////////
  999. function showHideUIElementBlocks( bShowNavigationHolder, bShowFeedItemsHolder, bShowErrorMessageHolder)
  1000. {
  1001.     if( bShowNavigationHolder !== undefined && bShowNavigationHolder !== null )
  1002.     {
  1003.         if( bShowNavigationHolder )
  1004.             navHolder.style.visibility = "visible";
  1005.         else
  1006.             navHolder.style.visibility = "hidden";
  1007.     }
  1008.  
  1009.     if( bShowFeedItemsHolder !== undefined && bShowFeedItemsHolder !== null )
  1010.     {
  1011.         if( bShowFeedItemsHolder )
  1012.         {
  1013.             FeedItemHldr.style.visibility = "visible";
  1014.             FeedItemHldr.style.display = "inline";
  1015.         }
  1016.         else
  1017.         {
  1018.             FeedItemHldr.style.visibility = "hidden";
  1019.             FeedItemHldr.style.display = "none";
  1020.         }
  1021.     }
  1022.  
  1023.     if( bShowErrorMessageHolder !== undefined && bShowErrorMessageHolder !== null )
  1024.     {
  1025.         if( bShowErrorMessageHolder )
  1026.             errorTextHldr.style.visibility = "visible";
  1027.         else
  1028.             errorTextHldr.style.visibility = "hidden";
  1029.     }
  1030. }
  1031.  
  1032.  
  1033. ////////////////////////////////////////////////////////////////////////////////
  1034. //
  1035. // Show Feed items that have content, hide the rest
  1036. //
  1037. ////////////////////////////////////////////////////////////////////////////////
  1038. function showHideFeedItems(headlineCount, itemsInView)
  1039. {
  1040.     var countDiff = headlineCount % itemsInView;
  1041.  
  1042.     if( countDiff == 0 )
  1043.     {
  1044.         countDiff = itemsInView;
  1045.     }
  1046.     for(var i = 0; i < itemsInView; i++)
  1047.     {
  1048.         if( i < countDiff )
  1049.         {
  1050.             eval("FeedItem"+i).style.visibility = "visible";
  1051.         }
  1052.         else
  1053.         {
  1054.             eval("FeedItem"+i).style.visibility = "hidden";
  1055.         }
  1056.     }
  1057. }
  1058.  
  1059. ////////////////////////////////////////////////////////////////////////////////
  1060. //
  1061. // Add Feed Items to View Elements HTML Object to be displayed in Gadget
  1062. //
  1063. ////////////////////////////////////////////////////////////////////////////////
  1064. function setNextViewItems()
  1065. {
  1066.     if( g_timerFlag && g_returnFeed!==null )
  1067.     {
  1068.         var headlineCount;
  1069.         do
  1070.         {
  1071.             headlineCount = g_returnFeed.feedItems.length;
  1072.             g_lastCalledArrayIndex = g_currentArrayIndex;
  1073.             if(g_totalViewableItems < headlineCount)
  1074.             {
  1075.                 headlineCount = g_totalViewableItems;
  1076.             }
  1077.             if(g_currentArrayIndex > g_returnFeed.feedItems.length || g_currentArrayIndex >= headlineCount)
  1078.             { 
  1079.                 g_currentArrayIndex = 0;
  1080.                 refreshRssFeedData();
  1081.             } 
  1082.  
  1083.             var countDiff = headlineCount%g_countToView;
  1084.             var lastPageItemsArrayIndex;
  1085.             if(countDiff == 0)
  1086.             { 
  1087.                 lastPageItemsArrayIndex = headlineCount - g_countToView;
  1088.             }
  1089.             else
  1090.             {
  1091.                 lastPageItemsArrayIndex = headlineCount - countDiff;
  1092.             }
  1093.  
  1094.             if(g_currentArrayIndex < 0 || g_currentArrayIndex >= lastPageItemsArrayIndex )
  1095.             {
  1096.                 g_currentArrayIndex = lastPageItemsArrayIndex;
  1097.                 refreshRssFeedData();
  1098.                 showHideFeedItems(headlineCount , g_countToView);
  1099.             } 
  1100.             else
  1101.             { 
  1102.                 showHideFeedItems(g_countToView , g_countToView);// Show all items if not on last page
  1103.             } 
  1104.  
  1105.             if ( g_returnFeed == null )
  1106.             {
  1107.                 return;
  1108.             }
  1109.  
  1110.         }
  1111.         while (headlineCount > g_returnFeed.feedItems.length);
  1112.  
  1113.         if ( headlineCount == 0 )
  1114.         {
  1115.             displayMessage(L_ZFI_ERRORMESSAGE, true);
  1116.             return;
  1117.         }
  1118.  
  1119.         if( !g_timerFlag )
  1120.             return;
  1121.  
  1122.         showHideUIElementBlocks( true, true, false);
  1123.  
  1124.         clearViewElements();
  1125.  
  1126.         System.Gadget.settingsUI = "settings.html";
  1127.         for(var i = 0; i < g_countToView; i++)
  1128.         {
  1129.             var positionContentArray = new Array();
  1130.             positionContentArray[0] = (g_currentArrayIndex + 1) - i;
  1131.             positionContentArray[1] = "-";
  1132.             positionContentArray[2] = g_currentArrayIndex + 1;
  1133.             var pageDir = document.getElementsByTagName("html")[0].dir;
  1134.             if (pageDir == "rtl")
  1135.             {
  1136.                 positionContentArray.reverse();
  1137.             }    
  1138.             var positionContent = positionContentArray[0]+positionContentArray[1]+positionContentArray[2];
  1139.             if(g_currentArrayIndex == headlineCount)
  1140.             {
  1141.                 for (var j = i; j < g_countToView; j++)
  1142.                 {
  1143.                     if(j < g_countToView)
  1144.                     {
  1145.                         eval("FeedItem"+j).style.border = "";
  1146.                     }
  1147.                     g_currentArrayIndex++;
  1148.                 }
  1149.                 return;
  1150.             }
  1151.             
  1152.             eval("FeedItem"+i).style.borderBottom = "dotted 1px #3b4458";
  1153.             eval("FeedItemLink"+i).style.textOverflow = "ellipsis";
  1154.             eval("FeedItemLink"+i).style.overflow = "hidden"; 
  1155.             eval("FeedItemLink"+i).style.whiteSpace = "nowrap"; 
  1156.             eval("FeedItemLink"+i).style.width = g_curLinkWidth;
  1157.             positionNumbers.innerText = positionContent;
  1158.             var countNow = g_returnFeed.feedItems[g_currentArrayIndex].feedItemCount;
  1159.             var feedItemName = g_returnFeed.feedItems[g_currentArrayIndex].feedItemName;
  1160.             g_viewElements.FeedItems[i].setAttribute("title",feedItemName);
  1161.             if(!g_returnFeed.feedItems[g_currentArrayIndex].feedItemIsRead)
  1162.             {
  1163.                 g_viewElements.FeedItems[i].className="unreadItem";
  1164.             }
  1165.             else
  1166.             {                
  1167.                 g_viewElements.FeedItems[i].className="readItem";
  1168.             }
  1169.             g_viewElements.FeedItems[i].innerText = feedItemName;
  1170.             g_viewElements.FeedItems[i].href = checkHref(g_returnFeed.feedItems[g_currentArrayIndex].feedItemUrl);
  1171.             g_viewElements.FeedItems[i].setAttribute("name", g_returnFeed.feedItems[g_currentArrayIndex].feedItemParentPath);
  1172.             g_viewElements.FeedItems[i].setAttribute("localId", g_returnFeed.feedItems[g_currentArrayIndex].feedItemID);            
  1173.             eval("FeedItemName"+i).innerText = g_returnFeed.feedItems[g_currentArrayIndex].feedItemParent;
  1174.             eval("FeedItemName"+i).setAttribute("title",g_returnFeed.feedItems[g_currentArrayIndex].feedItemParent);                
  1175.             eval("FeedItemName"+i).style.textOverflow = "ellipsis";
  1176.             eval("FeedItemName"+i).style.overflow = "hidden"; 
  1177.             eval("FeedItemName"+i).style.whiteSpace = "nowrap"; 
  1178.             eval("FeedItemDate"+i).innerText = g_returnFeed.feedItems[g_currentArrayIndex].feedItemDate;
  1179.             eval("FeedItemDate"+i).setAttribute("title",g_returnFeed.feedItems[g_currentArrayIndex].feedItemDate);
  1180.             eval("FeedItemDate"+i).style.overflow = "hidden";        
  1181.             g_currentArrayIndex++;
  1182.             clearBack();
  1183.         }
  1184.     }
  1185. }
  1186. ////////////////////////////////////////////////////////////////////////////////
  1187. //
  1188. //
  1189. ////////////////////////////////////////////////////////////////////////////////
  1190. function displayMessage(errorText, bShowSettingsWrench)
  1191. {
  1192.     clearBorder();
  1193.     clearViewElements(); 
  1194.     showHideUIElementBlocks( false, false, true);
  1195.  
  1196.     stopTimer();
  1197.     stopPolling();
  1198.     g_timerFlag = false;
  1199.  
  1200.     if( bShowSettingsWrench !== undefined && bShowSettingsWrench !== null)
  1201.     {
  1202.         if ( bShowSettingsWrench )
  1203.         {
  1204.             System.Gadget.settingsUI = "settings.html";
  1205.             g_gadgetErrorFlag = 0;
  1206.         }
  1207.         else
  1208.         {
  1209.             System.Gadget.settingsUI = "";
  1210.             g_gadgetErrorFlag = 2;
  1211.         }
  1212.     }
  1213.  
  1214.  
  1215.     errorTextHldr.style.textAlign = "center";
  1216.     errorTextLink.className = "textView";
  1217.     errorTextHldr.style.top = "30%";
  1218.     if(errorText == L_FCE_ERRORMESSAGE)
  1219.     {
  1220.         errorTextLink.innerHTML = "<p style=\"margin:0px;padding-bottom:5px;\">"
  1221.                                 + "<img src=\"images/rssLogo.gif\" border=\"0\" />"
  1222.                                 + "</p>"+errorText;
  1223.         errorTextLink.style.cursor = "pointer";
  1224.         errorTextLink.title = L_FCEHOVER_ERRORMESSAGE;
  1225.         g_gadgetErrorFlag = 1;
  1226.     }
  1227.     else
  1228.     {
  1229.         errorTextLink.style.cursor = "default";
  1230.         errorTextLink.innerHTML = errorText;
  1231.         errorTextLink.title = "";
  1232.     }
  1233. }
  1234. ////////////////////////////////////////////////////////////////////////////////
  1235. //
  1236. //
  1237. ////////////////////////////////////////////////////////////////////////////////
  1238. function clearBorder()
  1239. {
  1240.     for (var i = 0; i < 4; i++)
  1241.     {                
  1242.         if(eval("FeedItem"+i) != undefined)
  1243.         {
  1244.             eval("FeedItem"+i).style.border = "";
  1245.         }
  1246.     }
  1247. }
  1248. ////////////////////////////////////////////////////////////////////////////////
  1249. //
  1250. //
  1251. ////////////////////////////////////////////////////////////////////////////////
  1252. function showSpinner(posTop)
  1253. {
  1254.     clearViewElements();
  1255.     clearBorder();
  1256.     errorTextLink.innerHTML = "<p style=\"margin:0px;padding-bottom:10px;\">"
  1257.                             + "<img border=\"0\" src=\"images/16-on-black.gif\" />"
  1258.                             + "</p>"+L_LOADING_TEXT;
  1259.     errorTextLink.className = "textLoad";
  1260.     errorTextLink.style.cursor = "default";
  1261.     errorTextLink.title = L_LOADING_TEXT;
  1262.  
  1263.     showHideUIElementBlocks( false, true, true)
  1264.  
  1265.     errorTextHldr.style.textAlign = "center";
  1266.     errorTextHldr.style.top = posTop;
  1267. }
  1268. ////////////////////////////////////////////////////////////////////////////////
  1269. //
  1270. //
  1271. ////////////////////////////////////////////////////////////////////////////////
  1272. function OnItemClick()
  1273. {        
  1274.     if(g_gadgetErrorFlag > 0)
  1275.     {
  1276.         if(g_gadgetErrorFlag == 1)
  1277.         {
  1278.         System.Gadget.Settings.write("rssFeedPath", "");
  1279.         showSpinner('35%');
  1280.         this.blur();
  1281.         loadMSFeedManager();
  1282.         downloadAllFeeds(g_msFeedManager.RootFolder);
  1283.         g_msFeedManager = null;        
  1284.         g_loadFirstTime = "existingGadget";
  1285.         System.Gadget.Settings.write("loadFirstTime", g_loadFirstTime);
  1286.         if(g_downloadErrorFlag)
  1287.         {
  1288.                 setTimeout(loadMain, g_loadingMilliSecs);
  1289.         }
  1290.         else
  1291.         {
  1292.                 loadMain();
  1293.         }
  1294.         }
  1295.         else if(g_gadgetErrorFlag == 2)
  1296.         {
  1297.             window.location = 'http://go.microsoft.com/fwlink/?LinkId=69153';
  1298.         }
  1299.     }
  1300. }
  1301. ////////////////////////////////////////////////////////////////////////////////
  1302. //
  1303. //
  1304. ////////////////////////////////////////////////////////////////////////////////
  1305. function downloadAllFeeds(folderToAdd)
  1306.     loadMSFeedManager();
  1307.     var currentFolder;
  1308.     var currentFeeds;        
  1309.     var feedDefault;            
  1310.     
  1311.     if (folderToAdd.IsRoot)
  1312.     {
  1313.         currentFeeds = folderToAdd.Feeds;
  1314.         for (var feedIndex = 0; feedIndex < currentFeeds.Count; feedIndex++)
  1315.         {
  1316.             try
  1317.             {
  1318.                 feedDefault = safeGetFeed(currentFeeds.Item(feedIndex).Path);
  1319.             }
  1320.             catch(e)
  1321.             {
  1322.                 displayMessage(L_MSIE_ERRORMESSAGE, false);
  1323.                 g_timerFlag = false;
  1324.             }
  1325.             try
  1326.             {
  1327.                 feedDefault.Download();
  1328.             }
  1329.             catch(e)
  1330.             {
  1331.                 g_downloadErrorFlag = true;
  1332.             }
  1333.         }
  1334.         downloadAllFeeds(folderToAdd.SubFolders);
  1335.         return;
  1336.     }
  1337.     for (var folderIndex = 0; folderIndex < folderToAdd.Count; folderIndex++)
  1338.     {
  1339.         currentFolder = folderToAdd.Item(folderIndex);
  1340.         currentFeeds = currentFolder.Feeds;
  1341.         for (var feedIndex = 0; feedIndex < currentFeeds.Count; feedIndex++)
  1342.         {
  1343.             try
  1344.             {
  1345.                 feedDefault = safeGetFeed(currentFeeds.Item(feedIndex).Path);
  1346.             }
  1347.             catch(e)
  1348.             {
  1349.                 displayMessage(L_MSIE_ERRORMESSAGE, false);
  1350.                 g_timerFlag = false;
  1351.             }
  1352.             try
  1353.             {
  1354.                 feedDefault.Download();
  1355.             }
  1356.             catch(e)
  1357.             {
  1358.                 g_downloadErrorFlag = true;
  1359.             }
  1360.         }
  1361.         if (currentFolder.Subfolders.Count > 0)
  1362.         {
  1363.             downloadAllFeeds(currentFolder.Subfolders);
  1364.         }
  1365.     }
  1366.     loadMSFeedManager();
  1367.     if(g_msFeedManager.BackgroundSyncStatus == 0)
  1368.     {
  1369.         g_msFeedManager.BackgroundSync(1);
  1370.     }
  1371.     g_msFeedManager = null;
  1372. }
  1373. ////////////////////////////////////////////////////////////////////////////////
  1374. //
  1375. //
  1376. ////////////////////////////////////////////////////////////////////////////////
  1377. function showFlyout(feedAll)
  1378. {
  1379.     g_feedForFlyout = feedAll.name;
  1380.     g_feedURL = feedAll.href;
  1381.     g_feedTitle = feedAll.innerText;
  1382.     g_feedID = feedAll;
  1383.     g_feedLocalId = feedAll.localId;
  1384.     g_feedID.innerText=g_feedTitle;
  1385.     g_timerFlyoutFlag = true;
  1386.     markAsRead();
  1387.     if (event.type == "click")
  1388.     {
  1389.         if(g_feedURL == g_lastClickedUrl)
  1390.         {
  1391.             stopTimer();
  1392.             System.Gadget.Flyout.show = false;
  1393.             g_lastClickedUrl = "";
  1394.             g_timerFlyoutFlag = false;
  1395.         }    
  1396.         if(System.Gadget.Flyout.show)
  1397.         {
  1398.             addContentToFlyout();
  1399.             g_lastClickedUrl = feedAll.href;
  1400.         }
  1401.         else
  1402.         {
  1403.             System.Gadget.Flyout.show = true;
  1404.             System.Gadget.Flyout.onShow = function()
  1405.             {
  1406.                 stopTimer();
  1407.                 addContentToFlyout();
  1408.             }
  1409.             System.Gadget.Flyout.onHide = function()
  1410.             {
  1411.                 g_feedClicked = null;
  1412.                 clearBack();
  1413.                 if(g_timerFlyoutFlag)
  1414.                 {
  1415.                     startTimer();
  1416.                 }
  1417.                 g_timerFlyoutFlag = true;
  1418.             }
  1419.             g_lastClickedUrl = feedAll.href;
  1420.         }
  1421.  
  1422.     }
  1423. }
  1424. ////////////////////////////////////////////////////////////////////////////////
  1425. //
  1426. //
  1427. ////////////////////////////////////////////////////////////////////////////////
  1428. function markAsRead()
  1429. {
  1430.     if( g_returnFeed == null )
  1431.         return;
  1432.  
  1433.     for(var i = 0; i < g_returnFeed.feedItems.length; i++)
  1434.     { 
  1435.         if(g_returnFeed.feedItems[i].feedItemUrl == g_feedURL)
  1436.         {
  1437.             g_returnFeed.feedItems[i].feedItemIsRead = true;
  1438.             g_viewElements.FeedItems[i%4].className="readItem";
  1439.         }
  1440.     }
  1441.     loadMSFeedManager();
  1442.     try
  1443.     {
  1444.         var currentFeeds = safeGetFeed(g_feedForFlyout);
  1445.         var currentFeed = currentFeeds.getItem(g_feedLocalId);
  1446.         currentFeed.IsRead = true;
  1447.     }
  1448.     catch(e)
  1449.     {
  1450.     }
  1451.     g_msFeedManager = null;
  1452. }
  1453. ////////////////////////////////////////////////////////////////////////////////
  1454. //
  1455. //
  1456. ////////////////////////////////////////////////////////////////////////////////
  1457. function hideFlyout()
  1458. {
  1459.  System.Gadget.Flyout.show = false;
  1460. }
  1461.  
  1462. ////////////////////////////////////////////////////////////////////////////////
  1463. //
  1464. //
  1465. ////////////////////////////////////////////////////////////////////////////////
  1466. function addContentToFlyout()
  1467. {
  1468.     try
  1469.     {
  1470.         if(System.Gadget.Flyout.show)
  1471.         {
  1472.             var flyoutDiv = System.Gadget.Flyout.document;
  1473.             loadMSFeedManager();
  1474.             try
  1475.             {
  1476.                 var currentFeeds = safeGetFeed(g_feedForFlyout);
  1477.                 var currentFeed = currentFeeds.getItem(g_feedLocalId);
  1478.                 var tempTitle = removeNewLines(currentFeed.title);
  1479.                 flyoutDiv.getElementById("flyoutTitleLink").innerText = tempTitle;
  1480.                 flyoutDiv.getElementById("flyoutTitleLink").href = checkHref(g_feedURL);
  1481.                 flyoutDiv.getElementById("flyoutTitleLink").setAttribute("title", tempTitle);
  1482.                 flyoutDiv.getElementById("flyoutTitleLink").style.textOverflow = "ellipsis";
  1483.                 flyoutDiv.getElementById("flyoutTitleLink").style.overflow = "hidden"; 
  1484.                 flyoutDiv.getElementById("flyoutTitleLink").style.whiteSpace = "nowrap"; 
  1485.                 flyoutDiv.getElementById("flyoutPubDate").innerText = currentFeeds.Name;
  1486.                 flyoutDiv.getElementById("flyoutPubDate").href = checkHref(currentFeeds.URL);
  1487.                 flyoutDiv.getElementById("flyoutPubDate").setAttribute("title", currentFeeds.Name);
  1488.                 flyoutDiv.getElementById("flyoutPubDate").style.textOverflow = "ellipsis";
  1489.                 flyoutDiv.getElementById("flyoutPubDate").style.overflow = "hidden"; 
  1490.                 flyoutDiv.getElementById("flyoutPubDate").style.whiteSpace = "nowrap"; 
  1491.                 flyoutDiv.getElementById("readOnlineLink").href = checkHref(g_feedURL);
  1492.                 flyoutDiv.getElementById("flyoutMainFeedDescription").innerHTML = currentFeed.Description;
  1493.             }
  1494.             catch(e)
  1495.             {
  1496.             }
  1497.             g_msFeedManager = null;
  1498.         }
  1499.     }
  1500.     catch(e)
  1501.     {
  1502.         //catch slow flyout - no div object will be available.
  1503.     }
  1504. }
  1505.  
  1506. ////////////////////////////////////////////////////////////////////////////////
  1507. //
  1508. // Check HTML document direction and position Feed Name and Feed Date as appropriate
  1509. //
  1510. ////////////////////////////////////////////////////////////////////////////////
  1511.  
  1512. function updateDivLocation(divFeedNameObject,divFeedDateObject)
  1513. {    
  1514.     var pageDir = document.getElementsByTagName("html")[0].dir;
  1515.  
  1516.     if (pageDir == "rtl")
  1517.     {
  1518.         divFeedDateObject.style.textAlign = "left";
  1519.         divFeedDateObject.style.styleFloat = "left";
  1520.         divFeedNameObject.style.textAlign = "right";
  1521.         divFeedNameObject.style.styleFloat = "right";
  1522.     }
  1523.     else
  1524.     {
  1525.         divFeedDateObject.style.textAlign = "right";
  1526.         divFeedDateObject.style.styleFloat = "right";
  1527.         divFeedNameObject.style.textAlign = "left";
  1528.         divFeedNameObject.style.styleFloat = "left";
  1529.     }
  1530. }
  1531.  
  1532. ////////////////////////////////////////////////////////////////////////////////
  1533. //
  1534. // Gadget DOCKED
  1535. //
  1536. ////////////////////////////////////////////////////////////////////////////////
  1537.  
  1538. function dockedState()
  1539. {    
  1540.     g_curLinkWidth    = "113px";
  1541.     g_feedNameLength    = 10;
  1542.     if(g_lastCalledArrayIndex)
  1543.     {
  1544.         g_currentArrayIndex = g_lastCalledArrayIndex;
  1545.     }
  1546.     else
  1547.     {
  1548.         g_currentArrayIndex = 0;
  1549.     }
  1550.     setNextViewItems();
  1551.     with(document.body.style)
  1552.     {
  1553.         height = "173px";
  1554.         width = "130px";
  1555.     } 
  1556.     with(rssfeedBg.style)
  1557.     {
  1558.         height = "173px";
  1559.         width = "130px";
  1560.     } 
  1561.     rssfeedBg.src = "url(images/rssBackBlue_docked.png)";
  1562.     //styleSwitch (name backgroundColor top left height width, fontWeight, fontSize, color, 
  1563.     //            paddingTop, paddingBottom, paddingRight, paddingLeft, borderbottom, bordercolor)
  1564.  
  1565.     styleSwitch("FeedItemHldr", false, 4, 4, false, false, false, false, false, false, false, 4, false, false, false);    
  1566.     styleSwitch("navHolder", false, 147, 25, 20, 75, false, false, false, false, false, false, false, false, false); 
  1567.     for (i=0; i < g_countToView; i++)
  1568.     {        
  1569.         styleSwitch(eval("FeedItem"+i), false, false, false, 35, 121, false, 12, '#ffffff', 5, 1, 4, 6, false, false);
  1570.         styleSwitch(eval("FeedItemName"+i), false, false, false, 14, 55, false, 11, '#67788a', 0, 0, 0, 0, false, false);
  1571.         styleSwitch(eval("FeedItemDate"+i), false, false, false, 14, 55, false, 11, '#67788a', 0, 0, 0, 0, false, false);
  1572.         eval("FeedItem"+i).style.lineHeight = "13px";
  1573.         eval("FeedItem"+i).style.overflow = "hidden";        
  1574.         eval("FeedItemName"+i).style.lineHeight = "12px";
  1575.         eval("FeedItemDate"+i).style.lineHeight = "12px";
  1576.  
  1577.         updateDivLocation( eval("FeedItemName"+i) , eval("FeedItemDate"+i) )
  1578.     
  1579.  }    
  1580. }
  1581. ////////////////////////////////////////////////////////////////////////////////
  1582. //
  1583. // Gadget UNDOCKED
  1584. //
  1585. ////////////////////////////////////////////////////////////////////////////////
  1586. function undockedState()
  1587. {
  1588.     g_curLinkWidth    = "250px";
  1589.     g_feedNameLength    = 15;
  1590.     if(g_lastCalledArrayIndex)
  1591.     {
  1592.         g_currentArrayIndex = g_lastCalledArrayIndex;
  1593.     }
  1594.     else
  1595.     {
  1596.         g_currentArrayIndex = 0;
  1597.     }
  1598.     setNextViewItems();
  1599.     with(document.body.style)
  1600.     {
  1601.         height = "232px";
  1602.         width = "296px";
  1603.     }
  1604.     with(rssfeedBg.style)
  1605.     {
  1606.         height = "232px";
  1607.         width = "296px";
  1608.     } 
  1609.     rssfeedBg.src = "url(images/rssBackBlue_undocked.png)";
  1610.     
  1611.     //styleSwitch (name backgroundColor top left height width, fontWeight, fontSize, 
  1612.     //    color, paddingTop, paddingBottom, paddingRight, paddingLeft, borderbottom, bordercolor)
  1613.  
  1614.     styleSwitch("FeedItemHldr", false, 14, 13, false, false, false, false, false, false, false, 14, false, false, false); 
  1615.     styleSwitch("navHolder", false, 190, 106, 20, 75, false, false, false, false, false, false, false, false, false);
  1616.  
  1617.     for (i=0; i < g_countToView; i++)
  1618.     {        
  1619.         styleSwitch(eval("FeedItem"+i), false, false, false, 44, 264, false, 14, '#ffffff', 7, 2, 7, 7, false, false);
  1620.         styleSwitch(eval("FeedItemName"+i), false, false, false, 14, 130, false, 12, '#67788a', 0, 0, 0, 0, false, false);
  1621.         styleSwitch(eval("FeedItemDate"+i), false, false, false, 14, 120, false, 12, '#67788a', 0, 0, 0, 0, false, false);
  1622.         eval("FeedItem"+i).style.lineHeight = "14px";
  1623.         eval("FeedItem"+i).style.overflow = "hidden";        
  1624.         eval("FeedItemName"+i).style.lineHeight = "14px";
  1625.         eval("FeedItemDate"+i).style.lineHeight = "14px";
  1626.  
  1627.         updateDivLocation( eval("FeedItemName"+i) , eval("FeedItemDate"+i) )
  1628.  
  1629.  }    
  1630. }
  1631. ////////////////////////////////////////////////////////////////////////////////
  1632. //
  1633. //
  1634. ////////////////////////////////////////////////////////////////////////////////
  1635. function styleSwitch(divObject, backgroundColorVal, topVal, leftVal, heightVal, widthVal, fontWeightVal, fontSizeVal, fontColor, marginTopVal, marginBottomVal, marginRightVal, marginLeftVal, borderBottomVal, borderColorVal)
  1636. {
  1637.     with(eval(divObject).style)
  1638.     {
  1639.         if(topVal)
  1640.         {
  1641.             top = topVal + "px";
  1642.         }
  1643.         if(leftVal)
  1644.         {
  1645.             left = leftVal + "px";
  1646.         }
  1647.         if(heightVal)
  1648.         {
  1649.             height = heightVal + "px";
  1650.         }        
  1651.         if(widthVal)
  1652.         {
  1653.             width = widthVal + "px";
  1654.         }    
  1655.         if(fontWeightVal)
  1656.         {
  1657.             fontWeight = fontWeightVal;
  1658.         }
  1659.         if(fontSizeVal)
  1660.         {
  1661.             fontSize = fontSizeVal + "px";
  1662.         }        
  1663.         if(fontColor)
  1664.         {
  1665.             color = fontColor;
  1666.         }
  1667.         if(marginTopVal)
  1668.         {
  1669.             paddingTop = marginTopVal + "px";
  1670.         }
  1671.         if(marginBottomVal)
  1672.         {
  1673.             paddingBottom = marginBottomVal + "px";
  1674.         }
  1675.         if(marginLeftVal)
  1676.         {
  1677.             paddingLeft = marginLeftVal+ "px";
  1678.         }
  1679.         if(marginRightVal)
  1680.         {
  1681.             paddingRight = marginRightVal+ "px";
  1682.         }
  1683.         if(borderBottomVal)
  1684.         {
  1685.             borderBottom = "dotted "+ borderBottomVal + "px";
  1686.         }
  1687.         if(borderColorVal)
  1688.         {
  1689.             borderColor = borderColorVal;
  1690.         }
  1691.         if(backgroundColorVal)
  1692.         {
  1693.             backgroundColor = backgroundColorVal;
  1694.         }
  1695.     }
  1696. }
  1697. ////////////////////////////////////////////////////////////////////////////////
  1698. //
  1699. //
  1700. ////////////////////////////////////////////////////////////////////////////////
  1701. function toggleBack(objToChange, showBack)
  1702. {    
  1703.     if(objToChange.innerText != g_feedClicked)
  1704.     {
  1705.         if(!System.Gadget.docked) 
  1706.         {
  1707.             var backgroundToLoad = "url(images/item_hover_floating.png)";
  1708.         } 
  1709.         else if (System.Gadget.docked)
  1710.         {
  1711.             var backgroundToLoad = "url(images/item_hover_docked.png)"; 
  1712.         }
  1713.         if(showBack)
  1714.         {
  1715.             eval("objToChange").style.backgroundImage = backgroundToLoad; 
  1716.         }
  1717.         else
  1718.         {
  1719.             eval("objToChange").style.backgroundImage = ""; 
  1720.         }
  1721.     }
  1722. }
  1723. ////////////////////////////////////////////////////////////////////////////////
  1724. //
  1725. // set/swap background image when clicked/dblclicked
  1726. //
  1727. ////////////////////////////////////////////////////////////////////////////////
  1728. function selectBack(objToChange)
  1729. {    
  1730.     g_feedClicked = objToChange.innerText;
  1731.     clearBack();
  1732. ////////////////////////////////////////////////////////////////////////////////
  1733. //
  1734. // clear background image's and set selected article with image
  1735. //
  1736. ////////////////////////////////////////////////////////////////////////////////
  1737. function clearBack()
  1738. {    
  1739.     for(var i = 0; i < 4; i++)
  1740.     {
  1741.         if(eval("FeedItem"+i).innerText == g_feedClicked)
  1742.         { 
  1743.             setSelectBack(eval("FeedItem"+i));            
  1744.         }
  1745.         else
  1746.         {
  1747.             eval("FeedItem"+i).style.backgroundImage = "";
  1748.         }
  1749.     } 
  1750. }
  1751. ////////////////////////////////////////////////////////////////////////////////
  1752. //
  1753. // Set the background image
  1754. //
  1755. //////////////////////////////////////////////////////////////////////////////// 
  1756. function setSelectBack(objToChange)
  1757. {
  1758.     if(objToChange.innerText == g_feedClicked)
  1759.     {
  1760.         if(!System.Gadget.docked) 
  1761.         {
  1762.             var backgroundToLoad = "url(images/rss_headline_glow_floating.png)";
  1763.         } 
  1764.         else if (System.Gadget.docked)
  1765.         {
  1766.             var backgroundToLoad = "url(images/rss_headline_glow_docked.png)"; 
  1767.         }
  1768.         eval("objToChange").style.backgroundImage = backgroundToLoad; 
  1769.     }
  1770. }
  1771. ////////////////////////////////////////////////////////////////////////////////
  1772. //
  1773. //
  1774. ////////////////////////////////////////////////////////////////////////////////
  1775. function toggleButton(objToChange, newSRC)
  1776. {        
  1777.  eval("objToChange").src = "images/"+newSRC;
  1778. }
  1779. ////////////////////////////////////////////////////////////////////////////////
  1780. //
  1781. //
  1782. ////////////////////////////////////////////////////////////////////////////////
  1783. function mouseWheeNavigate()
  1784. {
  1785.     if( g_returnFeed == null )
  1786.         return;
  1787.  
  1788.     var headlineCount = g_returnFeed.feedItems.length;
  1789.     if(g_totalViewableItems < headlineCount)
  1790.     {
  1791.         headlineCount = g_totalViewableItems;
  1792.     }
  1793.     if(event.wheelDelta < -20)
  1794.     {
  1795.         setNextViewItems();
  1796.     }
  1797.     if(event.wheelDelta > 20)
  1798.     {
  1799.         setPreviousViewItems();
  1800.     }
  1801. }
  1802.  
  1803. ////////////////////////////////////////////////////////////////////////////////
  1804. //
  1805. //
  1806. ////////////////////////////////////////////////////////////////////////////////
  1807.  
  1808. function keyNavigate()
  1809.     switch(event.keyCode)
  1810.     {
  1811.  
  1812.         case 38:
  1813.         case 104:
  1814.             setPreviousViewItems();
  1815.             break;
  1816.         case 40:
  1817.         case 98:
  1818.             setNextViewItems();
  1819.             break;
  1820.         case 32: 
  1821.         case 13:
  1822.             if(event.srcElement.id == "buttonLeftNarrator")
  1823.             {
  1824.                 setPreviousViewItems();
  1825.             }
  1826.             else if(event.srcElement.id == "buttonRightNarrator")
  1827.             {
  1828.                 setNextViewItems();
  1829.             }
  1830.             break;
  1831.         case 27:
  1832.             hideFlyout();
  1833.             break;
  1834.     }
  1835. }
  1836. ////////////////////////////////////////////////////////////////////////////////
  1837. //
  1838. //
  1839. ////////////////////////////////////////////////////////////////////////////////
  1840.  
  1841. function keyNavigateClose()
  1842.     switch(event.keyCode)
  1843.     {
  1844.         case 27:
  1845.             hideFlyout();
  1846.             break;
  1847.     }
  1848. }
  1849.  
  1850.