// This set of RSS utilities relies upon these DHTML element functions
//    to be predefined...
//  1) getElement(id)
//  2) appendInnerHTML(id, newHTML)

// global flag
var isIE = false;

// global request and XML document objects
var req;
var channelElemId;
var itemsElemId;
var maxItems = 999;

// FUNCTION: Loads an XML document (from current domain)
// PARAMETER: URL string (relative or complete) to an .xml file whose 
//              Content-Type is a valid XML type, such as text/xml
function loadXMLDoc(url, channelId, itemsId, numberOfItems) 
{
  channelElemId = channelId;
  itemsElemId = itemsId;
  if (numberOfItems)
    maxItems = numberOfItems;
  else
    maxItems = 999;
    
  // branch for native XMLHttpRequest object
  if (window.XMLHttpRequest) 
  {
    req = new XMLHttpRequest();
    req.onreadystatechange = processReqChange;
    req.open("GET", url, true);
    req.send(null);
  } 
  else if (window.ActiveXObject) 
  { // branch for IE/Windows ActiveX version
    isIE = true;
    req = new ActiveXObject("Microsoft.XMLHTTP");
    if (req) 
    {
      req.onreadystatechange = processReqChange;
      req.open("GET", url, true);
      req.send();
    }
  }
  else
  {
    alert("No supporting function for XML Doc Load");
  }
}

// handle onreadystatechange event of req object
function processReqChange() 
{
  // only if req shows "loaded"
  if (req.readyState == 4) 
  {
    // only if "OK"
    if (req.status == 200) 
    {
      showChannelInfo(channelElemId)
      showItems(itemsElemId, maxItems);
    } 
    else
    {
      alert("There was a problem retrieving the XML data:\n" + req.statusText);
    }
  }
}

var months =  [ "January", "February", "March", "April", "May", "June"
              , "July", "August", "September", "October", "November", "December" 
              ];

function formatDate(dateString)
{
  thisDate = new Date(dateString);
  
  if (thisDate)
  {
    hour = thisDate.getHours();
    minute = thisDate.getMinutes();
    timeStr = "";
       
    if ((hour != 0) || (minute != 0))
    {
      if (minute < 10)
        minuteStr = "0" + minute + "";
      else
        minuteStr = minute + "";
      am_pm = " PM";     
	  if (hour < 12)
	  {
	    am_pm = " AM";
	    if (hour == 0)
	    {
	      hour = 12;
	    }
	  }
	  else if (hour > 12)
	  {
	    hour -= 12;
	  }
      timeStr = hour + ":" + minuteStr + am_pm;
    }
    return  months[thisDate.getMonth()] + " " + thisDate.getDate() 
            + ", " + thisDate.getFullYear() + " " + timeStr;
  }
  return "";
}

// Get All Item elements and display summary info for each
function showChannelInfo(elemID) 
{
  var rssChannelArea = getElement(elemID);
  if (rssChannelArea)
  {
    clearInnerHTML(elemID);
    var channels = req.responseXML.getElementsByTagName("channel");
    if (channels)
    {
      channel = channels[0];
      newHTML = '<SPAN class="rssh">'
              + '\n<P class="rssh">'
              + '\n' + getElementTextNS("", "title", channel, 0)
              + '\n</P>' 
              + '\n<P class="rssh">'
              + '\n' + getElementTextNS("", "description", channel, 0)
              + '\n</P>' 
              + '\n<P class="rssh">'
              + '\n' + formatDate(getElementTextNS("", "lastBuildDate", channel, 0))
              + '\n</P>'
              + '\n</SPAN>'; 
              
      appendInnerHTML(elemID, newHTML);
    }
  }
}
// Get All Item elements and display summary info for each
function showItems(elemID, numberOfItems) 
{
  var rssItemsArea = getElement(elemID);
  if (rssItemsArea)
  {
    clearInnerHTML(elemID);
    var items = req.responseXML.getElementsByTagName("item");
    // loop through <item> elements, and add each nested
    // <title> element to Topics select element
    for (var i = 0; (i < items.length) && (i < numberOfItems); i++) 
    { 
      link = getElementTextNS("", "link", items[i], 0);
      newHTML = '<H3 class="rsst">';
      if (link)
      {
        newHTML = '\n<A class="rssl" href="' + link + '">';
      }
      newHTML += getElementTextNS("", "title", items[i], 0);
      if (link)
      {
        newHTML += '</A>';
      }
      
      pubDate = getElementTextNS("", "pubDate", items[i], 0);
      newHTML +=  '\n<BR/>';
      if (pubDate != 'n/a')
      {
        newHTML +=  '<SPAN class="rssdt">(' 
                +   '\n ' + formatDate(pubDate)
                +   '\n</SPAN>)';
      }
      newHTML +=  '\n</H3>'
              +   '\n<P class="rssd">' 
              +   '\n ' + getElementTextNS("", "description", items[i], 0)
              +   '\n</P>';
      
      appendInnerHTML(elemID, newHTML);
    }
  }
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) 
{
  var result = "";
  if (prefix && isIE) 
  {
    // IE/Windows way of handling namespaces
    result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
  } 
  else
  {
    // the namespace versions of this method 
    // (getElementsByTagNameNS()) operate
    // differently in Safari and Mozilla, but both
    // return value with just local name, provided 
    // there aren't conflicts with non-namespace element
    // names
    result = parentElem.getElementsByTagName(local)[index];
  }
  if (result)
  {
    // get text, accounting for possible
    // whitespace (carriage return) text nodes 
    if (result.childNodes.length > 1) 
    {
      return result.childNodes[1].nodeValue;
    } 
    else
    {
      return result.firstChild.nodeValue;       
    }
  } 
  else
  {
    return "n/a";
  }
}