home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / Gadgets.7z / Gadgets / FeedReader.gadget / scripts / gadget.js < prev    next >
Text File  |  2011-10-09  |  9KB  |  307 lines

  1. System.Gadget.settingsUI = "Settings.html";
  2. System.Gadget.onSettingsClosed = settingsClosed;
  3. System.Gadget.onDock = resizeGadget;
  4. System.Gadget.onUndock = resizeGadget;
  5.  
  6. /* Refresh feed when Settings dialog is closed */
  7. function settingsClosed(event)
  8. {
  9.     if (event.closeAction == event.Action.commit) 
  10.     {
  11.         loadTheme();
  12.         currentFeed = 0;
  13.         getNews();
  14.     }
  15. }
  16.  
  17. /* Rezise gadget when docked/undocked */
  18. function resizeGadget() 
  19. {
  20.     var themeName = System.Gadget.Settings.read('theme');
  21.     noItems = System.Gadget.Settings.read('noItems');
  22.     
  23.     if ( noItems == "" ) noItems = 4;
  24.     if ( themeName == "" ) themeName = "default";
  25.     
  26.     switch( noItems ) {
  27.         case 4: 
  28.             document.body.style.height = '209px'; 
  29.             message.style.height = '142px';
  30.             break;
  31.         case 6: 
  32.             document.body.style.height = '278px'; 
  33.             message.style.height = '200px';
  34.             break;
  35.         case 8: 
  36.             document.body.style.height = '348px'; 
  37.             message.style.height = '280px';
  38.             break;
  39.     }
  40.     
  41.     for ( var i = 0; i < noItems; i++ ) document.getElementById(i+'').style.display = 'block';
  42.     for ( var i = noItems; i < 8; i++ ) document.getElementById(i+'').style.display = 'none';
  43.     
  44.     if ( System.Gadget.docked == true )
  45.     {
  46.         try { document.body.style.background = "url('../themes/" + themeName + "/background" + noItems + ".png') no-repeat"; } catch(e) {}
  47.         for ( var i = 0; i < noItems; i++ )
  48.             document.getElementById(i+'').className = "feedItemDocked";    
  49.         message.style.width = '120px';
  50.         navigation.style.marginLeft = '8px';
  51.         titleLink.style.width = '72px';
  52.         document.body.style.width = '132px';
  53.     }
  54.     else
  55.     {
  56.         try { document.body.style.background = "url('../themes/" + themeName + "/background-large" + noItems + ".png') no-repeat"; } catch(e) {}
  57.         for ( var i = 0; i < noItems; i++ )
  58.             document.getElementById(i+'').className = "feedItemUndocked";
  59.         message.style.width = '355px'; 
  60.         navigation.style.marginLeft = '127px';
  61.         titleLink.style.width = '308px';
  62.         document.body.style.width = '368px';
  63.     }
  64. }
  65.  
  66. /* Create a new RSS item object */
  67. function RSS2Item(itemxml)
  68. {
  69.     this.title;
  70.     this.link;
  71.     this.description;
  72.     this.pubDate;
  73.  
  74.     var properties = new Array("title", "link", "description", "pubDate");
  75.     var tmpElement = null;
  76.     for (var i=0; i<properties.length; i++)
  77.     {
  78.         tmpElement = itemxml.getElementsByTagName(properties[i])[0];
  79.         if ( tmpElement != null )
  80.             if ( tmpElement.childNodes != null )
  81.                 if ( tmpElement.childNodes[0] != null )
  82.                     if ( tmpElement.childNodes[0].nodeValue != null )
  83.                         eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
  84.     }
  85. }
  86.  
  87. /* Create a new RSS channel object */
  88. function RSS2Channel(rssxml)
  89. {
  90.     this.items = new Array();
  91.     var itemElements = rssxml.getElementsByTagName("item");
  92.     for (var i=0; i<itemElements.length; i++)
  93.     {
  94.         Item = new RSS2Item(itemElements[i]);
  95.         this.items.push(Item);
  96.     }
  97. }
  98.  
  99. /* Creates a new Atom feed entry object */
  100. function AtomItem(itemxml)
  101. {
  102.     this.title;
  103.     this.link;
  104.     this.description;
  105.     this.pubDate;
  106.  
  107.     try { this.title = itemxml.getElementsByTagName("title")[0].childNodes[0].nodeValue; }
  108.     catch (e) { this.title = "(no title)"; }
  109.     
  110.     try { this.pubDate = itemxml.getElementsByTagName("published")[0].childNodes[0].nodeValue; }
  111.     catch (e) { this.pubDate = null; }
  112.     
  113.     try { this.description = itemxml.getElementsByTagName("summary")[0].childNodes[0].nodeValue; }
  114.     catch (e) { this.description = null; }
  115.     
  116.     if ( this.description == null ) 
  117.     {
  118.         try { this.description = itemxml.getElementsByTagName("content")[0].childNodes[0].nodeValue; }
  119.         catch (e) { this.description = "(no summary)"; }
  120.     }
  121.     
  122.     try 
  123.     {
  124.         var links = itemxml.getElementsByTagName("link");
  125.         for ( var i = 0; i < links.length; i++ ) 
  126.         {
  127.             try { if ( links[i].attributes.getNamedItem("rel").value == "alternate" ) this.link = links[i].attributes.getNamedItem("href").value }
  128.             catch (e) {}
  129.         }
  130.     } catch(e) {}
  131. }
  132.  
  133. /* Create a new Atom feed channel object */
  134. function AtomChannel(atomxml)
  135. {
  136.     this.items = new Array();
  137.     var itemElements;
  138.     try { itemElements = atomxml.getElementsByTagName("feed")[0].getElementsByTagName("entry"); } catch (e) { return false; }
  139.  
  140.     for ( var i=0; i<itemElements.length; i++ )
  141.     {
  142.         Item = new AtomItem(itemElements[i]);
  143.         this.items.push(Item);
  144.     }    
  145. }
  146.  
  147. /* Download (request) the feed from the URL */
  148. function getNews()
  149. {
  150.     clear();
  151.     var URL = System.Gadget.Settings.read("feedURL"+currentFeed);
  152.     if ( URL == "" ) 
  153.     {
  154.         titleLink.innerHTML = "Feed Reader";
  155.         showMessage( "No Feed" );
  156.         return true;
  157.     }
  158.     showMessage( "Fetching ..." );
  159.     currentPosition = 0;
  160.     
  161.      var xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
  162.     xmlDocument.onreadystatechange = function () {
  163.         if (xmlDocument.readyState == 4) {
  164.             if ( xmlDocument.getElementsByTagName("item") != null ) news = new RSS2Channel(xmlDocument);
  165.             else news = new AtomChannel(xmlDocument);
  166.             showNews(news);
  167.         }
  168.     };
  169.     xmlDocument.load(URL);
  170.     
  171.     var refreshTime = System.Gadget.Settings.read('refresh');
  172.     if ( refreshTime > 0 ) setTimeout( "getNews();", refreshTime );
  173.     var isAutoScroll = System.Gadget.Settings.read( "autoScroll" );
  174.     if ( isAutoScroll == 1 ) setTimeout( "autoScroll();", 30000 );
  175.     return;
  176. }
  177.  
  178. /* Display the current 4 items in the news */
  179. function showNews(news)
  180. {
  181.     var name = System.Gadget.Settings.read( "feedName"+currentFeed );
  182.     
  183.     if ( name != "" ) titleLink.innerHTML = name;
  184.     else titleLink.innerHTML = 'Feed Reader';
  185.     
  186.     for ( var i = currentPosition; (i < currentPosition+noItems) && (i < news.items.length); i++ ) 
  187.     {
  188.         item_html = '<a ';
  189.         item_html += (news.items[i].link == null) ? "" : 'href="javascript:void(0)" onclick="flyoutIndex = ' + i + '; showFlyout()">';
  190.         item_html += (news.items[i].title == null ) ? "(no title)</a>" : news.items[i].title + "</a>";
  191.         item_html += (news.items[i].description == null) ? "" : "<br>" + decodeHTML(news.items[i].description);
  192.         document.getElementById( (i-currentPosition) + '' ).innerHTML = item_html;
  193.     }
  194.     
  195.     var posText = (currentPosition + 1) + '-' + ((currentPosition + noItems)>news.items.length?news.items.length:(currentPosition + noItems)) + '/' + news.items.length;
  196.     position.innerHTML = posText;
  197.  
  198.     System.Gadget.Settings.write("currentFeed", currentFeed);
  199.     showMessage("");
  200.     return true;
  201. }
  202.  
  203. /* Display a message to the user */
  204. function showMessage( msg )
  205. {
  206.     message.style.visibility = "visible";
  207.     messageText.innerHTML = msg;
  208.     if ( msg == "" ) message.style.visibility = "hidden";
  209. }
  210.  
  211. /* Loads the current theme or the default one */
  212. function loadTheme()
  213. {
  214.     var themeName = System.Gadget.Settings.read('theme');
  215.     if ( themeName == "" ) themeName = "default";
  216.     document.styleSheets(1).href = 'themes/' + themeName + '/style.css';
  217.     resizeGadget();    
  218. }
  219.  
  220. /* Show the flyout when mouse is over an item */
  221. function showFlyout()
  222. {
  223.     if ( flyoutIndex >= news.items.length )
  224.     {
  225.         System.Gadget.Flyout.show = false;
  226.         return true;
  227.     }
  228.     System.Gadget.Flyout.file = "Flyout.html";
  229.     System.Gadget.Flyout.show = true;
  230. }
  231.  
  232. /* Clear the contents of the gadget */
  233. function clear()
  234. {
  235.     for ( var i = 0; i < 8; i++ )
  236.         document.getElementById(i+'').innerHTML = '';
  237. }
  238.  
  239. /* Displays the next feed when clicking the top right arrow */
  240. function getNextFeed()
  241. {
  242.     var noFeeds = System.Gadget.Settings.read("noFeeds");
  243.     if ( noFeeds == "" || noFeeds < 2 ) return true;
  244.     currentFeed = (currentFeed+1) % noFeeds;
  245.     getNews();    
  246. }
  247.  
  248. /* Displays the previous feed when clicking the top left arrow */
  249. function getPreviousFeed()
  250. {
  251.     var noFeeds = System.Gadget.Settings.read("noFeeds");
  252.     if ( noFeeds == "" || noFeeds < 2 ) return true;
  253.     currentFeed--;
  254.     if ( currentFeed < 0 ) currentFeed = noFeeds-1;
  255.     getNews();    
  256. }
  257.  
  258. /* Converts < and > into < and > */
  259. function decodeHTML(text)
  260. {
  261.     var ctom = /<([^&]*)>/g;
  262.     return text.replace(ctom,"<$1>");
  263. }
  264.  
  265. /* Scroll one page up */
  266. function previousPage()
  267. {
  268.     currentPosition = (currentPosition - noItems >= 0) ? currentPosition - noItems : ((news.items.length - news.items.length%noItems)); 
  269.     if ( currentPosition >= news.items.length ) currentPosition -= noItems;
  270.     clear();
  271.     showNews(news);
  272. }
  273.  
  274. /* Scroll one page down */
  275. function nextPage()
  276. {
  277.     currentPosition = (currentPosition + noItems) >= news.items.length ? 0 : (currentPosition + noItems); 
  278.     clear();
  279.     showNews(news);
  280. }
  281.  
  282. /* Navigates through the feeds automatically */
  283. function autoScroll()
  284. {
  285.     nextPage();
  286.     if ( currentPosition == 0 ) getNextFeed();
  287.     else setTimeout( "autoScroll();", 30000 );
  288. }
  289.  
  290. /* Current position in the feed */
  291. var currentPosition = 0;
  292.  
  293. /* The index of the item that must be displayed in the flyout */
  294. var flyoutIndex = 0;
  295.  
  296. /* The news items */
  297. var news;
  298.  
  299. /* The index of the current feed in the list */
  300. var currentFeed = ( (System.Gadget.Settings.read("currentFeed") == "" ) ? 0 : System.Gadget.Settings.read("currentFeed") );
  301.  
  302. /* Number of items to display on a page */
  303. var noItems = ( (System.Gadget.Settings.read("noItems") == "" ) ? 4 : System.Gadget.Settings.read("noItems") );
  304.  
  305.  
  306.  
  307.