// File: rss_parse.js

function NewsFeedItem (titleItem, linkItem, descItem) {
   //---[ Instance variables ]-------------
   var _titleItem;
   var _linkItem;
   var _descItem;
   var _visible;

   //---[ Public methods ]-------------
   this.titleItem = function () { return _titleItem; }
   this.toggleState = function () {
      _visible = !_visible;
   }

   this.itemHtml = function () {
      var html = null;
      var title = titleItemText();
      if (title  && title != "") {
         html = '<div class="rssitem" onmouseover="newsItemMenu.mouseover(this)" onmouseout="newsItemMenu.mouseout(this)" onclick="newsItemMenu.click(this)">';
         html += titleHtml();
         html += descHtml();
         html += '</div>';
      }
      return html;
   }

   //---[ Private methods ]-------------
   function titleItemText () { return itemText(_titleItem); }
   function linkItemText () { return itemText(_linkItem); }
   function descItemText () { return itemText(_descItem); }

   function itemText (item) {
      if (item != null && item.firstChild != null) {
         return item.firstChild.data;
      }
      else {
         return null;
      }
   }

   function titleHtml () {
      var html;
      html = '<span class="rsstitle">'
           +  titleItemText()
           + '</span>';
      return html;
   }

   function descHtml () {
      var html;
      //html = _visible? '<span class="rssdesc">' : '<span class="rssdeschidden">';
      html = '<span class="rssdesc">';
      html +=  descItemText()
           +   '... <a class="rssmore" href="' + linkItemText() + '" target="_blank">[More...]</a>'
           + '</span>';
      return html;
   }
   
   //---[ Initialization ]-------------
   _titleItem = titleItem;
   _linkItem  = linkItem;
   _descItem  = descItem;
   _visible   = false;
}

function NewsFeed (feedUrl, destDivName) {
   //---[ Instance variables ]-------------
   var _url = feedUrl;         // URL of RSS feed
   var _httpreq;     // XMLHttpRequest object
   var _reqProxy;    // local request proxy service
   var _targetDivName = destDivName;
   var _targetDiv;   // where the newsfeed will be displayed
   var _feedDoc;     // document element of RSS (or RDF) doc
   var _feedType;    // "rss", "rdf", or "unknown"
   var _feedVersion; // version of feed
   var _feedTitle;   // title from XML doc
   var _feedLink;    // URL of feed source, from XML doc
   var _feedDesc;    // feed description, from XML doc
   var _items;       // array of NewsFeedItem objects
   var _itemState;   // array of open/closed flags for items
   var _newsItems = new Array;

   //---[ Public methods ]-------------
   this.setUrl = function (aurl) { _url = aurl; }
   this.setReqProxy = function (proxy) { _reqProxy = proxy; }
   this.setDiv = function (divName) {
      _targetDiv = document.getElementById(divName);
   }

   //---[ Private methods ]-------------

   // Set the contents of the target div
   function show_content (html) {
      if (_targetDiv != null) {
         _targetDiv.innerHTML = html;
      }
   }

   // Wraps the html in a <div class="rssstatus"></div>
   function show_status (html) {
      show_content('<div class="rssstatus">' + html + '</div>');
   }

   function get_xml_file (/*url, divname*/) {
      try {
         _httpreq = getHTTPObject();

         if (_url == "") return; // must have a URL

         var proxyurl = _reqProxy + escape(_url);
      //alert("proxyurl = " + proxyurl);
         try {
            _httpreq.open("GET", proxyurl, true);
         } catch (e) {
            show_status("Browser won't allow access to RSS feed");
            return;
         }
         _httpreq.onreadystatechange = function () {
            if (_httpreq.readyState == 4) { // 4 == COMPLETED
               show_status("Parsing news feed ...");

               last_xml_response = _httpreq.responseXML;
               if (last_xml_response != null) {
                  var nItems = collectNewsItems();
                  if (nItems <= 0) {
                     show_status("No news from " + _url);
                  }
                  else {
                     displayNewsItems();
                  }
               }
            }
         };
         show_status("Retrieving news feed ...");
         _httpreq.send(null); // send the request
      } catch (e) {
         show_status("No access to news feed at "+ _url + " from here.");
      }
   }

   // Toggle the display state of the item's description
   function toggle_item (item) {
alert("in toggle_item");
      for (var i = 0; i < _items.length; i++) {
         if (_newsItems[i].titleItem() == item) {
alert("found item");
            _newsItems[i].toggleState();
         }
      }
   }

   function collectNewsItems () {
      var response = _httpreq.responseXML;
      if (response == null) return 0;

      var doc = response.documentElement;
      if (doc == null) return 0;

      if (_items == null) {
         _items = doc.getElementsByTagName("item");
         _itemState   = new Array();
         _feedTitle   = get_feed_title(doc);
         _feedLink    = get_feed_link(doc);
         _feedDesc    = get_feed_desc(doc);
         _feedType    = get_feed_type(doc);
         _feedVersion = get_feed_version(doc);
      }

      show_status("Parsing news feed " + _items.length + " items ...");

      for (var i = 0; i < _items.length; i++) {
         var title = _items[i].getElementsByTagName("title")[0];
         if (title != null && title.firstChild != null && title.firstChild.data != null) {
            var title_text = title.firstChild.data;
            var link  = _items[i].getElementsByTagName("link")[0];
            var desc  = _items[i].getElementsByTagName("description")[0];
            var rssItem = new NewsFeedItem(title, link, desc);
            _newsItems.push(rssItem);
         }
      }
      return _newsItems.length;
   }

   function displayNewsItems () {
      var typeVer = _feedType;
      if (_feedVersion != null) typeVer += ' ' + _feedVersion;
      var html = '<span class="rssurl">'
                 + '<a href="' + _feedLink + '" title="' + _feedDesc + '">'
                 + _feedTitle + '</a> '
                 //+ '<a href="' + _url + '">['
                 //+ _feedType + ' ' + _feedVersion + ']</a></span>';
                 + '<a href="' + _url + '"><img class="feedicon" src="images/feed-icon-16x16.gif" width="16" height="16" alt="'
                 + typeVer + '" /></a></span>';
   
      for (var i = 0; i < _newsItems.length; i++) {
         html += _newsItems[i].itemHtml();
      }
      show_content(html);
newsItemMenu = new NavMenu(_targetDivName, "div", "rssitem", "rssitemhighlight", "rssitemactive");
//newsItemMenu.setMouseOverFunc(toggle_item);
   }

   function get_feed_type (doc) {
      var type = doc.nodeName;
      if (type != null) {
         switch (type) {
         case "rdf":
         case "rdf:RDF":
            type = "RDF";
            break;
         case "rss":
            type = "RSS";
         default:
            break;
         }
      }
      return type;
   }

   function get_feed_version (doc) {
      var type = get_feed_type(doc);
      if (type == null) return null;

      var ver = null;
      switch (type) {
      case "RDF":
      case "RSS":
         ver = doc.getAttribute("version");
         break;
      default:
         break;
      }

      return ver;
   }

   function get_feed_title (doc) {
      var chan = doc.getElementsByTagName("channel");
      if (chan != null) {
         var title = doc.getElementsByTagName("title");
         if (title != null && title.length > 0 &&
             title[0] != null && title[0].firstChild != null) {
            return title[0].firstChild.data;
         } 
      }
   }

   function get_feed_link (doc) {
      var chan = doc.getElementsByTagName("channel");
      if (chan != null) {
         var title = doc.getElementsByTagName("link");
         if (title != null && title.length > 0 &&
             title[0] != null && title[0].firstChild != null) {
            return title[0].firstChild.data;
         } 
      }
   }

   function get_feed_desc (doc) {
      var chan = doc.getElementsByTagName("channel");
      if (chan != null) {
         var title = doc.getElementsByTagName("description");
         if (title != null && title.length > 0 &&
             title[0] != null && title[0].firstChild != null) {
            return title[0].firstChild.data;
         } 
      }
   }

   //---[ Initialization ]-------------
//alert("NewsFeed about to init()");
   //init(feedUrl, destDivName);

   _itemState = null;
   this.setUrl(feedUrl);
   this.setDiv(destDivName);
   this.setReqProxy("/cgi-bin/simplereq.pl?req="); // real
   //this.setReqProxy("http://www.precisionlightworks.com/cgi-bin/simplereq.pl?req="); // debug
   get_xml_file();
}

function get_rss_feed () {
   // Get selected feed
   var lbfeeds = document.getElementById("lbfeeds");
   if (lbfeeds != null && lbfeeds.value != "") {
      get_xml_file(lbfeeds.value, "content");
   }
}

function load_rss_feed (url, divname) {
   get_xml_file(url, divname);
}



/*function dump_format () {
   var kids = doc.childNodes;
   var msg = "nodes: ";
   if (kids != null) {
alert("kids=" + kids.length);
      for (var i = 0; i < kids.length; i++) {
         msg += kids[i].nodeName + "\n";
      }
   }
   alert(msg);
   var chans = doc.getElementsByTagName("channel");
   if (chans.length > 0) {
      alert("get_feed_version: chans[0]\n" + chans[0]);
   }
}*/

// rdf:
//   <rdf>
//     <channel>
//         <title>...</title>
//         <link>...</link>
//         <description>...</description>
//     </channel>
//     <item>
//       <title>...</title>
//       <description>...</description>
//       <link>...</link>
//       <pubDate>...</pubDate>
//     </item>
//     <item>...</item>
//   </rdf>

// rss 0.91:

// rss 0.92:

// rss 1.0:

// rss 2.0:
//   <rss>
//     <channel>
//       <title>...</title>
//       <description>...</description>
//       <link>...</link>
//       <item>
//         <title>...</title>
//         <description>...</description>
//         <link>...</link>
//         <pubDate>...</pubDate>
//       </item>
//       <item>...</item>
//     <channel>
//   </rss>
