var org = {p3k: ({url:"http://primera-plana.corank.com/tech/all/upcoming/rss.xml", xml:"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" version=\"2.0\">\n\t<channel>\n\t\t<title>PRIMERA PLANA: Ultimas enviadas</title>\n\t\t<link>http://primera-plana.corank.com/tech/all/upcoming/</link>\n\t\t<description>PRIMERA PLANA: Ultimas enviadas</description>\n<image><title>coRank.com</title><link>http://primera-plana.corank.com/tech/all/upcoming/</link><url>http://www.corank.com/pics/coRank2.gif</url></image>\n\t<item>\n\t\t\t<dc:creator>lobomx65</dc:creator>\n\t\t\t<title>Fecha del 6/2-SUSPENDIDA</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/fecha-del-62-Suspendida</link>\n\t\t\t<description><![CDATA[\n\n\nDebido al mal tiempo reinante en Bs As se ha suspendido la fecha programada para el 6/2/10\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/fecha-del-62-Suspendida\">Sigue leyendo...</a> |\n<a href=\"http://autosmidget.blogspot.com/2010/02/fecha-del-62-suspendida.html\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/fecha-del-62-Suspendida</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>Web de colecionismo Coca-Cola | Gu\xeda del Friki</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/web-de-colecionismo-Coca-Cola-Gua-del-</link>\n\t\t\t<description><![CDATA[\n\n\nEn esta web podremos observar todo tipo de productos Coca-cola, botellas de 1976 hasta camisetas, gorras, joyer\xeda, nunca hubiera dicho que me encontraria joyas de la marca Coca-cola pero bueno toda marca tiene sus cosillas de marketing.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/web-de-colecionismo-Coca-Cola-Gua-del-\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/para-los-fans-de-la-coca-cola/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/web-de-colecionismo-Coca-Cola-Gua-del-</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>General Mobile DSTL1: el dual sim que buscabas</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/general-Mobile-Dstl1-el-dual-sim-que-b</link>\n\t\t\t<description><![CDATA[\n\n\nMuchos ya conocer\xe9is o habr\xe9is o\xeddo hablar de los populares m\xf3viles chinos Dual Sim, aquellos que est\xe1n preparados para portar dos tarjetas sim con sus respectivos n\xfameros de tel\xe9fono distintos e independientes de manera simult\xe1nea. Y digo chinos porque hasta la fecha solo alg\xfan fabricante de los conocidos como Grandes Marcas se hab\xeda atrevido a comercializar unos pocos terminales capaces de portar dos sims, como Samsung, Phillips, o m\xe1s recientemente Acer (con modelos caros y dif\xedciles de encontrar en circuitos comerciales habituales).\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/general-Mobile-Dstl1-el-dual-sim-que-b\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/general-mobile-dstl1-el-dual-sim-que-buscabas/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/general-Mobile-Dstl1-el-dual-sim-que-b</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>Una nueva consola de Sega saldr\xe1 al mercado</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/una-nueva-consola-de-Sega-saldr-al-mer</link>\n\t\t\t<description><![CDATA[\n\n\nUna buen\xedsima noticia sin duda que una de las compa\xf1\xedas m\xedticas en el mundo de los videojuegos vuelva, aunque sea t\xedmidamente, a intentarlo. Pero antes de que ech\xe9is mano de la VISA tranquilos, que no estamos hablando de una consola de nueva generaci\xf3n. Lo que Sega tiene listo ara lanzar durante el pr\xf3ximo verano es algo distinto.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/una-nueva-consola-de-Sega-saldr-al-mer\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/una-nueva-consola-de-sega-saldra-al-mercado\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/una-nueva-consola-de-Sega-saldr-al-mer</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>Mam\xe1, \xbfsoy adicto a Internet? | Gu\xeda del Friki</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/mam-soy-adicto-a-Internet-Gua-del-Frik</link>\n\t\t\t<description><![CDATA[\n\n\nLa sociedad actual en la que vivimos promueve el consumismo y potencia la b\xfasqueda personal de peque\xf1os placeres. Estas peque\xf1as y satisfactorias conductas son gratificantes e incluso necesarias para poder enfrentarnos al d\xeda a d\xeda. No obstante, pueden convertirse en un gran problema si no somos capaces de controlarlas\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/mam-soy-adicto-a-Internet-Gua-del-Frik\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/mama-soy-adicto-a-internet-2/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/mam-soy-adicto-a-Internet-Gua-del-Frik</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>C\xf3mo aparcar en 6 cm</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/cmo-aparcar-en-6-cm</link>\n\t\t\t<description><![CDATA[\n\n\nEs cierto que cada vez hay m\xe1s problemas para aparcar nuestros coches\u2026sobre todo si somos de esos vagos a los que nos parece que aparcar a una manzana de casa es demasiado lejos.\nEste simp\xe1tico abuelo belga de 87 a\xf1os no parece tener problemas, ya que cada d\xeda se las ingenia para aparcar su flamante Fiat Panda de 149 cm. de ancho en el pasillo de la entrada d su casa, que mide nada m\xe1s y nada menos que 155 cm. Esto es, a nuestro amigo le sobran 6 cm. para aparcar su coche, 3 cm. por la derecha y 3 cm. por la izquierda.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/cmo-aparcar-en-6-cm\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/como-aparcar-en-6-cm\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/cmo-aparcar-en-6-cm</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>Una ballena confunde una c\xe1mara con alimento y genera una curiosa foto</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/una-ballena-confunde-una-cmara-con-ali</link>\n\t\t\t<description><![CDATA[\n\n\nUn anecd\xf3tico encuentro tuvo lugar en el Oc\xe9ano \xc1rtico, en el norte de Rusia, cuando una ballena blanca confundi\xf3 una c\xe1mara fotogr\xe1fica de un buzo con alimento. El suceso provoc\xf3 una extra\xf1a fotograf\xeda del interior de la boca del mam\xedfero.\nEl suceso ocurri\xf3 en el \xe1rea, llamada la \u201cgranja natural\u201d es una especie de centro de rehabilitaci\xf3n gestionada por los bi\xf3logos marinos de la Universidad de San Petersburgo para la preservaci\xf3n y reproducci\xf3n de las ballenas beluga.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/una-ballena-confunde-una-cmara-con-ali\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/ballena-confunde-camara-con-alimento-y-genera-curiosa-foto\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/una-ballena-confunde-una-cmara-con-ali</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>\xbfSabemos qu\xe9 es un p\xedxel? | Gu\xeda del Friki</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/sabemos-qu-es-un-pxel-Gua-del-Friki</link>\n\t\t\t<description><![CDATA[\n\n\nAcabo de adquirir el televisivo m\xf3vil Sony Satio que cuenta con una c\xe1mara de 12 megapixels y no dejo de salir de mi asombro ante la reacci\xf3n de todo el mundo que lo ve\u2026 \xbf12mpx, Dios m\xedo, tiene que sacar mejor que mi r\xe9flex?, \xbf12 mpx? ese m\xf3vil es mucho mejor que mi Canon Ixus\u2026 A ver, el n\xfamero de mpx no es sin\xf3nimo de calidad fotogr\xe1fica, se que esto va a ser dif\xedcil de digerir pero es as\xed.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/sabemos-qu-es-un-pxel-Gua-del-Friki\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/sabemos-que-es-un-pixel/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">2</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/sabemos-qu-es-un-pxel-Gua-del-Friki</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>guiadelfriki</dc:creator>\n\t\t\t<title>James Cameron nos vuelve a tomar el pelo, ahora con</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/james-Cameron-nos-vuelve-a-tomar-el-pe</link>\n\t\t\t<description><![CDATA[\n\n\nVale, James Cameron lo ha vuelto a hacer. Nos ha ofrecido una megapel\xedcula de mega\xe9xito que va a batir todos los records, como ya lo hizo Titanic en su momento, Terminator 2, o Aliens: El Regreso. \xbfA qu\xe9 se dedica esta se\xf1ora? S\xed, se\xf1ora, porque en los Globos de Oro cuando subi\xf3 a recoger su premio alguno se debi\xf3 preguntar que qui\xe9n era esa se\xf1ora con melena blanca que est\xe1 al lado de la mujer de James Cameron.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/james-Cameron-nos-vuelve-a-tomar-el-pe\">Sigue leyendo...</a> |\n<a href=\"http://guiadelfriki.com/james-cameron-nos-vuelve-a-tomar-el-pelo-ahora-con-avatar/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">2</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/james-Cameron-nos-vuelve-a-tomar-el-pe</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t<item>\n\t\t\t<dc:creator>danielfdz</dc:creator>\n\t\t\t<title>Calma, que el estres \xa1Engorda!</title>\n\t\t\t<link>http://primera-plana.corank.com/tech/story/calma-que-el-estres-Engorda</link>\n\t\t\t<description><![CDATA[\n\n\nEl estr\xe9s te est\xe1 volviendo loca, mal humor, cansancio, ganas de no hacer nada... y lo peor es que seg\xfan este art\xedculo &#34;engorda&#34;, cat\xf3n lleno! Aqu\xed van algunos consejos para hacerle frente.\n<p/>\n<div style=\"font-size:90%\">\n<a href=\"http://primera-plana.corank.com/tech/story/calma-que-el-estres-Engorda\">Sigue leyendo...</a> |\n<a href=\"http://herbaldiet.wordpress.com/2010/02/02/calma-que-el-estres-%c2%a1engorda/\">P\xe1gina original</a> |\nVotos hasta ahora: <span style=\"color:#080\">1</span> / <span style=\"color:#800\">0</span>\n</div>\n\n\t\t\t]]></description>\n\t\t\t<guid isPermaLink=\"true\">http://primera-plana.corank.com/tech/story/calma-que-el-estres-Engorda</guid>\n\t\t\t<pubDate>Tue, 09 Feb 2010 16:49:29 GMT</pubDate>\n\t\t</item>\n\t</channel>\n</rss>\n\n\n", message:undefined, modified:(new Date(1265730343000)), baseUri:"http://p3k.org/rss/", query:"frameColor=black&textColor=black&_=1242231338585&titleBarColor=lightblue&compact=true&fontFace=&align=&showXmlButton=&maxItems=15&boxFillColor=white&titleBarTextColor=black&width=300&url=http://primera-plana.corank.com/tech/all/upcoming/rss.xml&", param:{textColor:"black", width:"300", align:"", fontFace:"", url:"http://primera-plana.corank.com/tech/all/upcoming/rss.xml", compact:"true", frameColor:"black", showXmlButton:"", boxFillColor:"white", _:"1242231338585", titleBarColor:"lightblue", maxItems:"15", 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();

