home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 June (DVD) / DPPRO0605DVD.iso / Install / program files / Borland / BDS / 3.0 / Welcomepage / JS / RSS.JS < prev    next >
Encoding:
JavaScript  |  2004-10-22  |  12.4 KB  |  496 lines

  1.     /*
  2.     BDS Welcome Page RSS Feed Processing
  3.  
  4.     Copyright (c) 2004 Borland Software Corporation
  5.  
  6.     Rewritten by Daniel Wischnewski.
  7.     Co-Admin of www.delphipraxis.net -- The German Delphi Community
  8.     Email: dwischnewski@gatenetwork.com
  9. */
  10.  
  11. var clientIsOnline;
  12. var clientUsesProxy;
  13. var clientProxyString;
  14. var clientAppDataFolder;
  15.  
  16. var FEED_OK                 = 00;
  17. var FEED_OFFLINE            = 01;
  18. var FEED_CACHE          = 02;
  19. var FEED_CONN_ERROR         = 10;
  20. var FEED_NODATA             = 11;
  21. var FEED_XML4_ERROR              = 12;
  22. var FEED_OFFLINE_NODATA          = 13;
  23.  
  24. var radBlog;
  25. radBlog = "";
  26.  
  27. function appendItemNode(item, tag, aclass)
  28. {
  29.     var node;
  30.     
  31.     node = document.createElement(tag);
  32.     if (aclass != "")
  33.     {
  34.         node.className = aclass;
  35.     }
  36.     item.appendChild(node);
  37.     return node;
  38. }
  39.  
  40. function createRSSItem(channel, item, counter)
  41. {
  42.     var strDesc;
  43.     var title;
  44.     var link;
  45.     var node;
  46.     var strDate;
  47.  
  48.     if (item == null | channel == null)
  49.     {
  50.         return;
  51.     }
  52.     title = getItemValue(item, "title");
  53.     if (title == "")
  54.     {
  55.         return;
  56.     }
  57.     // insert list item
  58.     link = getItemValue(item, "link");
  59.     itemli = document.createElement("li");
  60.     if (counter % 2 == 0)
  61.     {
  62.         itemli.className = "item0";
  63.     } else {
  64.         itemli.className = "item1";
  65.     }
  66.     channel.appendChild(itemli);
  67.     // create <div> area and insert text data
  68.     node = itemli.appendChild(document.createElement("div"));
  69.     node.className = "title";
  70.     node = appendItemNode(node, "A", "title");
  71.     node.innerHTML = title;
  72.     node.href = link;
  73.     strDesc = getItemValue(item, "description");
  74.     if (strDesc != "")
  75.     {
  76.         if (strDesc.length > 500)
  77.         {
  78.             strDesc = strDesc.substr(0, 500) + " [<a href='" + link + "'>...</a>]";
  79.         }
  80.         node = appendItemNode(itemli, "div", "description");
  81.                 try
  82.         {
  83.             node.innerHTML = strDesc;
  84.         } catch(e) {
  85.             re = /<[/]?[pP]([^>]*)?>/g;
  86.             strDesc = strDesc.replace(re, "<br>");
  87.             re = /<[^b][^r][^>]*?>/g;
  88.             strDesc = strDesc.replace(re, "");
  89.             node.innerHTML = strDesc;
  90.         }
  91.     }
  92.     strDate = getDateItemValue(item, "pubDate");
  93.     if (strDate != "")
  94.     {
  95.         node = appendItemNode(itemli, "div", "pubDate");
  96.         node.innerText = getLangText("postedon") + " " + strDate;
  97.     }
  98.     if(getItemValue(item, "comments") != "")
  99.     {
  100.         node = appendItemNode(node, "A", "comments");
  101.         node.innerText = " Comments";
  102.         node.href = getItemValue(item, "comments");
  103.     }
  104. }
  105.  
  106. function doDownloadNews(feedNode, cacheXml, timeOut, xmlPersonal, date)
  107. {
  108.     var wpTools;
  109.   var xmlHTTP;
  110.     var lResolve;
  111.     var lConnect;
  112.     var lSend;
  113.     var lReceive;
  114.   var xmlDoc;
  115.  
  116. //  try
  117. //  {
  118. //    wpTools = new ActiveXObject("BDNWelcomePage.ClientTools");
  119. //    clientIsOnline = wpTools.IsOnline;
  120. //    clientUsesProxy = wpTools.UsesProxy;
  121. //    clientProxyString = wpTools.ProxyString;
  122. //  } catch (e) {
  123. //    clientIsOnline = true;
  124. //    clientUsesProxy = false;
  125. //    clientProxyString = '';
  126. //  }
  127.   clientIsOnline = external.Application.IsOnline;
  128.   clientUsesProxy = external.Application.UsesProxy;
  129.   clientProxyString = external.Application.ProxyString;
  130.   clientUserAgentString = external.Application.UserAgent;
  131.   // no download in offline mode
  132.   if (!clientIsOnline)
  133.     return FEED_OFFLINE;
  134.   // get server xml http object
  135.   try
  136.   {
  137.     xmlHTTP = getXmlHttpDoc();
  138.   }
  139.   catch(e)
  140.   {
  141.       return FEED_XML4_ERROR;
  142.   }
  143.   // download news feed
  144.   if (getItemValue(cacheXml, "@link").indexOf("://") >= 0)
  145.   {
  146.       isLocal = false;
  147.       try
  148.       {
  149.         if(feedNode.getAttributeNode("localcontent") == null)
  150.         {
  151.             lResolve = timeOut * 1000;    // Timeout values are in milli-seconds
  152.             lConnect = 30 * 1000;
  153.             lSend = 30 * 1000;
  154.             lReceive = 30 * 1000;
  155.             xmlHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive);
  156.             xmlHTTP.open("GET", getItemValue(cacheXml, "@link"), false);
  157.             xmlHTTP.setRequestHeader("User-Agent", clientUserAgentString);
  158.             xmlHTTP.send();
  159.             if (xmlHTTP.status != 200)
  160.               return false;
  161.             xmlDoc = getXmlDoc();
  162.             xmlDoc.load(xmlHTTP.responseXML);
  163.         }
  164.         else
  165.         {
  166.             xmlDoc = getXmlDoc();
  167.             xmlDoc.load(appPath + "..\\welcomepage\\" + getItemValue(cacheXml, "@link"));
  168.         }
  169.       }
  170.       catch(e)
  171.       {
  172.         return FEED_CONN_ERROR;
  173.       }
  174.   } else {
  175.       isLocal = true;
  176.       xmlDoc = getXmlDoc();
  177.       xmlDoc.load(appPath + '..\\Welcomepage\\' + getItemValue(cacheXml, "@link"));
  178.   }
  179.     // quick'n dirty remove off all subnodes
  180.     cacheXml.text = "";
  181.     if (!isLocal)
  182.         setAttrValue(cacheXml, "lastLoad", date.toLocaleDateString());
  183.     items = xmlDoc.getElementsByTagName("item");
  184.     for (var i = 0; i < items.length; i++)
  185.     {
  186.       cacheXml.appendChild(items[i]);
  187.     }
  188.     savePersonalSettings(xmlPersonal);
  189.     return FEED_OK;
  190. }
  191. /*
  192.     processRSS - Downloads RSS feed and builds HTML content from the contents
  193.     The format of the content is as follows:
  194.  
  195.     <div class="channel">
  196.         <ul>
  197.             <li class="item0"><div class="title"><a class="title" href="(url)">title</a>
  198.                 <div class="description">description</div>
  199.                 <div class="pubDate">pubDate <a class="comments" href="comments_link">Comments</a></div>
  200.         ...
  201.         </ul>
  202.     </div>
  203. */
  204. function processRSS(feedNode, rssContent, timeOut, xmlPersonal)
  205. {
  206.   var downloadNews;
  207.   var downloadResult;
  208.   var cacheXml;
  209.   var URI;
  210.   var date;
  211.   var channel;
  212.   var channelList;
  213.   var items;
  214.   var maxItems;
  215.  
  216.   downloadNews = false;
  217.   date = new Date();
  218.  
  219.   // check cached feed data
  220.   if (getItemValue(feedNode, "reload") == "1")
  221.   {
  222.       downloadNews = true;
  223.     getSubNode(feedNode, "reload").text = "0";
  224.     savePersonalSettings(xmlPersonal);
  225.   }
  226.   URI = getItemValue(feedNode, "link");
  227.   cacheXml = getSubNodeEx(getSettingsNode(xmlPersonal), "lastFeed", "link", URI);
  228.   if (getItemValue(cacheXml, "@lastLoad") != date.toLocaleDateString())
  229.     downloadNews = true;
  230.     if (downloadNews)
  231.   {
  232.       downloadResult = doDownloadNews(feedNode, cacheXml, timeOut, xmlPersonal, date);
  233.   } else {
  234.     downloadResult = FEED_CACHE;
  235.   }
  236.  
  237.   // get feed content
  238.     items = cacheXml.selectNodes(".//item");
  239.     maxItems = items.length;
  240.   if (maxItems == 0)
  241.   {
  242.       if (downloadResult == FEED_OK)
  243.         return FEED_NODATA;
  244.       if (downloadResult == FEED_OFFLINE)
  245.         return FEED_OFFLINE_NODATA;
  246.     return downloadResult;
  247.   }
  248.   // limit to 10 entries displayed on welcome page
  249.     if (maxItems > 10)
  250.     {
  251.         maxItems = 10;
  252.     }
  253.  
  254.   // get news feed view layer
  255.     channel = document.createElement("div");
  256.     channel.className = "channel";
  257.     channelList = document.createElement("ul");
  258.     rssContent.appendChild(channel);
  259.     channel.appendChild(channelList);
  260.  
  261.   // display news feed
  262.     for (var i = 0; i < maxItems; i++)
  263.     {
  264.         createRSSItem(channelList, items[i], i);
  265.     }
  266.      return downloadResult;
  267. }
  268.  
  269. function determineDefaultFeed(xmlPersonal)
  270. {
  271.     var item;
  272.     var xmlDefault;
  273.  
  274.     // check personal settings
  275.     item = getSubNode(getSettingsNode(xmlPersonal), "defaultFeed");
  276.     if (getItemValue(item, "link") == "")
  277.     {
  278.         xmlDefault = loadDefaultProviders();
  279.         item = xmlDefault.selectSingleNode(".//item[@default]");
  280.         if (item == null)
  281.         {
  282.             item = xmlDefault.selectSingleNode(".//item");
  283.         }
  284.     }
  285.     return item;
  286. }
  287.  
  288. function loadItemsIntoSelectBox(selectBox, items, defaultLink, header)
  289. {
  290.     var optionGroup;
  291.     var newOption;
  292.     var item;
  293.     var strLink;
  294.     if (items.length > 0)
  295.     {
  296.         optionGroup = appendItemNode(selectBox, "optgroup", "");
  297.         optionGroup.label = header;
  298.         optionGroup.className = "selectoptiongroup";
  299.         for (var i = 0; i < items.length; i++)
  300.         {
  301.             item = items[i];
  302.             strLink = getItemValue(item, "link");
  303.             newOption = appendItemNode(optionGroup, "option", "");
  304.             newOption.text = getItemValue(item, "title");
  305.             newOption.value = strLink;
  306.             newOption.className = "selectoption";
  307.             newOption.selected = (strLink == defaultLink);
  308.         }
  309.     }
  310. }
  311.  
  312. function fillSelectBox(selectBox, defaultLink)
  313. {
  314.     var xmlDoc;
  315.     var groups;
  316.     var group;
  317.  
  318.     if (radBlog != "")
  319.     {
  320.         optionGroup = appendItemNode(selectBox, "optgroup", "");
  321.         optionGroup.label = "Borland Internal Blogs";
  322.         optionGroup.className = "selectoptiongroup";
  323.         newOption = appendItemNode(optionGroup, "option", "");
  324.         newOption.text = "RADBlog";
  325.         newOption.value = radBlog;
  326.         newOption.className = "selectoption";
  327.         newOption.selected = (radBlog == defaultLink);
  328.     }
  329.  
  330.     xmlDoc = loadDefaultProviders();
  331.     groups = xmlDoc.selectNodes(".//group");
  332.  
  333.     for (var i = 0; i < groups.length; i++)
  334.     {
  335.         group = groups[i];
  336.         loadItemsIntoSelectBox(selectBox, group.selectNodes("item"), defaultLink, getItemValue(group, "title"));
  337.     }
  338. }
  339.  
  340. function checkRadBlog()
  341. {
  342.     var xmlHTTP;
  343.  
  344.     try
  345.     {
  346. //    try
  347. //    {
  348. //      wpTools = new ActiveXObject("BDNWelcomePage.ClientTools");
  349. //      clientIsOnline = wpTools.IsOnline;
  350. //    } catch (e) {
  351. //      clientIsOnline = true;
  352. //    }
  353.         if ((radBlog != "") && external.Application.IsOnline)
  354.         {
  355.             xmlHTTP = getXmlHttpDoc();
  356.             xmlHTTP.setTimeouts(1000, 2000, 2000, 2000);
  357.             try
  358.             {
  359.                 xmlHTTP.open("GET", radBlog, false);
  360.                 xmlHTTP.send();
  361.                 if (xmlHTTP.status == 200)
  362.                     return 0;
  363.             } catch (e) {
  364.             }
  365.         }
  366.     } catch(e) {
  367.     }
  368.     radBlog = "";
  369. }
  370.  
  371. function clearDynamicContent(rssContent, rssOffline, selectBox)
  372. {
  373.   // clear rss content area
  374.     for (var i = 0; rssContent.childNodes.length > 0; )
  375.     {
  376.         rssContent.childNodes[0].removeNode(true);
  377.     }
  378.   rssOffline.innerHTML = "";
  379.   // clear rss select box
  380.     for (var i = 0; selectBox.childNodes.length > 0; )
  381.     {
  382.         selectBox.childNodes[0].removeNode(true);
  383.     }
  384. }
  385.  
  386. function loadRSSFeed(rssContent, rssOffline, selectBox)
  387. {
  388.     var xmlPersonal;
  389.     var feedNode;
  390.     var lastFeed;
  391.     var bdsAppPath;
  392.     var newOption;
  393.  
  394.   clearDynamicContent(rssContent, rssOffline, selectBox);
  395.  
  396.   // display "please wait" in rss select box
  397.   // (this is the only place that IE will refresh on most systems)
  398.     newOption = new Option(getLangText("pleasewait"), '', '');
  399.     newOption.className = "selectoption";
  400.     selectBox.options[0] = newOption;
  401.  
  402.     checkRadBlog();
  403.     xmlPersonal = loadPersonalSettings();
  404.     feedNode = determineDefaultFeed(xmlPersonal);
  405.     fillSelectBox(selectBox, getItemValue(feedNode, "link"));
  406.  
  407.     switch (processRSS(feedNode, rssContent, 10, xmlPersonal))
  408.     {
  409.       case FEED_OFFLINE:
  410.             rssOffline.innerHTML = getLangText("offline");
  411.         break;
  412.       case FEED_CACHE:
  413.             rssOffline.innerHTML = getLangText("cached");
  414.         break;
  415.       case FEED_CONN_ERROR:
  416.             rssContent.insertAdjacentHTML("beforeEnd", getLangText("conn_error"));
  417.         break;
  418.       case FEED_NODATA:
  419.             rssContent.insertAdjacentHTML("beforeEnd", getLangText("norssdata"));
  420.         break;
  421.       case FEED_XML4_ERROR:
  422.             rssContent.insertAdjacentHTML("beforeEnd", getLangText("xml4error"));
  423.         break;
  424.     case FEED_OFFLINE_NODATA:
  425.             rssContent.insertAdjacentHTML("beforeEnd", getLangText("nodata"));
  426.         break;
  427.     }
  428.  
  429.   // remove "please wait" option
  430.     selectBox.options[0] = null;
  431. }
  432.  
  433. function saveSettings(selectBox)
  434. {
  435.     var idx;
  436.     var newFeedUrl;
  437.     var newFeedTxt;
  438.     var xmlPersonal;
  439.     var defaultFeed;
  440.  
  441.     idx = selectBox.selectedIndex;
  442.     newFeedUrl = selectBox[idx].value;
  443.     newFeedTxt = selectBox[idx].text;
  444.  
  445.     xmlPersonal = loadPersonalSettings();
  446.     defaultFeed = getSubNode(getSettingsNode(xmlPersonal), "defaultFeed");
  447.     getSubNode(defaultFeed, "link").text = newFeedUrl;
  448.     getSubNode(defaultFeed, "title").text = newFeedTxt;
  449.     getSubNode(defaultFeed, "reload").text = "1";
  450.     savePersonalSettings(xmlPersonal);
  451. }
  452.  
  453. function reloadRSSFeed()
  454. {
  455.     var rssContent;
  456.     var selectBox;
  457.   var rssOffline;
  458.  
  459.     rssContent = document.getElementById("rsscontent");
  460.   rssOffline = document.getElementById("rssoffline");
  461.     selectBox = document.getElementById("rssfeeds");
  462.  
  463.   saveSettings(selectBox);
  464.   // load selected feed
  465.     loadRSSFeed(rssContent, rssOffline, selectBox);
  466. }
  467.  
  468. function InitializePage()
  469. {
  470.     var WPTools;
  471.     var rssContent;
  472.     var selectBox;
  473.   var rssOffline;
  474.  
  475. //    try
  476. //    {
  477. //        WPTools = new ActiveXObject("BDNWelcomePage.ClientTools");
  478. //        clientAppDataFolder = WPTools.AppDataFolder;
  479. //    } catch (e) {
  480. //        clientAppDataFolder = appPath;
  481. //    }
  482.  
  483.     clientAppDataFolder = external.Application.AppDataFolder;
  484.  
  485.     rssContent = document.getElementById("rsscontent");
  486.     rssOffline = document.getElementById("rssoffline");
  487.     selectBox = document.getElementById("rssfeeds");
  488.  
  489.     RenderProjectsModule();
  490.     loadLanguageStrings();
  491.         if(menuBar)
  492.                 loadLocalContent('menuBar');
  493.         if(rssContent)
  494.             loadRSSFeed(rssContent, rssOffline, selectBox);
  495. }
  496.