var org = {p3k: ({url:"http://news.thomasnet.com/conewsxml/400443", xml:"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!-- generator=\"FeedCreator 1.7.1\" -->\n<rss version=\"2.0\">\n    <channel>\n        <title>RSS Feed for Boston Gear</title>\n        <description>ThomasNet News is a service of ThomasNet.com</description>\n        <link>http://news.thomasnet.com</link>\n        <lastBuildDate>Sun, 05 Sep 2010 23:29:01 -0400</lastBuildDate>\n        <generator>FeedCreator 1.7.1</generator>\n        <image>\n            <url>http://news.thomasnet.com/images/header/TN_News_footer.gif</url>\n            <title>Powered by ThomasNet News</title>\n            <link>http://news.thomasnet.com</link>\n            <width>129</width>\n            <height>38</height>\n        </image>\n        <item>\n            <title>Worm Gear Speed Reducer suits food and beverage industry.</title>\n            <link>http://news.thomasnet.com/fullstory/Worm-Gear-Speed-Reducer-suits-food-and-beverage-industry-812223</link>\n            <description>\nOffering maximum corrosion resistance in caustic wash down environments, Stainless Steel 700 Series Worm Gear Speed Reducer comes with housings, motor flange, and carrier crafted from 316SS. Rounded housing design, plastic hardware covers, and 2-piece mounting base prevent particle accumulation or fluid pooling on or under unit. Large internal oil reservoir is filled with H1 food-grade lubricant and sealed for life, providing wide range of operating temperatures.\n&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/worm-gear-speed-reducers-66721200-1.html' target='_blank''&gt;Worm Gear Speed Reducers&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Fri, 08 Feb 2008 07:56:08 -0400</pubDate>\n        </item>\n        <item>\n            <title>\nNew Brochure on High Precision Planetary Gearheads from Boston Gear\n </title>\n            <link>http://news.thomasnet.com/companystory/New-Brochure-on-High-Precision-Planetary-Gearheads-from-Boston-Gear-486855</link>\n            <description>\nJune 7, 2006 - Quincy, Mass. - Boston Gear has published a full color, 36-page brochure to introduce new High Precision Helical Planetary Gearheads - a complete line of high-quality gearheads designed for direct attachment to popular servo and stepper motors.\n\n   Planetary gearheads combine the load-sharing attributes of multiple-tooth contacts with balanced operation at high speeds. That makes them ideal for servo-driven solutions to packaging, medical, material handling, robotics, ...</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Fri, 09 Jun 2006 08:06:18 -0400</pubDate>\n        </item>\n        <item>\n            <title>Gearheads attach directly to servo and stepper motors.</title>\n            <link>http://news.thomasnet.com/fullstory/Gearheads-attach-directly-to-servo-and-stepper-motors-485413</link>\n            <description>\nSuited for packaging, medical, material handling, robotics, and automotive applications, Helical Planetary Precision Gearheads feature planet carrier design, I/O sealing designs, and heat and surface treatments. All exposed gearhead parts are SS with housings available in black anodized aluminum or epoxy-coated. Gearheads provide high output torque, quiet operation, and reduced backlash.\n&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/precision-gearheads-33547506-1.html' target='_blank''&gt;Precision Gearheads&lt;/a&gt;  |  &lt;a href='http://www.thomasnet.com/products/planetary-gearheads-33547407-1.html' target='_blank''&gt;Planetary Gearheads&lt;/a&gt;  |  &lt;a href='http://www.thomasnet.com/products/helical-gearheads-33547159-1.html' target='_blank''&gt;Helical Gearheads&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Wed, 24 May 2006 08:12:04 -0400</pubDate>\n        </item>\n        <item>\n            <title>Overload Clutch delivers reliable torque protection.</title>\n            <link>http://news.thomasnet.com/fullstory/Overload-Clutch-delivers-reliable-torque-protection-476861</link>\n            <description>\nFeaturing zero backlash performance, Centrigard&amp;#174; torque-timing clutch incorporates stainless steel trip plate that promotes utility and wear life of unit. Product has torque range of 100-1,200 lb-in. and is suited for use in packaging lines as well as other applications that require torque-limiting rotational timing.\n&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/torque-limiting-clutches-15581408-1.html' target='_blank''&gt;Torque Limiting Clutches&lt;/a&gt;  |  &lt;a href='http://www.thomasnet.com/products/overload-releasing-clutches-15530207-1.html' target='_blank''&gt;Overload Releasing Clutches&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Thu, 16 Mar 2006 07:05:01 -0400</pubDate>\n        </item>\n        <item>\n            <title>Flange Adapter streamlines material handling conveyors.</title>\n            <link>http://news.thomasnet.com/fullstory/Flange-Adapter-streamlines-material-handling-conveyors-472743</link>\n            <description>\nDirect-mount, worm gear speed reducer, Model CFA700 replaces heavy chain drive on material handling conveyors and is interchangeable with standard 2- and 4-bolt mounted bearings. Adapter attaches to existing side rails, so conveyor redesign is not required. Rubber mounting pads and bushing limit vibration and noise, while PosiVent&amp;#174; Pressure Equalization System eliminates need for conventional pressure vents, and OSHA end cap cover limits exposure to moving parts in aisle.\n&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/material-handling-storage' target='_blank''&gt;Material Handling and Storage&lt;/a&gt; Sponsored by:  &lt;a target='_blank' href='http://news.thomasnet.com/redir.html?lnty=rssad&amp;spclid=3473&amp;prid=472743&amp;cat=1424&amp;goto=http%3A%2F%2Fwww.reidsupply.com%2FCad.aspx'&gt;Reid Supply - FREE CAD Drawings of Tens-of-Thousands of Parts!&lt;/a&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/material-handling-conveyor-parts-95996955-1.html' target='_blank''&gt;Material Handling Conveyor Parts&lt;/a&gt;  |  &lt;a href='http://www.thomasnet.com/products/worm-gear-speed-reducers-66721200-1.html' target='_blank''&gt;Worm Gear Speed Reducers&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Fri, 13 Jan 2006 07:06:12 -0400</pubDate>\n        </item>\n        <item>\n            <title>Speed Reducers feature washdown coating.</title>\n            <link>http://news.thomasnet.com/fullstory/Speed-Reducers-feature-washdown-coating-458995</link>\n            <description>Suited for speed reducers, Stainless Bost-Kleen&amp;#226;&amp;quot;&amp;#162; utilizes Bisphenol-F type epoxy, which offers chemical, pressure, and thermal resistance to prevent wear and cracking caused by caustic chemicals and high-pressure washdowns as well as scratches that may occur from contact during installation and operation. Coating is USDA and FDA accepted, BISCC certified, and available on all speed reducers.&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/paints-coatings' target='_blank''&gt;Paints and Coatings&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/chemical-resistant-coatings-15720444-1.html' target='_blank''&gt;Chemical Resistant Coatings&lt;/a&gt;  |  &lt;a href='http://www.thomasnet.com/products/speed-reducers-66580606-1.html' target='_blank''&gt;Speed Reducers&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Mon, 10 Jan 2005 08:16:33 -0400</pubDate>\n        </item>\n        <item>\n            <title>Speed Reducers have quick connect coupling system.</title>\n            <link>http://news.thomasnet.com/fullstory/Speed-Reducers-have-quick-connect-coupling-system-452638</link>\n            <description>Suited for applications with aggressive washdown, heavy shock loading, or frequent motor changes, QC 700 Series worm gear speed reducers have clean NEMA flange design that eliminates contamination during washdown process. Quick connect coupling system enables motor to connect and disconnect from reducer without requiring large alignment hole in NEMA flange. QC 700 coupling connects to motor shaft with standard Allen wrench.&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Thu, 17 Jun 2004 07:50:45 -0400</pubDate>\n        </item>\n        <item>\n            <title>Speed Reducers offer optional pressure equalization system.</title>\n            <link>http://news.thomasnet.com/fullstory/Speed-Reducers-offer-optional-pressure-equalization-system-31060</link>\n            <description>Available as an option on all Series 700 speed reducers, PosiVent&amp;#226;&amp;quot;&amp;#162; keeps water, washdown solution, and other airborne contaminants out of gearboxes in food processing and material handling applications. In aggressive production environments, PosiVent system replaces traditional vent plugs that can allow contaminants to enter gearbox during cool-down. Built with single seam, system can be mounted in any position without leakage.&lt;br&gt;&lt;br&gt;&lt;b&gt;This story is related to the following:&lt;/b&gt;&lt;br&gt;&lt;a href='http://news.thomasnet.com/news/mechanical-power-transmission' target='_blank''&gt;Mechanical Power Transmission&lt;/a&gt;&lt;br&gt;&lt;br&gt;Search for suppliers of: &lt;a href='http://www.thomasnet.com/products/speed-reducers-66580606-1.html' target='_blank''&gt;Speed Reducers&lt;/a&gt;&lt;br&gt;</description>\n            <author>info@productnews.com (ThomasNet News)</author>\n            <pubDate>Tue, 02 Mar 2004 07:39:20 -0400</pubDate>\n        </item>\n    </channel>\n</rss>\n", message:undefined, modified:(new Date(1283743741704)), baseUri:"http://p3k.org/rss/", query:"textColor=#000000&width=500&align=&fontFace=&url=http://news.thomasnet.com/conewsxml/400443&frameColor=black&compact=&showXmlButton=&setup=true&boxFillColor=white&_=1266199702602&titleBarColor=orange&maxItems=7&titleBarTextColor=black&", param:{textColor:"#000000", align:"", width:"500", fontFace:"", url:"http://news.thomasnet.com/conewsxml/400443", compact:"", frameColor:"black", showXmlButton:"", setup:"true", boxFillColor:"white", _:"1266199702602", titleBarColor:"orange", maxItems:"7", titleBarTextColor:"black"}, box:"<table class=\"rssBox\" width=\"${width}\" bgcolor=\"${frameColor}\" \n      style=\"table-layout: fixed; overflow: hidden; font-family: ${fontFace};\" \n      align=\"${align}\" cellspacing=\"1\" cellpadding=\"7\" border=\"0\">\n<tr bgcolor=\"${titleBarColor}\">\n<td>\n   ${xmlButton}\n   <strong>${title}</strong>\n   <div>\n      <small style=\"color: ${titleBarTextColor};\">${date}</small>\n   </div>\n</td>\n</tr>\n<tr bgcolor=\"${boxFillColor}\">\n<td class=\"rssBoxContent\" style=\"color: ${textColor};\">\n   ${image}\n   ${items}\n   ${input}\n   <div class=\"rssBoxPromo\" style=\"margin-top: 0px; text-align: left; \n         font: 9px verdana, sans-serif\">\n      RSS box by <a href=\"http://p3k.org/rss\">p3k.org</a>.\n   </div>\n</td>\n</tr>\n</table>\n\n", image:"<a href=\"${link}\"><img src=\"${source}\" width=\"${width}\" height=\"${height}\" \nalt=\"${title}\" title=\"${title}\" align=\"${align}\" valign=\"${valign}\" \nhspace=\"${hspace}\" vspace=\"${vspace}\" border=\"0\" /></a>\n\n", input:"<form method=\"get\" action=\"${link}\">\n${description}\n<input type=\"text\" name=\"${name}\" size=\"15\" /> <input type=\"submit\" \nvalue=\"${title}\" />\n</form>\n\n", item:"<div class=\"rssBoxItemContent\">\n${title}\n${break}\n${description}\n${buttons}\n</div><br />\n\n", date:"${year}-${month}-${day}, ${hours}:${minutes}h\n\n", link:"<a class=\"${class}\" href=\"${link}\" style=\"${style}\">${text}</a>\n", error:"<?xml version=\"1.0\"?>\n<rss version=\"error\">\n   <channel>\n      <title>RSS Box Error</title>\n      <link>${link}</link>\n      <description>This output was automatically generated to report an error \n      that occurred during a request to the JavaScript RSS Box Viewer.</description>\n      <item>\n         <title>Oops, something went wrong...</title>\n         <description>An error occurred while processing the request to the \n         JavaScript RSS Box Viewer.</description>\n      </item>\n      <item>\n         <title>An error message was returned by the server.</title>\n         <description>${message}</description>\n      </item>\n      <item>\n         <description>Most likely, this might have happened because of a \n         non-existent or invalid RSS feed URL. Please check and possibly correct \n         your input, then try again.</description>\n      </item>\n   </channel>\n</rss>\n\n"})};
function debug(str) {
   return document.write('<p><span style="background-color: yellow;">', 
         str, '</span><p>');
}

org.p3k.RssBox = function() {
   var ref;
   var ISOPATTERN = /([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9:]+).*$/;
   
   var data = org.p3k;
   data.defaults = {
      url: "http://blog.p3k.org/rss",
      maxItems: 7,
      width: 200,
      align: "",
      frameColor: "black",
      titleBarColor: "lightblue",
      titleBarTextColor: "black",
      boxFillColor: "white",
      textColor: "black",
      showXmlButton: "",
      compact: ""
   };
   
   var baseUri = data.baseUri;
    
   var getColor = function(str) {
      if (str.length === 6 && parseInt(str, 16) && str.indexOf("#") !== 0) {
         str = "#" + str;
      }
      return str.toLowerCase();
   }

   var value;
   for (var i in data.defaults) {
      value = data.param[i];
      if (!value || value.length === 0) {
         data.param[i] = data.defaults[i];
      } else if (i.indexOf("Color") > 0) {
         data.param[i] = getColor(value);
      }
   }

   // FIXME: Ugly work-around for many boxes using too small width 
   // values because the former version did not show the exact output.
   if (data.param.javascript && data.param.width < 200) {
      data.param.width = 200;
   }
   // Remove obsolete parameters from param and query
   delete data.param.javascript;
   data.query = data.query.replace("javascript=true", "");   

   var NAMESPACES = {
      dc: "http://purl.org/dc/elements/1.1/",
      rdf: "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   };

   var getUrl = function(url) {
      url = baseUri + "proxy.r?" + encodeURIComponent(url);
   
      var HttpRequest = function() {
         return (typeof XMLHttpRequest !== "undefined") ?
            new XMLHttpRequest() : new ActiveXObject("Msxml2.XMLHTTP");
      }
   
      var request = new HttpRequest();
      request.open("GET", url, false);
      request.send(null);   
      if (!request.getResponseHeader("Date")) {
         var cached = request;
         var ifModifiedSince = cached.getResponseHeader("Last-Modified") || 
               new Date(0); // January 1, 1970
         request = new HttpRequest();
         request.open("GET", url, false);
         request.setRequestHeader("If-Modified-Since", ifModifiedSince);
         request.send("");
         if (request.status === 304) {
            request = cached; 
         }
      }
      return request;
   }
   
   var getDocument = function(source) {
      if (source) {
         if (document.implementation.createDocument) {
            var parser = new DOMParser();
            var doc = parser.parseFromString(source, "text/xml");
            return doc;
         } else if (window.ActiveXObject) {
            var doc = new ActiveXObject("Microsoft.XMLDOM");
            doc.async = "false";
            doc.loadXML(source);
            return doc;
         }
      }
      return null;
   }
   
   var getError = function() {
      var msg = null, root;
      if (!xml || data.message) {
         msg = data.message || "Unknown error.";
      } else if (xml.parseError && xml.parseError.errorCode) {
         msg = xml.parseError.reason; // IExplore
      } else if (root = xml.documentElement) {
         var errorNode;
         if (root.nodeName === "parsererror") {
            msg = xml.documentElement.textContent; // Mozilla
         } else if ((errorNode = root.childNodes[0]) && 
               errorNode.nodeName === "parsererror") {
            msg = errorNode.textContent; // Safari
         } else if (!/rss|rdf|scriptingNews/i.test(xml.documentElement.nodeName)) {
            msg = "Incompatible data format. Are you sure this is an RSS feed?";
         }
      }
      return msg;
   }
   
   var getNode = function(parent, name, namespace) {
      if (namespace) {
         if (typeof parent.getElementsByTagNameNS === "undefined") {
            var elements = parent.getElementsByTagName(namespace + ":" + name);
         } else {
            var elements = parent.getElementsByTagNameNS(NAMESPACES[namespace], name);
         }
      } else {
         var elements = parent.getElementsByTagName(name);
      }
      if (elements && elements[0]) {
         return elements[0];
      }
      return null;
   }
   
   var getText = function(node) {
      if (node && node.childNodes && node.childNodes.length > 0) {
         return node.childNodes[0].nodeValue || "";
      }
      return "";
   }
   
   var trim = function(str) {
      if (str) {
         return str.replace(/^\s*(\S*)\s*$/, "$1");
      }
      return "";
   }
   
   var padZero = function(n) {
      if (n < 10) {
         return "0" + n
      }
      return n;
   }

   var encodeXml = function(str) {
      if (!str) {
         return "";
      }
      return str.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/&/g, "&amp;");
   }
      
   var render = function(template, param) {
      if (!template || !param) {
         return template;
      }
      template = template.replace(/\$\{([^}]+)\}/g, function() {
         var key = arguments[1];
         return param[key] || "";
      });
      return template;
   }
   
   var renderDate = function(date) {
      if (date.constructor !== Date) {
         var str = String(date);
         var millis = Date.parse(str.replace(ISOPATTERN, "$1/$2/$3 $4"));
         if (millis) {
            date = new Date(millis);
         } else {
            date = new Date;
         }
      }

      return render(data.date, {
         year: date.getFullYear(),
         month: padZero(date.getMonth() + 1),
         day: padZero(date.getDate()),
         hours: padZero(date.getHours()),
         minutes: padZero(date.getMinutes()),
         seconds: padZero(date.getSeconds()),
         timeZone: "" // date.getTimezoneOffset()
      });
   }
   
   var renderButtons = function(enclosure, source) {
      var result = "";
      if (enclosure && enclosure.link) {
         result += render(data.image, {
            source: baseUri + "enclosure.gif",
            title: enclosure.type,
            link: encodeURI(enclosure.link),
            width: 13,
            height: 16
         });
      }
      if (source && source.link) {
         result += render(data.image, {
            source: baseUri + "source.gif",
            title: source.title,
            link: encodeURI(source.link),
            width: 15,
            height: 15
         });
      }
      return result;         
   }
   
   var param = data.param;
   var rss = data.rss = {items: []};
   var xml = getDocument(data.xml);

   rss.error = getError();
   if (rss.error !== null) {
      xml = getDocument(render(data.error, {
         link: baseUri + "?" + encodeXml(data.query),
         message: encodeXml(rss.error)
      }));
      param.compact = 0;
      param.showXmlButton = 1;
   }

   var root = xml.documentElement;
   var type = root.nodeName;

   if (type === "scriptingNews") {
      var channel = getNode(xml, "header");
      rss.format = "Scripting News";
      rss.version = getText(getNode(channel, "scriptingNewsVersion"));
      rss.title = getText(getNode(channel, "channelTitle"));
      rss.description = getText(getNode(channel, "channelDescription"));
      rss.link = getText(getNode(channel, "channelLink"));
      if (ref = getText(getNode(channel, "imageUrl"))) {
         ref = rss.image = {source: ref};
         ref.title = getText(getNode(channel, "imageTitle"));
         ref.link = getText(getNode(channel, "imageLink"));
         ref.width = getText(getNode(channel, "imageWidth"));
         ref.height = getText(getNode(channel, "imageHeight"));
         ref.description = getText(getNode(channel, "imageCaption"));
      }
   } else {
      var channel = getNode(xml, "channel");
      rss.format = "RSS";
      rss.version = (type === "rdf:RDF") ? "1.0" : 
            root.getAttribute("version");
      rss.title = getText(getNode(channel, "title"));
      rss.description = getText(getNode(channel, "description"));
      rss.link = getText(getNode(channel, "link"));
      var image = getNode(xml, "image");
      if (image) {
         ref = rss.image = {};
         ref.source = getText(getNode(image, "url"));
         ref.title = getText(getNode(image, "title"));
         ref.link = getText(getNode(image, "link"));
         ref.width = getText(getNode(image, "width"));
         ref.height = getText(getNode(image, "height"));
         ref.description = getText(getNode(image, "description"));
      }
   }
   
   if (type === "rdf:RDF") {
      rss.date = renderDate(getText(getNode(channel, "date", "dc")) || data.modified);
      rss.rights = getText(getNode(channel, "creator", "dc"));
      var input = getNode(root, "textinput");
      if (input && !getNode(input, "link")) {
         input = root.getElementsByTagName("textinput")[1];
      }
      if (input) {
         ref = rss.input = {};
         ref.link = getText(getNode(input, "link"));
         ref.description = getText(getNode(input, "description"));
         ref.name = getText(getNode(input, "name"));
         ref.title = getText(getNode(input, "title"));
      }
   } else {
      rss.date = renderDate(getText(getNode(channel, "lastBuildDate") || getText(getNode(channel, "pubDate"))) || data.modified);
      rss.rights = getText(getNode(channel, "copyright"));
   }
   
   var item, text, node;
   var items = xml.getElementsByTagName("item");

   for (var i=0; i<Math.min(items.length, param.maxItems); i+=1) {
      item = items[i];

      if (type === "scriptingNews") {
         ref = {title: ""};
         ref.description = getText(getNode(item, "text")).replace(/\n/g, " ");
         ref.link = getText(getNode(item, "link"));
         if (text = trim(getText(getNode(item, "linetext")).replace(/\n/g, " "))) {
            ref.description = ref.description.replace(new RegExp(text), 
                  '<a href="' + getText(getNode(item, "url")) + '">' + text + '</a>');
         }
      } else {
         ref = {
            title: getText(getNode(item, "title")),
            description: getText(getNode(item, "description")),
            link: getText(getNode(item, "link") || getNode(item, "guid"))
         };
     }

     if (node = getNode(item, "source")) {
        ref.source = {
           link: node.getAttribute("url"),
           title: getText(node)
        }
     }
     
     if (node = getNode(item, "enclosure")) {
        ref.enclosure = {
           link: node.getAttribute("url"),
           length: node.getAttribute("length"),
           type: node.getAttribute("type")
        }
     }
     
     if (node = getNode(item, "category")) {
        ref.category = {
           domain: node.getAttribute("domain") || "",
           content: getText(node)
        }
     }
     
     rss.items.push(ref);
   }
   
   var item, items = "";
   for (var i=0; i<rss.items.length; i+=1) {
      item = rss.items[i];
      items += render(data.item, {
         title: new function() {
            var title = (!param.compact ? "<strong>" : "");
            if (item.link) {
               title += render(data.link, {
                  link: encodeURI(item.link),
                  text: item.title,
                  'class': "rssBoxItemTitle"
               });
            } else {
               title += item.title;
            }
            !param.compact && (title += "</strong>");
            return new String(title); // FIXME: Funny, title alone will be rendered as [object]
         }(),
         'break': item.title && item.description ? "<br />" : "",
         description: (!param.compact || !item.title) && item.description,
         buttons: renderButtons(item.enclosure, item.source)
      });
   }
   
   var box = render(data.box, {
      title: rss.link ? render(data.link, {
         link: encodeURI(rss.link),
         text: rss.title,
         'class': "rssBoxTitle",
         style: "color: " + param.titleBarTextColor
      }) : rss.title,
      description: rss.description,
      items: items,

      xmlButton: param.showXmlButton && render(data.image, {
         link: param.url,
         source: baseUri + "rss.png",
         title: rss.format + " " + rss.version,
         width: 16,
         height: 16,
         align: "right",
         hspace: 3
      }),
      
      image: !param.compact && rss.image && render(data.image, {
         link: encodeURI(rss.image.link),
         source: rss.image.source,
         width: rss.image.width,
         height: rss.image.height,
         title: rss.image.title,
         align: "right",
         valign: "baseline",
         hspace: 5,
         vspace: 5
      }),
      
      input: !param.compact && rss.input && render(data.input, {
         link: encodeURI(rss.input.link),
         description: rss.input.description,
         name: rss.input.name,
         title: rss.input.title
      }),
      
      date: rss.date,
      width: param.width,
      frameColor: param.frameColor,
      fontFace: param.fontFace,
      align: param.align,
      titleBarColor: param.titleBarColor,
      titleBarTextColor: param.titleBarTextColor,
      boxFillColor: param.boxFillColor,
      textColor: param.textColor
   });

   if (!window.rssBoxSetup) {
      document.write(box);
   }
   
   return box;
};

org.p3k.RssBox();

