var org = {p3k: ({url:"http://www.coloradocapitoljournal.com/rss.xml", xml:"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\">\n    <channel>\n        <title>Colorado Capitol Journal</title>\n        <description>RSS Feed for Colorado Capitol Journal</description>\n        <link>http://www.coloradocapitoljournal.com</link>\n        <copyright>Palmer Divide Media, LLC</copyright>\n        <language>en-us</language>\n        <lastBuildDate>Fri, 03 Apr 2009 06:59:49 -0600</lastBuildDate>\n        <pubDate>Fri, 03 Apr 2009 06:59:59 -0600</pubDate>\n        <item>\n            <title>FASTER OK By Ritter</title>\n            <description>A bill that would raise Coloradoan&apos;s motor vehicle registration fees to pay for highway and bridge improvements and repairs was signed into law by Gov. Bill Ritter today.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030209.htm</link>\n            <guid isPermaLink=\"false\">0493C8B1-3DAE-4DD5-8956-9888249C0CDD</guid>\n            <pubDate>Mon, 2 Mar 2009 09:03:14 -0600</pubDate>\n        </item>\n        <item>\n            <title>Repeal of General Fund Growth Limit Gets Senate OK After Debate Extending to Wee Hours</title>\n            <description>A bill that would repeal the limit on the annual growth of the state&apos;s general fund gained preliminary approval in the Senate early this morning after Republicans tried for more than 10 hours to delay its passage.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030309.htm</link>\n            <guid isPermaLink=\"false\">5DCC4733-A9BF-45AC-BD7E-900624139EB0</guid>\n            <pubDate>Tue, 3 Mar 2009 09:03:24 -0600</pubDate>\n        </item>\n        <item>\n            <title>ARVESCHOUG-BIRD REPEAL MAY HIT BARRIER IN HOUSE</title>\n            <description>The controversial bill that would repeal Colorado&apos;s annual limit on general fund growth may hit a roadblock in the House.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030509.htm</link>\n            <guid isPermaLink=\"false\">2C15A98A-36A8-4ED6-80C3-18BE07D8AEFE</guid>\n            <pubDate>Thu, 5 Mar 2009 09:03:37 -0600</pubDate>\n        </item>\n        <item>\n            <title>Bill Giving Some Immigrant Kids In-State Tuition Advances</title>\n            <description>A controversial bill that would allow immigrant kids who have spent three years in Colorado to pay resident tuition rates at the state&apos;s colleges and universities cleared a Senate committee Thursday.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030609b.htm</link>\n            <guid isPermaLink=\"false\">096A508E-0B22-4EFF-BFB8-F00C43070ECD</guid>\n            <pubDate>Sat, 7 Mar 2009 12:14:39 -0600</pubDate>\n        </item>\n        <item>\n            <title>LAMBERT STIRS CONTROVERSY WITH OBJECTION TO MEXICAN GOVERNMENT\u2019S BOOK DONATION TO STATE DEPARTMENT OF EDUCATION</title>\n            <description>A routine donation of books to the state by the Mexican government has a Colorado Springs legislator worried that students will be exposed to &quot;foreign propaganda.&quot;</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030609.htm</link>\n            <guid isPermaLink=\"false\">6F78602D-C39A-4BB0-90E9-53A10937EF4B</guid>\n            <pubDate>Fri, 6 Mar 2009 09:01:58 -0600</pubDate>\n        </item>\n        <item>\n            <title>LEGAL EXPERTS DISPUTE KING&apos;S, GOP VIEW THAT IN-STATE TUITION FOR UNDOCUMENTED IMMIGRANTS WOULD VIOLATE FEDERAL LAW</title>\n            <description>Keith King is convinced that Colorado cannot make in-state tuition rates at its colleges and universities available to the children who are undocumented immigrants.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/030909a.htm</link>\n            <guid isPermaLink=\"false\">221C5771-3658-4577-A76C-3409D6261314</guid>\n            <pubDate>Thu, 12 Mar 2009 12:10:32 -0600</pubDate>\n        </item>\n        <item>\n            <title>CHARTER SCHOOLS MAY GAIN ACCESS TO SCHOOL DISTRICT BOND PROCEEDS UNDER BILL CLEARED BY SENATE COMMITTEE</title>\n            <description>The state&apos;s 150 charter schools may find it easier to share school district bond proceeds if a bill cleared Thursday by a Senate committee becomes law.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/031309a.htm</link>\n            <guid isPermaLink=\"false\">158BD6F9-6449-4ECA-99DF-E8250702E6F4</guid>\n            <pubDate>Fri, 13 Mar 2009 15:45:45 -0600</pubDate>\n        </item>\n        <item>\n            <title>STATE SUPREME COURT UPHOLDS 2007 LAW FREEZING SCHOOL DISTRICT MILL LEVIES</title>\n            <description>A controversial law that froze mill levies in almost all of the state&apos;s 178 public school districts, which allowed the districts to retain about $117 million in property tax revenues that would otherwise have been refunded to taxpayers, was upheld Monday by the state supreme court.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/031609a.htm</link>\n            <guid isPermaLink=\"false\">0C4E24D3-66F8-4D8C-8695-EFA4F0BAAD81</guid>\n            <pubDate>Mon, 16 Mar 2009 16:51:54 -0600</pubDate>\n        </item>\n        <item>\n            <title>REP. ANNE McGIHON, D-DENVER, RESIGNS FROM LEGISLATURE</title>\n            <description>Veteran Denver Democrat Anne McGihon has resigned from the House of Representatives.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/031609b.htm</link>\n            <guid isPermaLink=\"false\">E299F4E8-739D-455B-83A1-44DF653E6153</guid>\n            <pubDate>Mon, 16 Mar 2009 16:53:11 -0600</pubDate>\n        </item>\n        <item>\n            <title>MEASURE REPEALING STATE GENERAL FUND GROWTH LIMIT CLEARS SENATE</title>\n            <description>The bill that would repeal the state&apos;s general fund growth limit is on the way to the House of Representatives after gaining final approval in the Senate this morning.\n</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/031709a.htm</link>\n            <guid isPermaLink=\"false\">CDDC4C72-FF38-49BF-BCF9-A6558329D6CD</guid>\n            <pubDate>Tue, 17 Mar 2009 15:54:31 -0600</pubDate>\n        </item>\n        <item>\n            <title>BILL REQUIRING COLORADO ELECTORS TO CAST ELECTORAL COLLEGE VOTES FOR NATIONAL POPULAR VOTE WINNER ADVANCES</title>\n            <description>A bill that would require Colorado&apos;s presidential electors to cast their votes in the Electoral College in favor of the candidate who won the national popular vote, even if that candidate did not win the most votes in Colorado, gained final approval in the House today.</description>\n            <link>http://www.coloradocapitoljournal.com/feeds/031709b.htm</link>\n            <guid isPermaLink=\"false\">B35948E9-2AFF-4288-B67B-E0877EDED182</guid>\n            <pubDate>Tue, 17 Mar 2009 15:55:43 -0600</pubDate>\n        </item>\n        <item>\n        \t<title>Wikipedia Says Colorado is Pluralistic</title>\n        \t<description>The state is very pluralistic politically, the Democrats are strong in the college towns of Fort Collins and Boulder</description>\n        \t<link>http://www.coloradocapitoljournal.com/feeds/040209a.htm</link>\n        \t<guid isPermalink=\"false\">http://www.coloradocapitoljournal.com/feeds/040209a.htm</guid>\n        \t<pubDate>Thu, 02 Apr 2009 19:59:00 -0100></pubDate>\n        </item>\n    </channel>\n</rss>\n", message:undefined, modified:(new Date(1284015560171)), baseUri:"http://p3k.org/rss/", query:"frameColor=white&textColor=black&_=1236830294737&titleBarColor=lightblue&compact=&fontFace=Arial&align=&showXmlButton=&maxItems=20&boxFillColor=white&titleBarTextColor=black&width=738&url=http://www.coloradocapitoljournal.com/rss.xml&", param:{textColor:"black", width:"738", align:"", fontFace:"Arial", url:"http://www.coloradocapitoljournal.com/rss.xml", compact:"", frameColor:"white", showXmlButton:"", boxFillColor:"white", _:"1236830294737", titleBarColor:"lightblue", maxItems:"20", 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();

