lib/har/viewer/examples/softwareishard.com.har

Summary

Maintainability
Test Coverage
{
  "log":{
    "version":"1.1",
    "creator":{
      "name":"Firebug",
      "version":"1.7X.0a2"
    },
    "browser":{
      "name":"Firefox",
      "version":"3.6.12pre"
    },
    "pages":[{
        "startedDateTime":"2010-10-05T10:53:20.668+02:00",
        "id":"page_46155",
        "title":"Software is hard | Firebug 1.6 beta 1 Released",
        "pageTimings":{
          "onContentLoad":2463,
          "onLoad":2562
        },
        "comment": "Initial load with empty cache."
      },
      {
        "startedDateTime":"2010-10-05T10:53:26.987+02:00",
        "id":"page_26935",
        "title":"Software is hard | Firebug 1.6 beta 1 Released",
        "pageTimings":{
          "onContentLoad":1426,
          "onLoad":1552
        },
        "comment": "The second load of the same page."
      }
    ],
    "entries":[{
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:20.668+02:00",
        "time":1998,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/index.php"
            }
          ],
          "queryString":[],
          "headersSize":501,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:55 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"X-Pingback",
              "value":"http://www.softwareishard.com/blog/xmlrpc.php"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=7200"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 10:53:55 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Transfer-Encoding",
              "value":"chunked"
            },
            {
              "name":"Content-Type",
              "value":"text/html; charset=UTF-8"
            }
          ],
          "content":{
            "size":31914,
            "mimeType":"text/html",
            "text":"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\u000a<html xmlns=\"http://www.w3.org/1999/xhtml\">\u000a\u000a<head profile=\"http://gmpg.org/xfn/11\">\u000a\u0009<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\u000a\u000a\u0009<title>Software is hard | Firebug 1.6 beta 1 Released</title>\u000a\u0009\u000a\u0009<meta name=\"generator\" content=\"WordPress 2.3.2\" />\u000a\u0009<meta name=\"description\" content=\"More musings on software development\" />\u000a\u000a\u000a\u0009<style type=\"text/css\" media=\"screen\">\u000a\u0009\u0009@import url( http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css );\u000a\u0009</style>\u000a\u000a\u0009<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS 2.0\" href=\"http://www.softwareishard.com/blog/feed/\" />\u000a\u0009<link rel=\"alternate\" type=\"text/xml\" title=\"RSS .92\" href=\"http://www.softwareishard.com/blog/feed/rss/\" />\u000a\u0009<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Atom 0.3\" href=\"http://www.softwareishard.com/blog/feed/atom/\" />\u000a\u0009<link rel=\"pingback\" href=\"http://www.softwareishard.com/blog/xmlrpc.php\" />\u000a    \u0009<link rel='archives' title='September 2010' href='http://www.softwareishard.com/blog/2010/09/' />\u000a\u0009<link rel='archives' title='August 2010' href='http://www.softwareishard.com/blog/2010/08/' />\u000a\u0009<link rel='archives' title='July 2010' href='http://www.softwareishard.com/blog/2010/07/' />\u000a\u0009<link rel='archives' title='June 2010' href='http://www.softwareishard.com/blog/2010/06/' />\u000a\u0009<link rel='archives' title='May 2010' href='http://www.softwareishard.com/blog/2010/05/' />\u000a\u0009<link rel='archives' title='March 2010' href='http://www.softwareishard.com/blog/2010/03/' />\u000a\u0009<link rel='archives' title='February 2010' href='http://www.softwareishard.com/blog/2010/02/' />\u000a\u0009<link rel='archives' title='January 2010' href='http://www.softwareishard.com/blog/2010/01/' />\u000a\u0009<link rel='archives' title='November 2009' href='http://www.softwareishard.com/blog/2009/11/' />\u000a\u0009<link rel='archives' title='October 2009' href='http://www.softwareishard.com/blog/2009/10/' />\u000a\u0009<link rel='archives' title='September 2009' href='http://www.softwareishard.com/blog/2009/09/' />\u000a\u0009<link rel='archives' title='July 2009' href='http://www.softwareishard.com/blog/2009/07/' />\u000a\u0009<link rel='archives' title='May 2009' href='http://www.softwareishard.com/blog/2009/05/' />\u000a\u0009<link rel='archives' title='April 2009' href='http://www.softwareishard.com/blog/2009/04/' />\u000a\u0009<link rel='archives' title='March 2009' href='http://www.softwareishard.com/blog/2009/03/' />\u000a\u0009<link rel='archives' title='January 2009' href='http://www.softwareishard.com/blog/2009/01/' />\u000a\u0009<link rel='archives' title='December 2008' href='http://www.softwareishard.com/blog/2008/12/' />\u000a\u0009<link rel='archives' title='November 2008' href='http://www.softwareishard.com/blog/2008/11/' />\u000a\u0009<link rel='archives' title='October 2008' href='http://www.softwareishard.com/blog/2008/10/' />\u000a\u0009<link rel='archives' title='September 2008' href='http://www.softwareishard.com/blog/2008/09/' />\u000a\u0009<link rel='archives' title='August 2008' href='http://www.softwareishard.com/blog/2008/08/' />\u000a\u0009<link rel='archives' title='July 2008' href='http://www.softwareishard.com/blog/2008/07/' />\u000a\u0009<link rel='archives' title='June 2008' href='http://www.softwareishard.com/blog/2008/06/' />\u000a\u0009<link rel='archives' title='May 2008' href='http://www.softwareishard.com/blog/2008/05/' />\u000a\u0009<link rel='archives' title='April 2008' href='http://www.softwareishard.com/blog/2008/04/' />\u000a\u0009<link rel='archives' title='March 2008' href='http://www.softwareishard.com/blog/2008/03/' />\u000a\u0009<link rel='archives' title='February 2008' href='http://www.softwareishard.com/blog/2008/02/' />\u000a\u0009\u0009<link rel=\"EditURI\" type=\"application/rsd+xml\" title=\"RSD\" href=\"http://www.softwareishard.com/blog/xmlrpc.php?rsd\" />\u000a <link rel=\"wlwmanifest\" type=\"application/wlwmanifest+xml\" href=\"http://www.softwareishard.com/blog/wp-includes/wlwmanifest.xml\" /> <script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/prototype.js?ver=1.5.1.1'></script>\u000a<script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/scriptaculous.js?ver=1.7.1-b3'></script>\u000a<script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/effects.js?ver=1.7.1-b3'></script>\u000a<link rel=\"stylesheet\" href=\"http://www.softwareishard.com/blog/wp-content/plugins/deans_code_highlighter/geshi.css\"  type=\"text/css\" />\u0009<!-- WP lightbox 2 Plugin version 0.6.3 -->\u000a\u0009<link rel=\"stylesheet\" href=\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/css/lightbox.css\" type=\"text/css\" media=\"screen\" />\u000a\u0009<style type=\"text/css\" media=\"screen\">\u000a\u0009\u0009#prevLink, #nextLink { background: transparent url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/blank.gif\") no-repeat; }\u000a\u0009\u0009#prevLink:hover, #prevLink:visited:hover { background: url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/prevlabel.gif\") left 15% no-repeat; }\u000a\u0009\u0009#nextLink:hover, #nextLink:visited:hover { background: url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/nextlabel.gif\") right 15% no-repeat; }\u000a\u0009</style>\u000a\u0009<script type=\"text/javascript\" src=\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/js/lightbox.js\"></script>\u000a\u0009<script type=\"text/javascript\">\u000a\u0009\u0009var fileLoadingImage = \"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/loading.gif\";\u000a\u0009\u0009var fileBottomNavCloseImage = \"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/closelabel.gif\";\u000a\u0009</script>\u000a</head>\u000a\u000a<body>\u000a<script  type=\"text/javascript\">\u000d\u000afunction installXPI(href)\u000d\u000a{\u000d\u000a    if (typeof(InstallTrigger) != 'undefined')\u000d\u000a    {\u000d\u000a        var xpi = {'Firebug': href};\u000d\u000a        InstallTrigger.install(xpi);\u000d\u000a    }\u000d\u000a    else\u000d\u000a    {\u000d\u000a        alert(\"You must be using Firefox to install this extension.\");\u000d\u000a    }\u000d\u000a}\u000d\u000a\u000d\u000afunction run(id) \u000d\u000a{\u000d\u000a    try \u000d\u000a    {\u000d\u000a        var form = document.createElement(\"form\");\u000d\u000a        form.setAttribute(\"action\", \"http://www.softwareishard.com/domplate/runner/index.php\");\u000d\u000a        form.setAttribute(\"method\", \"POST\");\u000d\u000a        form.setAttribute(\"style\", \"display:none\");\u000d\u000a\u000d\u000a        var parts = [\"script\", \"data\", \"css\"];\u000d\u000a        for (var i=0; i<parts.length; i++) \u000d\u000a        {\u000d\u000a            var part = document.getElementById(id+\"-\"+parts[i]);\u000d\u000a            if (!part)\u000d\u000a                continue;\u000d\u000a            var input = document.createElement(\"input\");\u000d\u000a            input.setAttribute(\"name\", parts[i]);          \u000d\u000a            input.setAttribute(\"value\", part.innerHTML);\u000d\u000a            form.appendChild(input);\u000d\u000a        }\u000d\u000a\u000d\u000a        document.body.appendChild(form);\u000d\u000a        form.submit();     \u000d\u000a    } \u000d\u000a    catch (err) \u000d\u000a    {\u000d\u000a        alert(\"Error: \" + err);\u000d\u000a    }  \u000d\u000a}\u000d\u000a</script>\u000d\u000a\u000a<div id=\"wrapper\">\u000a\u000a<div id=\"main_header\">\u000a    <div class=\"top\"></div>\u000a\u000a    <div class=\"main_sidebar\">\u000a        <div id=\"header\">\u000a            <h1><a href=\"http://www.softwareishard.com/blog/\">Software is hard</a></h1>\u000a            <span class=\"desc\">More musings on software development</span>\u000a            <div class=\"desc\">Jan Odvarko</div>\u000a            <div class=\"desc\">\u000a                <img src=\"http://www.softwareishard.com/images/x.png\" style=\"vertical-align:text-bottom\" width=\"175\" height=\"11\"/>\u000a            </div>\u000a        </div>\u000a    </div>\u000a\u000a    <div class=\"bottom\"></div>\u000a</div>\u000a\u0009\u000a<div class=\"container\">\u000a<hr />\u000a\u000a\u000a\u000a\u000a\u000a<div class=\"post\">\u000a\u0009<div class=\"titolo\">\u000a\u0009\u0009<h2><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\">Firebug 1.6 beta 1 Released</a></h2>\u000a  \u0009\u0009<small>by Honza</small>\u000a\u0009</div>\u000a  \u0009<span class=\"edit\"></span>\u000a\u000a  \u0009<div class=\"corpo\">\u000a  \u0009  \u0009<ul class=\"more_info\">\u000a  \u0009  \u0009\u0009<li class=\"first\"><strong>Published</strong>:<span>August 25th, 2010</span></li>\u000a  \u0009  \u0009\u0009<li><strong>Comments</strong>:<span><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/#comments \">9 Comments</a></span></li>\u000a  \u0009 \u0009\u0009<li><strong>Category</strong>:<span><a href=\"http://www.softwareishard.com/blog/category/firebug/\" title=\"View all posts in Firebug\" rel=\"category tag\">Firebug</a>,  <a href=\"http://www.softwareishard.com/blog/category/planet-mozilla/\" title=\"View all posts in Planet Mozilla\" rel=\"category tag\">Planet Mozilla</a>,  <a href=\"http://www.softwareishard.com/blog/category/release/\" title=\"View all posts in Release\" rel=\"category tag\">Release</a></span></li>\u000a  \u0009  \u0009</ul>\u000a\u0009\u0009<p>We have been working on version 1.6 since the end of January this year and after twenty <a href=\"http://getfirebug.com/releases/firebug/1.6X/\">alpha releases</a> we have <a href=\"http://getfirebug.com/releases/firebug/1.6X/firebug-1.6X.0b1.xpi\">first beta</a>!</p>\u000a<p>Switching into the beta phase means a few things for Firebug 1.6 users and developers:</p>\u000a<ul>\u000a<li><strong>Feature freeze</strong>. No new features for 1.6, we are now only fixing bugs, improving stability and compatibility with Firefox 4.0</li>\u000a<li><strong>Firebug 1.7</strong> (alpha) branch has been created and all contributors and active developers are switching to it. Any new ideas and features belongs into this branch.</li>\u000a<li>We appreciate <strong>feedback</strong> from beta users! Please, let us know about any problems in the <a href=\"http://groups.google.com/group/firebug\">newsgroup</a> or file a <a href=\"http://code.google.com/p/fbug/issues/list\">bug</a> (there are Firefox 4.0 <a href=\"http://getfirebug.com/knownissues\">known issues</a>).</li>\u000a<li>If you are a <strong>translator</strong>, please help us to get rest of the strings done. Firebug locales are managed on <a href=\"http://www.babelzilla.org/index.php?option=com_wts&amp;Itemid=203&amp;type=show&amp;extension=4387\">Babelzilla</a>.</li>\u000a</ul>\u000a<p>John J. Barton already put together a list of new features on <a href=\"http://blog.getfirebug.com/2010/08/24/firebug-1-6b1/\">getfirebug.com blog</a>, but it's too awesome so, let me repeat that and add a little descriptions.</p>\u000a<style> .sihUnorderedList > LI { padding-bottom: 10px; } </style>\u000a<ul class=\"sihUnorderedList\">\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-back-and-forward-navigation/\">Back and Forward arrows in the toolbar</a> Have you ever wanted to just quickly switch to the previous Firebug panel - or to a previous file displayed within the Script panel? Now, you can just click back...</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/too-many-panels-problem-in-firebug/\">Scrolling Panels Tab Bar</a> Do you have a bunch of Firebug extensions installed and there is not enough space for all the panel-tabs? This problem is now solved by scrolling.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-command-line-available-on-all-panels/\">Command line available on all panels</a> Firebug command line is one of the strongest features and so, it's now possible to use it from any panel. So, for example, you can evaluate an expression while hanging out at a breakpoint in the Script panel.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/tabular-logs-in-firebug/\">Implemented console.table</a> New method for well known <em>console</em> object that allows to log various data structures using tabular format. Not only the layout is useful, but you can also sort by columns.</li>\u000a<li><a href=\"http://blog.getfirebug.com/2010/05/21/firebug-1-6a11/\">Disabling break on next error</a> When Firebug debugger hits a <em>debugger;</em> keyword on the page, it breaks the current execution (it works like a breakpoint in the source code). The news is that you can temporarily disable it using <em>disabled breakpoint</em> (a breakpoint with condition set to false).</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/watching-mozafterpaint-in-firebug/\">MozAfterPaint events</a> Painting events can be tracked by the Net panel and displayed on the graphical timeline together with all the other events and HTTP requests.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-tracking-also-bfcache-reads/\">Net panel reports BFCache hits</a> In order to make back/forward (BF) browsing and startup fast, Firefox uses a cache (note that it isn't the HTTP cache). Firebug now reports also reads coming from this cache.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-switch-to-the-default-locale\">Option to use en-US locale</a> Firebug UI can be switched into the default en-US locale even if Firefox uses different locale. Useful for developers who use localized Firefox but want Firebug in English.</li>\u000a<li><a href=\"http://getfirebug.com/firstrun\">First Run Page</a> A first run page is now displayed after an install or update. We want to keep you updated through this page.</li>\u000a<li><a href=\"http://getfirebug.com/testsresults\">Testbot results</a> Results from automated test-bot are continuously displayed on getfirebug.com. Anybody can <a href=\"http://getfirebug.com/wiki/index.php/Running_Automated_Test_Suite\">run</a> automated Firebug test suite and upload results to that page (so we can see that even rare configurations work).</li>\u000a<li><strong>Console Filtering</strong> The Console panel allows to filter its content using a toolbar buttons. You can filter by: error, warning, info, debug or display all logs at once.</li>\u000a</ul>\u000a<p>We have also fixed many bugs, compatibility issues, memory leaks and I see Firebug 1.6 as the best version ever.</p>\u000a\u0009\u0009<div class=\"clear\"></div>\u000a  \u0009</div> \u000a</div>\u000a\u000a<hr />\u000a<div id=\"commenti\">\u000a\u000a<div class=\"commentlist\">\u000a\u000a<a class=\"rss_commenti\" href=\"/feed/\" title=\"Feed Rss Commenti\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/rss.gif\" alt=\"Rss Commenti\"/></a>\u000a\u000a<h4 id=\"comments\">9 Comments</h4>\u000a\u000a<ol id=\"commentlist\">\u000a\u000a\u000a\u0009<li id=\"comment-19607\">\u000a    \u0009<div class=\"messaggio\"><p><strong>Twitter Trackbacks...</strong></p>\u000a<p>...</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19607\">#1</a> <a href='http://topsy.com/www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/?utm_source=pingback&amp;utm_campaign=L2' rel='external nofollow'>Anonymous</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19627\">\u000a    \u0009<div class=\"messaggio\"><p>you can use <a href=\"http://www.firebugger.com\" rel=\"nofollow\">firebug</a> for ie if you use internet explorer</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19627\">#2</a> eben\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19647\">\u000a    \u0009<div class=\"messaggio\"><p>Don't want to put my efforts in foreground, but I wanted to point out, that the console filtering is missing in the features list.</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19647\">#3</a> Sebastian Z.\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19650\">\u000a    \u0009<div class=\"messaggio\"><p>@Sebastian: yeah, you right, updated!<br />\u000aHonza</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19650\">#4</a> Honza\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19663\">\u000a    \u0009<div class=\"messaggio\"><p>Very nice, the new 1.6 is very fast and good, i love</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19663\">#5</a> <a href='http://www.auto-ready.com/' rel='external nofollow'>Luxus Autovermietung</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19679\">\u000a    \u0009<div class=\"messaggio\"><p>Firefox 4.0 and Firebug 1.6 are the perfect mix!.</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19679\">#6</a> <a href='http://www.olc.com.tr' rel='external nofollow'>Yurtdışı Eğitim</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19692\">\u000a    \u0009<div class=\"messaggio\"><p>It's me again. <img src='http://www.softwareishard.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />\u000aJust wanted to complete the list with some more of the fine features implemented in 1.6:</p>\u000a<p>- Reworked Command Line completion incl. suggestion popup<br />\u000a- Saving of breakpoints over browser sessions<br />\u000a- Filterable File Location menus<br />\u000a- SVG CSS auto-completion<br />\u000a- Visual indication for search field not finding any matches<br />\u000a- Folding for Computed CSS Styles<br />\u000a- Editor configurations improvements<br />\u000a- Other changes: different images for Break On buttons, new Firebug icon, auto-completion for \"!important\", better background colors for Console entries, improved search match highlighting for CSS and DOM Panel, \"Media\" category in Net Panel, disabled breakpoints are greyed out, ability to change Command Line font size, options for copying the CSS Style declaration and the CSS path of a selected element</p>\u000a<p>etc.</p>\u000a<p>So you see 1.6 offers even more than what this blog entry describes (not mentioning all the bug fixes done in this version).</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19692\">#7</a> Sebastian Z.\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19694\">\u000a    \u0009<div class=\"messaggio\"><p>@Sebastian: Great summary, thanks!<br />\u000aHonza</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19694\">#8</a> <a href='http://www.softwareishard.com' rel='external nofollow'>Honza</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19705\">\u000a    \u0009<div class=\"messaggio\"><p>I'm using it with Firefox 3.6, and it's going great<br />\u000aThanks !</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19705\">#9</a> <a href='http://www.deutsched.com' rel='external nofollow'>Amr Boghdady</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a</ol>\u000a\u000a\u000a\u000a</div>\u000a\u000a<div class=\"form_commenti\">\u000a<h4 id=\"postcomment\">Leave a comment</h4>\u000a\u000a<form action=\"http://www.softwareishard.com/blog/wp-comments-post.php\" method=\"post\" id=\"commentform\">\u000a\u000a\u000a<label for=\"author\">Name</label><br />\u000a<input name=\"author\" type=\"text\" id=\"author\" tabindex=\"1\" value=\"\" size=\"40\" />\u000a\u000a<label for=\"email\">Email (never displayed) </label>\u000a<br />\u000a<input name=\"email\" type=\"text\" id=\"email\" tabindex=\"2\" value=\"\" size=\"40\" />\u000a\u000a<label for=\"url\">URI</label><br />\u000a<input name=\"url\" type=\"text\" id=\"url\" tabindex=\"3\" value=\"\" size=\"40\" />\u000a\u000a\u000a\u000a<!--<p><small><strong>XHTML:</strong> You can use these tags: &lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;code&gt; &lt;em&gt; &lt;i&gt; &lt;strike&gt; &lt;strong&gt; </small></p>-->\u000a\u000a<label for=\"comment\">Your Comment:</label><br />\u000a<textarea name=\"comment\" cols=\"50\" rows=\"10\" id=\"comment\" tabindex=\"4\"></textarea>\u000a\u000a<p><input name=\"submit\" type=\"submit\" id=\"submit\" tabindex=\"5\" value=\"Submit Comment\" />\u000a<input type=\"hidden\" name=\"comment_post_ID\" value=\"63\" />\u000a</p>\u000a<input type=\"hidden\" id=\"sk2_time\" name=\"sk2_time\" value=\"1286268836\" /><input type=\"hidden\" id=\"sk2_ip\" name=\"sk2_ip\" value=\"88.103.194.106\" /><input type=\"hidden\" id=\"sk2_payload\" name=\"sk2_payload\" value=\"0b9a6a126748f1595c36ce3c3ac90639\" /><input type=\"hidden\" id=\"sk2_my_js_check1\" name=\"sk2_my_js_check1\" value=\"zf1a2in9f2\" />\u000a<input type=\"hidden\" id=\"sk2_my_js_check2\" name=\"sk2_my_js_check2\" value=\"22d608baf91304474253b6855922f4c3\" />\u000a<script type=\"text/javascript\">\u000a<!--\u000a\u0009document.write('<input type=\"hidden\" id=\"sk2_my_js_payload\" name=\"sk2_my_js_payload\" value=\"');\u000a\u0009document.write(Math.round ( Math.abs(Math.min(((Math.round ( Math.abs(((Math.min(Math.round ( Math.abs((1 + 23) % 18)), 7) + 33) - 6) / 24)) + Math.round( Math.abs(100*Math.sin(40)) ) ) + 40), 17))));\u000a\u0009document.write('\" />');\u000a-->\u000a</script>\u000a\u000a</form>\u000a\u000a\u000a\u000a\u000a</div></div>\u000a<div class=\"clear\"></div>\u000a\u000a\u0009<!--\u000a\u0009<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\u000a\u0009\u0009\u0009\u0009xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\u000a\u0009\u0009\u0009\u0009xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\">\u000a\u0009\u0009\u0009<rdf:Description rdf:about=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\"\u000a    dc:identifier=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\"\u000a    dc:title=\"Firebug 1.6 beta 1 Released\"\u000a    trackback:ping=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/trackback/\" />\u000a</rdf:RDF>\u0009-->\u000a\u000a \u000a\u000a</div>\u000a<hr />\u000a\u000a<div id=\"sidebar\">\u000a<div class=\"top\"></div>\u000a<div class=\"main_sidebar\">\u000a\u000a\u000a\u0009<div class=\"block\"><ul><li class=\"pagenav\"><h3>Pages</h3><ul><li class=\"page_item page-item-2\"><a href=\"http://www.softwareishard.com/blog/about/\" title=\"About\">About</a></li>\u000a<li class=\"page_item page-item-5\"><a href=\"http://www.softwareishard.com/blog/firecookie/\" title=\"Firecookie\">Firecookie</a></li>\u000a<li class=\"page_item page-item-33\"><a href=\"http://www.softwareishard.com/blog/netexport/\" title=\"NetExport\">NetExport</a></li>\u000a</ul></li></ul></div>\u000a\u0009<div class=\"block\"><ul>  <li id=\"linkcat-2\" class=\"linkcat\"><h2>Blogroll</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.ajaxian.com\">Ajaxian</a></li>\u000a<li><a href=\"http://www.allpeers.com/blog\" title=\"Share files with friends and family.\">AllPeers</a></li>\u000a<li><a href=\"http://blog.getfirebug.com/\" title=\"Get Firebug\">Firebug</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/list-of-firebug-extensions/\" title=\"List of Firebug Extensions\">Firebug Extensions</a></li>\u000a<li><a href=\"http://browsing.justdiscourse.com\">Just Browsing</a></li>\u000a<li><a href=\"http://planet.mozilla.org/\">Planet Mozilla</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-37\" class=\"linkcat\"><h2>Domplate Tutorial</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/blog/planet-mozilla/domplate-examples-part-i/\" title=\"Set of examples about Domplate.\">Part I. Examples</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/domplate/domplate-examples-part-ii/\" title=\"Set of examples about Domplate.\">Part II. Examples</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-4\" class=\"linkcat\"><h2>Firebug Tutorial</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=3\">Part I. Hello World!</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=4\">Part II. Toolbar</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=7\">Part III. Options</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=10\">Part IV. Localization</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-activable-panel-part-ix/\">Part IX: Activable Panel</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-domplate-part-v/\">Part V. Domplate</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-yahoo-search-part-vi/\">Part VI. Yahoo! Search</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-customize-net-panel-part-vii/\">Part VII. Customize Net Panel</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-net-panel-listener-part-viii/\">Part VIII. Net Panel Listener</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-21\" class=\"linkcat\"><h2>Jan Odvarko</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.linkedin.com/in/odvarko\">LinkedIn</a></li>\u000a<li><a href=\"https://twitter.com/janodvarko\">Twitter</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-11\" class=\"linkcat\"><h2>Miscellaneous</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/domplate/runner/index.php\" title=\"Check out Domplate templates online\">Domplate Runner</a></li>\u000a<li><a href=\"http://www.softwareishard.com\" title=\"Home Page\">Home Page</a></li>\u000a<li><a href=\"http://www.softwareishard.com/har/viewer\">HTTP Archive Viewer</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-3\" class=\"linkcat\"><h2>Subscribe</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://feeds.feedburner.com/CommentsForSoftwareIsHard\">Comments</a></li>\u000a<li><a href=\"http://feeds.feedburner.com/SoftwareIsHard\">Posts</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a</ul></div>\u000a\u0009<div class=\"block\"><ul><li class=\"categories\"><h3>Categories</h3><ul>\u0009<li class=\"cat-item cat-item-69\"><a href=\"http://www.softwareishard.com/blog/category/documentation/\" title=\"View all posts filed under Documentation\">Documentation</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-19\"><a href=\"http://www.softwareishard.com/blog/category/domplate/\" title=\"View all posts filed under Domplate\">Domplate</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-81\"><a href=\"http://www.softwareishard.com/blog/category/eventbug/\" title=\"View all posts filed under Eventbug\">Eventbug</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-45\"><a href=\"http://www.softwareishard.com/blog/category/extension-architecture/\" title=\"View all posts filed under Extension Architecture\">Extension Architecture</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-5\"><a href=\"http://www.softwareishard.com/blog/category/firebug/\" title=\"View all posts filed under Firebug\">Firebug</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-4\"><a href=\"http://www.softwareishard.com/blog/category/firebug-tutorial/\" title=\"View all posts filed under Firebug Tutorial\">Firebug Tutorial</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-8\"><a href=\"http://www.softwareishard.com/blog/category/firecookie/\" title=\"View all posts filed under Firecookie\">Firecookie</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-86\"><a href=\"http://www.softwareishard.com/blog/category/firestarter/\" title=\"View all posts filed under Firestarter\">Firestarter</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-41\"><a href=\"http://www.softwareishard.com/blog/category/fireunit/\" title=\"View all posts filed under Fireunit\">Fireunit</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-75\"><a href=\"http://www.softwareishard.com/blog/category/har/\" title=\"View all posts filed under HAR\">HAR</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-59\"><a href=\"http://www.softwareishard.com/blog/category/netexport/\" title=\"View all posts filed under NetExport\">NetExport</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-18\"><a href=\"http://www.softwareishard.com/blog/category/planet-mozilla/\" title=\"View all posts filed under Planet Mozilla\">Planet Mozilla</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-34\"><a href=\"http://www.softwareishard.com/blog/category/prism/\" title=\"View all posts filed under Prism\">Prism</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-110\"><a href=\"http://www.softwareishard.com/blog/category/release/\" title=\"View all posts filed under Release\">Release</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-43\"><a href=\"http://www.softwareishard.com/blog/category/testing/\" title=\"View all posts filed under Testing\">Testing</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-1\"><a href=\"http://www.softwareishard.com/blog/category/uncategorized/\" title=\"View all posts filed under Uncategorized\">Uncategorized</a>\u000a</li>\u000a</ul></li></ul></div>\u000a\u000a <div class=\"block\">\u000a   <h3>Search:</h3>\u000a   <form id=\"searchform\" method=\"get\" action=\"http://www.softwareishard.com/blog\">\u000a\u0009\u0009<input class=\"cerca_modulo\" type=\"text\" name=\"s\" id=\"s\" size=\"12\" />\u000a\u0009\u0009<input class=\"cerca_invio\" type=\"submit\" value=\"Search\" />\u000a\u0009</form>\u000a </div>\u000a \u000a <div class=\"block\"><h3>Archives</h3>\u000a\u0009<ul>\u000a\u0009 \u0009<li><a href='http://www.softwareishard.com/blog/2010/09/' title='September 2010'>September 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/08/' title='August 2010'>August 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/07/' title='July 2010'>July 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/06/' title='June 2010'>June 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/05/' title='May 2010'>May 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/03/' title='March 2010'>March 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/02/' title='February 2010'>February 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/01/' title='January 2010'>January 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/11/' title='November 2009'>November 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/10/' title='October 2009'>October 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/09/' title='September 2009'>September 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/07/' title='July 2009'>July 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/05/' title='May 2009'>May 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/04/' title='April 2009'>April 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/03/' title='March 2009'>March 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/01/' title='January 2009'>January 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/12/' title='December 2008'>December 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/11/' title='November 2008'>November 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/10/' title='October 2008'>October 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/09/' title='September 2008'>September 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/08/' title='August 2008'>August 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/07/' title='July 2008'>July 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/06/' title='June 2008'>June 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/05/' title='May 2008'>May 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/04/' title='April 2008'>April 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/03/' title='March 2008'>March 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/02/' title='February 2008'>February 2008</a></li>\u000a\u0009</ul>\u000a </div>\u000a \u000a<!-- <div class=\"block\"><h3>Meta:</h3>\u000a\u0009<ul>\u000a\u0009\u0009\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/wp-login.php\">Login</a></li>\u000a\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/feed/\" title=\"Syndicate this site using RSS\"><abbr title=\"Really Simple Syndication\">RSS</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/comments/feed/\" title=\"The latest comments to all posts in RSS\">Comments <abbr title=\"Really Simple Syndication\">RSS</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://validator.w3.org/check/referer\" title=\"This page validates as XHTML 1.0 Transitional\">Valid <abbr title=\"eXtensible HyperText Markup Language\">XHTML</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://gmpg.org/xfn/\"><abbr title=\"XHTML Friends Network\">XFN</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://wordpress.org/\" title=\"Powered by WordPress, state-of-the-art semantic personal publishing platform.\"><abbr title=\"WordPress\">WP</abbr></a></li>\u000a\u0009\u0009\u0009</ul>\u000a </div>\u000a-->\u000a\u000a<!-- This is only for the demo page, remove it if you don't want this block\u000a<div class=\"block\"> \u000a\u0009<h3>Theme Switcher</h3>\u000a\u0009</div>\u000a-->\u000a\u000a</div>\u000a<div class=\"bottom\"></div>\u000a</div><div class=\"clear\"></div>\u000a\u000a<div id=\"footer\">\u000a<a href=\"http://www.wordpress.org\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/wordpress.gif\" alt=\"Wordpress.org\"/></a>\u000a<a href=\"http://www.creativebits.it/news/tema-wordpress-minibits/\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/creativebits.gif\" alt=\"clearPaper by CreativeBits.it\"/></a>\u000a\u0009<span>Copyright &copy; 2007 Software is hard. All rights reserved.</span>\u000a\u0009<span><a href=\"http://validator.w3.org/check/referer\" title=\"Pagina valida XHTML 1.0 Transitional\">Xhtml</a>, <a href=\"http://jigsaw.w3.org/css-validator/check/referer\" title=\"Pagina valida CSS v.1\">Css</a>, <a href=\"http://www.softwareishard.com/blog/feed/\">Rss</a>. Powered by <a href=\"http://www.creativebits.it/news/tema-wordpress-minibits/\">miniBits</a> &amp; <a href=\"http://www.wordpress.org/\">Wordpress</a>.</span></div>\u000a\u000a</div>\u000a\u000a<div id=\"sk2-footer\" style=\"color:#FFF; background-color:#444; padding: 3px 2px 3px 2px; border-top: #888 solid 1px;\">This blog is protected by <a href=\"http://unknowngenius.com/blog/\" title=\"Dave\">Dave</a>'s <strong><a href=\"http://unknowngenius.com/blog/wordpress/spam-karma/\" title=\"SK2\">Spam Karma 2</a></strong>: <strong>27416</strong>  Spams eaten and counting...</div>\u000a<script src=\"http://www.google-analytics.com/urchin.js\" type=\"text/javascript\">\u000d\u000a</script>\u000d\u000a<script type=\"text/javascript\">\u000d\u000a_uacct = \"UA-3586722-1\";\u000d\u000aurchinTracker();\u000d\u000a</script>\u000a</body>\u000a</html>"
          },
          "redirectURL":"",
          "headersSize":323,
          "bodySize":31918
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":22,
          "blocked":0,
          "send":0,
          "wait":1875,
          "receive":101
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.580+02:00",
        "time":79,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":492,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:25:01 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fed-1dfc-bd82b140\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"7676"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"text/css"
            }
          ],
          "content":{
            "size":7676,
            "mimeType":"text/css",
            "text":"/* \u000aTheme Name: miniBits \u000aTheme URI: http://www.creativebits.it/go/minibits \u000aVersion: 0.8 \u000aAuthor: Raffaele Rasini \u000aAuthor URI: http://creativebits.it/ \u000a*/ \u000a\u000a* { padding:0; margin:0; }\u000abody { padding:0px; text-align: left; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; color: #222222; line-height: 150%; /*background: #4A525A ;*/ background-color: #fff; }\u000ahr { display: none; margin: 0; }\u000aa { color: #6B8D20; text-decoration: underline; }\u000aa:hover { background-color: #6B8D20; color: White; text-decoration: none; }\u000aa img, .post a img, img { border: 0; text-decoration: none; border-color: white; }\u000ah1, h2, h3, h4, h5, h6 { font-family: Georgia, serif; }\u000aspan.highlight { background-color: #FFFFDB; }\u000a\u000a/* ---[ Elementi ]------------------------------- */\u000ablockquote { margin: 1em 0 1em 0; padding: 0; color: #777; background: White url(img/quote.gif) no-repeat top left; padding-top: 10px; padding-left: 35px; }\u000acode { color: #6B8D20; font-family: Monaco, monospace; text-align: left; }\u000acode strong { color: #4E6200; }\u000aabbr, acronym, .popup { font-style: normal; border-bottom: 1px dotted #999; cursor: help; }\u000aem { font-style: italic; }\u000astrong { font-weight: bold; }\u000astrike, del { text-decoration: line-through; }\u000ains { text-decoration: none; }\u000aaddress { margin: 0; padding: 0; font-style: normal; }\u000a\u000a/* ---[ Container ]------------------------------- */ \u000a#wrapper { margin: 0 auto; text-align: left; width: 760px; background: #FFFFFF ; font-size: 0.9em; line-height: 1.6em; padding: 20px 10px 0 10px; /*border-right: 2px solid #424A51; border-left: 2px solid #424A51;*/ }\u000a#wrapper .container { float: left; width: 520px; }\u000a.clear { clear: both; }\u000a\u000a/* ---[ Header ]------------------------------- */ \u000a#header { padding: 30px 0 20px 0; text-align:center; }\u000a#header h1 { font-weight: lighter; font-size: 4em; margin-bottom: 10px; }\u000a#header h1 a { color: #4A525A; text-decoration: none; }\u000a#header h1 a:hover { color: #9D4134; background-color: transparent; }\u000a#header span.desc { color: #7B8691; text-transform: uppercase; font-size: 0.9em; }\u000a\u000a/* ---[ Pagine ]------------------------------- */ \u000a.post { margin-bottom: 25px; }\u000a.post .titolo { border-bottom: 1px solid #E1E1D3; padding-bottom: 3px; }\u000a* html .post .titolo { padding-bottom: 6px; }\u000a.post h2, .post h2 a { color: #DD467B; font-size: 22.8px; font-weight: lighter; display: inline; }\u000a.post h2 a { border: 0; text-decoration: none; }\u000a.post h2 a:hover { background-color: transparent; color: #6B8D20; }\u000a.post h3 { margin-bottom: 4px; padding-bottom: 3px; font-size: 1.2em; color: #278BD8; font-weight: bold; border-bottom: 1px solid #D8D3C1; }\u000a.post span.edit { float: right; margin-top: -20px; }\u000a.post span.edit a { border: 0; font-size: 0.9em; }\u000a.post small { color: #878787; font-size: 0.9em; padding-left: 1px; }\u000a* html .post small { padding-left: 5px; }\u000a\u000a.post div.corpo ul.more_info a { color: #D87431; }\u000a.post div.corpo ul.more_info a:hover { background-color: #D87431; color: White; }\u000a.post div.corpo ul.more_info { list-style-type: none; margin: 0; padding: 3px 8px 3px 8px; width: 145px; float: right; margin-bottom: 10px; margin-left: 10px; background-color: #F8F8F6; border: 1px solid #E2E2DA; }\u000a.post div.corpo ul.more_info li { padding-top: 5px; padding-bottom: 5px; border-top: 1px solid #E2E2DA; }\u000a.post div.corpo ul.more_info li.first { border: 0; }\u000a.post div.corpo ul.more_info span { display: block; }\u000a.post div.corpo { padding-top: 6px; }\u000a.post div.corpo a.more-link { color: #9D4134; }\u000a.post div.corpo a.more-link:hover { color: White; background-color: #9D4134; }\u000a.post div.corpo ul, .post div.corpo ol{ margin: 15px 0 15px 35px; }\u000a.post div.corpo p { margin-bottom: 10px; }\u000aimg.center, img[align=\"center\"] { display: block; margin-left: auto; margin-right: auto; }\u000aimg.alignright, img[align=\"right\"] { padding: 4px 0 0 0; margin: 0 0 5px 5px; display: inline; }\u000aimg.alignleft, img[align=\"left\"] { padding: 4px 0 0 0; margin: 0 5px 5px 0; display: inline; }\u000a.post div.corpo h4 { font-size: 1.1em; margin-top: 10px; margin-bottom: 0; }\u000a\u000a/* ---[ Commenti ]------------------------------- */ \u000a#commenti { margin-top: 15px; }\u000a#commenti h4 { margin-bottom: 15px; font-size: 1.05em; color: #626C76; font-weight: bold; border-bottom: 1px solid #E1E1D3; }\u000a#commenti a.rss_commenti { border: 0; float: right; margin-top: 1px; }\u000a#commenti ol#commentlist { list-style-type: none; }\u000a#commenti ol#commentlist li { margin-bottom: 15px; }\u000a#commenti ol#commentlist li span { display: block; }\u000a#commenti ol#commentlist li div.messaggio { background: #F4FAE2; padding: 10px; }\u000a#commenti ol#commentlist li span.autore { padding: 5px 10px 5px 0; background: url(img/comment-from.gif) no-repeat 20px 0px; }\u000a#commenti ol#commentlist li span.autore a.count{ color: #999999; margin-right: 45px; font-weight: normal; }\u000a#commenti ol#commentlist li span.autore a.count:hover{ color: #666666; background-color: White; }\u000a\u000a/* Stile link per commentatore normale */ \u000a#commenti ol#commentlist li span.autore a { font-weight: bold; color: #96B236; border-color: #CFE7F7; }\u000a#commenti ol#commentlist li span.autore a:hover { background-color: White; }\u000a.nocomment { padding: 0 0 10px 0; margin: 0; }\u000a#commenti ol#commentlist li span.edit_comment { float: right; margin: -16px 0 0 0; }\u000a\u000a/* Modulo inserimento commenti */ \u000a#commenti .form_commenti { }\u000a#commenti .form_commenti form { color: #595750; padding: 0; margin-top: -4px; }\u000aform label { display: block; }\u000a\u000a/* link e maggiori info sui commenti */ \u000a#commenti .form_commenti .more_info { background-color: #FFF0F5; float: right; }\u000a#commenti .form_commenti form br { display: none; }\u000a\u000a/* ---[ Sidebar ]------------------- */ \u000a#sidebar { width: 220px; background-color: #F0F3F4; float: right; color: #727267; }\u000a#sidebar .main_sidebar { padding: 5px 10px 5px 10px; }\u000a#sidebar h3, #sidebar h2 { font-size: 1.2em; padding-bottom: 2px; color: #3C4848; border-bottom: 1px solid #CCD6D6; font-weight: lighter; margin-bottom: 4px; }\u000a#sidebar a { color: #4170BE; text-decoration: underline; }\u000a#sidebar a:hover { background-color: #4170BE; color: White; text-decoration: none; }\u000a#sidebar .top { background: url(img/sidebar_top.gif) no-repeat top center; height: 5px; }\u000a#sidebar .bottom { background: url(img/sidebar_bottom.gif) no-repeat bottom center; height: 5px; }\u000a#sidebar ul, #sidebar ol, #sidebar li { list-style-type: none; }\u000a#sidebar .block, #sidebar .linkcat { margin-bottom: 15px; }\u000a.cerca_modulo { width: 130px; }\u000a.cerca_invio { width: 60px; }\u000a\u000a/* ---[ Widget]------------- */ \u000a#wp-calendar { width: 180px; }\u000a\u000a/* ---[ Footer ]------------------------------- */ \u000a#footer { padding: 8px 0 8px 0; border-top: 1px solid #EEEEEE; margin: 0px; font-size: 0.9em; color: #999999; margin-top: 15px; }\u000a#footer img { float: left; margin-top: 5px; margin-bottom: -5px; margin-right: 5px; }\u000a#footer img a { border: 0; }\u000a#footer span{ display: block; margin-left: 60px; }\u000a#footer a { color: #333; border-color: #D8F18C; }\u000a#footer a:hover { background-color: White; color: #333; text-decoration: none; }\u000a\u000a\u000a/* ---- Honza ---- */\u000ah3 {\u000a    padding-top: 20px;\u000a}\u000a\u000a.sihTable {\u000a    margin-bottom: 20px;\u000a}\u000a\u000a.sihTableBorder {\u000a    border-top: solid 1px #D8D3C1;\u000a    border-left: solid 1px #D8D3C1;\u000a}\u000a\u000a.sihTableBorder TD {\u000a    border-right: solid 1px #D8D3C1;\u000a    border-bottom: solid 1px #D8D3C1;\u000a    padding: 7px;\u000a}\u000a\u000a.sihImageBorder {\u000a    border: 4px solid #D1D1D1;\u000a}\u000a \u000a#main_header { width: 100%; background-color: #F0F3F4; margin-bottom:40px; border:1px solid #E2E2DA;}\u000a/*#main_header .top { background: url(img/sidebar_top.gif) no-repeat top center; height: 5px; }\u000a#main_header .bottom { background: url(img/sidebar_bottom.gif) no-repeat bottom center; height: 5px; }*/\u000a\u000a"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":7676
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":22,
          "blocked":0,
          "send":0,
          "wait":27,
          "receive":30
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.581+02:00",
        "time":194,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/prototype.js?ver=1.5.1.1",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.5.1.1"
            }
          ],
          "headersSize":471,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Tue, 05 Feb 2008 14:05:21 GMT"
            },
            {
              "name":"Etag",
              "value":"\"12054-17837-bb2cca40\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"96311"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:27 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"application/javascript"
            }
          ],
          "content":{
            "size":96309,
            "mimeType":"application/javascript",
            "text":"/*  Prototype JavaScript framework, version 1.5.1.1\u000a *  (c) 2005-2007 Sam Stephenson\u000a *\u000a *  Prototype is freely distributable under the terms of an MIT-style license.\u000a *  For details, see the Prototype web site: http://www.prototypejs.org/\u000a *\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Prototype = {\u000a  Version: '1.5.1.1',\u000a\u000a  Browser: {\u000a    IE:     !!(window.attachEvent && !window.opera),\u000a    Opera:  !!window.opera,\u000a    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,\u000a    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1\u000a  },\u000a\u000a  BrowserFeatures: {\u000a    XPath: !!document.evaluate,\u000a    ElementExtensions: !!window.HTMLElement,\u000a    SpecificElementExtensions:\u000a      (document.createElement('div').__proto__ !==\u000a       document.createElement('form').__proto__)\u000a  },\u000a\u000a  ScriptFragment: '<script[^>]*>([\\\\S\\\\s]*?)<\\/script>',\u000a  JSONFilter: /^\\/\\*-secure-([\\s\\S]*)\\*\\/\\s*$/,\u000a\u000a  emptyFunction: function() { },\u000a  K: function(x) { return x }\u000a}\u000a\u000avar Class = {\u000a  create: function() {\u000a    return function() {\u000a      this.initialize.apply(this, arguments);\u000a    }\u000a  }\u000a}\u000a\u000avar Abstract = new Object();\u000a\u000aObject.extend = function(destination, source) {\u000a  for (var property in source) {\u000a    destination[property] = source[property];\u000a  }\u000a  return destination;\u000a}\u000a\u000aObject.extend(Object, {\u000a  inspect: function(object) {\u000a    try {\u000a      if (object === undefined) return 'undefined';\u000a      if (object === null) return 'null';\u000a      return object.inspect ? object.inspect() : object.toString();\u000a    } catch (e) {\u000a      if (e instanceof RangeError) return '...';\u000a      throw e;\u000a    }\u000a  },\u000a\u000a  toJSON: function(object) {\u000a    var type = typeof object;\u000a    switch(type) {\u000a      case 'undefined':\u000a      case 'function':\u000a      case 'unknown': return;\u000a      case 'boolean': return object.toString();\u000a    }\u000a    if (object === null) return 'null';\u000a    if (object.toJSON) return object.toJSON();\u000a    if (object.ownerDocument === document) return;\u000a    var results = [];\u000a    for (var property in object) {\u000a      var value = Object.toJSON(object[property]);\u000a      if (value !== undefined)\u000a        results.push(property.toJSON() + ': ' + value);\u000a    }\u000a    return '{' + results.join(', ') + '}';\u000a  },\u000a\u000a  keys: function(object) {\u000a    var keys = [];\u000a    for (var property in object)\u000a      keys.push(property);\u000a    return keys;\u000a  },\u000a\u000a  values: function(object) {\u000a    var values = [];\u000a    for (var property in object)\u000a      values.push(object[property]);\u000a    return values;\u000a  },\u000a\u000a  clone: function(object) {\u000a    return Object.extend({}, object);\u000a  }\u000a});\u000a\u000aFunction.prototype.bind = function() {\u000a  var __method = this, args = $A(arguments), object = args.shift();\u000a  return function() {\u000a    return __method.apply(object, args.concat($A(arguments)));\u000a  }\u000a}\u000a\u000aFunction.prototype.bindAsEventListener = function(object) {\u000a  var __method = this, args = $A(arguments), object = args.shift();\u000a  return function(event) {\u000a    return __method.apply(object, [event || window.event].concat(args));\u000a  }\u000a}\u000a\u000aObject.extend(Number.prototype, {\u000a  toColorPart: function() {\u000a    return this.toPaddedString(2, 16);\u000a  },\u000a\u000a  succ: function() {\u000a    return this + 1;\u000a  },\u000a\u000a  times: function(iterator) {\u000a    $R(0, this, true).each(iterator);\u000a    return this;\u000a  },\u000a\u000a  toPaddedString: function(length, radix) {\u000a    var string = this.toString(radix || 10);\u000a    return '0'.times(length - string.length) + string;\u000a  },\u000a\u000a  toJSON: function() {\u000a    return isFinite(this) ? this.toString() : 'null';\u000a  }\u000a});\u000a\u000aDate.prototype.toJSON = function() {\u000a  return '\"' + this.getFullYear() + '-' +\u000a    (this.getMonth() + 1).toPaddedString(2) + '-' +\u000a    this.getDate().toPaddedString(2) + 'T' +\u000a    this.getHours().toPaddedString(2) + ':' +\u000a    this.getMinutes().toPaddedString(2) + ':' +\u000a    this.getSeconds().toPaddedString(2) + '\"';\u000a};\u000a\u000avar Try = {\u000a  these: function() {\u000a    var returnValue;\u000a\u000a    for (var i = 0, length = arguments.length; i < length; i++) {\u000a      var lambda = arguments[i];\u000a      try {\u000a        returnValue = lambda();\u000a        break;\u000a      } catch (e) {}\u000a    }\u000a\u000a    return returnValue;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar PeriodicalExecuter = Class.create();\u000aPeriodicalExecuter.prototype = {\u000a  initialize: function(callback, frequency) {\u000a    this.callback = callback;\u000a    this.frequency = frequency;\u000a    this.currentlyExecuting = false;\u000a\u000a    this.registerCallback();\u000a  },\u000a\u000a  registerCallback: function() {\u000a    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\u000a  },\u000a\u000a  stop: function() {\u000a    if (!this.timer) return;\u000a    clearInterval(this.timer);\u000a    this.timer = null;\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    if (!this.currentlyExecuting) {\u000a      try {\u000a        this.currentlyExecuting = true;\u000a        this.callback(this);\u000a      } finally {\u000a        this.currentlyExecuting = false;\u000a      }\u000a    }\u000a  }\u000a}\u000aObject.extend(String, {\u000a  interpret: function(value) {\u000a    return value == null ? '' : String(value);\u000a  },\u000a  specialChar: {\u000a    '\\b': '\\\\b',\u000a    '\\t': '\\\\t',\u000a    '\\n': '\\\\n',\u000a    '\\f': '\\\\f',\u000a    '\\r': '\\\\r',\u000a    '\\\\': '\\\\\\\\'\u000a  }\u000a});\u000a\u000aObject.extend(String.prototype, {\u000a  gsub: function(pattern, replacement) {\u000a    var result = '', source = this, match;\u000a    replacement = arguments.callee.prepareReplacement(replacement);\u000a\u000a    while (source.length > 0) {\u000a      if (match = source.match(pattern)) {\u000a        result += source.slice(0, match.index);\u000a        result += String.interpret(replacement(match));\u000a        source  = source.slice(match.index + match[0].length);\u000a      } else {\u000a        result += source, source = '';\u000a      }\u000a    }\u000a    return result;\u000a  },\u000a\u000a  sub: function(pattern, replacement, count) {\u000a    replacement = this.gsub.prepareReplacement(replacement);\u000a    count = count === undefined ? 1 : count;\u000a\u000a    return this.gsub(pattern, function(match) {\u000a      if (--count < 0) return match[0];\u000a      return replacement(match);\u000a    });\u000a  },\u000a\u000a  scan: function(pattern, iterator) {\u000a    this.gsub(pattern, iterator);\u000a    return this;\u000a  },\u000a\u000a  truncate: function(length, truncation) {\u000a    length = length || 30;\u000a    truncation = truncation === undefined ? '...' : truncation;\u000a    return this.length > length ?\u000a      this.slice(0, length - truncation.length) + truncation : this;\u000a  },\u000a\u000a  strip: function() {\u000a    return this.replace(/^\\s+/, '').replace(/\\s+$/, '');\u000a  },\u000a\u000a  stripTags: function() {\u000a    return this.replace(/<\\/?[^>]+>/gi, '');\u000a  },\u000a\u000a  stripScripts: function() {\u000a    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');\u000a  },\u000a\u000a  extractScripts: function() {\u000a    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');\u000a    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');\u000a    return (this.match(matchAll) || []).map(function(scriptTag) {\u000a      return (scriptTag.match(matchOne) || ['', ''])[1];\u000a    });\u000a  },\u000a\u000a  evalScripts: function() {\u000a    return this.extractScripts().map(function(script) { return eval(script) });\u000a  },\u000a\u000a  escapeHTML: function() {\u000a    var self = arguments.callee;\u000a    self.text.data = this;\u000a    return self.div.innerHTML;\u000a  },\u000a\u000a  unescapeHTML: function() {\u000a    var div = document.createElement('div');\u000a    div.innerHTML = this.stripTags();\u000a    return div.childNodes[0] ? (div.childNodes.length > 1 ?\u000a      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :\u000a      div.childNodes[0].nodeValue) : '';\u000a  },\u000a\u000a  toQueryParams: function(separator) {\u000a    var match = this.strip().match(/([^?#]*)(#.*)?$/);\u000a    if (!match) return {};\u000a\u000a    return match[1].split(separator || '&').inject({}, function(hash, pair) {\u000a      if ((pair = pair.split('='))[0]) {\u000a        var key = decodeURIComponent(pair.shift());\u000a        var value = pair.length > 1 ? pair.join('=') : pair[0];\u000a        if (value != undefined) value = decodeURIComponent(value);\u000a\u000a        if (key in hash) {\u000a          if (hash[key].constructor != Array) hash[key] = [hash[key]];\u000a          hash[key].push(value);\u000a        }\u000a        else hash[key] = value;\u000a      }\u000a      return hash;\u000a    });\u000a  },\u000a\u000a  toArray: function() {\u000a    return this.split('');\u000a  },\u000a\u000a  succ: function() {\u000a    return this.slice(0, this.length - 1) +\u000a      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);\u000a  },\u000a\u000a  times: function(count) {\u000a    var result = '';\u000a    for (var i = 0; i < count; i++) result += this;\u000a    return result;\u000a  },\u000a\u000a  camelize: function() {\u000a    var parts = this.split('-'), len = parts.length;\u000a    if (len == 1) return parts[0];\u000a\u000a    var camelized = this.charAt(0) == '-'\u000a      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)\u000a      : parts[0];\u000a\u000a    for (var i = 1; i < len; i++)\u000a      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);\u000a\u000a    return camelized;\u000a  },\u000a\u000a  capitalize: function() {\u000a    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\u000a  },\u000a\u000a  underscore: function() {\u000a    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();\u000a  },\u000a\u000a  dasherize: function() {\u000a    return this.gsub(/_/,'-');\u000a  },\u000a\u000a  inspect: function(useDoubleQuotes) {\u000a    var escapedString = this.gsub(/[\\x00-\\x1f\\\\]/, function(match) {\u000a      var character = String.specialChar[match[0]];\u000a      return character ? character : '\\\\u00' + match[0].charCodeAt().toPaddedString(2, 16);\u000a    });\u000a    if (useDoubleQuotes) return '\"' + escapedString.replace(/\"/g, '\\\\\"') + '\"';\u000a    return \"'\" + escapedString.replace(/'/g, '\\\\\\'') + \"'\";\u000a  },\u000a\u000a  toJSON: function() {\u000a    return this.inspect(true);\u000a  },\u000a\u000a  unfilterJSON: function(filter) {\u000a    return this.sub(filter || Prototype.JSONFilter, '#{1}');\u000a  },\u000a\u000a  isJSON: function() {\u000a    var str = this.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\u000a    return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\u000a  },\u000a\u000a  evalJSON: function(sanitize) {\u000a    var json = this.unfilterJSON();\u000a    try {\u000a      if (!sanitize || json.isJSON()) return eval('(' + json + ')');\u000a    } catch (e) { }\u000a    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());\u000a  },\u000a\u000a  include: function(pattern) {\u000a    return this.indexOf(pattern) > -1;\u000a  },\u000a\u000a  startsWith: function(pattern) {\u000a    return this.indexOf(pattern) === 0;\u000a  },\u000a\u000a  endsWith: function(pattern) {\u000a    var d = this.length - pattern.length;\u000a    return d >= 0 && this.lastIndexOf(pattern) === d;\u000a  },\u000a\u000a  empty: function() {\u000a    return this == '';\u000a  },\u000a\u000a  blank: function() {\u000a    return /^\\s*$/.test(this);\u000a  }\u000a});\u000a\u000aif (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {\u000a  escapeHTML: function() {\u000a    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');\u000a  },\u000a  unescapeHTML: function() {\u000a    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');\u000a  }\u000a});\u000a\u000aString.prototype.gsub.prepareReplacement = function(replacement) {\u000a  if (typeof replacement == 'function') return replacement;\u000a  var template = new Template(replacement);\u000a  return function(match) { return template.evaluate(match) };\u000a}\u000a\u000aString.prototype.parseQuery = String.prototype.toQueryParams;\u000a\u000aObject.extend(String.prototype.escapeHTML, {\u000a  div:  document.createElement('div'),\u000a  text: document.createTextNode('')\u000a});\u000a\u000awith (String.prototype.escapeHTML) div.appendChild(text);\u000a\u000avar Template = Class.create();\u000aTemplate.Pattern = /(^|.|\\r|\\n)(#\\{(.*?)\\})/;\u000aTemplate.prototype = {\u000a  initialize: function(template, pattern) {\u000a    this.template = template.toString();\u000a    this.pattern  = pattern || Template.Pattern;\u000a  },\u000a\u000a  evaluate: function(object) {\u000a    return this.template.gsub(this.pattern, function(match) {\u000a      var before = match[1];\u000a      if (before == '\\\\') return match[2];\u000a      return before + String.interpret(object[match[3]]);\u000a    });\u000a  }\u000a}\u000a\u000avar $break = {}, $continue = new Error('\"throw $continue\" is deprecated, use \"return\" instead');\u000a\u000avar Enumerable = {\u000a  each: function(iterator) {\u000a    var index = 0;\u000a    try {\u000a      this._each(function(value) {\u000a        iterator(value, index++);\u000a      });\u000a    } catch (e) {\u000a      if (e != $break) throw e;\u000a    }\u000a    return this;\u000a  },\u000a\u000a  eachSlice: function(number, iterator) {\u000a    var index = -number, slices = [], array = this.toArray();\u000a    while ((index += number) < array.length)\u000a      slices.push(array.slice(index, index+number));\u000a    return slices.map(iterator);\u000a  },\u000a\u000a  all: function(iterator) {\u000a    var result = true;\u000a    this.each(function(value, index) {\u000a      result = result && !!(iterator || Prototype.K)(value, index);\u000a      if (!result) throw $break;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  any: function(iterator) {\u000a    var result = false;\u000a    this.each(function(value, index) {\u000a      if (result = !!(iterator || Prototype.K)(value, index))\u000a        throw $break;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  collect: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      results.push((iterator || Prototype.K)(value, index));\u000a    });\u000a    return results;\u000a  },\u000a\u000a  detect: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      if (iterator(value, index)) {\u000a        result = value;\u000a        throw $break;\u000a      }\u000a    });\u000a    return result;\u000a  },\u000a\u000a  findAll: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      if (iterator(value, index))\u000a        results.push(value);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  grep: function(pattern, iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      var stringValue = value.toString();\u000a      if (stringValue.match(pattern))\u000a        results.push((iterator || Prototype.K)(value, index));\u000a    })\u000a    return results;\u000a  },\u000a\u000a  include: function(object) {\u000a    var found = false;\u000a    this.each(function(value) {\u000a      if (value == object) {\u000a        found = true;\u000a        throw $break;\u000a      }\u000a    });\u000a    return found;\u000a  },\u000a\u000a  inGroupsOf: function(number, fillWith) {\u000a    fillWith = fillWith === undefined ? null : fillWith;\u000a    return this.eachSlice(number, function(slice) {\u000a      while(slice.length < number) slice.push(fillWith);\u000a      return slice;\u000a    });\u000a  },\u000a\u000a  inject: function(memo, iterator) {\u000a    this.each(function(value, index) {\u000a      memo = iterator(memo, value, index);\u000a    });\u000a    return memo;\u000a  },\u000a\u000a  invoke: function(method) {\u000a    var args = $A(arguments).slice(1);\u000a    return this.map(function(value) {\u000a      return value[method].apply(value, args);\u000a    });\u000a  },\u000a\u000a  max: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      value = (iterator || Prototype.K)(value, index);\u000a      if (result == undefined || value >= result)\u000a        result = value;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  min: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      value = (iterator || Prototype.K)(value, index);\u000a      if (result == undefined || value < result)\u000a        result = value;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  partition: function(iterator) {\u000a    var trues = [], falses = [];\u000a    this.each(function(value, index) {\u000a      ((iterator || Prototype.K)(value, index) ?\u000a        trues : falses).push(value);\u000a    });\u000a    return [trues, falses];\u000a  },\u000a\u000a  pluck: function(property) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      results.push(value[property]);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  reject: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      if (!iterator(value, index))\u000a        results.push(value);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  sortBy: function(iterator) {\u000a    return this.map(function(value, index) {\u000a      return {value: value, criteria: iterator(value, index)};\u000a    }).sort(function(left, right) {\u000a      var a = left.criteria, b = right.criteria;\u000a      return a < b ? -1 : a > b ? 1 : 0;\u000a    }).pluck('value');\u000a  },\u000a\u000a  toArray: function() {\u000a    return this.map();\u000a  },\u000a\u000a  zip: function() {\u000a    var iterator = Prototype.K, args = $A(arguments);\u000a    if (typeof args.last() == 'function')\u000a      iterator = args.pop();\u000a\u000a    var collections = [this].concat(args).map($A);\u000a    return this.map(function(value, index) {\u000a      return iterator(collections.pluck(index));\u000a    });\u000a  },\u000a\u000a  size: function() {\u000a    return this.toArray().length;\u000a  },\u000a\u000a  inspect: function() {\u000a    return '#<Enumerable:' + this.toArray().inspect() + '>';\u000a  }\u000a}\u000a\u000aObject.extend(Enumerable, {\u000a  map:     Enumerable.collect,\u000a  find:    Enumerable.detect,\u000a  select:  Enumerable.findAll,\u000a  member:  Enumerable.include,\u000a  entries: Enumerable.toArray\u000a});\u000avar $A = Array.from = function(iterable) {\u000a  if (!iterable) return [];\u000a  if (iterable.toArray) {\u000a    return iterable.toArray();\u000a  } else {\u000a    var results = [];\u000a    for (var i = 0, length = iterable.length; i < length; i++)\u000a      results.push(iterable[i]);\u000a    return results;\u000a  }\u000a}\u000a\u000aif (Prototype.Browser.WebKit) {\u000a  $A = Array.from = function(iterable) {\u000a    if (!iterable) return [];\u000a    if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&\u000a      iterable.toArray) {\u000a      return iterable.toArray();\u000a    } else {\u000a      var results = [];\u000a      for (var i = 0, length = iterable.length; i < length; i++)\u000a        results.push(iterable[i]);\u000a      return results;\u000a    }\u000a  }\u000a}\u000a\u000aObject.extend(Array.prototype, Enumerable);\u000a\u000aif (!Array.prototype._reverse)\u000a  Array.prototype._reverse = Array.prototype.reverse;\u000a\u000aObject.extend(Array.prototype, {\u000a  _each: function(iterator) {\u000a    for (var i = 0, length = this.length; i < length; i++)\u000a      iterator(this[i]);\u000a  },\u000a\u000a  clear: function() {\u000a    this.length = 0;\u000a    return this;\u000a  },\u000a\u000a  first: function() {\u000a    return this[0];\u000a  },\u000a\u000a  last: function() {\u000a    return this[this.length - 1];\u000a  },\u000a\u000a  compact: function() {\u000a    return this.select(function(value) {\u000a      return value != null;\u000a    });\u000a  },\u000a\u000a  flatten: function() {\u000a    return this.inject([], function(array, value) {\u000a      return array.concat(value && value.constructor == Array ?\u000a        value.flatten() : [value]);\u000a    });\u000a  },\u000a\u000a  without: function() {\u000a    var values = $A(arguments);\u000a    return this.select(function(value) {\u000a      return !values.include(value);\u000a    });\u000a  },\u000a\u000a  indexOf: function(object) {\u000a    for (var i = 0, length = this.length; i < length; i++)\u000a      if (this[i] == object) return i;\u000a    return -1;\u000a  },\u000a\u000a  reverse: function(inline) {\u000a    return (inline !== false ? this : this.toArray())._reverse();\u000a  },\u000a\u000a  reduce: function() {\u000a    return this.length > 1 ? this : this[0];\u000a  },\u000a\u000a  uniq: function(sorted) {\u000a    return this.inject([], function(array, value, index) {\u000a      if (0 == index || (sorted ? array.last() != value : !array.include(value)))\u000a        array.push(value);\u000a      return array;\u000a    });\u000a  },\u000a\u000a  clone: function() {\u000a    return [].concat(this);\u000a  },\u000a\u000a  size: function() {\u000a    return this.length;\u000a  },\u000a\u000a  inspect: function() {\u000a    return '[' + this.map(Object.inspect).join(', ') + ']';\u000a  },\u000a\u000a  toJSON: function() {\u000a    var results = [];\u000a    this.each(function(object) {\u000a      var value = Object.toJSON(object);\u000a      if (value !== undefined) results.push(value);\u000a    });\u000a    return '[' + results.join(', ') + ']';\u000a  }\u000a});\u000a\u000aArray.prototype.toArray = Array.prototype.clone;\u000a\u000afunction $w(string) {\u000a  string = string.strip();\u000a  return string ? string.split(/\\s+/) : [];\u000a}\u000a\u000aif (Prototype.Browser.Opera){\u000a  Array.prototype.concat = function() {\u000a    var array = [];\u000a    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);\u000a    for (var i = 0, length = arguments.length; i < length; i++) {\u000a      if (arguments[i].constructor == Array) {\u000a        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)\u000a          array.push(arguments[i][j]);\u000a      } else {\u000a        array.push(arguments[i]);\u000a      }\u000a    }\u000a    return array;\u000a  }\u000a}\u000avar Hash = function(object) {\u000a  if (object instanceof Hash) this.merge(object);\u000a  else Object.extend(this, object || {});\u000a};\u000a\u000aObject.extend(Hash, {\u000a  toQueryString: function(obj) {\u000a    var parts = [];\u000a    parts.add = arguments.callee.addPair;\u000a\u000a    this.prototype._each.call(obj, function(pair) {\u000a      if (!pair.key) return;\u000a      var value = pair.value;\u000a\u000a      if (value && typeof value == 'object') {\u000a        if (value.constructor == Array) value.each(function(value) {\u000a          parts.add(pair.key, value);\u000a        });\u000a        return;\u000a      }\u000a      parts.add(pair.key, value);\u000a    });\u000a\u000a    return parts.join('&');\u000a  },\u000a\u000a  toJSON: function(object) {\u000a    var results = [];\u000a    this.prototype._each.call(object, function(pair) {\u000a      var value = Object.toJSON(pair.value);\u000a      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);\u000a    });\u000a    return '{' + results.join(', ') + '}';\u000a  }\u000a});\u000a\u000aHash.toQueryString.addPair = function(key, value, prefix) {\u000a  key = encodeURIComponent(key);\u000a  if (value === undefined) this.push(key);\u000a  else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));\u000a}\u000a\u000aObject.extend(Hash.prototype, Enumerable);\u000aObject.extend(Hash.prototype, {\u000a  _each: function(iterator) {\u000a    for (var key in this) {\u000a      var value = this[key];\u000a      if (value && value == Hash.prototype[key]) continue;\u000a\u000a      var pair = [key, value];\u000a      pair.key = key;\u000a      pair.value = value;\u000a      iterator(pair);\u000a    }\u000a  },\u000a\u000a  keys: function() {\u000a    return this.pluck('key');\u000a  },\u000a\u000a  values: function() {\u000a    return this.pluck('value');\u000a  },\u000a\u000a  merge: function(hash) {\u000a    return $H(hash).inject(this, function(mergedHash, pair) {\u000a      mergedHash[pair.key] = pair.value;\u000a      return mergedHash;\u000a    });\u000a  },\u000a\u000a  remove: function() {\u000a    var result;\u000a    for(var i = 0, length = arguments.length; i < length; i++) {\u000a      var value = this[arguments[i]];\u000a      if (value !== undefined){\u000a        if (result === undefined) result = value;\u000a        else {\u000a          if (result.constructor != Array) result = [result];\u000a          result.push(value)\u000a        }\u000a      }\u000a      delete this[arguments[i]];\u000a    }\u000a    return result;\u000a  },\u000a\u000a  toQueryString: function() {\u000a    return Hash.toQueryString(this);\u000a  },\u000a\u000a  inspect: function() {\u000a    return '#<Hash:{' + this.map(function(pair) {\u000a      return pair.map(Object.inspect).join(': ');\u000a    }).join(', ') + '}>';\u000a  },\u000a\u000a  toJSON: function() {\u000a    return Hash.toJSON(this);\u000a  }\u000a});\u000a\u000afunction $H(object) {\u000a  if (object instanceof Hash) return object;\u000a  return new Hash(object);\u000a};\u000a\u000a// Safari iterates over shadowed properties\u000aif (function() {\u000a  var i = 0, Test = function(value) { this.key = value };\u000a  Test.prototype.key = 'foo';\u000a  for (var property in new Test('bar')) i++;\u000a  return i > 1;\u000a}()) Hash.prototype._each = function(iterator) {\u000a  var cache = [];\u000a  for (var key in this) {\u000a    var value = this[key];\u000a    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;\u000a    cache.push(key);\u000a    var pair = [key, value];\u000a    pair.key = key;\u000a    pair.value = value;\u000a    iterator(pair);\u000a  }\u000a};\u000aObjectRange = Class.create();\u000aObject.extend(ObjectRange.prototype, Enumerable);\u000aObject.extend(ObjectRange.prototype, {\u000a  initialize: function(start, end, exclusive) {\u000a    this.start = start;\u000a    this.end = end;\u000a    this.exclusive = exclusive;\u000a  },\u000a\u000a  _each: function(iterator) {\u000a    var value = this.start;\u000a    while (this.include(value)) {\u000a      iterator(value);\u000a      value = value.succ();\u000a    }\u000a  },\u000a\u000a  include: function(value) {\u000a    if (value < this.start)\u000a      return false;\u000a    if (this.exclusive)\u000a      return value < this.end;\u000a    return value <= this.end;\u000a  }\u000a});\u000a\u000avar $R = function(start, end, exclusive) {\u000a  return new ObjectRange(start, end, exclusive);\u000a}\u000a\u000avar Ajax = {\u000a  getTransport: function() {\u000a    return Try.these(\u000a      function() {return new XMLHttpRequest()},\u000a      function() {return new ActiveXObject('Msxml2.XMLHTTP')},\u000a      function() {return new ActiveXObject('Microsoft.XMLHTTP')}\u000a    ) || false;\u000a  },\u000a\u000a  activeRequestCount: 0\u000a}\u000a\u000aAjax.Responders = {\u000a  responders: [],\u000a\u000a  _each: function(iterator) {\u000a    this.responders._each(iterator);\u000a  },\u000a\u000a  register: function(responder) {\u000a    if (!this.include(responder))\u000a      this.responders.push(responder);\u000a  },\u000a\u000a  unregister: function(responder) {\u000a    this.responders = this.responders.without(responder);\u000a  },\u000a\u000a  dispatch: function(callback, request, transport, json) {\u000a    this.each(function(responder) {\u000a      if (typeof responder[callback] == 'function') {\u000a        try {\u000a          responder[callback].apply(responder, [request, transport, json]);\u000a        } catch (e) {}\u000a      }\u000a    });\u000a  }\u000a};\u000a\u000aObject.extend(Ajax.Responders, Enumerable);\u000a\u000aAjax.Responders.register({\u000a  onCreate: function() {\u000a    Ajax.activeRequestCount++;\u000a  },\u000a  onComplete: function() {\u000a    Ajax.activeRequestCount--;\u000a  }\u000a});\u000a\u000aAjax.Base = function() {};\u000aAjax.Base.prototype = {\u000a  setOptions: function(options) {\u000a    this.options = {\u000a      method:       'post',\u000a      asynchronous: true,\u000a      contentType:  'application/x-www-form-urlencoded',\u000a      encoding:     'UTF-8',\u000a      parameters:   ''\u000a    }\u000a    Object.extend(this.options, options || {});\u000a\u000a    this.options.method = this.options.method.toLowerCase();\u000a    if (typeof this.options.parameters == 'string')\u000a      this.options.parameters = this.options.parameters.toQueryParams();\u000a  }\u000a}\u000a\u000aAjax.Request = Class.create();\u000aAjax.Request.Events =\u000a  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];\u000a\u000aAjax.Request.prototype = Object.extend(new Ajax.Base(), {\u000a  _complete: false,\u000a\u000a  initialize: function(url, options) {\u000a    this.transport = Ajax.getTransport();\u000a    this.setOptions(options);\u000a    this.request(url);\u000a  },\u000a\u000a  request: function(url) {\u000a    this.url = url;\u000a    this.method = this.options.method;\u000a    var params = Object.clone(this.options.parameters);\u000a\u000a    if (!['get', 'post'].include(this.method)) {\u000a      // simulate other verbs over post\u000a      params['_method'] = this.method;\u000a      this.method = 'post';\u000a    }\u000a\u000a    this.parameters = params;\u000a\u000a    if (params = Hash.toQueryString(params)) {\u000a      // when GET, append parameters to URL\u000a      if (this.method == 'get')\u000a        this.url += (this.url.include('?') ? '&' : '?') + params;\u000a      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))\u000a        params += '&_=';\u000a    }\u000a\u000a    try {\u000a      if (this.options.onCreate) this.options.onCreate(this.transport);\u000a      Ajax.Responders.dispatch('onCreate', this, this.transport);\u000a\u000a      this.transport.open(this.method.toUpperCase(), this.url,\u000a        this.options.asynchronous);\u000a\u000a      if (this.options.asynchronous)\u000a        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\u000a\u000a      this.transport.onreadystatechange = this.onStateChange.bind(this);\u000a      this.setRequestHeaders();\u000a\u000a      this.body = this.method == 'post' ? (this.options.postBody || params) : null;\u000a      this.transport.send(this.body);\u000a\u000a      /* Force Firefox to handle ready state 4 for synchronous requests */\u000a      if (!this.options.asynchronous && this.transport.overrideMimeType)\u000a        this.onStateChange();\u000a\u000a    }\u000a    catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a  },\u000a\u000a  onStateChange: function() {\u000a    var readyState = this.transport.readyState;\u000a    if (readyState > 1 && !((readyState == 4) && this._complete))\u000a      this.respondToReadyState(this.transport.readyState);\u000a  },\u000a\u000a  setRequestHeaders: function() {\u000a    var headers = {\u000a      'X-Requested-With': 'XMLHttpRequest',\u000a      'X-Prototype-Version': Prototype.Version,\u000a      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'\u000a    };\u000a\u000a    if (this.method == 'post') {\u000a      headers['Content-type'] = this.options.contentType +\u000a        (this.options.encoding ? '; charset=' + this.options.encoding : '');\u000a\u000a      /* Force \"Connection: close\" for older Mozilla browsers to work\u000a       * around a bug where XMLHttpRequest sends an incorrect\u000a       * Content-length header. See Mozilla Bugzilla #246651.\u000a       */\u000a      if (this.transport.overrideMimeType &&\u000a          (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005)\u000a            headers['Connection'] = 'close';\u000a    }\u000a\u000a    // user-defined headers\u000a    if (typeof this.options.requestHeaders == 'object') {\u000a      var extras = this.options.requestHeaders;\u000a\u000a      if (typeof extras.push == 'function')\u000a        for (var i = 0, length = extras.length; i < length; i += 2)\u000a          headers[extras[i]] = extras[i+1];\u000a      else\u000a        $H(extras).each(function(pair) { headers[pair.key] = pair.value });\u000a    }\u000a\u000a    for (var name in headers)\u000a      this.transport.setRequestHeader(name, headers[name]);\u000a  },\u000a\u000a  success: function() {\u000a    return !this.transport.status\u000a        || (this.transport.status >= 200 && this.transport.status < 300);\u000a  },\u000a\u000a  respondToReadyState: function(readyState) {\u000a    var state = Ajax.Request.Events[readyState];\u000a    var transport = this.transport, json = this.evalJSON();\u000a\u000a    if (state == 'Complete') {\u000a      try {\u000a        this._complete = true;\u000a        (this.options['on' + this.transport.status]\u000a         || this.options['on' + (this.success() ? 'Success' : 'Failure')]\u000a         || Prototype.emptyFunction)(transport, json);\u000a      } catch (e) {\u000a        this.dispatchException(e);\u000a      }\u000a\u000a      var contentType = this.getHeader('Content-type');\u000a      if (contentType && contentType.strip().\u000a        match(/^(text|application)\\/(x-)?(java|ecma)script(;.*)?$/i))\u000a          this.evalResponse();\u000a    }\u000a\u000a    try {\u000a      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);\u000a      Ajax.Responders.dispatch('on' + state, this, transport, json);\u000a    } catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a\u000a    if (state == 'Complete') {\u000a      // avoid memory leak in MSIE: clean up\u000a      this.transport.onreadystatechange = Prototype.emptyFunction;\u000a    }\u000a  },\u000a\u000a  getHeader: function(name) {\u000a    try {\u000a      return this.transport.getResponseHeader(name);\u000a    } catch (e) { return null }\u000a  },\u000a\u000a  evalJSON: function() {\u000a    try {\u000a      var json = this.getHeader('X-JSON');\u000a      return json ? json.evalJSON() : null;\u000a    } catch (e) { return null }\u000a  },\u000a\u000a  evalResponse: function() {\u000a    try {\u000a      return eval((this.transport.responseText || '').unfilterJSON());\u000a    } catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a  },\u000a\u000a  dispatchException: function(exception) {\u000a    (this.options.onException || Prototype.emptyFunction)(this, exception);\u000a    Ajax.Responders.dispatch('onException', this, exception);\u000a  }\u000a});\u000a\u000aAjax.Updater = Class.create();\u000a\u000aObject.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\u000a  initialize: function(container, url, options) {\u000a    this.container = {\u000a      success: (container.success || container),\u000a      failure: (container.failure || (container.success ? null : container))\u000a    }\u000a\u000a    this.transport = Ajax.getTransport();\u000a    this.setOptions(options);\u000a\u000a    var onComplete = this.options.onComplete || Prototype.emptyFunction;\u000a    this.options.onComplete = (function(transport, param) {\u000a      this.updateContent();\u000a      onComplete(transport, param);\u000a    }).bind(this);\u000a\u000a    this.request(url);\u000a  },\u000a\u000a  updateContent: function() {\u000a    var receiver = this.container[this.success() ? 'success' : 'failure'];\u000a    var response = this.transport.responseText;\u000a\u000a    if (!this.options.evalScripts) response = response.stripScripts();\u000a\u000a    if (receiver = $(receiver)) {\u000a      if (this.options.insertion)\u000a        new this.options.insertion(receiver, response);\u000a      else\u000a        receiver.update(response);\u000a    }\u000a\u000a    if (this.success()) {\u000a      if (this.onComplete)\u000a        setTimeout(this.onComplete.bind(this), 10);\u000a    }\u000a  }\u000a});\u000a\u000aAjax.PeriodicalUpdater = Class.create();\u000aAjax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\u000a  initialize: function(container, url, options) {\u000a    this.setOptions(options);\u000a    this.onComplete = this.options.onComplete;\u000a\u000a    this.frequency = (this.options.frequency || 2);\u000a    this.decay = (this.options.decay || 1);\u000a\u000a    this.updater = {};\u000a    this.container = container;\u000a    this.url = url;\u000a\u000a    this.start();\u000a  },\u000a\u000a  start: function() {\u000a    this.options.onComplete = this.updateComplete.bind(this);\u000a    this.onTimerEvent();\u000a  },\u000a\u000a  stop: function() {\u000a    this.updater.options.onComplete = undefined;\u000a    clearTimeout(this.timer);\u000a    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\u000a  },\u000a\u000a  updateComplete: function(request) {\u000a    if (this.options.decay) {\u000a      this.decay = (request.responseText == this.lastText ?\u000a        this.decay * this.options.decay : 1);\u000a\u000a      this.lastText = request.responseText;\u000a    }\u000a    this.timer = setTimeout(this.onTimerEvent.bind(this),\u000a      this.decay * this.frequency * 1000);\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    this.updater = new Ajax.Updater(this.container, this.url, this.options);\u000a  }\u000a});\u000afunction $(element) {\u000a  if (arguments.length > 1) {\u000a    for (var i = 0, elements = [], length = arguments.length; i < length; i++)\u000a      elements.push($(arguments[i]));\u000a    return elements;\u000a  }\u000a  if (typeof element == 'string')\u000a    element = document.getElementById(element);\u000a  return Element.extend(element);\u000a}\u000a\u000aif (Prototype.BrowserFeatures.XPath) {\u000a  document._getElementsByXPath = function(expression, parentElement) {\u000a    var results = [];\u000a    var query = document.evaluate(expression, $(parentElement) || document,\u000a      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\u000a    for (var i = 0, length = query.snapshotLength; i < length; i++)\u000a      results.push(query.snapshotItem(i));\u000a    return results;\u000a  };\u000a\u000a  document.getElementsByClassName = function(className, parentElement) {\u000a    var q = \".//*[contains(concat(' ', @class, ' '), ' \" + className + \" ')]\";\u000a    return document._getElementsByXPath(q, parentElement);\u000a  }\u000a\u000a} else document.getElementsByClassName = function(className, parentElement) {\u000a  var children = ($(parentElement) || document.body).getElementsByTagName('*');\u000a  var elements = [], child, pattern = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\u000a  for (var i = 0, length = children.length; i < length; i++) {\u000a    child = children[i];\u000a    var elementClassName = child.className;\u000a    if (elementClassName.length == 0) continue;\u000a    if (elementClassName == className || elementClassName.match(pattern))\u000a      elements.push(Element.extend(child));\u000a  }\u000a  return elements;\u000a};\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aif (!window.Element) var Element = {};\u000a\u000aElement.extend = function(element) {\u000a  var F = Prototype.BrowserFeatures;\u000a  if (!element || !element.tagName || element.nodeType == 3 ||\u000a   element._extended || F.SpecificElementExtensions || element == window)\u000a    return element;\u000a\u000a  var methods = {}, tagName = element.tagName, cache = Element.extend.cache,\u000a   T = Element.Methods.ByTag;\u000a\u000a  // extend methods for all tags (Safari doesn't need this)\u000a  if (!F.ElementExtensions) {\u000a    Object.extend(methods, Element.Methods),\u000a    Object.extend(methods, Element.Methods.Simulated);\u000a  }\u000a\u000a  // extend methods for specific tags\u000a  if (T[tagName]) Object.extend(methods, T[tagName]);\u000a\u000a  for (var property in methods) {\u000a    var value = methods[property];\u000a    if (typeof value == 'function' && !(property in element))\u000a      element[property] = cache.findOrStore(value);\u000a  }\u000a\u000a  element._extended = Prototype.emptyFunction;\u000a  return element;\u000a};\u000a\u000aElement.extend.cache = {\u000a  findOrStore: function(value) {\u000a    return this[value] = this[value] || function() {\u000a      return value.apply(null, [this].concat($A(arguments)));\u000a    }\u000a  }\u000a};\u000a\u000aElement.Methods = {\u000a  visible: function(element) {\u000a    return $(element).style.display != 'none';\u000a  },\u000a\u000a  toggle: function(element) {\u000a    element = $(element);\u000a    Element[Element.visible(element) ? 'hide' : 'show'](element);\u000a    return element;\u000a  },\u000a\u000a  hide: function(element) {\u000a    $(element).style.display = 'none';\u000a    return element;\u000a  },\u000a\u000a  show: function(element) {\u000a    $(element).style.display = '';\u000a    return element;\u000a  },\u000a\u000a  remove: function(element) {\u000a    element = $(element);\u000a    element.parentNode.removeChild(element);\u000a    return element;\u000a  },\u000a\u000a  update: function(element, html) {\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    $(element).innerHTML = html.stripScripts();\u000a    setTimeout(function() {html.evalScripts()}, 10);\u000a    return element;\u000a  },\u000a\u000a  replace: function(element, html) {\u000a    element = $(element);\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    if (element.outerHTML) {\u000a      element.outerHTML = html.stripScripts();\u000a    } else {\u000a      var range = element.ownerDocument.createRange();\u000a      range.selectNodeContents(element);\u000a      element.parentNode.replaceChild(\u000a        range.createContextualFragment(html.stripScripts()), element);\u000a    }\u000a    setTimeout(function() {html.evalScripts()}, 10);\u000a    return element;\u000a  },\u000a\u000a  inspect: function(element) {\u000a    element = $(element);\u000a    var result = '<' + element.tagName.toLowerCase();\u000a    $H({'id': 'id', 'className': 'class'}).each(function(pair) {\u000a      var property = pair.first(), attribute = pair.last();\u000a      var value = (element[property] || '').toString();\u000a      if (value) result += ' ' + attribute + '=' + value.inspect(true);\u000a    });\u000a    return result + '>';\u000a  },\u000a\u000a  recursivelyCollect: function(element, property) {\u000a    element = $(element);\u000a    var elements = [];\u000a    while (element = element[property])\u000a      if (element.nodeType == 1)\u000a        elements.push(Element.extend(element));\u000a    return elements;\u000a  },\u000a\u000a  ancestors: function(element) {\u000a    return $(element).recursivelyCollect('parentNode');\u000a  },\u000a\u000a  descendants: function(element) {\u000a    return $A($(element).getElementsByTagName('*')).each(Element.extend);\u000a  },\u000a\u000a  firstDescendant: function(element) {\u000a    element = $(element).firstChild;\u000a    while (element && element.nodeType != 1) element = element.nextSibling;\u000a    return $(element);\u000a  },\u000a\u000a  immediateDescendants: function(element) {\u000a    if (!(element = $(element).firstChild)) return [];\u000a    while (element && element.nodeType != 1) element = element.nextSibling;\u000a    if (element) return [element].concat($(element).nextSiblings());\u000a    return [];\u000a  },\u000a\u000a  previousSiblings: function(element) {\u000a    return $(element).recursivelyCollect('previousSibling');\u000a  },\u000a\u000a  nextSiblings: function(element) {\u000a    return $(element).recursivelyCollect('nextSibling');\u000a  },\u000a\u000a  siblings: function(element) {\u000a    element = $(element);\u000a    return element.previousSiblings().reverse().concat(element.nextSiblings());\u000a  },\u000a\u000a  match: function(element, selector) {\u000a    if (typeof selector == 'string')\u000a      selector = new Selector(selector);\u000a    return selector.match($(element));\u000a  },\u000a\u000a  up: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(element.parentNode);\u000a    var ancestors = element.ancestors();\u000a    return expression ? Selector.findElement(ancestors, expression, index) :\u000a      ancestors[index || 0];\u000a  },\u000a\u000a  down: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return element.firstDescendant();\u000a    var descendants = element.descendants();\u000a    return expression ? Selector.findElement(descendants, expression, index) :\u000a      descendants[index || 0];\u000a  },\u000a\u000a  previous: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));\u000a    var previousSiblings = element.previousSiblings();\u000a    return expression ? Selector.findElement(previousSiblings, expression, index) :\u000a      previousSiblings[index || 0];\u000a  },\u000a\u000a  next: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));\u000a    var nextSiblings = element.nextSiblings();\u000a    return expression ? Selector.findElement(nextSiblings, expression, index) :\u000a      nextSiblings[index || 0];\u000a  },\u000a\u000a  getElementsBySelector: function() {\u000a    var args = $A(arguments), element = $(args.shift());\u000a    return Selector.findChildElements(element, args);\u000a  },\u000a\u000a  getElementsByClassName: function(element, className) {\u000a    return document.getElementsByClassName(className, element);\u000a  },\u000a\u000a  readAttribute: function(element, name) {\u000a    element = $(element);\u000a    if (Prototype.Browser.IE) {\u000a      if (!element.attributes) return null;\u000a      var t = Element._attributeTranslations;\u000a      if (t.values[name]) return t.values[name](element, name);\u000a      if (t.names[name])  name = t.names[name];\u000a      var attribute = element.attributes[name];\u000a      return attribute ? attribute.nodeValue : null;\u000a    }\u000a    return element.getAttribute(name);\u000a  },\u000a\u000a  getHeight: function(element) {\u000a    return $(element).getDimensions().height;\u000a  },\u000a\u000a  getWidth: function(element) {\u000a    return $(element).getDimensions().width;\u000a  },\u000a\u000a  classNames: function(element) {\u000a    return new Element.ClassNames(element);\u000a  },\u000a\u000a  hasClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    var elementClassName = element.className;\u000a    if (elementClassName.length == 0) return false;\u000a    if (elementClassName == className ||\u000a        elementClassName.match(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\")))\u000a      return true;\u000a    return false;\u000a  },\u000a\u000a  addClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element).add(className);\u000a    return element;\u000a  },\u000a\u000a  removeClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element).remove(className);\u000a    return element;\u000a  },\u000a\u000a  toggleClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);\u000a    return element;\u000a  },\u000a\u000a  observe: function() {\u000a    Event.observe.apply(Event, arguments);\u000a    return $A(arguments).first();\u000a  },\u000a\u000a  stopObserving: function() {\u000a    Event.stopObserving.apply(Event, arguments);\u000a    return $A(arguments).first();\u000a  },\u000a\u000a  // removes whitespace-only text node children\u000a  cleanWhitespace: function(element) {\u000a    element = $(element);\u000a    var node = element.firstChild;\u000a    while (node) {\u000a      var nextNode = node.nextSibling;\u000a      if (node.nodeType == 3 && !/\\S/.test(node.nodeValue))\u000a        element.removeChild(node);\u000a      node = nextNode;\u000a    }\u000a    return element;\u000a  },\u000a\u000a  empty: function(element) {\u000a    return $(element).innerHTML.blank();\u000a  },\u000a\u000a  descendantOf: function(element, ancestor) {\u000a    element = $(element), ancestor = $(ancestor);\u000a    while (element = element.parentNode)\u000a      if (element == ancestor) return true;\u000a    return false;\u000a  },\u000a\u000a  scrollTo: function(element) {\u000a    element = $(element);\u000a    var pos = Position.cumulativeOffset(element);\u000a    window.scrollTo(pos[0], pos[1]);\u000a    return element;\u000a  },\u000a\u000a  getStyle: function(element, style) {\u000a    element = $(element);\u000a    style = style == 'float' ? 'cssFloat' : style.camelize();\u000a    var value = element.style[style];\u000a    if (!value) {\u000a      var css = document.defaultView.getComputedStyle(element, null);\u000a      value = css ? css[style] : null;\u000a    }\u000a    if (style == 'opacity') return value ? parseFloat(value) : 1.0;\u000a    return value == 'auto' ? null : value;\u000a  },\u000a\u000a  getOpacity: function(element) {\u000a    return $(element).getStyle('opacity');\u000a  },\u000a\u000a  setStyle: function(element, styles, camelized) {\u000a    element = $(element);\u000a    var elementStyle = element.style;\u000a\u000a    for (var property in styles)\u000a      if (property == 'opacity') element.setOpacity(styles[property])\u000a      else\u000a        elementStyle[(property == 'float' || property == 'cssFloat') ?\u000a          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :\u000a          (camelized ? property : property.camelize())] = styles[property];\u000a\u000a    return element;\u000a  },\u000a\u000a  setOpacity: function(element, value) {\u000a    element = $(element);\u000a    element.style.opacity = (value == 1 || value === '') ? '' :\u000a      (value < 0.00001) ? 0 : value;\u000a    return element;\u000a  },\u000a\u000a  getDimensions: function(element) {\u000a    element = $(element);\u000a    var display = $(element).getStyle('display');\u000a    if (display != 'none' && display != null) // Safari bug\u000a      return {width: element.offsetWidth, height: element.offsetHeight};\u000a\u000a    // All *Width and *Height properties give 0 on elements with display none,\u000a    // so enable the element temporarily\u000a    var els = element.style;\u000a    var originalVisibility = els.visibility;\u000a    var originalPosition = els.position;\u000a    var originalDisplay = els.display;\u000a    els.visibility = 'hidden';\u000a    els.position = 'absolute';\u000a    els.display = 'block';\u000a    var originalWidth = element.clientWidth;\u000a    var originalHeight = element.clientHeight;\u000a    els.display = originalDisplay;\u000a    els.position = originalPosition;\u000a    els.visibility = originalVisibility;\u000a    return {width: originalWidth, height: originalHeight};\u000a  },\u000a\u000a  makePositioned: function(element) {\u000a    element = $(element);\u000a    var pos = Element.getStyle(element, 'position');\u000a    if (pos == 'static' || !pos) {\u000a      element._madePositioned = true;\u000a      element.style.position = 'relative';\u000a      // Opera returns the offset relative to the positioning context, when an\u000a      // element is position relative but top and left have not been defined\u000a      if (window.opera) {\u000a        element.style.top = 0;\u000a        element.style.left = 0;\u000a      }\u000a    }\u000a    return element;\u000a  },\u000a\u000a  undoPositioned: function(element) {\u000a    element = $(element);\u000a    if (element._madePositioned) {\u000a      element._madePositioned = undefined;\u000a      element.style.position =\u000a        element.style.top =\u000a        element.style.left =\u000a        element.style.bottom =\u000a        element.style.right = '';\u000a    }\u000a    return element;\u000a  },\u000a\u000a  makeClipping: function(element) {\u000a    element = $(element);\u000a    if (element._overflow) return element;\u000a    element._overflow = element.style.overflow || 'auto';\u000a    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')\u000a      element.style.overflow = 'hidden';\u000a    return element;\u000a  },\u000a\u000a  undoClipping: function(element) {\u000a    element = $(element);\u000a    if (!element._overflow) return element;\u000a    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;\u000a    element._overflow = null;\u000a    return element;\u000a  }\u000a};\u000a\u000aObject.extend(Element.Methods, {\u000a  childOf: Element.Methods.descendantOf,\u000a  childElements: Element.Methods.immediateDescendants\u000a});\u000a\u000aif (Prototype.Browser.Opera) {\u000a  Element.Methods._getStyle = Element.Methods.getStyle;\u000a  Element.Methods.getStyle = function(element, style) {\u000a    switch(style) {\u000a      case 'left':\u000a      case 'top':\u000a      case 'right':\u000a      case 'bottom':\u000a        if (Element._getStyle(element, 'position') == 'static') return null;\u000a      default: return Element._getStyle(element, style);\u000a    }\u000a  };\u000a}\u000aelse if (Prototype.Browser.IE) {\u000a  Element.Methods.getStyle = function(element, style) {\u000a    element = $(element);\u000a    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();\u000a    var value = element.style[style];\u000a    if (!value && element.currentStyle) value = element.currentStyle[style];\u000a\u000a    if (style == 'opacity') {\u000a      if (value = (element.getStyle('filter') || '').match(/alpha\\(opacity=(.*)\\)/))\u000a        if (value[1]) return parseFloat(value[1]) / 100;\u000a      return 1.0;\u000a    }\u000a\u000a    if (value == 'auto') {\u000a      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))\u000a        return element['offset'+style.capitalize()] + 'px';\u000a      return null;\u000a    }\u000a    return value;\u000a  };\u000a\u000a  Element.Methods.setOpacity = function(element, value) {\u000a    element = $(element);\u000a    var filter = element.getStyle('filter'), style = element.style;\u000a    if (value == 1 || value === '') {\u000a      style.filter = filter.replace(/alpha\\([^\\)]*\\)/gi,'');\u000a      return element;\u000a    } else if (value < 0.00001) value = 0;\u000a    style.filter = filter.replace(/alpha\\([^\\)]*\\)/gi, '') +\u000a      'alpha(opacity=' + (value * 100) + ')';\u000a    return element;\u000a  };\u000a\u000a  // IE is missing .innerHTML support for TABLE-related elements\u000a  Element.Methods.update = function(element, html) {\u000a    element = $(element);\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    var tagName = element.tagName.toUpperCase();\u000a    if (['THEAD','TBODY','TR','TD'].include(tagName)) {\u000a      var div = document.createElement('div');\u000a      switch (tagName) {\u000a        case 'THEAD':\u000a        case 'TBODY':\u000a          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';\u000a          depth = 2;\u000a          break;\u000a        case 'TR':\u000a          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';\u000a          depth = 3;\u000a          break;\u000a        case 'TD':\u000a          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';\u000a          depth = 4;\u000a      }\u000a      $A(element.childNodes).each(function(node) { element.removeChild(node) });\u000a      depth.times(function() { div = div.firstChild });\u000a      $A(div.childNodes).each(function(node) { element.appendChild(node) });\u000a    } else {\u000a      element.innerHTML = html.stripScripts();\u000a    }\u000a    setTimeout(function() { html.evalScripts() }, 10);\u000a    return element;\u000a  }\u000a}\u000aelse if (Prototype.Browser.Gecko) {\u000a  Element.Methods.setOpacity = function(element, value) {\u000a    element = $(element);\u000a    element.style.opacity = (value == 1) ? 0.999999 :\u000a      (value === '') ? '' : (value < 0.00001) ? 0 : value;\u000a    return element;\u000a  };\u000a}\u000a\u000aElement._attributeTranslations = {\u000a  names: {\u000a    colspan:   \"colSpan\",\u000a    rowspan:   \"rowSpan\",\u000a    valign:    \"vAlign\",\u000a    datetime:  \"dateTime\",\u000a    accesskey: \"accessKey\",\u000a    tabindex:  \"tabIndex\",\u000a    enctype:   \"encType\",\u000a    maxlength: \"maxLength\",\u000a    readonly:  \"readOnly\",\u000a    longdesc:  \"longDesc\"\u000a  },\u000a  values: {\u000a    _getAttr: function(element, attribute) {\u000a      return element.getAttribute(attribute, 2);\u000a    },\u000a    _flag: function(element, attribute) {\u000a      return $(element).hasAttribute(attribute) ? attribute : null;\u000a    },\u000a    style: function(element) {\u000a      return element.style.cssText.toLowerCase();\u000a    },\u000a    title: function(element) {\u000a      var node = element.getAttributeNode('title');\u000a      return node.specified ? node.nodeValue : null;\u000a    }\u000a  }\u000a};\u000a\u000a(function() {\u000a  Object.extend(this, {\u000a    href: this._getAttr,\u000a    src:  this._getAttr,\u000a    type: this._getAttr,\u000a    disabled: this._flag,\u000a    checked:  this._flag,\u000a    readonly: this._flag,\u000a    multiple: this._flag\u000a  });\u000a}).call(Element._attributeTranslations.values);\u000a\u000aElement.Methods.Simulated = {\u000a  hasAttribute: function(element, attribute) {\u000a    var t = Element._attributeTranslations, node;\u000a    attribute = t.names[attribute] || attribute;\u000a    node = $(element).getAttributeNode(attribute);\u000a    return node && node.specified;\u000a  }\u000a};\u000a\u000aElement.Methods.ByTag = {};\u000a\u000aObject.extend(Element, Element.Methods);\u000a\u000aif (!Prototype.BrowserFeatures.ElementExtensions &&\u000a document.createElement('div').__proto__) {\u000a  window.HTMLElement = {};\u000a  window.HTMLElement.prototype = document.createElement('div').__proto__;\u000a  Prototype.BrowserFeatures.ElementExtensions = true;\u000a}\u000a\u000aElement.hasAttribute = function(element, attribute) {\u000a  if (element.hasAttribute) return element.hasAttribute(attribute);\u000a  return Element.Methods.Simulated.hasAttribute(element, attribute);\u000a};\u000a\u000aElement.addMethods = function(methods) {\u000a  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;\u000a\u000a  if (!methods) {\u000a    Object.extend(Form, Form.Methods);\u000a    Object.extend(Form.Element, Form.Element.Methods);\u000a    Object.extend(Element.Methods.ByTag, {\u000a      \"FORM\":     Object.clone(Form.Methods),\u000a      \"INPUT\":    Object.clone(Form.Element.Methods),\u000a      \"SELECT\":   Object.clone(Form.Element.Methods),\u000a      \"TEXTAREA\": Object.clone(Form.Element.Methods)\u000a    });\u000a  }\u000a\u000a  if (arguments.length == 2) {\u000a    var tagName = methods;\u000a    methods = arguments[1];\u000a  }\u000a\u000a  if (!tagName) Object.extend(Element.Methods, methods || {});\u000a  else {\u000a    if (tagName.constructor == Array) tagName.each(extend);\u000a    else extend(tagName);\u000a  }\u000a\u000a  function extend(tagName) {\u000a    tagName = tagName.toUpperCase();\u000a    if (!Element.Methods.ByTag[tagName])\u000a      Element.Methods.ByTag[tagName] = {};\u000a    Object.extend(Element.Methods.ByTag[tagName], methods);\u000a  }\u000a\u000a  function copy(methods, destination, onlyIfAbsent) {\u000a    onlyIfAbsent = onlyIfAbsent || false;\u000a    var cache = Element.extend.cache;\u000a    for (var property in methods) {\u000a      var value = methods[property];\u000a      if (!onlyIfAbsent || !(property in destination))\u000a        destination[property] = cache.findOrStore(value);\u000a    }\u000a  }\u000a\u000a  function findDOMClass(tagName) {\u000a    var klass;\u000a    var trans = {\u000a      \"OPTGROUP\": \"OptGroup\", \"TEXTAREA\": \"TextArea\", \"P\": \"Paragraph\",\u000a      \"FIELDSET\": \"FieldSet\", \"UL\": \"UList\", \"OL\": \"OList\", \"DL\": \"DList\",\u000a      \"DIR\": \"Directory\", \"H1\": \"Heading\", \"H2\": \"Heading\", \"H3\": \"Heading\",\u000a      \"H4\": \"Heading\", \"H5\": \"Heading\", \"H6\": \"Heading\", \"Q\": \"Quote\",\u000a      \"INS\": \"Mod\", \"DEL\": \"Mod\", \"A\": \"Anchor\", \"IMG\": \"Image\", \"CAPTION\":\u000a      \"TableCaption\", \"COL\": \"TableCol\", \"COLGROUP\": \"TableCol\", \"THEAD\":\u000a      \"TableSection\", \"TFOOT\": \"TableSection\", \"TBODY\": \"TableSection\", \"TR\":\u000a      \"TableRow\", \"TH\": \"TableCell\", \"TD\": \"TableCell\", \"FRAMESET\":\u000a      \"FrameSet\", \"IFRAME\": \"IFrame\"\u000a    };\u000a    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';\u000a    if (window[klass]) return window[klass];\u000a    klass = 'HTML' + tagName + 'Element';\u000a    if (window[klass]) return window[klass];\u000a    klass = 'HTML' + tagName.capitalize() + 'Element';\u000a    if (window[klass]) return window[klass];\u000a\u000a    window[klass] = {};\u000a    window[klass].prototype = document.createElement(tagName).__proto__;\u000a    return window[klass];\u000a  }\u000a\u000a  if (F.ElementExtensions) {\u000a    copy(Element.Methods, HTMLElement.prototype);\u000a    copy(Element.Methods.Simulated, HTMLElement.prototype, true);\u000a  }\u000a\u000a  if (F.SpecificElementExtensions) {\u000a    for (var tag in Element.Methods.ByTag) {\u000a      var klass = findDOMClass(tag);\u000a      if (typeof klass == \"undefined\") continue;\u000a      copy(T[tag], klass.prototype);\u000a    }\u000a  }\u000a\u000a  Object.extend(Element, Element.Methods);\u000a  delete Element.ByTag;\u000a};\u000a\u000avar Toggle = { display: Element.toggle };\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.Insertion = function(adjacency) {\u000a  this.adjacency = adjacency;\u000a}\u000a\u000aAbstract.Insertion.prototype = {\u000a  initialize: function(element, content) {\u000a    this.element = $(element);\u000a    this.content = content.stripScripts();\u000a\u000a    if (this.adjacency && this.element.insertAdjacentHTML) {\u000a      try {\u000a        this.element.insertAdjacentHTML(this.adjacency, this.content);\u000a      } catch (e) {\u000a        var tagName = this.element.tagName.toUpperCase();\u000a        if (['TBODY', 'TR'].include(tagName)) {\u000a          this.insertContent(this.contentFromAnonymousTable());\u000a        } else {\u000a          throw e;\u000a        }\u000a      }\u000a    } else {\u000a      this.range = this.element.ownerDocument.createRange();\u000a      if (this.initializeRange) this.initializeRange();\u000a      this.insertContent([this.range.createContextualFragment(this.content)]);\u000a    }\u000a\u000a    setTimeout(function() {content.evalScripts()}, 10);\u000a  },\u000a\u000a  contentFromAnonymousTable: function() {\u000a    var div = document.createElement('div');\u000a    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';\u000a    return $A(div.childNodes[0].childNodes[0].childNodes);\u000a  }\u000a}\u000a\u000avar Insertion = new Object();\u000a\u000aInsertion.Before = Class.create();\u000aInsertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {\u000a  initializeRange: function() {\u000a    this.range.setStartBefore(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.parentNode.insertBefore(fragment, this.element);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.Top = Class.create();\u000aInsertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {\u000a  initializeRange: function() {\u000a    this.range.selectNodeContents(this.element);\u000a    this.range.collapse(true);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.reverse(false).each((function(fragment) {\u000a      this.element.insertBefore(fragment, this.element.firstChild);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.Bottom = Class.create();\u000aInsertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {\u000a  initializeRange: function() {\u000a    this.range.selectNodeContents(this.element);\u000a    this.range.collapse(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.appendChild(fragment);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.After = Class.create();\u000aInsertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {\u000a  initializeRange: function() {\u000a    this.range.setStartAfter(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.parentNode.insertBefore(fragment,\u000a        this.element.nextSibling);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aElement.ClassNames = Class.create();\u000aElement.ClassNames.prototype = {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a  },\u000a\u000a  _each: function(iterator) {\u000a    this.element.className.split(/\\s+/).select(function(name) {\u000a      return name.length > 0;\u000a    })._each(iterator);\u000a  },\u000a\u000a  set: function(className) {\u000a    this.element.className = className;\u000a  },\u000a\u000a  add: function(classNameToAdd) {\u000a    if (this.include(classNameToAdd)) return;\u000a    this.set($A(this).concat(classNameToAdd).join(' '));\u000a  },\u000a\u000a  remove: function(classNameToRemove) {\u000a    if (!this.include(classNameToRemove)) return;\u000a    this.set($A(this).without(classNameToRemove).join(' '));\u000a  },\u000a\u000a  toString: function() {\u000a    return $A(this).join(' ');\u000a  }\u000a};\u000a\u000aObject.extend(Element.ClassNames.prototype, Enumerable);\u000a/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,\u000a * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style\u000a * license.  Please see http://www.yui-ext.com/ for more information. */\u000a\u000avar Selector = Class.create();\u000a\u000aSelector.prototype = {\u000a  initialize: function(expression) {\u000a    this.expression = expression.strip();\u000a    this.compileMatcher();\u000a  },\u000a\u000a  compileMatcher: function() {\u000a    // Selectors with namespaced attributes can't use the XPath version\u000a    if (Prototype.BrowserFeatures.XPath && !(/\\[[\\w-]*?:/).test(this.expression))\u000a      return this.compileXPathMatcher();\u000a\u000a    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,\u000a        c = Selector.criteria, le, p, m;\u000a\u000a    if (Selector._cache[e]) {\u000a      this.matcher = Selector._cache[e]; return;\u000a    }\u000a    this.matcher = [\"this.matcher = function(root) {\",\u000a                    \"var r = root, h = Selector.handlers, c = false, n;\"];\u000a\u000a    while (e && le != e && (/\\S/).test(e)) {\u000a      le = e;\u000a      for (var i in ps) {\u000a        p = ps[i];\u000a        if (m = e.match(p)) {\u000a          this.matcher.push(typeof c[i] == 'function' ? c[i](m) :\u000a    \u0009      new Template(c[i]).evaluate(m));\u000a          e = e.replace(m[0], '');\u000a          break;\u000a        }\u000a      }\u000a    }\u000a\u000a    this.matcher.push(\"return h.unique(n);\\n}\");\u000a    eval(this.matcher.join('\\n'));\u000a    Selector._cache[this.expression] = this.matcher;\u000a  },\u000a\u000a  compileXPathMatcher: function() {\u000a    var e = this.expression, ps = Selector.patterns,\u000a        x = Selector.xpath, le,  m;\u000a\u000a    if (Selector._cache[e]) {\u000a      this.xpath = Selector._cache[e]; return;\u000a    }\u000a\u000a    this.matcher = ['.//*'];\u000a    while (e && le != e && (/\\S/).test(e)) {\u000a      le = e;\u000a      for (var i in ps) {\u000a        if (m = e.match(ps[i])) {\u000a          this.matcher.push(typeof x[i] == 'function' ? x[i](m) :\u000a            new Template(x[i]).evaluate(m));\u000a          e = e.replace(m[0], '');\u000a          break;\u000a        }\u000a      }\u000a    }\u000a\u000a    this.xpath = this.matcher.join('');\u000a    Selector._cache[this.expression] = this.xpath;\u000a  },\u000a\u000a  findElements: function(root) {\u000a    root = root || document;\u000a    if (this.xpath) return document._getElementsByXPath(this.xpath, root);\u000a    return this.matcher(root);\u000a  },\u000a\u000a  match: function(element) {\u000a    return this.findElements(document).include(element);\u000a  },\u000a\u000a  toString: function() {\u000a    return this.expression;\u000a  },\u000a\u000a  inspect: function() {\u000a    return \"#<Selector:\" + this.expression.inspect() + \">\";\u000a  }\u000a};\u000a\u000aObject.extend(Selector, {\u000a  _cache: {},\u000a\u000a  xpath: {\u000a    descendant:   \"//*\",\u000a    child:        \"/*\",\u000a    adjacent:     \"/following-sibling::*[1]\",\u000a    laterSibling: '/following-sibling::*',\u000a    tagName:      function(m) {\u000a      if (m[1] == '*') return '';\u000a      return \"[local-name()='\" + m[1].toLowerCase() +\u000a             \"' or local-name()='\" + m[1].toUpperCase() + \"']\";\u000a    },\u000a    className:    \"[contains(concat(' ', @class, ' '), ' #{1} ')]\",\u000a    id:           \"[@id='#{1}']\",\u000a    attrPresence: \"[@#{1}]\",\u000a    attr: function(m) {\u000a      m[3] = m[5] || m[6];\u000a      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);\u000a    },\u000a    pseudo: function(m) {\u000a      var h = Selector.xpath.pseudos[m[1]];\u000a      if (!h) return '';\u000a      if (typeof h === 'function') return h(m);\u000a      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);\u000a    },\u000a    operators: {\u000a      '=':  \"[@#{1}='#{3}']\",\u000a      '!=': \"[@#{1}!='#{3}']\",\u000a      '^=': \"[starts-with(@#{1}, '#{3}')]\",\u000a      '$=': \"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']\",\u000a      '*=': \"[contains(@#{1}, '#{3}')]\",\u000a      '~=': \"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]\",\u000a      '|=': \"[contains(concat('-', @#{1}, '-'), '-#{3}-')]\"\u000a    },\u000a    pseudos: {\u000a      'first-child': '[not(preceding-sibling::*)]',\u000a      'last-child':  '[not(following-sibling::*)]',\u000a      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',\u000a      'empty':       \"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \\t\\r\\n', '') = '')]\",\u000a      'checked':     \"[@checked]\",\u000a      'disabled':    \"[@disabled]\",\u000a      'enabled':     \"[not(@disabled)]\",\u000a      'not': function(m) {\u000a        var e = m[6], p = Selector.patterns,\u000a            x = Selector.xpath, le, m, v;\u000a\u000a        var exclusion = [];\u000a        while (e && le != e && (/\\S/).test(e)) {\u000a          le = e;\u000a          for (var i in p) {\u000a            if (m = e.match(p[i])) {\u000a              v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);\u000a              exclusion.push(\"(\" + v.substring(1, v.length - 1) + \")\");\u000a              e = e.replace(m[0], '');\u000a              break;\u000a            }\u000a          }\u000a        }\u000a        return \"[not(\" + exclusion.join(\" and \") + \")]\";\u000a      },\u000a      'nth-child':      function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(count(./preceding-sibling::*) + 1) \", m);\u000a      },\u000a      'nth-last-child': function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(count(./following-sibling::*) + 1) \", m);\u000a      },\u000a      'nth-of-type':    function(m) {\u000a        return Selector.xpath.pseudos.nth(\"position() \", m);\u000a      },\u000a      'nth-last-of-type': function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(last() + 1 - position()) \", m);\u000a      },\u000a      'first-of-type':  function(m) {\u000a        m[6] = \"1\"; return Selector.xpath.pseudos['nth-of-type'](m);\u000a      },\u000a      'last-of-type':   function(m) {\u000a        m[6] = \"1\"; return Selector.xpath.pseudos['nth-last-of-type'](m);\u000a      },\u000a      'only-of-type':   function(m) {\u000a        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);\u000a      },\u000a      nth: function(fragment, m) {\u000a        var mm, formula = m[6], predicate;\u000a        if (formula == 'even') formula = '2n+0';\u000a        if (formula == 'odd')  formula = '2n+1';\u000a        if (mm = formula.match(/^(\\d+)$/)) // digit only\u000a          return '[' + fragment + \"= \" + mm[1] + ']';\u000a        if (mm = formula.match(/^(-?\\d*)?n(([+-])(\\d+))?/)) { // an+b\u000a          if (mm[1] == \"-\") mm[1] = -1;\u000a          var a = mm[1] ? Number(mm[1]) : 1;\u000a          var b = mm[2] ? Number(mm[2]) : 0;\u000a          predicate = \"[((#{fragment} - #{b}) mod #{a} = 0) and \" +\u000a          \"((#{fragment} - #{b}) div #{a} >= 0)]\";\u000a          return new Template(predicate).evaluate({\u000a            fragment: fragment, a: a, b: b });\u000a        }\u000a      }\u000a    }\u000a  },\u000a\u000a  criteria: {\u000a    tagName:      'n = h.tagName(n, r, \"#{1}\", c);   c = false;',\u000a    className:    'n = h.className(n, r, \"#{1}\", c); c = false;',\u000a    id:           'n = h.id(n, r, \"#{1}\", c);        c = false;',\u000a    attrPresence: 'n = h.attrPresence(n, r, \"#{1}\"); c = false;',\u000a    attr: function(m) {\u000a      m[3] = (m[5] || m[6]);\u000a      return new Template('n = h.attr(n, r, \"#{1}\", \"#{3}\", \"#{2}\"); c = false;').evaluate(m);\u000a    },\u000a    pseudo:       function(m) {\u000a      if (m[6]) m[6] = m[6].replace(/\"/g, '\\\\\"');\u000a      return new Template('n = h.pseudo(n, \"#{1}\", \"#{6}\", r, c); c = false;').evaluate(m);\u000a    },\u000a    descendant:   'c = \"descendant\";',\u000a    child:        'c = \"child\";',\u000a    adjacent:     'c = \"adjacent\";',\u000a    laterSibling: 'c = \"laterSibling\";'\u000a  },\u000a\u000a  patterns: {\u000a    // combinators must be listed first\u000a    // (and descendant needs to be last combinator)\u000a    laterSibling: /^\\s*~\\s*/,\u000a    child:        /^\\s*>\\s*/,\u000a    adjacent:     /^\\s*\\+\\s*/,\u000a    descendant:   /^\\s/,\u000a\u000a    // selectors follow\u000a    tagName:      /^\\s*(\\*|[\\w\\-]+)(\\b|$)?/,\u000a    id:           /^#([\\w\\-\\*]+)(\\b|$)/,\u000a    className:    /^\\.([\\w\\-\\*]+)(\\b|$)/,\u000a    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\\((.*?)\\))?(\\b|$|\\s|(?=:))/,\u000a    attrPresence: /^\\[([\\w]+)\\]/,\u000a    attr:         /\\[((?:[\\w-]*:)?[\\w-]+)\\s*(?:([!^$*~|]?=)\\s*((['\"])([^\\]]*?)\\4|([^'\"][^\\]]*?)))?\\]/\u000a  },\u000a\u000a  handlers: {\u000a    // UTILITY FUNCTIONS\u000a    // joins two collections\u000a    concat: function(a, b) {\u000a      for (var i = 0, node; node = b[i]; i++)\u000a        a.push(node);\u000a      return a;\u000a    },\u000a\u000a    // marks an array of nodes for counting\u000a    mark: function(nodes) {\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        node._counted = true;\u000a      return nodes;\u000a    },\u000a\u000a    unmark: function(nodes) {\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        node._counted = undefined;\u000a      return nodes;\u000a    },\u000a\u000a    // mark each child node with its position (for nth calls)\u000a    // \"ofType\" flag indicates whether we're indexing for nth-of-type\u000a    // rather than nth-child\u000a    index: function(parentNode, reverse, ofType) {\u000a      parentNode._counted = true;\u000a      if (reverse) {\u000a        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {\u000a          node = nodes[i];\u000a          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;\u000a        }\u000a      } else {\u000a        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)\u000a          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;\u000a      }\u000a    },\u000a\u000a    // filters out duplicates and extends all nodes\u000a    unique: function(nodes) {\u000a      if (nodes.length == 0) return nodes;\u000a      var results = [], n;\u000a      for (var i = 0, l = nodes.length; i < l; i++)\u000a        if (!(n = nodes[i])._counted) {\u000a          n._counted = true;\u000a          results.push(Element.extend(n));\u000a        }\u000a      return Selector.handlers.unmark(results);\u000a    },\u000a\u000a    // COMBINATOR FUNCTIONS\u000a    descendant: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        h.concat(results, node.getElementsByTagName('*'));\u000a      return results;\u000a    },\u000a\u000a    child: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)\u000a          if (child.nodeType == 1 && child.tagName != '!') results.push(child);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    adjacent: function(nodes) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        var next = this.nextElementSibling(node);\u000a        if (next) results.push(next);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    laterSibling: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        h.concat(results, Element.nextSiblings(node));\u000a      return results;\u000a    },\u000a\u000a    nextElementSibling: function(node) {\u000a      while (node = node.nextSibling)\u000a\u0009      if (node.nodeType == 1) return node;\u000a      return null;\u000a    },\u000a\u000a    previousElementSibling: function(node) {\u000a      while (node = node.previousSibling)\u000a        if (node.nodeType == 1) return node;\u000a      return null;\u000a    },\u000a\u000a    // TOKEN FUNCTIONS\u000a    tagName: function(nodes, root, tagName, combinator) {\u000a      tagName = tagName.toUpperCase();\u000a      var results = [], h = Selector.handlers;\u000a      if (nodes) {\u000a        if (combinator) {\u000a          // fastlane for ordinary descendant combinators\u000a          if (combinator == \"descendant\") {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              h.concat(results, node.getElementsByTagName(tagName));\u000a            return results;\u000a          } else nodes = this[combinator](nodes);\u000a          if (tagName == \"*\") return nodes;\u000a        }\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node.tagName.toUpperCase() == tagName) results.push(node);\u000a        return results;\u000a      } else return root.getElementsByTagName(tagName);\u000a    },\u000a\u000a    id: function(nodes, root, id, combinator) {\u000a      var targetNode = $(id), h = Selector.handlers;\u000a      if (!nodes && root == document) return targetNode ? [targetNode] : [];\u000a      if (nodes) {\u000a        if (combinator) {\u000a          if (combinator == 'child') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (targetNode.parentNode == node) return [targetNode];\u000a          } else if (combinator == 'descendant') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (Element.descendantOf(targetNode, node)) return [targetNode];\u000a          } else if (combinator == 'adjacent') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (Selector.handlers.previousElementSibling(targetNode) == node)\u000a                return [targetNode];\u000a          } else nodes = h[combinator](nodes);\u000a        }\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node == targetNode) return [targetNode];\u000a        return [];\u000a      }\u000a      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];\u000a    },\u000a\u000a    className: function(nodes, root, className, combinator) {\u000a      if (nodes && combinator) nodes = this[combinator](nodes);\u000a      return Selector.handlers.byClassName(nodes, root, className);\u000a    },\u000a\u000a    byClassName: function(nodes, root, className) {\u000a      if (!nodes) nodes = Selector.handlers.descendant([root]);\u000a      var needle = ' ' + className + ' ';\u000a      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {\u000a        nodeClassName = node.className;\u000a        if (nodeClassName.length == 0) continue;\u000a        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    attrPresence: function(nodes, root, attr) {\u000a      var results = [];\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        if (Element.hasAttribute(node, attr)) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    attr: function(nodes, root, attr, value, operator) {\u000a      if (!nodes) nodes = root.getElementsByTagName(\"*\");\u000a      var handler = Selector.operators[operator], results = [];\u000a      for (var i = 0, node; node = nodes[i]; i++) {\u000a        var nodeValue = Element.readAttribute(node, attr);\u000a        if (nodeValue === null) continue;\u000a        if (handler(nodeValue, value)) results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    pseudo: function(nodes, name, value, root, combinator) {\u000a      if (nodes && combinator) nodes = this[combinator](nodes);\u000a      if (!nodes) nodes = root.getElementsByTagName(\"*\");\u000a      return Selector.pseudos[name](nodes, value, root);\u000a    }\u000a  },\u000a\u000a  pseudos: {\u000a    'first-child': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        if (Selector.handlers.previousElementSibling(node)) continue;\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a    'last-child': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        if (Selector.handlers.nextElementSibling(node)) continue;\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a    'only-child': function(nodes, value, root) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))\u000a          results.push(node);\u000a      return results;\u000a    },\u000a    'nth-child':        function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root);\u000a    },\u000a    'nth-last-child':   function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, true);\u000a    },\u000a    'nth-of-type':      function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, false, true);\u000a    },\u000a    'nth-last-of-type': function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, true, true);\u000a    },\u000a    'first-of-type':    function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, \"1\", root, false, true);\u000a    },\u000a    'last-of-type':     function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, \"1\", root, true, true);\u000a    },\u000a    'only-of-type':     function(nodes, formula, root) {\u000a      var p = Selector.pseudos;\u000a      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);\u000a    },\u000a\u000a    // handles the an+b logic\u000a    getIndices: function(a, b, total) {\u000a      if (a == 0) return b > 0 ? [b] : [];\u000a      return $R(1, total).inject([], function(memo, i) {\u000a        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);\u000a        return memo;\u000a      });\u000a    },\u000a\u000a    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type\u000a    nth: function(nodes, formula, root, reverse, ofType) {\u000a      if (nodes.length == 0) return [];\u000a      if (formula == 'even') formula = '2n+0';\u000a      if (formula == 'odd')  formula = '2n+1';\u000a      var h = Selector.handlers, results = [], indexed = [], m;\u000a      h.mark(nodes);\u000a      for (var i = 0, node; node = nodes[i]; i++) {\u000a        if (!node.parentNode._counted) {\u000a          h.index(node.parentNode, reverse, ofType);\u000a          indexed.push(node.parentNode);\u000a        }\u000a      }\u000a      if (formula.match(/^\\d+$/)) { // just a number\u000a        formula = Number(formula);\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node.nodeIndex == formula) results.push(node);\u000a      } else if (m = formula.match(/^(-?\\d*)?n(([+-])(\\d+))?/)) { // an+b\u000a        if (m[1] == \"-\") m[1] = -1;\u000a        var a = m[1] ? Number(m[1]) : 1;\u000a        var b = m[2] ? Number(m[2]) : 0;\u000a        var indices = Selector.pseudos.getIndices(a, b, nodes.length);\u000a        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {\u000a          for (var j = 0; j < l; j++)\u000a            if (node.nodeIndex == indices[j]) results.push(node);\u000a        }\u000a      }\u000a      h.unmark(nodes);\u000a      h.unmark(indexed);\u000a      return results;\u000a    },\u000a\u000a    'empty': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        // IE treats comments as element nodes\u000a        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\\s*$/))) continue;\u000a        results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    'not': function(nodes, selector, root) {\u000a      var h = Selector.handlers, selectorType, m;\u000a      var exclusions = new Selector(selector).findElements(root);\u000a      h.mark(exclusions);\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!node._counted) results.push(node);\u000a      h.unmark(exclusions);\u000a      return results;\u000a    },\u000a\u000a    'enabled': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!node.disabled) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    'disabled': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (node.disabled) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    'checked': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (node.checked) results.push(node);\u000a      return results;\u000a    }\u000a  },\u000a\u000a  operators: {\u000a    '=':  function(nv, v) { return nv == v; },\u000a    '!=': function(nv, v) { return nv != v; },\u000a    '^=': function(nv, v) { return nv.startsWith(v); },\u000a    '$=': function(nv, v) { return nv.endsWith(v); },\u000a    '*=': function(nv, v) { return nv.include(v); },\u000a    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },\u000a    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }\u000a  },\u000a\u000a  matchElements: function(elements, expression) {\u000a    var matches = new Selector(expression).findElements(), h = Selector.handlers;\u000a    h.mark(matches);\u000a    for (var i = 0, results = [], element; element = elements[i]; i++)\u000a      if (element._counted) results.push(element);\u000a    h.unmark(matches);\u000a    return results;\u000a  },\u000a\u000a  findElement: function(elements, expression, index) {\u000a    if (typeof expression == 'number') {\u000a      index = expression; expression = false;\u000a    }\u000a    return Selector.matchElements(elements, expression || '*')[index || 0];\u000a  },\u000a\u000a  findChildElements: function(element, expressions) {\u000a    var exprs = expressions.join(','), expressions = [];\u000a    exprs.scan(/(([\\w#:.~>+()\\s-]+|\\*|\\[.*?\\])+)\\s*(,|$)/, function(m) {\u000a      expressions.push(m[1].strip());\u000a    });\u000a    var results = [], h = Selector.handlers;\u000a    for (var i = 0, l = expressions.length, selector; i < l; i++) {\u000a      selector = new Selector(expressions[i].strip());\u000a      h.concat(results, selector.findElements(element));\u000a    }\u000a    return (l > 1) ? h.unique(results) : results;\u000a  }\u000a});\u000a\u000afunction $$() {\u000a  return Selector.findChildElements(document, $A(arguments));\u000a}\u000avar Form = {\u000a  reset: function(form) {\u000a    $(form).reset();\u000a    return form;\u000a  },\u000a\u000a  serializeElements: function(elements, getHash) {\u000a    var data = elements.inject({}, function(result, element) {\u000a      if (!element.disabled && element.name) {\u000a        var key = element.name, value = $(element).getValue();\u000a        if (value != null) {\u000a         \u0009if (key in result) {\u000a            if (result[key].constructor != Array) result[key] = [result[key]];\u000a            result[key].push(value);\u000a          }\u000a          else result[key] = value;\u000a        }\u000a      }\u000a      return result;\u000a    });\u000a\u000a    return getHash ? data : Hash.toQueryString(data);\u000a  }\u000a};\u000a\u000aForm.Methods = {\u000a  serialize: function(form, getHash) {\u000a    return Form.serializeElements(Form.getElements(form), getHash);\u000a  },\u000a\u000a  getElements: function(form) {\u000a    return $A($(form).getElementsByTagName('*')).inject([],\u000a      function(elements, child) {\u000a        if (Form.Element.Serializers[child.tagName.toLowerCase()])\u000a          elements.push(Element.extend(child));\u000a        return elements;\u000a      }\u000a    );\u000a  },\u000a\u000a  getInputs: function(form, typeName, name) {\u000a    form = $(form);\u000a    var inputs = form.getElementsByTagName('input');\u000a\u000a    if (!typeName && !name) return $A(inputs).map(Element.extend);\u000a\u000a    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {\u000a      var input = inputs[i];\u000a      if ((typeName && input.type != typeName) || (name && input.name != name))\u000a        continue;\u000a      matchingInputs.push(Element.extend(input));\u000a    }\u000a\u000a    return matchingInputs;\u000a  },\u000a\u000a  disable: function(form) {\u000a    form = $(form);\u000a    Form.getElements(form).invoke('disable');\u000a    return form;\u000a  },\u000a\u000a  enable: function(form) {\u000a    form = $(form);\u000a    Form.getElements(form).invoke('enable');\u000a    return form;\u000a  },\u000a\u000a  findFirstElement: function(form) {\u000a    return $(form).getElements().find(function(element) {\u000a      return element.type != 'hidden' && !element.disabled &&\u000a        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());\u000a    });\u000a  },\u000a\u000a  focusFirstElement: function(form) {\u000a    form = $(form);\u000a    form.findFirstElement().activate();\u000a    return form;\u000a  },\u000a\u000a  request: function(form, options) {\u000a    form = $(form), options = Object.clone(options || {});\u000a\u000a    var params = options.parameters;\u000a    options.parameters = form.serialize(true);\u000a\u000a    if (params) {\u000a      if (typeof params == 'string') params = params.toQueryParams();\u000a      Object.extend(options.parameters, params);\u000a    }\u000a\u000a    if (form.hasAttribute('method') && !options.method)\u000a      options.method = form.method;\u000a\u000a    return new Ajax.Request(form.readAttribute('action'), options);\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aForm.Element = {\u000a  focus: function(element) {\u000a    $(element).focus();\u000a    return element;\u000a  },\u000a\u000a  select: function(element) {\u000a    $(element).select();\u000a    return element;\u000a  }\u000a}\u000a\u000aForm.Element.Methods = {\u000a  serialize: function(element) {\u000a    element = $(element);\u000a    if (!element.disabled && element.name) {\u000a      var value = element.getValue();\u000a      if (value != undefined) {\u000a        var pair = {};\u000a        pair[element.name] = value;\u000a        return Hash.toQueryString(pair);\u000a      }\u000a    }\u000a    return '';\u000a  },\u000a\u000a  getValue: function(element) {\u000a    element = $(element);\u000a    var method = element.tagName.toLowerCase();\u000a    return Form.Element.Serializers[method](element);\u000a  },\u000a\u000a  clear: function(element) {\u000a    $(element).value = '';\u000a    return element;\u000a  },\u000a\u000a  present: function(element) {\u000a    return $(element).value != '';\u000a  },\u000a\u000a  activate: function(element) {\u000a    element = $(element);\u000a    try {\u000a      element.focus();\u000a      if (element.select && (element.tagName.toLowerCase() != 'input' ||\u000a        !['button', 'reset', 'submit'].include(element.type)))\u000a        element.select();\u000a    } catch (e) {}\u000a    return element;\u000a  },\u000a\u000a  disable: function(element) {\u000a    element = $(element);\u000a    element.blur();\u000a    element.disabled = true;\u000a    return element;\u000a  },\u000a\u000a  enable: function(element) {\u000a    element = $(element);\u000a    element.disabled = false;\u000a    return element;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Field = Form.Element;\u000avar $F = Form.Element.Methods.getValue;\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aForm.Element.Serializers = {\u000a  input: function(element) {\u000a    switch (element.type.toLowerCase()) {\u000a      case 'checkbox':\u000a      case 'radio':\u000a        return Form.Element.Serializers.inputSelector(element);\u000a      default:\u000a        return Form.Element.Serializers.textarea(element);\u000a    }\u000a  },\u000a\u000a  inputSelector: function(element) {\u000a    return element.checked ? element.value : null;\u000a  },\u000a\u000a  textarea: function(element) {\u000a    return element.value;\u000a  },\u000a\u000a  select: function(element) {\u000a    return this[element.type == 'select-one' ?\u000a      'selectOne' : 'selectMany'](element);\u000a  },\u000a\u000a  selectOne: function(element) {\u000a    var index = element.selectedIndex;\u000a    return index >= 0 ? this.optionValue(element.options[index]) : null;\u000a  },\u000a\u000a  selectMany: function(element) {\u000a    var values, length = element.length;\u000a    if (!length) return null;\u000a\u000a    for (var i = 0, values = []; i < length; i++) {\u000a      var opt = element.options[i];\u000a      if (opt.selected) values.push(this.optionValue(opt));\u000a    }\u000a    return values;\u000a  },\u000a\u000a  optionValue: function(opt) {\u000a    // extend element because hasAttribute may not be native\u000a    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.TimedObserver = function() {}\u000aAbstract.TimedObserver.prototype = {\u000a  initialize: function(element, frequency, callback) {\u000a    this.frequency = frequency;\u000a    this.element   = $(element);\u000a    this.callback  = callback;\u000a\u000a    this.lastValue = this.getValue();\u000a    this.registerCallback();\u000a  },\u000a\u000a  registerCallback: function() {\u000a    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    var value = this.getValue();\u000a    var changed = ('string' == typeof this.lastValue && 'string' == typeof value\u000a      ? this.lastValue != value : String(this.lastValue) != String(value));\u000a    if (changed) {\u000a      this.callback(this.element, value);\u000a      this.lastValue = value;\u000a    }\u000a  }\u000a}\u000a\u000aForm.Element.Observer = Class.create();\u000aForm.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\u000a  getValue: function() {\u000a    return Form.Element.getValue(this.element);\u000a  }\u000a});\u000a\u000aForm.Observer = Class.create();\u000aForm.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\u000a  getValue: function() {\u000a    return Form.serialize(this.element);\u000a  }\u000a});\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.EventObserver = function() {}\u000aAbstract.EventObserver.prototype = {\u000a  initialize: function(element, callback) {\u000a    this.element  = $(element);\u000a    this.callback = callback;\u000a\u000a    this.lastValue = this.getValue();\u000a    if (this.element.tagName.toLowerCase() == 'form')\u000a      this.registerFormCallbacks();\u000a    else\u000a      this.registerCallback(this.element);\u000a  },\u000a\u000a  onElementEvent: function() {\u000a    var value = this.getValue();\u000a    if (this.lastValue != value) {\u000a      this.callback(this.element, value);\u000a      this.lastValue = value;\u000a    }\u000a  },\u000a\u000a  registerFormCallbacks: function() {\u000a    Form.getElements(this.element).each(this.registerCallback.bind(this));\u000a  },\u000a\u000a  registerCallback: function(element) {\u000a    if (element.type) {\u000a      switch (element.type.toLowerCase()) {\u000a        case 'checkbox':\u000a        case 'radio':\u000a          Event.observe(element, 'click', this.onElementEvent.bind(this));\u000a          break;\u000a        default:\u000a          Event.observe(element, 'change', this.onElementEvent.bind(this));\u000a          break;\u000a      }\u000a    }\u000a  }\u000a}\u000a\u000aForm.Element.EventObserver = Class.create();\u000aForm.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\u000a  getValue: function() {\u000a    return Form.Element.getValue(this.element);\u000a  }\u000a});\u000a\u000aForm.EventObserver = Class.create();\u000aForm.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\u000a  getValue: function() {\u000a    return Form.serialize(this.element);\u000a  }\u000a});\u000aif (!window.Event) {\u000a  var Event = new Object();\u000a}\u000a\u000aObject.extend(Event, {\u000a  KEY_BACKSPACE: 8,\u000a  KEY_TAB:       9,\u000a  KEY_RETURN:   13,\u000a  KEY_ESC:      27,\u000a  KEY_LEFT:     37,\u000a  KEY_UP:       38,\u000a  KEY_RIGHT:    39,\u000a  KEY_DOWN:     40,\u000a  KEY_DELETE:   46,\u000a  KEY_HOME:     36,\u000a  KEY_END:      35,\u000a  KEY_PAGEUP:   33,\u000a  KEY_PAGEDOWN: 34,\u000a\u000a  element: function(event) {\u000a    return $(event.target || event.srcElement);\u000a  },\u000a\u000a  isLeftClick: function(event) {\u000a    return (((event.which) && (event.which == 1)) ||\u000a            ((event.button) && (event.button == 1)));\u000a  },\u000a\u000a  pointerX: function(event) {\u000a    return event.pageX || (event.clientX +\u000a      (document.documentElement.scrollLeft || document.body.scrollLeft));\u000a  },\u000a\u000a  pointerY: function(event) {\u000a    return event.pageY || (event.clientY +\u000a      (document.documentElement.scrollTop || document.body.scrollTop));\u000a  },\u000a\u000a  stop: function(event) {\u000a    if (event.preventDefault) {\u000a      event.preventDefault();\u000a      event.stopPropagation();\u000a    } else {\u000a      event.returnValue = false;\u000a      event.cancelBubble = true;\u000a    }\u000a  },\u000a\u000a  // find the first node with the given tagName, starting from the\u000a  // node the event was triggered on; traverses the DOM upwards\u000a  findElement: function(event, tagName) {\u000a    var element = Event.element(event);\u000a    while (element.parentNode && (!element.tagName ||\u000a        (element.tagName.toUpperCase() != tagName.toUpperCase())))\u000a      element = element.parentNode;\u000a    return element;\u000a  },\u000a\u000a  observers: false,\u000a\u000a  _observeAndCache: function(element, name, observer, useCapture) {\u000a    if (!this.observers) this.observers = [];\u000a    if (element.addEventListener) {\u000a      this.observers.push([element, name, observer, useCapture]);\u000a      element.addEventListener(name, observer, useCapture);\u000a    } else if (element.attachEvent) {\u000a      this.observers.push([element, name, observer, useCapture]);\u000a      element.attachEvent('on' + name, observer);\u000a    }\u000a  },\u000a\u000a  unloadCache: function() {\u000a    if (!Event.observers) return;\u000a    for (var i = 0, length = Event.observers.length; i < length; i++) {\u000a      Event.stopObserving.apply(this, Event.observers[i]);\u000a      Event.observers[i][0] = null;\u000a    }\u000a    Event.observers = false;\u000a  },\u000a\u000a  observe: function(element, name, observer, useCapture) {\u000a    element = $(element);\u000a    useCapture = useCapture || false;\u000a\u000a    if (name == 'keypress' &&\u000a      (Prototype.Browser.WebKit || element.attachEvent))\u000a      name = 'keydown';\u000a\u000a    Event._observeAndCache(element, name, observer, useCapture);\u000a  },\u000a\u000a  stopObserving: function(element, name, observer, useCapture) {\u000a    element = $(element);\u000a    useCapture = useCapture || false;\u000a\u000a    if (name == 'keypress' &&\u000a        (Prototype.Browser.WebKit || element.attachEvent))\u000a      name = 'keydown';\u000a\u000a    if (element.removeEventListener) {\u000a      element.removeEventListener(name, observer, useCapture);\u000a    } else if (element.detachEvent) {\u000a      try {\u000a        element.detachEvent('on' + name, observer);\u000a      } catch (e) {}\u000a    }\u000a  }\u000a});\u000a\u000a/* prevent memory leaks in IE */\u000aif (Prototype.Browser.IE)\u000a  Event.observe(window, 'unload', Event.unloadCache, false);\u000avar Position = {\u000a  // set to true if needed, warning: firefox performance problems\u000a  // NOT neeeded for page scrolling, only if draggable contained in\u000a  // scrollable elements\u000a  includeScrollOffsets: false,\u000a\u000a  // must be called before calling withinIncludingScrolloffset, every time the\u000a  // page is scrolled\u000a  prepare: function() {\u000a    this.deltaX =  window.pageXOffset\u000a                || document.documentElement.scrollLeft\u000a                || document.body.scrollLeft\u000a                || 0;\u000a    this.deltaY =  window.pageYOffset\u000a                || document.documentElement.scrollTop\u000a                || document.body.scrollTop\u000a                || 0;\u000a  },\u000a\u000a  realOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.scrollTop  || 0;\u000a      valueL += element.scrollLeft || 0;\u000a      element = element.parentNode;\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  cumulativeOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      element = element.offsetParent;\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  positionedOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      element = element.offsetParent;\u000a      if (element) {\u000a        if(element.tagName=='BODY') break;\u000a        var p = Element.getStyle(element, 'position');\u000a        if (p == 'relative' || p == 'absolute') break;\u000a      }\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  offsetParent: function(element) {\u000a    if (element.offsetParent) return element.offsetParent;\u000a    if (element == document.body) return element;\u000a\u000a    while ((element = element.parentNode) && element != document.body)\u000a      if (Element.getStyle(element, 'position') != 'static')\u000a        return element;\u000a\u000a    return document.body;\u000a  },\u000a\u000a  // caches x/y coordinate pair to use with overlap\u000a  within: function(element, x, y) {\u000a    if (this.includeScrollOffsets)\u000a      return this.withinIncludingScrolloffsets(element, x, y);\u000a    this.xcomp = x;\u000a    this.ycomp = y;\u000a    this.offset = this.cumulativeOffset(element);\u000a\u000a    return (y >= this.offset[1] &&\u000a            y <  this.offset[1] + element.offsetHeight &&\u000a            x >= this.offset[0] &&\u000a            x <  this.offset[0] + element.offsetWidth);\u000a  },\u000a\u000a  withinIncludingScrolloffsets: function(element, x, y) {\u000a    var offsetcache = this.realOffset(element);\u000a\u000a    this.xcomp = x + offsetcache[0] - this.deltaX;\u000a    this.ycomp = y + offsetcache[1] - this.deltaY;\u000a    this.offset = this.cumulativeOffset(element);\u000a\u000a    return (this.ycomp >= this.offset[1] &&\u000a            this.ycomp <  this.offset[1] + element.offsetHeight &&\u000a            this.xcomp >= this.offset[0] &&\u000a            this.xcomp <  this.offset[0] + element.offsetWidth);\u000a  },\u000a\u000a  // within must be called directly before\u000a  overlap: function(mode, element) {\u000a    if (!mode) return 0;\u000a    if (mode == 'vertical')\u000a      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\u000a        element.offsetHeight;\u000a    if (mode == 'horizontal')\u000a      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\u000a        element.offsetWidth;\u000a  },\u000a\u000a  page: function(forElement) {\u000a    var valueT = 0, valueL = 0;\u000a\u000a    var element = forElement;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a\u000a      // Safari fix\u000a      if (element.offsetParent == document.body)\u000a        if (Element.getStyle(element,'position')=='absolute') break;\u000a\u000a    } while (element = element.offsetParent);\u000a\u000a    element = forElement;\u000a    do {\u000a      if (!window.opera || element.tagName=='BODY') {\u000a        valueT -= element.scrollTop  || 0;\u000a        valueL -= element.scrollLeft || 0;\u000a      }\u000a    } while (element = element.parentNode);\u000a\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  clone: function(source, target) {\u000a    var options = Object.extend({\u000a      setLeft:    true,\u000a      setTop:     true,\u000a      setWidth:   true,\u000a      setHeight:  true,\u000a      offsetTop:  0,\u000a      offsetLeft: 0\u000a    }, arguments[2] || {})\u000a\u000a    // find page position of source\u000a    source = $(source);\u000a    var p = Position.page(source);\u000a\u000a    // find coordinate system to use\u000a    target = $(target);\u000a    var delta = [0, 0];\u000a    var parent = null;\u000a    // delta [0,0] will do fine with position: fixed elements,\u000a    // position:absolute needs offsetParent deltas\u000a    if (Element.getStyle(target,'position') == 'absolute') {\u000a      parent = Position.offsetParent(target);\u000a      delta = Position.page(parent);\u000a    }\u000a\u000a    // correct by body offsets (fixes Safari)\u000a    if (parent == document.body) {\u000a      delta[0] -= document.body.offsetLeft;\u000a      delta[1] -= document.body.offsetTop;\u000a    }\u000a\u000a    // set position\u000a    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';\u000a    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';\u000a    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';\u000a    if(options.setHeight) target.style.height = source.offsetHeight + 'px';\u000a  },\u000a\u000a  absolutize: function(element) {\u000a    element = $(element);\u000a    if (element.style.position == 'absolute') return;\u000a    Position.prepare();\u000a\u000a    var offsets = Position.positionedOffset(element);\u000a    var top     = offsets[1];\u000a    var left    = offsets[0];\u000a    var width   = element.clientWidth;\u000a    var height  = element.clientHeight;\u000a\u000a    element._originalLeft   = left - parseFloat(element.style.left  || 0);\u000a    element._originalTop    = top  - parseFloat(element.style.top || 0);\u000a    element._originalWidth  = element.style.width;\u000a    element._originalHeight = element.style.height;\u000a\u000a    element.style.position = 'absolute';\u000a    element.style.top    = top + 'px';\u000a    element.style.left   = left + 'px';\u000a    element.style.width  = width + 'px';\u000a    element.style.height = height + 'px';\u000a  },\u000a\u000a  relativize: function(element) {\u000a    element = $(element);\u000a    if (element.style.position == 'relative') return;\u000a    Position.prepare();\u000a\u000a    element.style.position = 'relative';\u000a    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);\u000a    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\u000a\u000a    element.style.top    = top + 'px';\u000a    element.style.left   = left + 'px';\u000a    element.style.height = element._originalHeight;\u000a    element.style.width  = element._originalWidth;\u000a  }\u000a}\u000a\u000a// Safari returns margins on body which is incorrect if the child is absolutely\u000a// positioned.  For performance reasons, redefine Position.cumulativeOffset for\u000a// KHTML/WebKit only.\u000aif (Prototype.Browser.WebKit) {\u000a  Position.cumulativeOffset = function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      if (element.offsetParent == document.body)\u000a        if (Element.getStyle(element, 'position') == 'absolute') break;\u000a\u000a      element = element.offsetParent;\u000a    } while (element);\u000a\u000a    return [valueL, valueT];\u000a  }\u000a}\u000a\u000aElement.addMethods();"
          },
          "redirectURL":"",
          "headersSize":353,
          "bodySize":96311
        },
        "cache":{},
        "timings":{
          "dns":1,
          "connect":30,
          "blocked":0,
          "send":0,
          "wait":29,
          "receive":134
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.829+02:00",
        "time":26,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/scriptaculous.js?ver=1.7.1-b3",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.7.1-b3"
            }
          ],
          "headersSize":490,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Tue, 05 Feb 2008 14:05:28 GMT"
            },
            {
              "name":"Etag",
              "value":"\"12068-a41-bb979a00\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"2625"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:27 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"application/javascript"
            }
          ],
          "content":{
            "size":2625,
            "mimeType":"application/javascript",
            "text":"// script.aculo.us scriptaculous.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007\u000a\u000a// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\u000a// \u000a// Permission is hereby granted, free of charge, to any person obtaining\u000a// a copy of this software and associated documentation files (the\u000a// \"Software\"), to deal in the Software without restriction, including\u000a// without limitation the rights to use, copy, modify, merge, publish,\u000a// distribute, sublicense, and/or sell copies of the Software, and to\u000a// permit persons to whom the Software is furnished to do so, subject to\u000a// the following conditions:\u000a// \u000a// The above copyright notice and this permission notice shall be\u000a// included in all copies or substantial portions of the Software.\u000a//\u000a// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\u000a// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\u000a// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\u000a// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\u000a// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\u000a// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\u000a// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\u000a//\u000a// For details, see the script.aculo.us web site: http://script.aculo.us/\u000a\u000avar Scriptaculous = {\u000a  Version: '1.7.1_beta3',\u000a  require: function(libraryName) {\u000a    // inserting via DOM fails in Safari 2.0, so brute force approach\u000a    document.write('<script type=\"text/javascript\" src=\"'+libraryName+'\"></script>');\u000a  },\u000a  REQUIRED_PROTOTYPE: '1.5.1',\u000a  load: function() {\u000a    function convertVersionString(versionString){\u000a      var r = versionString.split('.');\u000a      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);\u000a    }\u000a \u000a    if((typeof Prototype=='undefined') || \u000a       (typeof Element == 'undefined') || \u000a       (typeof Element.Methods=='undefined') ||\u000a       (convertVersionString(Prototype.Version) < \u000a        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))\u000a       throw(\"script.aculo.us requires the Prototype JavaScript framework >= \" +\u000a        Scriptaculous.REQUIRED_PROTOTYPE);\u000a    \u000a    $A(document.getElementsByTagName(\"script\")).findAll( function(s) {\u000a      return (s.src && s.src.match(/scriptaculous\\.js(\\?.*)?$/))\u000a    }).each( function(s) {\u000a      var path = s.src.replace(/scriptaculous\\.js(\\?.*)?$/,'');\u000a      var includes = s.src.match(/\\?.*load=([a-z,]*)/);\u000a      if ( includes )\u000a       includes[1].split(',').each(\u000a       function(include) { Scriptaculous.require(path+include+'.js') });\u000a    });\u000a  }\u000a}\u000a\u000aScriptaculous.load();\u000a"
          },
          "redirectURL":"",
          "headersSize":350,
          "bodySize":2625
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":1,
          "send":0,
          "wait":23,
          "receive":2
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.832+02:00",
        "time":98,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/effects.js?ver=1.7.1-b3",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.7.1-b3"
            }
          ],
          "headersSize":484,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Tue, 05 Feb 2008 14:05:26 GMT"
            },
            {
              "name":"Etag",
              "value":"\"12065-9554-bb791580\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"38228"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:27 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"application/javascript"
            }
          ],
          "content":{
            "size":38228,
            "mimeType":"application/javascript",
            "text":"// script.aculo.us effects.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007\u000a\u000a// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\u000a// Contributors:\u000a//  Justin Palmer (http://encytemedia.com/)\u000a//  Mark Pilgrim (http://diveintomark.org/)\u000a//  Martin Bialasinki\u000a// \u000a// script.aculo.us is freely distributable under the terms of an MIT-style license.\u000a// For details, see the script.aculo.us web site: http://script.aculo.us/ \u000a\u000a// converts rgb() and #xxx to #xxxxxx format,  \u000a// returns self (or first argument) if not convertable  \u000aString.prototype.parseColor = function() {  \u000a  var color = '#';\u000a  if(this.slice(0,4) == 'rgb(') {  \u000a    var cols = this.slice(4,this.length-1).split(',');  \u000a    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  \u000a  } else {  \u000a    if(this.slice(0,1) == '#') {  \u000a      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  \u000a      if(this.length==7) color = this.toLowerCase();  \u000a    }  \u000a  }  \u000a  return(color.length==7 ? color : (arguments[0] || this));  \u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aElement.collectTextNodes = function(element) {  \u000a  return $A($(element).childNodes).collect( function(node) {\u000a    return (node.nodeType==3 ? node.nodeValue : \u000a      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));\u000a  }).flatten().join('');\u000a}\u000a\u000aElement.collectTextNodesIgnoreClass = function(element, className) {  \u000a  return $A($(element).childNodes).collect( function(node) {\u000a    return (node.nodeType==3 ? node.nodeValue : \u000a      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? \u000a        Element.collectTextNodesIgnoreClass(node, className) : ''));\u000a  }).flatten().join('');\u000a}\u000a\u000aElement.setContentZoom = function(element, percent) {\u000a  element = $(element);  \u000a  element.setStyle({fontSize: (percent/100) + 'em'});   \u000a  if(Prototype.Browser.WebKit) window.scrollBy(0,0);\u000a  return element;\u000a}\u000a\u000aElement.getInlineOpacity = function(element){\u000a  return $(element).style.opacity || '';\u000a}\u000a\u000aElement.forceRerendering = function(element) {\u000a  try {\u000a    element = $(element);\u000a    var n = document.createTextNode(' ');\u000a    element.appendChild(n);\u000a    element.removeChild(n);\u000a  } catch(e) { }\u000a};\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aArray.prototype.call = function() {\u000a  var args = arguments;\u000a  this.each(function(f){ f.apply(this, args) });\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Effect = {\u000a  _elementDoesNotExistError: {\u000a    name: 'ElementDoesNotExistError',\u000a    message: 'The specified DOM element does not exist, but is required for this effect to operate'\u000a  },\u000a  tagifyText: function(element) {\u000a    if(typeof Builder == 'undefined')\u000a      throw(\"Effect.tagifyText requires including script.aculo.us' builder.js library\");\u000a      \u000a    var tagifyStyle = 'position:relative';\u000a    if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';\u000a    \u000a    element = $(element);\u000a    $A(element.childNodes).each( function(child) {\u000a      if(child.nodeType==3) {\u000a        child.nodeValue.toArray().each( function(character) {\u000a          element.insertBefore(\u000a            Builder.node('span',{style: tagifyStyle},\u000a              character == ' ' ? String.fromCharCode(160) : character), \u000a              child);\u000a        });\u000a        Element.remove(child);\u000a      }\u000a    });\u000a  },\u000a  multiple: function(element, effect) {\u000a    var elements;\u000a    if(((typeof element == 'object') || \u000a        (typeof element == 'function')) && \u000a       (element.length))\u000a      elements = element;\u000a    else\u000a      elements = $(element).childNodes;\u000a      \u000a    var options = Object.extend({\u000a      speed: 0.1,\u000a      delay: 0.0\u000a    }, arguments[2] || {});\u000a    var masterDelay = options.delay;\u000a\u000a    $A(elements).each( function(element, index) {\u000a      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));\u000a    });\u000a  },\u000a  PAIRS: {\u000a    'slide':  ['SlideDown','SlideUp'],\u000a    'blind':  ['BlindDown','BlindUp'],\u000a    'appear': ['Appear','Fade']\u000a  },\u000a  toggle: function(element, effect) {\u000a    element = $(element);\u000a    effect = (effect || 'appear').toLowerCase();\u000a    var options = Object.extend({\u000a      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }\u000a    }, arguments[2] || {});\u000a    Effect[element.visible() ? \u000a      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);\u000a  }\u000a};\u000a\u000avar Effect2 = Effect; // deprecated\u000a\u000a/* ------------- transitions ------------- */\u000a\u000aEffect.Transitions = {\u000a  linear: Prototype.K,\u000a  sinoidal: function(pos) {\u000a    return (-Math.cos(pos*Math.PI)/2) + 0.5;\u000a  },\u000a  reverse: function(pos) {\u000a    return 1-pos;\u000a  },\u000a  flicker: function(pos) {\u000a    var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;\u000a    return (pos > 1 ? 1 : pos);\u000a  },\u000a  wobble: function(pos) {\u000a    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;\u000a  },\u000a  pulse: function(pos, pulses) { \u000a    pulses = pulses || 5; \u000a    return (\u000a      Math.round((pos % (1/pulses)) * pulses) == 0 ? \u000a            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : \u000a        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))\u000a      );\u000a  },\u000a  none: function(pos) {\u000a    return 0;\u000a  },\u000a  full: function(pos) {\u000a    return 1;\u000a  }\u000a};\u000a\u000a/* ------------- core effects ------------- */\u000a\u000aEffect.ScopedQueue = Class.create();\u000aObject.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {\u000a  initialize: function() {\u000a    this.effects  = [];\u000a    this.interval = null;    \u000a  },\u000a  _each: function(iterator) {\u000a    this.effects._each(iterator);\u000a  },\u000a  add: function(effect) {\u000a    var timestamp = new Date().getTime();\u000a    \u000a    var position = (typeof effect.options.queue == 'string') ? \u000a      effect.options.queue : effect.options.queue.position;\u000a    \u000a    switch(position) {\u000a      case 'front':\u000a        // move unstarted effects after this effect  \u000a        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {\u000a            e.startOn  += effect.finishOn;\u000a            e.finishOn += effect.finishOn;\u000a          });\u000a        break;\u000a      case 'with-last':\u000a        timestamp = this.effects.pluck('startOn').max() || timestamp;\u000a        break;\u000a      case 'end':\u000a        // start effect after last queued effect has finished\u000a        timestamp = this.effects.pluck('finishOn').max() || timestamp;\u000a        break;\u000a    }\u000a    \u000a    effect.startOn  += timestamp;\u000a    effect.finishOn += timestamp;\u000a\u000a    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))\u000a      this.effects.push(effect);\u000a    \u000a    if(!this.interval)\u000a      this.interval = setInterval(this.loop.bind(this), 15);\u000a  },\u000a  remove: function(effect) {\u000a    this.effects = this.effects.reject(function(e) { return e==effect });\u000a    if(this.effects.length == 0) {\u000a      clearInterval(this.interval);\u000a      this.interval = null;\u000a    }\u000a  },\u000a  loop: function() {\u000a    var timePos = new Date().getTime();\u000a    for(var i=0, len=this.effects.length;i<len;i++) \u000a      this.effects[i] && this.effects[i].loop(timePos);\u000a  }\u000a});\u000a\u000aEffect.Queues = {\u000a  instances: $H(),\u000a  get: function(queueName) {\u000a    if(typeof queueName != 'string') return queueName;\u000a    \u000a    if(!this.instances[queueName])\u000a      this.instances[queueName] = new Effect.ScopedQueue();\u000a      \u000a    return this.instances[queueName];\u000a  }\u000a}\u000aEffect.Queue = Effect.Queues.get('global');\u000a\u000aEffect.DefaultOptions = {\u000a  transition: Effect.Transitions.sinoidal,\u000a  duration:   1.0,   // seconds\u000a  fps:        100,   // 100= assume 66fps max.\u000a  sync:       false, // true for combining\u000a  from:       0.0,\u000a  to:         1.0,\u000a  delay:      0.0,\u000a  queue:      'parallel'\u000a}\u000a\u000aEffect.Base = function() {};\u000aEffect.Base.prototype = {\u000a  position: null,\u000a  start: function(options) {\u000a    function codeForEvent(options,eventName){\u000a      return (\u000a        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +\u000a        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')\u000a      );\u000a    }\u000a    if(options.transition === false) options.transition = Effect.Transitions.linear;\u000a    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});\u000a    this.currentFrame = 0;\u000a    this.state        = 'idle';\u000a    this.startOn      = this.options.delay*1000;\u000a    this.finishOn     = this.startOn+(this.options.duration*1000);\u000a    this.fromToDelta  = this.options.to-this.options.from;\u000a    this.totalTime    = this.finishOn-this.startOn;\u000a    this.totalFrames  = this.options.fps*this.options.duration;\u000a    \u000a    eval('this.render = function(pos){ '+\u000a      'if(this.state==\"idle\"){this.state=\"running\";'+\u000a      codeForEvent(options,'beforeSetup')+\u000a      (this.setup ? 'this.setup();':'')+ \u000a      codeForEvent(options,'afterSetup')+\u000a      '};if(this.state==\"running\"){'+\u000a      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+\u000a      'this.position=pos;'+\u000a      codeForEvent(options,'beforeUpdate')+\u000a      (this.update ? 'this.update(pos);':'')+\u000a      codeForEvent(options,'afterUpdate')+\u000a      '}}');\u000a    \u000a    this.event('beforeStart');\u000a    if(!this.options.sync)\u000a      Effect.Queues.get(typeof this.options.queue == 'string' ? \u000a        'global' : this.options.queue.scope).add(this);\u000a  },\u000a  loop: function(timePos) {\u000a    if(timePos >= this.startOn) {\u000a      if(timePos >= this.finishOn) {\u000a        this.render(1.0);\u000a        this.cancel();\u000a        this.event('beforeFinish');\u000a        if(this.finish) this.finish(); \u000a        this.event('afterFinish');\u000a        return;  \u000a      }\u000a      var pos   = (timePos - this.startOn) / this.totalTime,\u000a          frame = Math.round(pos * this.totalFrames);\u000a      if(frame > this.currentFrame) {\u000a        this.render(pos);\u000a        this.currentFrame = frame;\u000a      }\u000a    }\u000a  },\u000a  cancel: function() {\u000a    if(!this.options.sync)\u000a      Effect.Queues.get(typeof this.options.queue == 'string' ? \u000a        'global' : this.options.queue.scope).remove(this);\u000a    this.state = 'finished';\u000a  },\u000a  event: function(eventName) {\u000a    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);\u000a    if(this.options[eventName]) this.options[eventName](this);\u000a  },\u000a  inspect: function() {\u000a    var data = $H();\u000a    for(property in this)\u000a      if(typeof this[property] != 'function') data[property] = this[property];\u000a    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';\u000a  }\u000a}\u000a\u000aEffect.Parallel = Class.create();\u000aObject.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {\u000a  initialize: function(effects) {\u000a    this.effects = effects || [];\u000a    this.start(arguments[1]);\u000a  },\u000a  update: function(position) {\u000a    this.effects.invoke('render', position);\u000a  },\u000a  finish: function(position) {\u000a    this.effects.each( function(effect) {\u000a      effect.render(1.0);\u000a      effect.cancel();\u000a      effect.event('beforeFinish');\u000a      if(effect.finish) effect.finish(position);\u000a      effect.event('afterFinish');\u000a    });\u000a  }\u000a});\u000a\u000aEffect.Event = Class.create();\u000aObject.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {\u000a  initialize: function() {\u000a    var options = Object.extend({\u000a      duration: 0\u000a    }, arguments[0] || {});\u000a    this.start(options);\u000a  },\u000a  update: Prototype.emptyFunction\u000a});\u000a\u000aEffect.Opacity = Class.create();\u000aObject.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    // make this work on IE on elements without 'layout'\u000a    if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))\u000a      this.element.setStyle({zoom: 1});\u000a    var options = Object.extend({\u000a      from: this.element.getOpacity() || 0.0,\u000a      to:   1.0\u000a    }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  update: function(position) {\u000a    this.element.setOpacity(position);\u000a  }\u000a});\u000a\u000aEffect.Move = Class.create();\u000aObject.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      x:    0,\u000a      y:    0,\u000a      mode: 'relative'\u000a    }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    // Bug in Opera: Opera returns the \"real\" position of a static element or\u000a    // relative element that does not have top/left explicitly set.\u000a    // ==> Always set top and left for position relative elements in your stylesheets \u000a    // (to 0 if you do not need them) \u000a    this.element.makePositioned();\u000a    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');\u000a    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');\u000a    if(this.options.mode == 'absolute') {\u000a      // absolute movement, so we need to calc deltaX and deltaY\u000a      this.options.x = this.options.x - this.originalLeft;\u000a      this.options.y = this.options.y - this.originalTop;\u000a    }\u000a  },\u000a  update: function(position) {\u000a    this.element.setStyle({\u000a      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',\u000a      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'\u000a    });\u000a  }\u000a});\u000a\u000a// for backwards compatibility\u000aEffect.MoveBy = function(element, toTop, toLeft) {\u000a  return new Effect.Move(element, \u000a    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));\u000a};\u000a\u000aEffect.Scale = Class.create();\u000aObject.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {\u000a  initialize: function(element, percent) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      scaleX: true,\u000a      scaleY: true,\u000a      scaleContent: true,\u000a      scaleFromCenter: false,\u000a      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values\u000a      scaleFrom: 100.0,\u000a      scaleTo:   percent\u000a    }, arguments[2] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    this.restoreAfterFinish = this.options.restoreAfterFinish || false;\u000a    this.elementPositioning = this.element.getStyle('position');\u000a    \u000a    this.originalStyle = {};\u000a    ['top','left','width','height','fontSize'].each( function(k) {\u000a      this.originalStyle[k] = this.element.style[k];\u000a    }.bind(this));\u000a      \u000a    this.originalTop  = this.element.offsetTop;\u000a    this.originalLeft = this.element.offsetLeft;\u000a    \u000a    var fontSize = this.element.getStyle('font-size') || '100%';\u000a    ['em','px','%','pt'].each( function(fontSizeType) {\u000a      if(fontSize.indexOf(fontSizeType)>0) {\u000a        this.fontSize     = parseFloat(fontSize);\u000a        this.fontSizeType = fontSizeType;\u000a      }\u000a    }.bind(this));\u000a    \u000a    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;\u000a    \u000a    this.dims = null;\u000a    if(this.options.scaleMode=='box')\u000a      this.dims = [this.element.offsetHeight, this.element.offsetWidth];\u000a    if(/^content/.test(this.options.scaleMode))\u000a      this.dims = [this.element.scrollHeight, this.element.scrollWidth];\u000a    if(!this.dims)\u000a      this.dims = [this.options.scaleMode.originalHeight,\u000a                   this.options.scaleMode.originalWidth];\u000a  },\u000a  update: function(position) {\u000a    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);\u000a    if(this.options.scaleContent && this.fontSize)\u000a      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });\u000a    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);\u000a  },\u000a  finish: function(position) {\u000a    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);\u000a  },\u000a  setDimensions: function(height, width) {\u000a    var d = {};\u000a    if(this.options.scaleX) d.width = Math.round(width) + 'px';\u000a    if(this.options.scaleY) d.height = Math.round(height) + 'px';\u000a    if(this.options.scaleFromCenter) {\u000a      var topd  = (height - this.dims[0])/2;\u000a      var leftd = (width  - this.dims[1])/2;\u000a      if(this.elementPositioning == 'absolute') {\u000a        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';\u000a        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';\u000a      } else {\u000a        if(this.options.scaleY) d.top = -topd + 'px';\u000a        if(this.options.scaleX) d.left = -leftd + 'px';\u000a      }\u000a    }\u000a    this.element.setStyle(d);\u000a  }\u000a});\u000a\u000aEffect.Highlight = Class.create();\u000aObject.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    // Prevent executing on elements not in the layout flow\u000a    if(this.element.getStyle('display')=='none') { this.cancel(); return; }\u000a    // Disable background image during the effect\u000a    this.oldStyle = {};\u000a    if (!this.options.keepBackgroundImage) {\u000a      this.oldStyle.backgroundImage = this.element.getStyle('background-image');\u000a      this.element.setStyle({backgroundImage: 'none'});\u000a    }\u000a    if(!this.options.endcolor)\u000a      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');\u000a    if(!this.options.restorecolor)\u000a      this.options.restorecolor = this.element.getStyle('background-color');\u000a    // init color calculations\u000a    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));\u000a    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));\u000a  },\u000a  update: function(position) {\u000a    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){\u000a      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });\u000a  },\u000a  finish: function() {\u000a    this.element.setStyle(Object.extend(this.oldStyle, {\u000a      backgroundColor: this.options.restorecolor\u000a    }));\u000a  }\u000a});\u000a\u000aEffect.ScrollTo = Class.create();\u000aObject.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    this.start(arguments[1] || {});\u000a  },\u000a  setup: function() {\u000a    Position.prepare();\u000a    var offsets = Position.cumulativeOffset(this.element);\u000a    if(this.options.offset) offsets[1] += this.options.offset;\u000a    var max = window.innerHeight ? \u000a      window.height - window.innerHeight :\u000a      document.body.scrollHeight - \u000a        (document.documentElement.clientHeight ? \u000a          document.documentElement.clientHeight : document.body.clientHeight);\u000a    this.scrollStart = Position.deltaY;\u000a    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;\u000a  },\u000a  update: function(position) {\u000a    Position.prepare();\u000a    window.scrollTo(Position.deltaX, \u000a      this.scrollStart + (position*this.delta));\u000a  }\u000a});\u000a\u000a/* ------------- combination effects ------------- */\u000a\u000aEffect.Fade = function(element) {\u000a  element = $(element);\u000a  var oldOpacity = element.getInlineOpacity();\u000a  var options = Object.extend({\u000a  from: element.getOpacity() || 1.0,\u000a  to:   0.0,\u000a  afterFinishInternal: function(effect) { \u000a    if(effect.options.to!=0) return;\u000a    effect.element.hide().setStyle({opacity: oldOpacity}); \u000a  }}, arguments[1] || {});\u000a  return new Effect.Opacity(element,options);\u000a}\u000a\u000aEffect.Appear = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),\u000a  to:   1.0,\u000a  // force Safari to render floated elements properly\u000a  afterFinishInternal: function(effect) {\u000a    effect.element.forceRerendering();\u000a  },\u000a  beforeSetup: function(effect) {\u000a    effect.element.setOpacity(effect.options.from).show(); \u000a  }}, arguments[1] || {});\u000a  return new Effect.Opacity(element,options);\u000a}\u000a\u000aEffect.Puff = function(element) {\u000a  element = $(element);\u000a  var oldStyle = { \u000a    opacity: element.getInlineOpacity(), \u000a    position: element.getStyle('position'),\u000a    top:  element.style.top,\u000a    left: element.style.left,\u000a    width: element.style.width,\u000a    height: element.style.height\u000a  };\u000a  return new Effect.Parallel(\u000a   [ new Effect.Scale(element, 200, \u000a      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), \u000a     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], \u000a     Object.extend({ duration: 1.0, \u000a      beforeSetupInternal: function(effect) {\u000a        Position.absolutize(effect.effects[0].element)\u000a      },\u000a      afterFinishInternal: function(effect) {\u000a         effect.effects[0].element.hide().setStyle(oldStyle); }\u000a     }, arguments[1] || {})\u000a   );\u000a}\u000a\u000aEffect.BlindUp = function(element) {\u000a  element = $(element);\u000a  element.makeClipping();\u000a  return new Effect.Scale(element, 0,\u000a    Object.extend({ scaleContent: false, \u000a      scaleX: false, \u000a      restoreAfterFinish: true,\u000a      afterFinishInternal: function(effect) {\u000a        effect.element.hide().undoClipping();\u000a      } \u000a    }, arguments[1] || {})\u000a  );\u000a}\u000a\u000aEffect.BlindDown = function(element) {\u000a  element = $(element);\u000a  var elementDimensions = element.getDimensions();\u000a  return new Effect.Scale(element, 100, Object.extend({ \u000a    scaleContent: false, \u000a    scaleX: false,\u000a    scaleFrom: 0,\u000a    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\u000a    restoreAfterFinish: true,\u000a    afterSetup: function(effect) {\u000a      effect.element.makeClipping().setStyle({height: '0px'}).show(); \u000a    },  \u000a    afterFinishInternal: function(effect) {\u000a      effect.element.undoClipping();\u000a    }\u000a  }, arguments[1] || {}));\u000a}\u000a\u000aEffect.SwitchOff = function(element) {\u000a  element = $(element);\u000a  var oldOpacity = element.getInlineOpacity();\u000a  return new Effect.Appear(element, Object.extend({\u000a    duration: 0.4,\u000a    from: 0,\u000a    transition: Effect.Transitions.flicker,\u000a    afterFinishInternal: function(effect) {\u000a      new Effect.Scale(effect.element, 1, { \u000a        duration: 0.3, scaleFromCenter: true,\u000a        scaleX: false, scaleContent: false, restoreAfterFinish: true,\u000a        beforeSetup: function(effect) { \u000a          effect.element.makePositioned().makeClipping();\u000a        },\u000a        afterFinishInternal: function(effect) {\u000a          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});\u000a        }\u000a      })\u000a    }\u000a  }, arguments[1] || {}));\u000a}\u000a\u000aEffect.DropOut = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.getStyle('top'),\u000a    left: element.getStyle('left'),\u000a    opacity: element.getInlineOpacity() };\u000a  return new Effect.Parallel(\u000a    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), \u000a      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],\u000a    Object.extend(\u000a      { duration: 0.5,\u000a        beforeSetup: function(effect) {\u000a          effect.effects[0].element.makePositioned(); \u000a        },\u000a        afterFinishInternal: function(effect) {\u000a          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);\u000a        } \u000a      }, arguments[1] || {}));\u000a}\u000a\u000aEffect.Shake = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.getStyle('top'),\u000a    left: element.getStyle('left') };\u000a    return new Effect.Move(element, \u000a      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\u000a        effect.element.undoPositioned().setStyle(oldStyle);\u000a  }}) }}) }}) }}) }}) }});\u000a}\u000a\u000aEffect.SlideDown = function(element) {\u000a  element = $(element).cleanWhitespace();\u000a  // SlideDown need to have the content of the element wrapped in a container element with fixed height!\u000a  var oldInnerBottom = element.down().getStyle('bottom');\u000a  var elementDimensions = element.getDimensions();\u000a  return new Effect.Scale(element, 100, Object.extend({ \u000a    scaleContent: false, \u000a    scaleX: false, \u000a    scaleFrom: window.opera ? 0 : 1,\u000a    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\u000a    restoreAfterFinish: true,\u000a    afterSetup: function(effect) {\u000a      effect.element.makePositioned();\u000a      effect.element.down().makePositioned();\u000a      if(window.opera) effect.element.setStyle({top: ''});\u000a      effect.element.makeClipping().setStyle({height: '0px'}).show(); \u000a    },\u000a    afterUpdateInternal: function(effect) {\u000a      effect.element.down().setStyle({bottom:\u000a        (effect.dims[0] - effect.element.clientHeight) + 'px' }); \u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      effect.element.undoClipping().undoPositioned();\u000a      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }\u000a    }, arguments[1] || {})\u000a  );\u000a}\u000a\u000aEffect.SlideUp = function(element) {\u000a  element = $(element).cleanWhitespace();\u000a  var oldInnerBottom = element.down().getStyle('bottom');\u000a  return new Effect.Scale(element, window.opera ? 0 : 1,\u000a   Object.extend({ scaleContent: false, \u000a    scaleX: false, \u000a    scaleMode: 'box',\u000a    scaleFrom: 100,\u000a    restoreAfterFinish: true,\u000a    beforeStartInternal: function(effect) {\u000a      effect.element.makePositioned();\u000a      effect.element.down().makePositioned();\u000a      if(window.opera) effect.element.setStyle({top: ''});\u000a      effect.element.makeClipping().show();\u000a    },  \u000a    afterUpdateInternal: function(effect) {\u000a      effect.element.down().setStyle({bottom:\u000a        (effect.dims[0] - effect.element.clientHeight) + 'px' });\u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});\u000a      effect.element.down().undoPositioned();\u000a    }\u000a   }, arguments[1] || {})\u000a  );\u000a}\u000a\u000a// Bug in opera makes the TD containing this element expand for a instance after finish \u000aEffect.Squish = function(element) {\u000a  return new Effect.Scale(element, window.opera ? 1 : 0, { \u000a    restoreAfterFinish: true,\u000a    beforeSetup: function(effect) {\u000a      effect.element.makeClipping(); \u000a    },  \u000a    afterFinishInternal: function(effect) {\u000a      effect.element.hide().undoClipping(); \u000a    }\u000a  });\u000a}\u000a\u000aEffect.Grow = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a    direction: 'center',\u000a    moveTransition: Effect.Transitions.sinoidal,\u000a    scaleTransition: Effect.Transitions.sinoidal,\u000a    opacityTransition: Effect.Transitions.full\u000a  }, arguments[1] || {});\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    height: element.style.height,\u000a    width: element.style.width,\u000a    opacity: element.getInlineOpacity() };\u000a\u000a  var dims = element.getDimensions();    \u000a  var initialMoveX, initialMoveY;\u000a  var moveX, moveY;\u000a  \u000a  switch (options.direction) {\u000a    case 'top-left':\u000a      initialMoveX = initialMoveY = moveX = moveY = 0; \u000a      break;\u000a    case 'top-right':\u000a      initialMoveX = dims.width;\u000a      initialMoveY = moveY = 0;\u000a      moveX = -dims.width;\u000a      break;\u000a    case 'bottom-left':\u000a      initialMoveX = moveX = 0;\u000a      initialMoveY = dims.height;\u000a      moveY = -dims.height;\u000a      break;\u000a    case 'bottom-right':\u000a      initialMoveX = dims.width;\u000a      initialMoveY = dims.height;\u000a      moveX = -dims.width;\u000a      moveY = -dims.height;\u000a      break;\u000a    case 'center':\u000a      initialMoveX = dims.width / 2;\u000a      initialMoveY = dims.height / 2;\u000a      moveX = -dims.width / 2;\u000a      moveY = -dims.height / 2;\u000a      break;\u000a  }\u000a  \u000a  return new Effect.Move(element, {\u000a    x: initialMoveX,\u000a    y: initialMoveY,\u000a    duration: 0.01, \u000a    beforeSetup: function(effect) {\u000a      effect.element.hide().makeClipping().makePositioned();\u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      new Effect.Parallel(\u000a        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),\u000a          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),\u000a          new Effect.Scale(effect.element, 100, {\u000a            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, \u000a            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})\u000a        ], Object.extend({\u000a             beforeSetup: function(effect) {\u000a               effect.effects[0].element.setStyle({height: '0px'}).show(); \u000a             },\u000a             afterFinishInternal: function(effect) {\u000a               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); \u000a             }\u000a           }, options)\u000a      )\u000a    }\u000a  });\u000a}\u000a\u000aEffect.Shrink = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a    direction: 'center',\u000a    moveTransition: Effect.Transitions.sinoidal,\u000a    scaleTransition: Effect.Transitions.sinoidal,\u000a    opacityTransition: Effect.Transitions.none\u000a  }, arguments[1] || {});\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    height: element.style.height,\u000a    width: element.style.width,\u000a    opacity: element.getInlineOpacity() };\u000a\u000a  var dims = element.getDimensions();\u000a  var moveX, moveY;\u000a  \u000a  switch (options.direction) {\u000a    case 'top-left':\u000a      moveX = moveY = 0;\u000a      break;\u000a    case 'top-right':\u000a      moveX = dims.width;\u000a      moveY = 0;\u000a      break;\u000a    case 'bottom-left':\u000a      moveX = 0;\u000a      moveY = dims.height;\u000a      break;\u000a    case 'bottom-right':\u000a      moveX = dims.width;\u000a      moveY = dims.height;\u000a      break;\u000a    case 'center':  \u000a      moveX = dims.width / 2;\u000a      moveY = dims.height / 2;\u000a      break;\u000a  }\u000a  \u000a  return new Effect.Parallel(\u000a    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),\u000a      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),\u000a      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })\u000a    ], Object.extend({            \u000a         beforeStartInternal: function(effect) {\u000a           effect.effects[0].element.makePositioned().makeClipping(); \u000a         },\u000a         afterFinishInternal: function(effect) {\u000a           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }\u000a       }, options)\u000a  );\u000a}\u000a\u000aEffect.Pulsate = function(element) {\u000a  element = $(element);\u000a  var options    = arguments[1] || {};\u000a  var oldOpacity = element.getInlineOpacity();\u000a  var transition = options.transition || Effect.Transitions.sinoidal;\u000a  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };\u000a  reverser.bind(transition);\u000a  return new Effect.Opacity(element, \u000a    Object.extend(Object.extend({  duration: 2.0, from: 0,\u000a      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }\u000a    }, options), {transition: reverser}));\u000a}\u000a\u000aEffect.Fold = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    width: element.style.width,\u000a    height: element.style.height };\u000a  element.makeClipping();\u000a  return new Effect.Scale(element, 5, Object.extend({   \u000a    scaleContent: false,\u000a    scaleX: false,\u000a    afterFinishInternal: function(effect) {\u000a    new Effect.Scale(element, 1, { \u000a      scaleContent: false, \u000a      scaleY: false,\u000a      afterFinishInternal: function(effect) {\u000a        effect.element.hide().undoClipping().setStyle(oldStyle);\u000a      } });\u000a  }}, arguments[1] || {}));\u000a};\u000a\u000aEffect.Morph = Class.create();\u000aObject.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      style: {}\u000a    }, arguments[1] || {});\u000a    if (typeof options.style == 'string') {\u000a      if(options.style.indexOf(':') == -1) {\u000a        var cssText = '', selector = '.' + options.style;\u000a        $A(document.styleSheets).reverse().each(function(styleSheet) {\u000a          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;\u000a          else if (styleSheet.rules) cssRules = styleSheet.rules;\u000a          $A(cssRules).reverse().each(function(rule) {\u000a            if (selector == rule.selectorText) {\u000a              cssText = rule.style.cssText;\u000a              throw $break;\u000a            }\u000a          });\u000a          if (cssText) throw $break;\u000a        });\u000a        this.style = cssText.parseStyle();\u000a        options.afterFinishInternal = function(effect){\u000a          effect.element.addClassName(effect.options.style);\u000a          effect.transforms.each(function(transform) {\u000a            if(transform.style != 'opacity')\u000a              effect.element.style[transform.style] = '';\u000a          });\u000a        }\u000a      } else this.style = options.style.parseStyle();\u000a    } else this.style = $H(options.style)\u000a    this.start(options);\u000a  },\u000a  setup: function(){\u000a    function parseColor(color){\u000a      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';\u000a      color = color.parseColor();\u000a      return $R(0,2).map(function(i){\u000a        return parseInt( color.slice(i*2+1,i*2+3), 16 ) \u000a      });\u000a    }\u000a    this.transforms = this.style.map(function(pair){\u000a      var property = pair[0], value = pair[1], unit = null;\u000a\u000a      if(value.parseColor('#zzzzzz') != '#zzzzzz') {\u000a        value = value.parseColor();\u000a        unit  = 'color';\u000a      } else if(property == 'opacity') {\u000a        value = parseFloat(value);\u000a        if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))\u000a          this.element.setStyle({zoom: 1});\u000a      } else if(Element.CSS_LENGTH.test(value)) {\u000a          var components = value.match(/^([\\+\\-]?[0-9\\.]+)(.*)$/);\u000a          value = parseFloat(components[1]);\u000a          unit = (components.length == 3) ? components[2] : null;\u000a      }\u000a\u000a      var originalValue = this.element.getStyle(property);\u000a      return { \u000a        style: property.camelize(), \u000a        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), \u000a        targetValue: unit=='color' ? parseColor(value) : value,\u000a        unit: unit\u000a      };\u000a    }.bind(this)).reject(function(transform){\u000a      return (\u000a        (transform.originalValue == transform.targetValue) ||\u000a        (\u000a          transform.unit != 'color' &&\u000a          (isNaN(transform.originalValue) || isNaN(transform.targetValue))\u000a        )\u000a      )\u000a    });\u000a  },\u000a  update: function(position) {\u000a    var style = {}, transform, i = this.transforms.length;\u000a    while(i--)\u000a      style[(transform = this.transforms[i]).style] = \u000a        transform.unit=='color' ? '#'+\u000a          (Math.round(transform.originalValue[0]+\u000a            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +\u000a          (Math.round(transform.originalValue[1]+\u000a            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +\u000a          (Math.round(transform.originalValue[2]+\u000a            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :\u000a        transform.originalValue + Math.round(\u000a          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;\u000a    this.element.setStyle(style, true);\u000a  }\u000a});\u000a\u000aEffect.Transform = Class.create();\u000aObject.extend(Effect.Transform.prototype, {\u000a  initialize: function(tracks){\u000a    this.tracks  = [];\u000a    this.options = arguments[1] || {};\u000a    this.addTracks(tracks);\u000a  },\u000a  addTracks: function(tracks){\u000a    tracks.each(function(track){\u000a      var data = $H(track).values().first();\u000a      this.tracks.push($H({\u000a        ids:     $H(track).keys().first(),\u000a        effect:  Effect.Morph,\u000a        options: { style: data }\u000a      }));\u000a    }.bind(this));\u000a    return this;\u000a  },\u000a  play: function(){\u000a    return new Effect.Parallel(\u000a      this.tracks.map(function(track){\u000a        var elements = [$(track.ids) || $$(track.ids)].flatten();\u000a        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });\u000a      }).flatten(),\u000a      this.options\u000a    );\u000a  }\u000a});\u000a\u000aElement.CSS_PROPERTIES = $w(\u000a  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + \u000a  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +\u000a  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +\u000a  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +\u000a  'fontSize fontWeight height left letterSpacing lineHeight ' +\u000a  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+\u000a  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +\u000a  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +\u000a  'right textIndent top width wordSpacing zIndex');\u000a  \u000aElement.CSS_LENGTH = /^(([\\+\\-]?[0-9\\.]+)(em|ex|px|in|cm|mm|pt|pc|\\%))|0$/;\u000a\u000aString.prototype.parseStyle = function(){\u000a  var element = document.createElement('div');\u000a  element.innerHTML = '<div style=\"' + this + '\"></div>';\u000a  var style = element.childNodes[0].style, styleRules = $H();\u000a  \u000a  Element.CSS_PROPERTIES.each(function(property){\u000a    if(style[property]) styleRules[property] = style[property]; \u000a  });\u000a  if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {\u000a    styleRules.opacity = this.match(/opacity:\\s*((?:0|1)?(?:\\.\\d*)?)/)[1];\u000a  }\u000a  return styleRules;\u000a};\u000a\u000aElement.morph = function(element, style) {\u000a  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));\u000a  return element;\u000a};\u000a\u000a['getInlineOpacity','forceRerendering','setContentZoom',\u000a 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( \u000a  function(f) { Element.Methods[f] = Element[f]; }\u000a);\u000a\u000aElement.Methods.visualEffect = function(element, effect, options) {\u000a  s = effect.dasherize().camelize();\u000a  effect_class = s.charAt(0).toUpperCase() + s.substring(1);\u000a  new Effect[effect_class](element, options);\u000a  return $(element);\u000a};\u000a\u000aElement.addMethods();"
          },
          "redirectURL":"",
          "headersSize":352,
          "bodySize":38228
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":32,
          "receive":66
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.833+02:00",
        "time":41,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/deans_code_highlighter/geshi.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":498,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sat, 26 Apr 2008 09:29:28 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11e4a-40a-51af6e00\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"1034"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"text/css"
            }
          ],
          "content":{
            "size":1034,
            "mimeType":"text/css",
            "text":"/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */\u000d\u000a.dean_ch{border: 1px dotted #a0a0a0; font-family: 'Courier New', Courier, monospace; background-color: #f0f0f0; color: #000000; overflow: auto;}\u000d\u000a.dean_ch .de1, .dean_ch .de2 {font-weight:normal;background:transparent;color:#000; padding-left: 5px;}\u000d\u000a.dean_ch .kw1 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .kw2 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .kw3 {color: #000066;}\u000d\u000a.dean_ch .kw4 {color: #f63333;}\u000d\u000a.dean_ch .co1, .dean_ch .co2, .dean_ch .coMULTI{color: rgb(0, 128, 0);}\u000d\u000a.dean_ch .es0 {color: #000033; font-weight: bold;}\u000d\u000a.dean_ch .br0 {color: rgb(197, 143, 0);}\u000d\u000a.dean_ch .st0 {color: #ff0000;}\u000d\u000a.dean_ch .nu0 {color: rgb(128, 0, 128);}\u000d\u000a.dean_ch .me0 {color: #006600;}\u000d\u000a.dean_ch .re0 {color: rgb(128, 128, 128);}\u000d\u000a.dean_ch .re1 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .re2 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .st0 {color: rgb(255, 0, 0);}\u000d\u000a\u000d\u000adiv .dean_ch {\u000d\u000a  margin-top:20px;\u000a  margin-bottom:20px;\u000a  padding-bottom:0px;\u000a}\u000d\u000a\u000d\u000apre {\u000a  margin-top:20px;\u000a  margin-bottom:20px;\u000a}"
          },
          "redirectURL":"",
          "headersSize":340,
          "bodySize":1034
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":41,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.834+02:00",
        "time":73,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/css/lightbox.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":495,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sat, 26 Apr 2008 09:51:18 GMT"
            },
            {
              "name":"Etag",
              "value":"\"e32c2-589-9fc47180\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"1417"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"text/css"
            }
          ],
          "content":{
            "size":1417,
            "mimeType":"text/css",
            "text":"#lightbox{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009z-index: 100;\u000d\u000a\u0009text-align: center;\u000d\u000a\u0009line-height: 0;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#lightbox a img{ border: none; }\u000d\u000a\u000d\u000a#outerImageContainer{\u000d\u000a\u0009position: relative;\u000d\u000a\u0009background-color: #fff;\u000d\u000a\u0009width: 250px;\u000d\u000a\u0009height: 250px;\u000d\u000a\u0009margin: 0 auto;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#imageContainer{\u000d\u000a\u0009padding: 10px;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#loading{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 40%;\u000d\u000a\u0009left: 0%;\u000d\u000a\u0009height: 25%;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009text-align: center;\u000d\u000a\u0009line-height: 0;\u000d\u000a\u0009}\u000d\u000a#hoverNav{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 0;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009height: 100%;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009z-index: 10;\u000d\u000a\u0009}\u000d\u000a#imageContainer>#hoverNav{ left: 0;}\u000d\u000a#hoverNav a{ outline: none;}\u000d\u000a\u000d\u000a#prevLink, #nextLink{\u000d\u000a\u0009width: 49%;\u000d\u000a\u0009height: 100%;\u000d\u000a\u0009display: block;\u000d\u000a\u0009}\u000d\u000a#prevLink { left: 0; float: left;}\u000d\u000a#nextLink { right: 0; float: right;}\u000d\u000a\u000d\u000a#imageDataContainer{\u000d\u000a\u0009font: 10px Verdana, Helvetica, sans-serif;\u000d\u000a\u0009background-color: #fff;\u000d\u000a\u0009margin: 0 auto;\u000d\u000a\u0009line-height: 1.4em;\u000d\u000a\u0009overflow: auto;\u000d\u000a\u0009width: 100%\u0009\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#imageData{\u0009padding:0 10px; color: #666; }\u000d\u000a#imageData #imageDetails{ width: 70%; float: left; text-align: left; }\u0009\u000d\u000a#imageData #caption{ font-weight: bold;\u0009}\u000d\u000a#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em;\u0009}\u0009\u0009\u0009\u000d\u000a#imageData #bottomNavClose{ width: 66px; float: right;  padding-bottom: 0.7em;\u0009}\u0009\u000d\u000a\u0009\u0009\u000d\u000a#overlay{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 0;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009z-index: 90;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009height: 500px;\u000d\u000a\u0009background-color: #000;\u000d\u000a\u0009}"
          },
          "redirectURL":"",
          "headersSize":340,
          "bodySize":1417
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":41,
          "blocked":0,
          "send":0,
          "wait":32,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.835+02:00",
        "time":137,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/js/lightbox.js",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":478,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sat, 26 Apr 2008 09:51:21 GMT"
            },
            {
              "name":"Etag",
              "value":"\"e32d7-5d1d-9ff23840\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"23837"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:27 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"application/javascript"
            }
          ],
          "content":{
            "size":23837,
            "mimeType":"application/javascript",
            "text":"// -----------------------------------------------------------------------------------\u000a//\u000a//\u0009Lightbox v2.03.3\u000a//\u0009by Lokesh Dhakar - http://www.huddletogether.com\u000a//\u00095/21/06\u000a//\u000a//\u0009For more information on this script, visit:\u000a//\u0009http://huddletogether.com/projects/lightbox2/\u000a//\u000a//\u0009Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/\u000a//\u0009\u000a//\u0009Credit also due to those who have helped, inspired, and made their code available to the public.\u000a//\u0009Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), Thomas Fuchs(mir.aculo.us), and others.\u000a//\u000a//\u000a// -----------------------------------------------------------------------------------\u000a/*\u000a\u000a\u0009Table of Contents\u000a\u0009-----------------\u000a\u0009Configuration\u000a\u0009Global Variables\u000a\u000a\u0009Extending Built-in Objects\u0009\u000a\u0009- Object.extend(Element)\u000a\u0009- Array.prototype.removeDuplicates()\u000a\u0009- Array.prototype.empty()\u000a\u000a\u0009Lightbox Class Declaration\u000a\u0009- initialize()\u000a\u0009- updateImageList()\u000a\u0009- start()\u000a\u0009- changeImage()\u000a\u0009- resizeImageContainer()\u000a\u0009- showImage()\u000a\u0009- updateDetails()\u000a\u0009- updateNav()\u000a\u0009- enableKeyboardNav()\u000a\u0009- disableKeyboardNav()\u000a\u0009- keyboardAction()\u000a\u0009- preloadNeighborImages()\u000a\u0009- end()\u000a\u0009\u000a\u0009Miscellaneous Functions\u000a\u0009- getPageScroll()\u000a\u0009- getPageSize()\u000a\u0009- getKey()\u000a\u0009- listenKey()\u000a\u0009- showSelectBoxes()\u000a\u0009- hideSelectBoxes()\u000a\u0009- showFlash()\u000a\u0009- hideFlash()\u000a\u0009- pause()\u000a\u0009- initLightbox()\u000a\u0009\u000a\u0009Function Calls\u000a\u0009- addLoadEvent(initLightbox)\u000a\u0009\u000a*/\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Configuration\u000a//\u000a//var fileLoadingImage = \"images/loading.gif\";\u0009\u0009\u000a//var fileBottomNavCloseImage = \"images/closelabel.gif\";\u000a\u000avar overlayOpacity = 0.8;\u0009// controls transparency of shadow overlay\u000a\u000avar animate = true;\u0009\u0009\u0009// toggles resizing animations\u000avar resizeSpeed = 7;\u0009\u0009// controls the speed of the image resizing animations (1=slowest and 10=fastest)\u000a\u000avar borderSize = 10;\u0009\u0009//if you adjust the padding in the CSS, you will need to update this variable\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Global Variables\u000a//\u000avar imageArray = new Array;\u000avar activeImage;\u000a\u000aif(animate == true){\u000a\u0009overlayDuration = 0.2;\u0009// shadow fade in/out duration\u000a\u0009if(resizeSpeed > 10){ resizeSpeed = 10;}\u000a\u0009if(resizeSpeed < 1){ resizeSpeed = 1;}\u000a\u0009resizeDuration = (11 - resizeSpeed) * 0.15;\u000a} else { \u000a\u0009overlayDuration = 0;\u000a\u0009resizeDuration = 0;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Additional methods for Element added by SU, Couloir\u000a//\u0009- further additions by Lokesh Dhakar (huddletogether.com)\u000a//\u000aObject.extend(Element, {\u000a\u0009getWidth: function(element) {\u000a\u0009   \u0009element = $(element);\u000a\u0009   \u0009return element.offsetWidth; \u000a\u0009},\u000a\u0009setWidth: function(element,w) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.width = w +\"px\";\u000a\u0009},\u000a\u0009setHeight: function(element,h) {\u000a   \u0009\u0009element = $(element);\u000a    \u0009element.style.height = h +\"px\";\u000a\u0009},\u000a\u0009setTop: function(element,t) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.top = t +\"px\";\u000a\u0009},\u000a\u0009setLeft: function(element,l) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.left = l +\"px\";\u000a\u0009},\u000a\u0009setSrc: function(element,src) {\u000a    \u0009element = $(element);\u000a    \u0009element.src = src; \u000a\u0009},\u000a\u0009setHref: function(element,href) {\u000a    \u0009element = $(element);\u000a    \u0009element.href = href; \u000a\u0009},\u000a\u0009setInnerHTML: function(element,content) {\u000a\u0009\u0009element = $(element);\u000a\u0009\u0009element.innerHTML = content;\u000a\u0009}\u000a});\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Extending built-in Array object\u000a//\u0009- array.removeDuplicates()\u000a//\u0009- array.empty()\u000a//\u000aArray.prototype.removeDuplicates = function () {\u000a    for(i = 0; i < this.length; i++){\u000a        for(j = this.length-1; j>i; j--){        \u000a            if(this[i][0] == this[j][0]){\u000a                this.splice(j,1);\u000a            }\u000a        }\u000a    }\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000aArray.prototype.empty = function () {\u000a\u0009for(i = 0; i <= this.length; i++){\u000a\u0009\u0009this.shift();\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Lightbox Class Declaration\u000a//\u0009- initialize()\u000a//\u0009- start()\u000a//\u0009- changeImage()\u000a//\u0009- resizeImageContainer()\u000a//\u0009- showImage()\u000a//\u0009- updateDetails()\u000a//\u0009- updateNav()\u000a//\u0009- enableKeyboardNav()\u000a//\u0009- disableKeyboardNav()\u000a//\u0009- keyboardNavAction()\u000a//\u0009- preloadNeighborImages()\u000a//\u0009- end()\u000a//\u000a//\u0009Structuring of code inspired by Scott Upton (http://www.uptonic.com/)\u000a//\u000avar Lightbox = Class.create();\u000a\u000aLightbox.prototype = {\u000a\u0009\u000a\u0009// initialize()\u000a\u0009// Constructor runs on completion of the DOM loading. Calls updateImageList and then\u000a\u0009// the function inserts html at the bottom of the page which is used to display the shadow \u000a\u0009// overlay and the image container.\u000a\u0009//\u000a\u0009initialize: function() {\u0009\u000a\u0009\u0009\u000a\u0009\u0009this.updateImageList();\u000a\u000a\u0009\u0009// Code inserts html at the bottom of the page that looks similar to this:\u000a\u0009\u0009//\u000a\u0009\u0009//\u0009<div id=\"overlay\"></div>\u000a\u0009\u0009//\u0009<div id=\"lightbox\">\u000a\u0009\u0009//\u0009\u0009<div id=\"outerImageContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009<div id=\"imageContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<img id=\"lightboxImage\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div style=\"\" id=\"hoverNav\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"prevLink\"></a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"nextLink\"></a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"loading\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"loadingLink\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009<img src=\"images/loading.gif\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009</a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009<div id=\"imageDataContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009<div id=\"imageData\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"imageDetails\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<span id=\"caption\"></span>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<span id=\"numberDisplay\"></span>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"bottomNav\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"bottomNavClose\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009<img src=\"images/close.gif\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009</a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009</div>\u000a\u0009\u0009//\u0009</div>\u000a\u000a\u000a\u0009\u0009var objBody = document.getElementsByTagName(\"body\").item(0);\u000a\u0009\u0009\u000a\u0009\u0009var objOverlay = document.createElement(\"div\");\u000a\u0009\u0009objOverlay.setAttribute('id','overlay');\u000a\u0009\u0009objOverlay.style.display = 'none';\u000a\u0009\u0009objOverlay.onclick = function() { myLightbox.end(); }\u000a\u0009\u0009objBody.appendChild(objOverlay);\u000a\u0009\u0009\u000a\u0009\u0009var objLightbox = document.createElement(\"div\");\u000a\u0009\u0009objLightbox.setAttribute('id','lightbox');\u000a\u0009\u0009objLightbox.style.display = 'none';\u000a\u0009\u0009objLightbox.onclick = function(e) {\u0009// close Lightbox is user clicks shadow overlay\u000a\u0009\u0009\u0009if (!e) var e = window.event;\u000a\u0009\u0009\u0009var clickObj = Event.element(e).id;\u000a\u0009\u0009\u0009if ( clickObj == 'lightbox') {\u000a\u0009\u0009\u0009\u0009myLightbox.end();\u000a\u0009\u0009\u0009}\u000a\u0009\u0009};\u000a\u0009\u0009objBody.appendChild(objLightbox);\u000a\u0009\u0009\u0009\u000a\u0009\u0009var objOuterImageContainer = document.createElement(\"div\");\u000a\u0009\u0009objOuterImageContainer.setAttribute('id','outerImageContainer');\u000a\u0009\u0009objLightbox.appendChild(objOuterImageContainer);\u000a\u000a\u0009\u0009// When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.\u000a\u0009\u0009// If animations are turned off, it will be hidden as to prevent a flicker of a\u000a\u0009\u0009// white 250 by 250 box.\u000a\u0009\u0009if(animate){\u000a\u0009\u0009\u0009Element.setWidth('outerImageContainer', 250);\u000a\u0009\u0009\u0009Element.setHeight('outerImageContainer', 250);\u0009\u0009\u0009\u000a\u0009\u0009} else {\u000a\u0009\u0009\u0009Element.setWidth('outerImageContainer', 1);\u000a\u0009\u0009\u0009Element.setHeight('outerImageContainer', 1);\u0009\u0009\u0009\u000a\u0009\u0009}\u000a\u000a\u0009\u0009var objImageContainer = document.createElement(\"div\");\u000a\u0009\u0009objImageContainer.setAttribute('id','imageContainer');\u000a\u0009\u0009objOuterImageContainer.appendChild(objImageContainer);\u000a\u0009\u000a\u0009\u0009var objLightboxImage = document.createElement(\"img\");\u000a\u0009\u0009objLightboxImage.setAttribute('id','lightboxImage');\u000a\u0009\u0009objImageContainer.appendChild(objLightboxImage);\u000a\u0009\u000a\u0009\u0009var objHoverNav = document.createElement(\"div\");\u000a\u0009\u0009objHoverNav.setAttribute('id','hoverNav');\u000a\u0009\u0009objImageContainer.appendChild(objHoverNav);\u000a\u0009\u000a\u0009\u0009var objPrevLink = document.createElement(\"a\");\u000a\u0009\u0009objPrevLink.setAttribute('id','prevLink');\u000a\u0009\u0009objPrevLink.setAttribute('href','#');\u000a\u0009\u0009objHoverNav.appendChild(objPrevLink);\u000a\u0009\u0009\u000a\u0009\u0009var objNextLink = document.createElement(\"a\");\u000a\u0009\u0009objNextLink.setAttribute('id','nextLink');\u000a\u0009\u0009objNextLink.setAttribute('href','#');\u000a\u0009\u0009objHoverNav.appendChild(objNextLink);\u000a\u0009\u000a\u0009\u0009var objLoading = document.createElement(\"div\");\u000a\u0009\u0009objLoading.setAttribute('id','loading');\u000a\u0009\u0009objImageContainer.appendChild(objLoading);\u000a\u0009\u000a\u0009\u0009var objLoadingLink = document.createElement(\"a\");\u000a\u0009\u0009objLoadingLink.setAttribute('id','loadingLink');\u000a\u0009\u0009objLoadingLink.setAttribute('href','#');\u000a\u0009\u0009objLoadingLink.onclick = function() { myLightbox.end(); return false; }\u000a\u0009\u0009objLoading.appendChild(objLoadingLink);\u000a\u0009\u000a\u0009\u0009var objLoadingImage = document.createElement(\"img\");\u000a\u0009\u0009objLoadingImage.setAttribute('src', fileLoadingImage);\u000a\u0009\u0009objLoadingLink.appendChild(objLoadingImage);\u000a\u000a\u0009\u0009var objImageDataContainer = document.createElement(\"div\");\u000a\u0009\u0009objImageDataContainer.setAttribute('id','imageDataContainer');\u000a\u0009\u0009objLightbox.appendChild(objImageDataContainer);\u000a\u000a\u0009\u0009var objImageData = document.createElement(\"div\");\u000a\u0009\u0009objImageData.setAttribute('id','imageData');\u000a\u0009\u0009objImageDataContainer.appendChild(objImageData);\u000a\u0009\u000a\u0009\u0009var objImageDetails = document.createElement(\"div\");\u000a\u0009\u0009objImageDetails.setAttribute('id','imageDetails');\u000a\u0009\u0009objImageData.appendChild(objImageDetails);\u000a\u0009\u000a\u0009\u0009var objCaption = document.createElement(\"span\");\u000a\u0009\u0009objCaption.setAttribute('id','caption');\u000a\u0009\u0009objImageDetails.appendChild(objCaption);\u000a\u0009\u000a\u0009\u0009var objNumberDisplay = document.createElement(\"span\");\u000a\u0009\u0009objNumberDisplay.setAttribute('id','numberDisplay');\u000a\u0009\u0009objImageDetails.appendChild(objNumberDisplay);\u000a\u0009\u0009\u000a\u0009\u0009var objBottomNav = document.createElement(\"div\");\u000a\u0009\u0009objBottomNav.setAttribute('id','bottomNav');\u000a\u0009\u0009objImageData.appendChild(objBottomNav);\u000a\u0009\u000a\u0009\u0009var objBottomNavCloseLink = document.createElement(\"a\");\u000a\u0009\u0009objBottomNavCloseLink.setAttribute('id','bottomNavClose');\u000a\u0009\u0009objBottomNavCloseLink.setAttribute('href','#');\u000a\u0009\u0009objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }\u000a\u0009\u0009objBottomNav.appendChild(objBottomNavCloseLink);\u000a\u0009\u000a\u0009\u0009var objBottomNavCloseImage = document.createElement(\"img\");\u000a\u0009\u0009objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);\u000a\u0009\u0009objBottomNavCloseLink.appendChild(objBottomNavCloseImage);\u000a\u0009},\u000a\u000a\u000a\u0009//\u000a\u0009// updateImageList()\u000a\u0009// Loops through anchor tags looking for 'lightbox' references and applies onclick\u000a\u0009// events to appropriate links. You can rerun after dynamically adding images w/ajax.\u000a\u0009//\u000a\u0009updateImageList: function() {\u0009\u000a\u0009\u0009if (!document.getElementsByTagName){ return; }\u000a\u0009\u0009var anchors = document.getElementsByTagName('a');\u000a\u0009\u0009var areas = document.getElementsByTagName('area');\u000a\u000a\u0009\u0009// loop through all anchor tags\u000a\u0009\u0009for (var i=0; i<anchors.length; i++){\u000a\u0009\u0009\u0009var anchor = anchors[i];\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009var relAttribute = String(anchor.getAttribute('rel'));\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009// use the string.match() method to catch 'lightbox' references in the rel attribute\u000a\u0009\u0009\u0009if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){\u000a\u0009\u0009\u0009\u0009anchor.onclick = function () {myLightbox.start(this); return false;}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// loop through all area tags\u000a\u0009\u0009// todo: combine anchor & area tag loops\u000a\u0009\u0009for (var i=0; i< areas.length; i++){\u000a\u0009\u0009\u0009var area = areas[i];\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009var relAttribute = String(area.getAttribute('rel'));\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009// use the string.match() method to catch 'lightbox' references in the rel attribute\u000a\u0009\u0009\u0009if (area.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){\u000a\u0009\u0009\u0009\u0009area.onclick = function () {myLightbox.start(this); return false;}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u0009},\u000a\u0009\u000a\u0009\u000a\u0009//\u000a\u0009//\u0009start()\u000a\u0009//\u0009Display overlay and lightbox. If image is part of a set, add siblings to imageArray.\u000a\u0009//\u000a\u0009start: function(imageLink) {\u0009\u000a\u000a\u0009\u0009hideSelectBoxes();\u000a\u0009\u0009hideFlash();\u000a\u000a\u0009\u0009// stretch overlay to fill page and fade in\u000a\u0009\u0009var arrayPageSize = getPageSize();\u000a\u0009\u0009Element.setWidth('overlay', arrayPageSize[0]);\u000a\u0009\u0009Element.setHeight('overlay', arrayPageSize[1]);\u000a\u000a\u0009\u0009new Effect.Appear('overlay', { duration: overlayDuration, from: 0.0, to: overlayOpacity });\u000a\u000a\u0009\u0009imageArray = [];\u000a\u0009\u0009imageNum = 0;\u0009\u0009\u000a\u000a\u0009\u0009if (!document.getElementsByTagName){ return; }\u000a\u0009\u0009var anchors = document.getElementsByTagName( imageLink.tagName);\u000a\u000a\u0009\u0009// if image is NOT part of a set..\u000a\u0009\u0009if((imageLink.getAttribute('rel') == 'lightbox')){\u000a\u0009\u0009\u0009// add single image to imageArray\u000a\u0009\u0009\u0009imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));\u0009\u0009\u0009\u000a\u0009\u0009} else {\u000a\u0009\u0009// if image is part of a set..\u000a\u000a\u0009\u0009\u0009// loop through anchors, find other images in set, and add them to imageArray\u000a\u0009\u0009\u0009for (var i=0; i<anchors.length; i++){\u000a\u0009\u0009\u0009\u0009var anchor = anchors[i];\u000a\u0009\u0009\u0009\u0009if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){\u000a\u0009\u0009\u0009\u0009\u0009imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));\u000a\u0009\u0009\u0009\u0009}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009\u0009imageArray.removeDuplicates();\u000a\u0009\u0009\u0009while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// calculate top and left offset for the lightbox \u000a\u0009\u0009var arrayPageScroll = getPageScroll();\u000a\u0009\u0009var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 10);\u000a\u0009\u0009var lightboxLeft = arrayPageScroll[0];\u000a\u0009\u0009Element.setTop('lightbox', lightboxTop);\u000a\u0009\u0009Element.setLeft('lightbox', lightboxLeft);\u000a\u0009\u0009\u000a\u0009\u0009Element.show('lightbox');\u000a\u0009\u0009\u000a\u0009\u0009this.changeImage(imageNum);\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009changeImage()\u000a\u0009//\u0009Hide most elements and preload image in preparation for resizing image container.\u000a\u0009//\u000a\u0009changeImage: function(imageNum) {\u0009\u000a\u0009\u0009\u000a\u0009\u0009activeImage = imageNum;\u0009// update global var\u000a\u000a\u0009\u0009// hide elements during transition\u000a\u0009\u0009if(animate){ Element.show('loading');}\u000a\u0009\u0009Element.hide('lightboxImage');\u000a\u0009\u0009Element.hide('hoverNav');\u000a\u0009\u0009Element.hide('prevLink');\u000a\u0009\u0009Element.hide('nextLink');\u000a\u0009\u0009Element.hide('imageDataContainer');\u000a\u0009\u0009Element.hide('numberDisplay');\u0009\u0009\u000a\u0009\u0009\u000a\u0009\u0009imgPreloader = new Image();\u000a\u0009\u0009\u000a\u0009\u0009// once image is preloaded, resize image container\u000a\u0009\u0009imgPreloader.onload=function(){\u000a\u0009\u0009\u0009Element.setSrc('lightboxImage', imageArray[activeImage][0]);\u000a\u0009\u0009\u0009myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009imgPreloader.onload=function(){};\u0009//\u0009clear onLoad, IE behaves irratically with animated gifs otherwise \u000a\u0009\u0009}\u000a\u0009\u0009imgPreloader.src = imageArray[activeImage][0];\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009resizeImageContainer()\u000a\u0009//\u000a\u0009resizeImageContainer: function( imgWidth, imgHeight) {\u000a\u000a\u0009\u0009// get curren width and height\u000a\u0009\u0009this.widthCurrent = Element.getWidth('outerImageContainer');\u000a\u0009\u0009this.heightCurrent = Element.getHeight('outerImageContainer');\u000a\u000a\u0009\u0009// get new width and height\u000a\u0009\u0009var widthNew = (imgWidth  + (borderSize * 2));\u000a\u0009\u0009var heightNew = (imgHeight  + (borderSize * 2));\u000a\u000a\u0009\u0009// scalars based on change from old to new\u000a\u0009\u0009this.xScale = ( widthNew / this.widthCurrent) * 100;\u000a\u0009\u0009this.yScale = ( heightNew / this.heightCurrent) * 100;\u000a\u000a\u0009\u0009// calculate size difference between new and old image, and resize if necessary\u000a\u0009\u0009wDiff = this.widthCurrent - widthNew;\u000a\u0009\u0009hDiff = this.heightCurrent - heightNew;\u000a\u000a\u0009\u0009if(!( hDiff == 0)){ new Effect.Scale('outerImageContainer', this.yScale, {scaleX: false, duration: resizeDuration, queue: 'front'}); }\u000a\u0009\u0009if(!( wDiff == 0)){ new Effect.Scale('outerImageContainer', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration}); }\u000a\u000a\u0009\u0009// if new and old image are same size and no scaling transition is necessary, \u000a\u0009\u0009// do a quick pause to prevent image flicker.\u000a\u0009\u0009if((hDiff == 0) && (wDiff == 0)){\u000a\u0009\u0009\u0009if (navigator.appVersion.indexOf(\"MSIE\")!=-1){ pause(250); } else { pause(100);} \u000a\u0009\u0009}\u000a\u000a\u0009\u0009Element.setHeight('prevLink', imgHeight);\u000a\u0009\u0009Element.setHeight('nextLink', imgHeight);\u000a\u0009\u0009Element.setWidth( 'imageDataContainer', widthNew);\u000a\u000a\u0009\u0009this.showImage();\u000a\u0009},\u000a\u0009\u000a\u0009//\u000a\u0009//\u0009showImage()\u000a\u0009//\u0009Display image and begin preloading neighbors.\u000a\u0009//\u000a\u0009showImage: function(){\u000a\u0009\u0009Element.hide('loading');\u000a\u0009\u0009new Effect.Appear('lightboxImage', { duration: resizeDuration, queue: 'end', afterFinish: function(){\u0009myLightbox.updateDetails(); } });\u000a\u0009\u0009this.preloadNeighborImages();\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009updateDetails()\u000a\u0009//\u0009Display caption, image number, and bottom nav.\u000a\u0009//\u000a\u0009updateDetails: function() {\u000a\u0009\u000a\u0009\u0009// if caption is not null\u000a\u0009\u0009if(imageArray[activeImage][1]){\u000a\u0009\u0009\u0009Element.show('caption');\u000a\u0009\u0009\u0009Element.setInnerHTML( 'caption', imageArray[activeImage][1]);\u000a\u0009\u0009}\u000a\u0009\u0009\u000a\u0009\u0009// if image is part of set display 'Image x of x' \u000a\u0009\u0009if(imageArray.length > 1){\u000a\u0009\u0009\u0009Element.show('numberDisplay');\u000a\u0009\u0009\u0009Element.setInnerHTML( 'numberDisplay', \"Image \" + eval(activeImage + 1) + \" of \" + imageArray.length);\u000a\u0009\u0009}\u000a\u000a\u0009\u0009new Effect.Parallel(\u000a\u0009\u0009\u0009[ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }), \u000a\u0009\u0009\u0009  new Effect.Appear('imageDataContainer', { sync: true, duration: resizeDuration }) ], \u000a\u0009\u0009\u0009{ duration: resizeDuration, afterFinish: function() {\u000a\u0009\u0009\u0009\u0009// update overlay size and update nav\u000a\u0009\u0009\u0009\u0009var arrayPageSize = getPageSize();\u000a\u0009\u0009\u0009\u0009Element.setHeight('overlay', arrayPageSize[1]);\u000a\u0009\u0009\u0009\u0009myLightbox.updateNav();\u000a\u0009\u0009\u0009\u0009}\u000a\u0009\u0009\u0009} \u000a\u0009\u0009);\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009updateNav()\u000a\u0009//\u0009Display appropriate previous and next hover navigation.\u000a\u0009//\u000a\u0009updateNav: function() {\u000a\u000a\u0009\u0009Element.show('hoverNav');\u0009\u0009\u0009\u0009\u000a\u000a\u0009\u0009// if not first image in set, display prev image button\u000a\u0009\u0009if(activeImage != 0){\u000a\u0009\u0009\u0009Element.show('prevLink');\u000a\u0009\u0009\u0009document.getElementById('prevLink').onclick = function() {\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage - 1); return false;\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// if not last image in set, display next image button\u000a\u0009\u0009if(activeImage != (imageArray.length - 1)){\u000a\u0009\u0009\u0009Element.show('nextLink');\u000a\u0009\u0009\u0009document.getElementById('nextLink').onclick = function() {\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage + 1); return false;\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u0009\u0009\u000a\u0009\u0009this.enableKeyboardNav();\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009enableKeyboardNav()\u000a\u0009//\u000a\u0009enableKeyboardNav: function() {\u000a\u0009\u0009document.onkeydown = this.keyboardAction; \u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009disableKeyboardNav()\u000a\u0009//\u000a\u0009disableKeyboardNav: function() {\u000a\u0009\u0009document.onkeydown = '';\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009keyboardAction()\u000a\u0009//\u000a\u0009keyboardAction: function(e) {\u000a\u0009\u0009if (e == null) { // ie\u000a\u0009\u0009\u0009keycode = event.keyCode;\u000a\u0009\u0009\u0009escapeKey = 27;\u000a\u0009\u0009} else { // mozilla\u000a\u0009\u0009\u0009keycode = e.keyCode;\u000a\u0009\u0009\u0009escapeKey = e.DOM_VK_ESCAPE;\u000a\u0009\u0009}\u000a\u000a\u0009\u0009key = String.fromCharCode(keycode).toLowerCase();\u000a\u0009\u0009\u000a\u0009\u0009if((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)){\u0009// close lightbox\u000a\u0009\u0009\u0009myLightbox.end();\u000a\u0009\u0009} else if((key == 'p') || (keycode == 37)){\u0009// display previous image\u000a\u0009\u0009\u0009if(activeImage != 0){\u000a\u0009\u0009\u0009\u0009myLightbox.disableKeyboardNav();\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage - 1);\u000a\u0009\u0009\u0009}\u000a\u0009\u0009} else if((key == 'n') || (keycode == 39)){\u0009// display next image\u000a\u0009\u0009\u0009if(activeImage != (imageArray.length - 1)){\u000a\u0009\u0009\u0009\u0009myLightbox.disableKeyboardNav();\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage + 1);\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009preloadNeighborImages()\u000a\u0009//\u0009Preload previous and next images.\u000a\u0009//\u000a\u0009preloadNeighborImages: function(){\u000a\u000a\u0009\u0009if((imageArray.length - 1) > activeImage){\u000a\u0009\u0009\u0009preloadNextImage = new Image();\u000a\u0009\u0009\u0009preloadNextImage.src = imageArray[activeImage + 1][0];\u000a\u0009\u0009}\u000a\u0009\u0009if(activeImage > 0){\u000a\u0009\u0009\u0009preloadPrevImage = new Image();\u000a\u0009\u0009\u0009preloadPrevImage.src = imageArray[activeImage - 1][0];\u000a\u0009\u0009}\u000a\u0009\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009end()\u000a\u0009//\u000a\u0009end: function() {\u000a\u0009\u0009this.disableKeyboardNav();\u000a\u0009\u0009Element.hide('lightbox');\u000a\u0009\u0009new Effect.Fade('overlay', { duration: overlayDuration});\u000a\u0009\u0009showSelectBoxes();\u000a\u0009\u0009showFlash();\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getPageScroll()\u000a// Returns array with x,y page scroll values.\u000a// Core code from - quirksmode.com\u000a//\u000afunction getPageScroll(){\u000a\u000a\u0009var xScroll, yScroll;\u000a\u000a\u0009if (self.pageYOffset) {\u000a\u0009\u0009yScroll = self.pageYOffset;\u000a\u0009\u0009xScroll = self.pageXOffset;\u000a\u0009} else if (document.documentElement && document.documentElement.scrollTop){\u0009 // Explorer 6 Strict\u000a\u0009\u0009yScroll = document.documentElement.scrollTop;\u000a\u0009\u0009xScroll = document.documentElement.scrollLeft;\u000a\u0009} else if (document.body) {// all other Explorers\u000a\u0009\u0009yScroll = document.body.scrollTop;\u000a\u0009\u0009xScroll = document.body.scrollLeft;\u0009\u000a\u0009}\u000a\u000a\u0009arrayPageScroll = new Array(xScroll,yScroll) \u000a\u0009return arrayPageScroll;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getPageSize()\u000a// Returns array with page width, height and window width, height\u000a// Core code from - quirksmode.com\u000a// Edit for Firefox by pHaez\u000a//\u000afunction getPageSize(){\u000a\u0009\u000a\u0009var xScroll, yScroll;\u000a\u0009\u000a\u0009if (window.innerHeight && window.scrollMaxY) {\u0009\u000a\u0009\u0009xScroll = window.innerWidth + window.scrollMaxX;\u000a\u0009\u0009yScroll = window.innerHeight + window.scrollMaxY;\u000a\u0009} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac\u000a\u0009\u0009xScroll = document.body.scrollWidth;\u000a\u0009\u0009yScroll = document.body.scrollHeight;\u000a\u0009} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari\u000a\u0009\u0009xScroll = document.body.offsetWidth;\u000a\u0009\u0009yScroll = document.body.offsetHeight;\u000a\u0009}\u000a\u0009\u000a\u0009var windowWidth, windowHeight;\u000a\u0009\u000a//\u0009console.log(self.innerWidth);\u000a//\u0009console.log(document.documentElement.clientWidth);\u000a\u000a\u0009if (self.innerHeight) {\u0009// all except Explorer\u000a\u0009\u0009if(document.documentElement.clientWidth){\u000a\u0009\u0009\u0009windowWidth = document.documentElement.clientWidth; \u000a\u0009\u0009} else {\u000a\u0009\u0009\u0009windowWidth = self.innerWidth;\u000a\u0009\u0009}\u000a\u0009\u0009windowHeight = self.innerHeight;\u000a\u0009} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode\u000a\u0009\u0009windowWidth = document.documentElement.clientWidth;\u000a\u0009\u0009windowHeight = document.documentElement.clientHeight;\u000a\u0009} else if (document.body) { // other Explorers\u000a\u0009\u0009windowWidth = document.body.clientWidth;\u000a\u0009\u0009windowHeight = document.body.clientHeight;\u000a\u0009}\u0009\u000a\u0009\u000a\u0009// for small pages with total height less then height of the viewport\u000a\u0009if(yScroll < windowHeight){\u000a\u0009\u0009pageHeight = windowHeight;\u000a\u0009} else { \u000a\u0009\u0009pageHeight = yScroll;\u000a\u0009}\u000a\u000a//\u0009console.log(\"xScroll \" + xScroll)\u000a//\u0009console.log(\"windowWidth \" + windowWidth)\u000a\u000a\u0009// for small pages with total width less then width of the viewport\u000a\u0009if(xScroll < windowWidth){\u0009\u000a\u0009\u0009pageWidth = xScroll;\u0009\u0009\u000a\u0009} else {\u000a\u0009\u0009pageWidth = windowWidth;\u000a\u0009}\u000a//\u0009console.log(\"pageWidth \" + pageWidth)\u000a\u000a\u0009arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) \u000a\u0009return arrayPageSize;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getKey(key)\u000a// Gets keycode. If 'x' is pressed then it hides the lightbox.\u000a//\u000afunction getKey(e){\u000a\u0009if (e == null) { // ie\u000a\u0009\u0009keycode = event.keyCode;\u000a\u0009} else { // mozilla\u000a\u0009\u0009keycode = e.which;\u000a\u0009}\u000a\u0009key = String.fromCharCode(keycode).toLowerCase();\u000a\u0009\u000a\u0009if(key == 'x'){\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// listenKey()\u000a//\u000afunction listenKey () {\u0009document.onkeypress = getKey; }\u000a\u0009\u000a// ---------------------------------------------------\u000a\u000afunction showSelectBoxes(){\u000a\u0009var selects = document.getElementsByTagName(\"select\");\u000a\u0009for (i = 0; i != selects.length; i++) {\u000a\u0009\u0009selects[i].style.visibility = \"visible\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction hideSelectBoxes(){\u000a\u0009var selects = document.getElementsByTagName(\"select\");\u000a\u0009for (i = 0; i != selects.length; i++) {\u000a\u0009\u0009selects[i].style.visibility = \"hidden\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction showFlash(){\u000a\u0009var flashObjects = document.getElementsByTagName(\"object\");\u000a\u0009for (i = 0; i < flashObjects.length; i++) {\u000a\u0009\u0009flashObjects[i].style.visibility = \"visible\";\u000a\u0009}\u000a\u000a\u0009var flashEmbeds = document.getElementsByTagName(\"embed\");\u000a\u0009for (i = 0; i < flashEmbeds.length; i++) {\u000a\u0009\u0009flashEmbeds[i].style.visibility = \"visible\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction hideFlash(){\u000a\u0009var flashObjects = document.getElementsByTagName(\"object\");\u000a\u0009for (i = 0; i < flashObjects.length; i++) {\u000a\u0009\u0009flashObjects[i].style.visibility = \"hidden\";\u000a\u0009}\u000a\u000a\u0009var flashEmbeds = document.getElementsByTagName(\"embed\");\u000a\u0009for (i = 0; i < flashEmbeds.length; i++) {\u000a\u0009\u0009flashEmbeds[i].style.visibility = \"hidden\";\u000a\u0009}\u000a\u000a}\u000a\u000a\u000a// ---------------------------------------------------\u000a\u000a//\u000a// pause(numberMillis)\u000a// Pauses code execution for specified time. Uses busy code, not good.\u000a// Help from Ran Bar-On [ran2103@gmail.com]\u000a//\u000a\u000afunction pause(ms){\u000a\u0009var date = new Date();\u000a\u0009curDate = null;\u000a\u0009do{var curDate = new Date();}\u000a\u0009while( curDate - date < ms);\u000a}\u000a/*\u000afunction pause(numberMillis) {\u000a\u0009var curently = new Date().getTime() + sender;\u000a\u0009while (new Date().getTime();\u0009\u000a}\u000a*/\u000a// ---------------------------------------------------\u000a\u000a\u000a\u000afunction initLightbox() { myLightbox = new Lightbox(); }\u000aEvent.observe(window, 'load', initLightbox, false);"
          },
          "redirectURL":"",
          "headersSize":352,
          "bodySize":23837
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":42,
          "blocked":0,
          "send":0,
          "wait":42,
          "receive":53
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:22.836+02:00",
        "time":81,
        "request":{
          "method":"GET",
          "url":"http://www.google-analytics.com/urchin.js",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.google-analytics.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":438,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Content-Length",
              "value":"6847"
            },
            {
              "name":"Content-Encoding",
              "value":"gzip"
            },
            {
              "name":"Last-Modified",
              "value":"Thu, 02 Sep 2010 18:46:49 GMT"
            },
            {
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:45 GMT"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:45 GMT"
            },
            {
              "name":"Content-Type",
              "value":"text/javascript"
            },
            {
              "name":"Vary",
              "value":"Accept-Encoding"
            },
            {
              "name":"Server",
              "value":"Golfe"
            },
            {
              "name":"X-Content-Type-Options",
              "value":"nosniff"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600, public"
            },
            {
              "name":"Age",
              "value":"12"
            }
          ],
          "content":{
            "size":22678,
            "mimeType":"text/javascript",
            "text":"//-- Google Analytics Urchin Module\u000a//-- Copyright 2007 Google, All Rights Reserved.\u000a\u000a//-- Urchin On Demand Settings ONLY\u000avar _uacct=\"\";\u0009\u0009\u0009// set up the Urchin Account\u000avar _userv=1;\u0009\u0009\u0009// service mode (0=local,1=remote,2=both)\u000a\u000a//-- UTM User Settings\u000avar _ufsc=1;\u0009\u0009\u0009// set client info flag (1=on|0=off)\u000avar _udn=\"auto\";\u0009\u0009// (auto|none|domain) set the domain name for cookies\u000avar _uhash=\"on\";\u0009\u0009// (on|off) unique domain hash for cookies\u000avar _utimeout=\"1800\";   \u0009// set the inactive session timeout in seconds\u000avar _ugifpath=\"/__utm.gif\";\u0009// set the web path to the __utm.gif file\u000avar _utsp=\"|\";\u0009\u0009\u0009// transaction field separator\u000avar _uflash=1;\u0009\u0009\u0009// set flash version detect option (1=on|0=off)\u000avar _utitle=1;\u0009\u0009\u0009// set the document title detect option (1=on|0=off)\u000avar _ulink=0;\u0009\u0009\u0009// enable linker functionality (1=on|0=off)\u000avar _uanchor=0;\u0009\u0009\u0009// enable use of anchors for campaign (1=on|0=off)\u000avar _utcp=\"/\";\u0009\u0009\u0009// the cookie path for tracking\u000avar _usample=100;\u0009\u0009// The sampling % of visitors to track (1-100).\u000a\u000a//-- UTM Campaign Tracking Settings\u000avar _uctm=1;\u0009\u0009\u0009// set campaign tracking module (1=on|0=off)\u000avar _ucto=\"15768000\";\u0009\u0009// set timeout in seconds (6 month default)\u000avar _uccn=\"utm_campaign\";\u0009// name\u000avar _ucmd=\"utm_medium\";\u0009\u0009// medium (cpc|cpm|link|email|organic)\u000avar _ucsr=\"utm_source\";\u0009\u0009// source\u000avar _uctr=\"utm_term\";\u0009\u0009// term/keyword\u000avar _ucct=\"utm_content\";\u0009// content\u000avar _ucid=\"utm_id\";\u0009\u0009// id number\u000avar _ucno=\"utm_nooverride\";\u0009// don't override\u000a\u000a//-- Auto/Organic Sources and Keywords\u000avar _uOsr=new Array();\u000avar _uOkw=new Array();\u000a_uOsr[0]=\"google\";\u0009_uOkw[0]=\"q\";\u000a_uOsr[1]=\"yahoo\";\u0009_uOkw[1]=\"p\";\u000a_uOsr[2]=\"msn\";\u0009\u0009_uOkw[2]=\"q\";\u000a_uOsr[3]=\"aol\";\u0009\u0009_uOkw[3]=\"query\";\u000a_uOsr[4]=\"aol\";\u0009\u0009_uOkw[4]=\"encquery\";\u000a_uOsr[5]=\"lycos\";\u0009_uOkw[5]=\"query\";\u000a_uOsr[6]=\"ask\";\u0009\u0009_uOkw[6]=\"q\";\u000a_uOsr[7]=\"altavista\";\u0009_uOkw[7]=\"q\";\u000a_uOsr[8]=\"netscape\";\u0009_uOkw[8]=\"query\";\u000a_uOsr[9]=\"cnn\";\u0009_uOkw[9]=\"query\";\u000a_uOsr[10]=\"looksmart\";\u0009_uOkw[10]=\"qt\";\u000a_uOsr[11]=\"about\";\u0009_uOkw[11]=\"terms\";\u000a_uOsr[12]=\"mamma\";\u0009_uOkw[12]=\"query\";\u000a_uOsr[13]=\"alltheweb\";\u0009_uOkw[13]=\"q\";\u000a_uOsr[14]=\"gigablast\";\u0009_uOkw[14]=\"q\";\u000a_uOsr[15]=\"voila\";\u0009_uOkw[15]=\"rdata\";\u000a_uOsr[16]=\"virgilio\";\u0009_uOkw[16]=\"qs\";\u000a_uOsr[17]=\"live\";\u0009_uOkw[17]=\"q\";\u000a_uOsr[18]=\"baidu\";\u0009_uOkw[18]=\"wd\";\u000a_uOsr[19]=\"alice\";\u0009_uOkw[19]=\"qs\";\u000a_uOsr[20]=\"yandex\";\u0009_uOkw[20]=\"text\";\u000a_uOsr[21]=\"najdi\";\u0009_uOkw[21]=\"q\";\u000a_uOsr[22]=\"aol\";\u0009_uOkw[22]=\"q\";\u000a_uOsr[23]=\"club-internet\"; _uOkw[23]=\"query\";\u000a_uOsr[24]=\"mama\";\u0009_uOkw[24]=\"query\";\u000a_uOsr[25]=\"seznam\";\u0009_uOkw[25]=\"q\";\u000a_uOsr[26]=\"search\";\u0009_uOkw[26]=\"q\";\u000a_uOsr[27]=\"wp\";\u0009_uOkw[27]=\"szukaj\";\u000a_uOsr[28]=\"onet\";\u0009_uOkw[28]=\"qt\";\u000a_uOsr[29]=\"netsprint\";\u0009_uOkw[29]=\"q\";\u000a_uOsr[30]=\"google.interia\";\u0009_uOkw[30]=\"q\";\u000a_uOsr[31]=\"szukacz\";\u0009_uOkw[31]=\"q\";\u000a_uOsr[32]=\"yam\";\u0009_uOkw[32]=\"k\";\u000a_uOsr[33]=\"pchome\";\u0009_uOkw[33]=\"q\";\u000a_uOsr[34]=\"kvasir\";\u0009_uOkw[34]=\"searchExpr\";\u000a_uOsr[35]=\"sesam\";\u0009_uOkw[35]=\"q\";\u000a_uOsr[36]=\"ozu\"; _uOkw[36]=\"q\";\u000a_uOsr[37]=\"terra\"; _uOkw[37]=\"query\";\u000a_uOsr[38]=\"nostrum\"; _uOkw[38]=\"query\";\u000a_uOsr[39]=\"mynet\"; _uOkw[39]=\"q\";\u000a_uOsr[40]=\"ekolay\"; _uOkw[40]=\"q\";\u000a_uOsr[41]=\"search.ilse\"; _uOkw[41]=\"search_for\";\u000a_uOsr[42]=\"bing\"; _uOkw[42]=\"q\";\u000a\u000a//-- Auto/Organic Keywords to Ignore\u000avar _uOno=new Array();\u000a//_uOno[0]=\"urchin\";\u000a//_uOno[1]=\"urchin.com\";\u000a//_uOno[2]=\"www.urchin.com\";\u000a\u000a//-- Referral domains to Ignore\u000avar _uRno=new Array();\u000a//_uRno[0]=\".urchin.com\";\u000a\u000a//-- **** Don't modify below this point ***\u000avar _uff,_udh,_udt,_ubl=0,_udo=\"\",_uu,_ufns=0,_uns=0,_ur=\"-\",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh=\"\",_uwv=\"1.3\";\u000avar _ugifpath2=\"http://www.google-analytics.com/__utm.gif\";\u000aif (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#'));\u000aif (_udl.protocol==\"https:\") _ugifpath2=\"https://ssl.google-analytics.com/__utm.gif\";\u000aif (!_utcp || _utcp==\"\") _utcp=\"/\";\u000afunction urchinTracker(page) {\u000a if (_udl.protocol==\"file:\") return;\u000a if (_uff && (!page || page==\"\")) return;\u000a var a,b,c,xx,v,z,k,x=\"\",s=\"\",f=0,nv=0;\u000a var nx=\" expires=\"+_uNx()+\";\";\u000a var dc=_ubd.cookie;\u000a _udh=_uDomain();\u000a if (!_uVG()) return;\u000a _uu=Math.round(Math.random()*2147483647);\u000a _udt=new Date();\u000a _ust=Math.round(_udt.getTime()/1000);\u000a a=dc.indexOf(\"__utma=\"+_udh+\".\");\u000a b=dc.indexOf(\"__utmb=\"+_udh);\u000a c=dc.indexOf(\"__utmc=\"+_udh);\u000a if (_udn && _udn!=\"\") { _udo=\" domain=\"+_udn+\";\"; }\u000a if (_utimeout && _utimeout!=\"\") {\u000a  x=new Date(_udt.getTime()+(_utimeout*1000));\u000a  x=\" expires=\"+x.toGMTString()+\";\";\u000a }\u000a if (_ulink) {\u000a  if (_uanchor && _udlh && _udlh!=\"\") s=_udlh+\"&\";\u000a  s+=_udl.search;\u000a  if(s && s!=\"\" && s.indexOf(\"__utma=\")>=0) {\u000a   if (!(_uIN(a=_uGC(s,\"__utma=\",\"&\")))) a=\"-\";\u000a   if (!(_uIN(b=_uGC(s,\"__utmb=\",\"&\")))) b=\"-\";\u000a   if (!(_uIN(c=_uGC(s,\"__utmc=\",\"&\")))) c=\"-\";\u000a   v=_uGC(s,\"__utmv=\",\"&\");\u000a   z=_uGC(s,\"__utmz=\",\"&\");\u000a   k=_uGC(s,\"__utmk=\",\"&\");\u000a   xx=_uGC(s,\"__utmx=\",\"&\");\u000a   if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a=\"-\";b=\"-\";c=\"-\";xx=\"-\";z=\"-\";v=\"-\";}\u000a   if (a!=\"-\" && b!=\"-\" && c!=\"-\") f=1;\u000a   else if(a!=\"-\") f=2;\u000a  }\u000a }\u000a if(f==1) {\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+b+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+c+\"; path=\"+_utcp+\";\"+_udo;\u000a } else if (f==2) {\u000a  a=_uFixA(s,\"&\",_ust);\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+_udh+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+_udh+\"; path=\"+_utcp+\";\"+_udo;\u000a  _ufns=1;\u000a } else if (a>=0 && b>=0 && c>=0) {\u000a   b = _uGC(dc,\"__utmb=\"+_udh,\";\");\u000a   b = (\"-\" == b) ? _udh : b;  \u000a  _ubd.cookie=\"__utmb=\"+b+\"; path=\"+_utcp+\";\"+x+_udo;\u000a } else {\u000a  if (a>=0) a=_uFixA(_ubd.cookie,\";\",_ust);\u000a  else {\u000a   a=_udh+\".\"+_uu+\".\"+_ust+\".\"+_ust+\".\"+_ust+\".1\";\u000a   nv=1;\u000a  }\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+_udh+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+_udh+\"; path=\"+_utcp+\";\"+_udo;\u000a  _ufns=1;\u000a }\u000a if (_ulink && xx && xx!=\"\" && xx!=\"-\") {\u000a   xx=_uUES(xx);\u000a   if (xx.indexOf(\";\")==-1) _ubd.cookie=\"__utmx=\"+xx+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a if (_ulink && v && v!=\"\" && v!=\"-\") {\u000a  v=_uUES(v);\u000a  if (v.indexOf(\";\")==-1) _ubd.cookie=\"__utmv=\"+v+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a var wc=window;\u000a var c=_ubd.cookie;\u000a if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){\u000a  var g=wc.gaGlobal;\u000a  var ua=c.split(\"__utma=\"+_udh+\".\")[1].split(\";\")[0].split(\".\");\u000a  if(g.sid)ua[3]=g.sid;\u000a  if(nv>0){\u000a   ua[2]=ua[3];\u000a   if(g.vid){\u000a    var v=g.vid.split(\".\");\u000a    ua[0]=v[0];\u000a    ua[1]=v[1];\u000a   }\u000a  }\u000a  _ubd.cookie=\"__utma=\"+_udh+\".\"+ua.join(\".\")+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a _uInfo(page);\u000a _ufns=0;\u000a _ufno=0;\u000a if (!page || page==\"\") _uff=1;\u000a}\u000afunction _uGH() {\u000a var hid;\u000a var wc=window;\u000a if (wc && wc.gaGlobal && wc.gaGlobal.hid) {\u000a  hid=wc.gaGlobal.hid;\u000a } else {\u000a  hid=Math.round(Math.random()*0x7fffffff);\u000a  if (!wc.gaGlobal) wc.gaGlobal={};\u000a  wc.gaGlobal.hid=hid;\u000a }\u000a return hid;\u000a}\u000afunction _uInfo(page) {\u000a var p,s=\"\",dm=\"\",pg=_udl.pathname+_udl.search;\u000a if (page && page!=\"\") pg=_uES(page,1);\u000a _ur=_ubd.referrer;\u000a if (!_ur || _ur==\"\") { _ur=\"-\"; }\u000a else {\u000a  dm=_ubd.domain;\u000a  if(_utcp && _utcp!=\"/\") dm+=_utcp;\u000a  p=_ur.indexOf(dm);\u000a  if ((p>=0) && (p<=8)) { _ur=\"0\"; }\u000a  if (_ur.indexOf(\"[\")==0 && _ur.lastIndexOf(\"]\")==(_ur.length-1)) { _ur=\"-\"; }\u000a }\u000a s+=\"&utmn=\"+_uu;\u000a if (_ufsc) s+=_uBInfo();\u000a if (_uctm) s+=_uCInfo();\u000a if (_utitle && _ubd.title && _ubd.title!=\"\") s+=\"&utmdt=\"+_uES(_ubd.title);\u000a if (_udl.hostname && _udl.hostname!=\"\") s+=\"&utmhn=\"+_uES(_udl.hostname);\u000a if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a s+=\"&utmhid=\"+_uGH();\u000a s+=\"&utmr=\"+_ur;\u000a s+=\"&utmp=\"+pg;\u000a if ((_userv==0 || _userv==2) && _uSP()) {\u000a  var i=new Image(1,1);\u000a  i.src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a  i.onload=function() { _uVoid(); }\u000a }\u000a if ((_userv==1 || _userv==2) && _uSP()) {\u000a  var i2=new Image(1,1);\u000a  i2.src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+_uGCS();\u000a  i2.onload=function() { _uVoid(); }\u000a }\u000a return;\u000a}\u000afunction _uVoid() { return; }\u000afunction _uCInfo() {\u000a if (!_ucto || _ucto==\"\") { _ucto=\"15768000\"; }\u000a if (!_uVG()) return;\u000a var c=\"\",t=\"-\",t2=\"-\",t3=\"-\",o=0,cs=0,cn=0,i=0,z=\"-\",s=\"\";\u000a if (_uanchor && _udlh && _udlh!=\"\") s=_udlh+\"&\";\u000a s+=_udl.search;\u000a var x=new Date(_udt.getTime()+(_ucto*1000));\u000a var dc=_ubd.cookie;\u000a x=\" expires=\"+x.toGMTString()+\";\";\u000a if (_ulink && !_ubl) {\u000a  z=_uUES(_uGC(s,\"__utmz=\",\"&\"));\u000a  if (z!=\"-\" && z.indexOf(\";\")==-1) { _ubd.cookie=\"__utmz=\"+z+\"; path=\"+_utcp+\";\"+x+_udo; return \"\"; }\u000a }\u000a z=dc.indexOf(\"__utmz=\"+_udh+\".\");\u000a if (z>-1) { z=_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"); }\u000a else { z=\"-\"; }\u000a t=_uGC(s,_ucid+\"=\",\"&\");\u000a t2=_uGC(s,_ucsr+\"=\",\"&\");\u000a t3=_uGC(s,\"gclid=\",\"&\");\u000a if ((t!=\"-\" && t!=\"\") || (t2!=\"-\" && t2!=\"\") || (t3!=\"-\" && t3!=\"\")) {\u000a  if (t!=\"-\" && t!=\"\") c+=\"utmcid=\"+_uEC(t);\u000a  if (t2!=\"-\" && t2!=\"\") { if (c != \"\") c+=\"|\"; c+=\"utmcsr=\"+_uEC(t2); }\u000a  if (t3!=\"-\" && t3!=\"\") { if (c != \"\") c+=\"|\"; c+=\"utmgclid=\"+_uEC(t3); }\u000a  t=_uGC(s,_uccn+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmccn=\"+_uEC(t);\u000a  else c+=\"|utmccn=(not+set)\";\u000a  t=_uGC(s,_ucmd+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmcmd=\"+_uEC(t);\u000a  else  c+=\"|utmcmd=(not+set)\";\u000a  t=_uGC(s,_uctr+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmctr=\"+_uEC(t);\u000a  else { t=_uOrg(1); if (t!=\"-\" && t!=\"\") c+=\"|utmctr=\"+_uEC(t); }\u000a  t=_uGC(s,_ucct+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmcct=\"+_uEC(t);\u000a  t=_uGC(s,_ucno+\"=\",\"&\");\u000a  if (t==\"1\") o=1;\u000a  if (z!=\"-\" && o==1) return \"\";\u000a }\u000a if (c==\"-\" || c==\"\") { c=_uOrg(); if (z!=\"-\" && _ufno==1)  return \"\"; }\u000a if (c==\"-\" || c==\"\") { if (_ufns==1)  c=_uRef(); if (z!=\"-\" && _ufno==1)  return \"\"; }\u000a if (c==\"-\" || c==\"\") {\u000a  if (z==\"-\" && _ufns==1) { c=\"utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)\"; }\u000a  if (c==\"-\" || c==\"\") return \"\";\u000a }\u000a if (z!=\"-\") {\u000a  i=z.indexOf(\".\");\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  t=z.substring(i+1,z.length);\u000a  if (t.toLowerCase()==c.toLowerCase()) cs=1;\u000a  t=z.substring(0,i);\u000a  if ((i=t.lastIndexOf(\".\")) > -1) {\u000a   t=t.substring(i+1,t.length);\u000a   cn=(t*1);\u000a  }\u000a }\u000a if (cs==0 || _ufns==1) {\u000a  t=_uGC(dc,\"__utma=\"+_udh+\".\",\";\");\u000a  if ((i=t.lastIndexOf(\".\")) > 9) {\u000a   _uns=t.substring(i+1,t.length);\u000a   _uns=(_uns*1);\u000a  }\u000a  cn++;\u000a  if (_uns==0) _uns=1;\u000a  _ubd.cookie=\"__utmz=\"+_udh+\".\"+_ust+\".\"+_uns+\".\"+cn+\".\"+c+\"; path=\"+_utcp+\"; \"+x+_udo;\u000a }\u000a if (cs==0 || _ufns==1) return \"&utmcn=1\";\u000a else return \"&utmcr=1\";\u000a}\u000afunction _uRef() {\u000a if (_ur==\"0\" || _ur==\"\" || _ur==\"-\") return \"\";\u000a var i=0,h,k,n;\u000a if ((i=_ur.indexOf(\"://\"))<0 || _uGCse()) return \"\";\u000a h=_ur.substring(i+3,_ur.length);\u000a if (h.indexOf(\"/\") > -1) {\u000a  k=h.substring(h.indexOf(\"/\"),h.length);\u000a  if (k.indexOf(\"?\") > -1) k=k.substring(0,k.indexOf(\"?\"));\u000a  h=h.substring(0,h.indexOf(\"/\"));\u000a }\u000a h=h.toLowerCase();\u000a n=h;\u000a if ((i=n.indexOf(\":\")) > -1) n=n.substring(0,i);\u000a for (var ii=0;ii<_uRno.length;ii++) {\u000a  if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; }\u000a }\u000a if (h.indexOf(\"www.\")==0) h=h.substring(4,h.length);\u000a return \"utmccn=(referral)|utmcsr=\"+_uEC(h)+\"|\"+\"utmcct=\"+_uEC(k)+\"|utmcmd=referral\";\u000a}\u000afunction _uOrg(t) {\u000a if (_ur==\"0\" || _ur==\"\" || _ur==\"-\") return \"\";\u000a var i=0,h,k;\u000a if ((i=_ur.indexOf(\"://\"))<0 || _uGCse()) return \"\";\u000a h=_ur.substring(i+3,_ur.length);\u000a if (h.indexOf(\"/\") > -1) {\u000a  h=h.substring(0,h.indexOf(\"/\"));\u000a }\u000a for (var ii=0;ii<_uOsr.length;ii++) {\u000a  if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {\u000a   if ((i=_ur.indexOf(\"?\"+_uOkw[ii]+\"=\")) > -1 || (i=_ur.indexOf(\"&\"+_uOkw[ii]+\"=\")) > -1) {\u000a    k=_ur.substring(i+_uOkw[ii].length+2,_ur.length);\u000a    if ((i=k.indexOf(\"&\")) > -1) k=k.substring(0,i);\u000a    for (var yy=0;yy<_uOno.length;yy++) {\u000a     if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; }\u000a    }\u000a    if (t) return _uEC(k);\u000a    else return \"utmccn=(organic)|utmcsr=\"+_uEC(_uOsr[ii])+\"|\"+\"utmctr=\"+_uEC(k)+\"|utmcmd=organic\";\u000a   }\u000a  }\u000a }\u000a return \"\";\u000a}\u000afunction _uGCse() {\u000a var h,p;\u000a h=p=_ur.split(\"://\")[1];\u000a if(h.indexOf(\"/\")>-1) {\u000a  h=h.split(\"/\")[0];\u000a  p=p.substring(p.indexOf(\"/\")+1,p.length);\u000a }\u000a if(p.indexOf(\"?\")>-1) {\u000a  p=p.split(\"?\")[0];\u000a }\u000a if(h.toLowerCase().indexOf(\"google\")>-1) {\u000a  if(_ur.indexOf(\"?q=\")>-1 || _ur.indexOf(\"&q=\")>-1) {\u000a   if (p.toLowerCase().indexOf(\"cse\")>-1) {\u000a    return true;\u000a   }\u000a  }\u000a }\u000a}\u000afunction _uBInfo() {\u000a var sr=\"-\",sc=\"-\",ul=\"-\",fl=\"-\",cs=\"-\",je=1;\u000a var n=navigator;\u000a if (self.screen) {\u000a  sr=screen.width+\"x\"+screen.height;\u000a  sc=screen.colorDepth+\"-bit\";\u000a } else if (self.java) {\u000a  var j=java.awt.Toolkit.getDefaultToolkit();\u000a  var s=j.getScreenSize();\u000a  sr=s.width+\"x\"+s.height;\u000a }\u000a if (n.language) { ul=n.language.toLowerCase(); }\u000a else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); }\u000a je=n.javaEnabled()?1:0;\u000a if (_uflash) fl=_uFlash();\u000a if (_ubd.characterSet) cs=_uES(_ubd.characterSet);\u000a else if (_ubd.charset) cs=_uES(_ubd.charset);\u000a return \"&utmcs=\"+cs+\"&utmsr=\"+sr+\"&utmsc=\"+sc+\"&utmul=\"+ul+\"&utmje=\"+je+\"&utmfl=\"+fl;\u000a}\u000afunction __utmSetTrans() {\u000a var e;\u000a if (_ubd.getElementById) e=_ubd.getElementById(\"utmtrans\");\u000a else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans;\u000a if (!e) return;\u000a var l=e.value.split(\"UTM:\");\u000a var i,i2,c;\u000a if (_userv==0 || _userv==2) i=new Array();\u000a if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); }\u000a\u000a for (var ii=0;ii<l.length;ii++) {\u000a  l[ii]=_uTrim(l[ii]);\u000a  if (l[ii].charAt(0)!='T' && l[ii].charAt(0)!='I') continue;\u000a  var r=Math.round(Math.random()*2147483647);\u000a  if (!_utsp || _utsp==\"\") _utsp=\"|\";\u000a  var f=l[ii].split(_utsp),s=\"\";\u000a  if (f[0].charAt(0)=='T') {\u000a   s=\"&utmt=tran\"+\"&utmn=\"+r;\u000a   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!=\"\") s+=\"&utmtid=\"+_uES(f[1]);\u000a   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!=\"\") s+=\"&utmtst=\"+_uES(f[2]);\u000a   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!=\"\") s+=\"&utmtto=\"+_uES(f[3]);\u000a   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!=\"\") s+=\"&utmttx=\"+_uES(f[4]);\u000a   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!=\"\") s+=\"&utmtsp=\"+_uES(f[5]);\u000a   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!=\"\") s+=\"&utmtci=\"+_uES(f[6]);\u000a   f[7]=_uTrim(f[7]); if(f[7]&&f[7]!=\"\") s+=\"&utmtrg=\"+_uES(f[7]);\u000a   f[8]=_uTrim(f[8]); if(f[8]&&f[8]!=\"\") s+=\"&utmtco=\"+_uES(f[8]);\u000a  } else {\u000a   s=\"&utmt=item\"+\"&utmn=\"+r;\u000a   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!=\"\") s+=\"&utmtid=\"+_uES(f[1]);\u000a   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!=\"\") s+=\"&utmipc=\"+_uES(f[2]);\u000a   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!=\"\") s+=\"&utmipn=\"+_uES(f[3]);\u000a   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!=\"\") s+=\"&utmiva=\"+_uES(f[4]);\u000a   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!=\"\") s+=\"&utmipr=\"+_uES(f[5]);\u000a   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!=\"\") s+=\"&utmiqt=\"+_uES(f[6]);\u000a  }\u000a  if (_udl.hostname && _udl.hostname!=\"\") s+=\"&utmhn=\"+_uES(_udl.hostname);\u000a  if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a\u000a  if ((_userv==0 || _userv==2) && _uSP()) {\u000a   i[ii]=new Image(1,1);\u000a   i[ii].src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a   i[ii].onload=function() { _uVoid(); }\u000a  }\u000a  if ((_userv==1 || _userv==2) && _uSP()) {\u000a   i2[ii]=new Image(1,1);\u000a   i2[ii].src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+c;\u000a   i2[ii].onload=function() { _uVoid(); }\u000a  }\u000a }\u000a return;\u000a}\u000afunction _uFlash() {\u000a var f=\"-\",n=navigator;\u000a if (n.plugins && n.plugins.length) {\u000a  for (var ii=0;ii<n.plugins.length;ii++) {\u000a   if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {\u000a    f=n.plugins[ii].description.split('Shockwave Flash ')[1];\u000a    break;\u000a   }\u000a  }\u000a } else {\u000a  var fl;\u000a  try {\u000a   fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\u000a   f = fl.GetVariable(\"$version\");\u000a  } catch(e) {}\u000a  if (f == \"-\") {\u000a   try {\u000a    fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\u000a    f = \"WIN 6,0,21,0\";\u000a    fl.AllowScriptAccess = \"always\";\u000a    f = fl.GetVariable(\"$version\");\u000a   } catch(e) {}\u000a  }\u000a  if (f == \"-\") {\u000a   try {\u000a    fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\u000a    f = fl.GetVariable(\"$version\");\u000a   } catch(e) {}\u000a  }\u000a  if (f != \"-\") {\u000a   f = f.split(\" \")[1].split(\",\");\u000a   f = f[0] + \".\" + f[1] + \" r\" + f[2];\u000a  }\u000a }\u000a return f;\u000a}\u000afunction __utmLinkerUrl(l,h) {\u000a var p,k,a=\"-\",b=\"-\",c=\"-\",x=\"-\",z=\"-\",v=\"-\";\u000a var dc=_ubd.cookie;\u000a var iq = l.indexOf(\"?\");\u000a var ih = l.indexOf(\"#\");\u000a var url=l;\u000a if (dc) {\u000a  a=_uES(_uGC(dc,\"__utma=\"+_udh+\".\",\";\"));\u000a  b=_uES(_uGC(dc,\"__utmb=\"+_udh,\";\"));\u000a  c=_uES(_uGC(dc,\"__utmc=\"+_udh,\";\"));\u000a  x=_uES(_uGC(dc,\"__utmx=\"+_udh,\";\"));\u000a  z=_uES(_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"));\u000a  v=_uES(_uGC(dc,\"__utmv=\"+_udh+\".\",\";\"));\u000a  k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1);\u000a  p=\"__utma=\"+a+\"&__utmb=\"+b+\"&__utmc=\"+c+\"&__utmx=\"+x+\"&__utmz=\"+z+\"&__utmv=\"+v+\"&__utmk=\"+k;\u000a }\u000a if (p) {\u000a  if (h && ih>-1) return;\u000a  if (h) { url=l+\"#\"+p; }\u000a  else {\u000a   if (iq==-1 && ih==-1) url=l+\"?\"+p;\u000a   else if (ih==-1) url=l+\"&\"+p;\u000a   else if (iq==-1) url=l.substring(0,ih-1)+\"?\"+p+l.substring(ih);\u000a   else url=l.substring(0,ih-1)+\"&\"+p+l.substring(ih);\u000a  }\u000a }\u000a return url;\u000a}\u000afunction __utmLinker(l,h) {\u000a if (!_ulink || !l || l==\"\") return;\u000a _udl.href=__utmLinkerUrl(l,h);\u000a}\u000afunction __utmLinkPost(f,h) {\u000a if (!_ulink || !f || !f.action) return;\u000a f.action=__utmLinkerUrl(f.action, h);\u000a return;\u000a}\u000afunction __utmSetVar(v) {\u000a if (!v || v==\"\") return;\u000a if (!_udo || _udo == \"\") {\u000a  _udh=_uDomain();\u000a  if (_udn && _udn!=\"\") { _udo=\" domain=\"+_udn+\";\"; }\u000a }\u000a if (!_uVG()) return;\u000a var r=Math.round(Math.random() * 2147483647);\u000a _ubd.cookie=\"__utmv=\"+_udh+\".\"+_uES(v)+\"; path=\"+_utcp+\"; expires=\"+_uNx()+\";\"+_udo;\u000a var s=\"&utmt=var&utmn=\"+r;\u000a if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a if ((_userv==0 || _userv==2) && _uSP()) {\u000a  var i=new Image(1,1);\u000a  i.src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a  i.onload=function() { _uVoid(); }\u000a }\u000a if ((_userv==1 || _userv==2) && _uSP()) {\u000a  var i2=new Image(1,1);\u000a  i2.src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+_uGCS();\u000a  i2.onload=function() { _uVoid(); }\u000a }\u000a}\u000afunction _uGCS() {\u000a var t,c=\"\",dc=_ubd.cookie;\u000a if ((t=_uGC(dc,\"__utma=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utma=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmx=\"+_udh,\";\"))!=\"-\") c+=_uES(\"__utmx=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utmz=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmv=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utmv=\"+t+\";\");\u000a if (c.charAt(c.length-1)==\"+\") c=c.substring(0,c.length-1);\u000a return c;\u000a}\u000afunction _uGC(l,n,s) {\u000a if (!l || l==\"\" || !n || n==\"\" || !s || s==\"\") return \"-\";\u000a var i,i2,i3,c=\"-\";\u000a i=l.indexOf(n);\u000a i3=n.indexOf(\"=\")+1;\u000a if (i > -1) {\u000a  i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }\u000a  c=l.substring((i+i3),i2);\u000a }\u000a return c;\u000a}\u000afunction _uDomain() {\u000a if (!_udn || _udn==\"\" || _udn==\"none\") { _udn=\"\"; return 1; }\u000a if (_udn==\"auto\") {\u000a  var d=_ubd.domain;\u000a  if (d.substring(0,4)==\"www.\") {\u000a   d=d.substring(4,d.length);\u000a  }\u000a  _udn=d;\u000a }\u000a _udn = _udn.toLowerCase(); \u000a if (_uhash==\"off\") return 1;\u000a return _uHash(_udn);\u000a}\u000afunction _uHash(d) {\u000a if (!d || d==\"\") return 1;\u000a var h=0,g=0;\u000a for (var i=d.length-1;i>=0;i--) {\u000a  var c=parseInt(d.charCodeAt(i));\u000a  h=((h << 6) & 0xfffffff) + c + (c << 14);\u000a  if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21));\u000a }\u000a return h;\u000a}\u000afunction _uFixA(c,s,t) {\u000a if (!c || c==\"\" || !s || s==\"\" || !t || t==\"\") return \"-\";\u000a var a=_uGC(c,\"__utma=\"+_udh+\".\",s);\u000a var lt=0,i=0;\u000a if ((i=a.lastIndexOf(\".\")) > 9) {\u000a  _uns=a.substring(i+1,a.length);\u000a  _uns=(_uns*1)+1;\u000a  a=a.substring(0,i);\u000a  if ((i=a.lastIndexOf(\".\")) > 7) {\u000a   lt=a.substring(i+1,a.length);\u000a   a=a.substring(0,i);\u000a  }\u000a  if ((i=a.lastIndexOf(\".\")) > 5) {\u000a   a=a.substring(0,i);\u000a  }\u000a  a+=\".\"+lt+\".\"+t+\".\"+_uns;\u000a }\u000a return a;\u000a}\u000afunction _uTrim(s) {\u000a  if (!s || s==\"\") return \"\";\u000a  while ((s.charAt(0)==' ') || (s.charAt(0)=='\\n') || (s.charAt(0,1)=='\\r')) s=s.substring(1,s.length);\u000a  while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\\n') || (s.charAt(s.length-1)=='\\r')) s=s.substring(0,s.length-1);\u000a  return s;\u000a}\u000afunction _uEC(s) {\u000a  var n=\"\";\u000a  if (!s || s==\"\") return \"\";\u000a  for (var i=0;i<s.length;i++) {if (s.charAt(i)==\" \") n+=\"+\"; else n+=s.charAt(i);}\u000a  return n;\u000a}\u000afunction __utmVisitorCode(f) {\u000a var r=0,t=0,i=0,i2=0,m=31;\u000a var a=_uGC(_ubd.cookie,\"__utma=\"+_udh+\".\",\";\");\u000a if ((i=a.indexOf(\".\",0))<0) return;\u000a if ((i2=a.indexOf(\".\",i+1))>0) r=a.substring(i+1,i2); else return \"\";  \u000a if ((i=a.indexOf(\".\",i2+1))>0) t=a.substring(i2+1,i); else return \"\";  \u000a if (f) {\u000a  return r;\u000a } else {\u000a  var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');\u000a  return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+\"-\"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+\"-\"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m];\u000a }\u000a}\u000afunction _uIN(n) {\u000a if (!n) return false;\u000a for (var i=0;i<n.length;i++) {\u000a  var c=n.charAt(i);\u000a  if ((c<\"0\" || c>\"9\") && (c!=\".\")) return false;\u000a }\u000a return true;\u000a}\u000afunction _uES(s,u) {\u000a if (typeof(encodeURIComponent) == 'function') {\u000a  if (u) return encodeURI(s);\u000a  else return encodeURIComponent(s);\u000a } else {\u000a  return escape(s);\u000a }\u000a}\u000afunction _uUES(s) {\u000a if (typeof(decodeURIComponent) == 'function') {\u000a  return decodeURIComponent(s);\u000a } else {\u000a  return unescape(s);\u000a }\u000a}\u000afunction _uVG() {\u000a if((_udn.indexOf(\"www.google.\") == 0 || _udn.indexOf(\".google.\") == 0 || _udn.indexOf(\"google.\") == 0) && _utcp=='/' && _udn.indexOf(\"google.org\")==-1) {\u000a  return false;\u000a }\u000a return true;\u000a}\u000afunction _uSP() {\u000a var s=100;\u000a if (_usample) s=_usample;\u000a if(s>=100 || s<=0) return true;\u000a return ((__utmVisitorCode(1)%10000)<(s*100));\u000a}\u000afunction urchinPathCopy(p){\u000a var d=document,nx,tx,sx,i,c,cs,t,h,o;\u000a cs=new Array(\"a\",\"b\",\"c\",\"v\",\"x\",\"z\");\u000a h=_uDomain(); if (_udn && _udn!=\"\") o=\" domain=\"+_udn+\";\";\u000a nx=_uNx()+\";\";\u000a tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000));\u000a tx=tx.toGMTString()+\";\";\u000a sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000));\u000a sx=sx.toGMTString()+\";\";\u000a for (i=0;i<6;i++){\u000a  t=\" expires=\";\u000a  if (i==1) t+=tx; else if (i==2) t=\"\"; else if (i==5) t+=sx; else t+=nx;\u000a  c=_uGC(d.cookie,\"__utm\"+cs[i]+\"=\"+h,\";\");\u000a  if (c!=\"-\") d.cookie=\"__utm\"+cs[i]+\"=\"+c+\"; path=\"+p+\";\"+t+o;\u000a }\u000a}\u000afunction _uCO() {\u000a if (!_utk || _utk==\"\" || _utk.length<10) return;\u000a var d='www.google.com';\u000a if (_utk.charAt(0)=='!') d='analytics.corp.google.com';\u000a _ubd.cookie=\"GASO=\"+_utk+\"; path=\"+_utcp+\";\"+_udo;\u000a var sc=document.createElement('script');\u000a sc.type='text/javascript';\u000a sc.id=\"_gasojs\";\u000a sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random();\u000a document.getElementsByTagName('head')[0].appendChild(sc);  \u000a}\u000afunction _uGT() {\u000a var h=location.hash, a;\u000a if (h && h!=\"\" && h.indexOf(\"#gaso=\")==0) {\u000a  a=_uGC(h,\"gaso=\",\"&\");\u000a } else {\u000a  a=_uGC(_ubd.cookie,\"GASO=\",\";\");\u000a }\u000a return a;\u000a}\u000avar _utk=_uGT();\u000aif (_utk && _utk!=\"\" && _utk.length>10 && _utk.indexOf(\"=\")==-1) {\u000a if (window.addEventListener) {\u000a  window.addEventListener('load', _uCO, false); \u000a } else if (window.attachEvent) { \u000a  window.attachEvent('onload', _uCO);\u000a }\u000a}\u000a\u000afunction _uNx() {\u000a  return (new Date((new Date()).getTime()+63072000000)).toGMTString();\u000a}\u000a"
          },
          "redirectURL":"",
          "headersSize":339,
          "bodySize":6847
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":74,
          "receive":7
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.050+02:00",
        "time":24,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/images/x.png",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":469,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Thu, 06 Mar 2008 19:51:47 GMT"
            },
            {
              "name":"Etag",
              "value":"\"26750-556-115b3ac0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"1366"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/png"
            }
          ],
          "content":{
            "size":1366,
            "mimeType":"image/png"
          },
          "redirectURL":"",
          "headersSize":342,
          "bodySize":1366
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":23,
          "receive":1
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.053+02:00",
        "time":33,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/rss.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":509,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fe8-26b-bd642cc0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"619"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":619,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":619
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":33,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.054+02:00",
        "time":40,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/images/smilies/icon_smile.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":503,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Tue, 05 Feb 2008 14:05:17 GMT"
            },
            {
              "name":"Etag",
              "value":"\"12043-ae-baefc140\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"174"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":174,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":340,
          "bodySize":174
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":40,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.057+02:00",
        "time":48,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/comment-from.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            }
          ],
          "queryString":[],
          "headersSize":528,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:24:57 GMT"
            },
            {
              "name":"Etag",
              "value":"\"6c1050-7e-bd45a840\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"126"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":126,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":126
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":48,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.062+02:00",
        "time":54,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/wordpress.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":515,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:25:00 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fec-208-bd736f00\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"520"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":520,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":520
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":54,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.063+02:00",
        "time":108,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/creativebits.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[],
          "headersSize":518,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:24:57 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fe4-155-bd45a840\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"341"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":341,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":341
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":54,
          "blocked":0,
          "send":0,
          "wait":54,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.064+02:00",
        "time":66,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/sidebar_top.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            }
          ],
          "queryString":[],
          "headersSize":527,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fea-6d-bd642cc0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"109"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=47"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":109,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":340,
          "bodySize":109
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":10,
          "send":0,
          "wait":56,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.068+02:00",
        "time":90,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/sidebar_bottom.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            }
          ],
          "queryString":[],
          "headersSize":530,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"Etag",
              "value":"\"11fe9-71-bd642cc0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"113"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=47"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":113,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":340,
          "bodySize":113
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":18,
          "send":0,
          "wait":72,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.081+02:00",
        "time":90,
        "request":{
          "method":"GET",
          "url":"http://www.google-analytics.com/__utm.gif?utmwv=1.3&utmn=167033691&utmcs=UTF-8&utmsr=1280x768&utmsc=24-bit&utmul=en-us&utmje=1&utmfl=10.1%20r82&utmcn=1&utmdt=Software%20is%20hard%20%7C%20Firebug%201.6%20beta%201%20Released&utmhn=www.softwareishard.com&utmhid=1444065975&utmr=0&utmp=/blog/firebug/firebug-16-beta-1-released/&utmac=UA-3586722-1&utmcc=__utma%3D57327400.167033691.1286268803.1286268803.1286268803.1%3B%2B__utmz%3D57327400.1286268803.1.1.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.google-analytics.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[{
              "name":"utmac",
              "value":"UA-3586722-1"
            },
            {
              "name":"utmcc",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1;+__utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none);+"
            },
            {
              "name":"utmcn",
              "value":"1"
            },
            {
              "name":"utmcs",
              "value":"UTF-8"
            },
            {
              "name":"utmdt",
              "value":"Software is hard | Firebug 1.6 beta 1 Released"
            },
            {
              "name":"utmfl",
              "value":"10.1 r82"
            },
            {
              "name":"utmhid",
              "value":"1444065975"
            },
            {
              "name":"utmhn",
              "value":"www.softwareishard.com"
            },
            {
              "name":"utmje",
              "value":"1"
            },
            {
              "name":"utmn",
              "value":"167033691"
            },
            {
              "name":"utmp",
              "value":"/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"utmr",
              "value":"0"
            },
            {
              "name":"utmsc",
              "value":"24-bit"
            },
            {
              "name":"utmsr",
              "value":"1280x768"
            },
            {
              "name":"utmul",
              "value":"en-us"
            },
            {
              "name":"utmwv",
              "value":"1.3"
            }
          ],
          "headersSize":938,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:48 GMT"
            },
            {
              "name":"Content-Length",
              "value":"35"
            },
            {
              "name":"Pragma",
              "value":"no-cache"
            },
            {
              "name":"Expires",
              "value":"Wed, 19 Apr 2000 11:43:00 GMT"
            },
            {
              "name":"Last-Modified",
              "value":"Wed, 21 Jan 2004 19:51:30 GMT"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            },
            {
              "name":"Server",
              "value":"Golfe"
            },
            {
              "name":"Cache-Control",
              "value":"private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
            }
          ],
          "content":{
            "size":35,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":293,
          "bodySize":35
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":90,
          "receive":0
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.209+02:00",
        "time":30,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/loading.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            }
          ],
          "queryString":[],
          "headersSize":694,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sat, 26 Apr 2008 09:51:19 GMT"
            },
            {
              "name":"Etag",
              "value":"\"e32ca-acf-9fd3b3c0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"2767"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":2767,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":342,
          "bodySize":2767
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":28,
          "receive":2
        }
      },
      {
        "pageref":"page_46155",
        "startedDateTime":"2010-10-05T10:53:23.211+02:00",
        "time":40,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/closelabel.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            }
          ],
          "queryString":[],
          "headersSize":697,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Last-Modified",
              "value":"Sat, 26 Apr 2008 09:51:19 GMT"
            },
            {
              "name":"Etag",
              "value":"\"e32c8-3d3-9fd3b3c0\""
            },
            {
              "name":"Accept-Ranges",
              "value":"bytes"
            },
            {
              "name":"Content-Length",
              "value":"979"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:57 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=47"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            }
          ],
          "content":{
            "size":979,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":341,
          "bodySize":979
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":40,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:26.987+02:00",
        "time":1219,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/index.php"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":709,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:01 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"X-Pingback",
              "value":"http://www.softwareishard.com/blog/xmlrpc.php"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=7200"
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 10:54:01 GMT"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Transfer-Encoding",
              "value":"chunked"
            },
            {
              "name":"Content-Type",
              "value":"text/html; charset=UTF-8"
            }
          ],
          "content":{
            "size":31951,
            "mimeType":"text/html",
            "text":"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\u000a<html xmlns=\"http://www.w3.org/1999/xhtml\">\u000a\u000a<head profile=\"http://gmpg.org/xfn/11\">\u000a\u0009<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\u000a\u000a\u0009<title>Software is hard | Firebug 1.6 beta 1 Released</title>\u000a\u0009\u000a\u0009<meta name=\"generator\" content=\"WordPress 2.3.2\" />\u000a\u0009<meta name=\"description\" content=\"More musings on software development\" />\u000a\u000a\u000a\u0009<style type=\"text/css\" media=\"screen\">\u000a\u0009\u0009@import url( http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css );\u000a\u0009</style>\u000a\u000a\u0009<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS 2.0\" href=\"http://www.softwareishard.com/blog/feed/\" />\u000a\u0009<link rel=\"alternate\" type=\"text/xml\" title=\"RSS .92\" href=\"http://www.softwareishard.com/blog/feed/rss/\" />\u000a\u0009<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Atom 0.3\" href=\"http://www.softwareishard.com/blog/feed/atom/\" />\u000a\u0009<link rel=\"pingback\" href=\"http://www.softwareishard.com/blog/xmlrpc.php\" />\u000a    \u0009<link rel='archives' title='September 2010' href='http://www.softwareishard.com/blog/2010/09/' />\u000a\u0009<link rel='archives' title='August 2010' href='http://www.softwareishard.com/blog/2010/08/' />\u000a\u0009<link rel='archives' title='July 2010' href='http://www.softwareishard.com/blog/2010/07/' />\u000a\u0009<link rel='archives' title='June 2010' href='http://www.softwareishard.com/blog/2010/06/' />\u000a\u0009<link rel='archives' title='May 2010' href='http://www.softwareishard.com/blog/2010/05/' />\u000a\u0009<link rel='archives' title='March 2010' href='http://www.softwareishard.com/blog/2010/03/' />\u000a\u0009<link rel='archives' title='February 2010' href='http://www.softwareishard.com/blog/2010/02/' />\u000a\u0009<link rel='archives' title='January 2010' href='http://www.softwareishard.com/blog/2010/01/' />\u000a\u0009<link rel='archives' title='November 2009' href='http://www.softwareishard.com/blog/2009/11/' />\u000a\u0009<link rel='archives' title='October 2009' href='http://www.softwareishard.com/blog/2009/10/' />\u000a\u0009<link rel='archives' title='September 2009' href='http://www.softwareishard.com/blog/2009/09/' />\u000a\u0009<link rel='archives' title='July 2009' href='http://www.softwareishard.com/blog/2009/07/' />\u000a\u0009<link rel='archives' title='May 2009' href='http://www.softwareishard.com/blog/2009/05/' />\u000a\u0009<link rel='archives' title='April 2009' href='http://www.softwareishard.com/blog/2009/04/' />\u000a\u0009<link rel='archives' title='March 2009' href='http://www.softwareishard.com/blog/2009/03/' />\u000a\u0009<link rel='archives' title='January 2009' href='http://www.softwareishard.com/blog/2009/01/' />\u000a\u0009<link rel='archives' title='December 2008' href='http://www.softwareishard.com/blog/2008/12/' />\u000a\u0009<link rel='archives' title='November 2008' href='http://www.softwareishard.com/blog/2008/11/' />\u000a\u0009<link rel='archives' title='October 2008' href='http://www.softwareishard.com/blog/2008/10/' />\u000a\u0009<link rel='archives' title='September 2008' href='http://www.softwareishard.com/blog/2008/09/' />\u000a\u0009<link rel='archives' title='August 2008' href='http://www.softwareishard.com/blog/2008/08/' />\u000a\u0009<link rel='archives' title='July 2008' href='http://www.softwareishard.com/blog/2008/07/' />\u000a\u0009<link rel='archives' title='June 2008' href='http://www.softwareishard.com/blog/2008/06/' />\u000a\u0009<link rel='archives' title='May 2008' href='http://www.softwareishard.com/blog/2008/05/' />\u000a\u0009<link rel='archives' title='April 2008' href='http://www.softwareishard.com/blog/2008/04/' />\u000a\u0009<link rel='archives' title='March 2008' href='http://www.softwareishard.com/blog/2008/03/' />\u000a\u0009<link rel='archives' title='February 2008' href='http://www.softwareishard.com/blog/2008/02/' />\u000a\u0009\u0009<link rel=\"EditURI\" type=\"application/rsd+xml\" title=\"RSD\" href=\"http://www.softwareishard.com/blog/xmlrpc.php?rsd\" />\u000a <link rel=\"wlwmanifest\" type=\"application/wlwmanifest+xml\" href=\"http://www.softwareishard.com/blog/wp-includes/wlwmanifest.xml\" /> <script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/prototype.js?ver=1.5.1.1'></script>\u000a<script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/scriptaculous.js?ver=1.7.1-b3'></script>\u000a<script type='text/javascript' src='http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/effects.js?ver=1.7.1-b3'></script>\u000a<link rel=\"stylesheet\" href=\"http://www.softwareishard.com/blog/wp-content/plugins/deans_code_highlighter/geshi.css\"  type=\"text/css\" />\u0009<!-- WP lightbox 2 Plugin version 0.6.3 -->\u000a\u0009<link rel=\"stylesheet\" href=\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/css/lightbox.css\" type=\"text/css\" media=\"screen\" />\u000a\u0009<style type=\"text/css\" media=\"screen\">\u000a\u0009\u0009#prevLink, #nextLink { background: transparent url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/blank.gif\") no-repeat; }\u000a\u0009\u0009#prevLink:hover, #prevLink:visited:hover { background: url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/prevlabel.gif\") left 15% no-repeat; }\u000a\u0009\u0009#nextLink:hover, #nextLink:visited:hover { background: url(\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/nextlabel.gif\") right 15% no-repeat; }\u000a\u0009</style>\u000a\u0009<script type=\"text/javascript\" src=\"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/js/lightbox.js\"></script>\u000a\u0009<script type=\"text/javascript\">\u000a\u0009\u0009var fileLoadingImage = \"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/loading.gif\";\u000a\u0009\u0009var fileBottomNavCloseImage = \"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/closelabel.gif\";\u000a\u0009</script>\u000a</head>\u000a\u000a<body>\u000a<script  type=\"text/javascript\">\u000d\u000afunction installXPI(href)\u000d\u000a{\u000d\u000a    if (typeof(InstallTrigger) != 'undefined')\u000d\u000a    {\u000d\u000a        var xpi = {'Firebug': href};\u000d\u000a        InstallTrigger.install(xpi);\u000d\u000a    }\u000d\u000a    else\u000d\u000a    {\u000d\u000a        alert(\"You must be using Firefox to install this extension.\");\u000d\u000a    }\u000d\u000a}\u000d\u000a\u000d\u000afunction run(id) \u000d\u000a{\u000d\u000a    try \u000d\u000a    {\u000d\u000a        var form = document.createElement(\"form\");\u000d\u000a        form.setAttribute(\"action\", \"http://www.softwareishard.com/domplate/runner/index.php\");\u000d\u000a        form.setAttribute(\"method\", \"POST\");\u000d\u000a        form.setAttribute(\"style\", \"display:none\");\u000d\u000a\u000d\u000a        var parts = [\"script\", \"data\", \"css\"];\u000d\u000a        for (var i=0; i<parts.length; i++) \u000d\u000a        {\u000d\u000a            var part = document.getElementById(id+\"-\"+parts[i]);\u000d\u000a            if (!part)\u000d\u000a                continue;\u000d\u000a            var input = document.createElement(\"input\");\u000d\u000a            input.setAttribute(\"name\", parts[i]);          \u000d\u000a            input.setAttribute(\"value\", part.innerHTML);\u000d\u000a            form.appendChild(input);\u000d\u000a        }\u000d\u000a\u000d\u000a        document.body.appendChild(form);\u000d\u000a        form.submit();     \u000d\u000a    } \u000d\u000a    catch (err) \u000d\u000a    {\u000d\u000a        alert(\"Error: \" + err);\u000d\u000a    }  \u000d\u000a}\u000d\u000a</script>\u000d\u000a\u000a<div id=\"wrapper\">\u000a\u000a<div id=\"main_header\">\u000a    <div class=\"top\"></div>\u000a\u000a    <div class=\"main_sidebar\">\u000a        <div id=\"header\">\u000a            <h1><a href=\"http://www.softwareishard.com/blog/\">Software is hard</a></h1>\u000a            <span class=\"desc\">More musings on software development</span>\u000a            <div class=\"desc\">Jan Odvarko</div>\u000a            <div class=\"desc\">\u000a                <img src=\"http://www.softwareishard.com/images/x.png\" style=\"vertical-align:text-bottom\" width=\"175\" height=\"11\"/>\u000a            </div>\u000a        </div>\u000a    </div>\u000a\u000a    <div class=\"bottom\"></div>\u000a</div>\u000a\u0009\u000a<div class=\"container\">\u000a<hr />\u000a\u000a\u000a\u000a\u000a\u000a<div class=\"post\">\u000a\u0009<div class=\"titolo\">\u000a\u0009\u0009<h2><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\">Firebug 1.6 beta 1 Released</a></h2>\u000a  \u0009\u0009<small>by Honza</small>\u000a\u0009</div>\u000a  \u0009<span class=\"edit\"></span>\u000a\u000a  \u0009<div class=\"corpo\">\u000a  \u0009  \u0009<ul class=\"more_info\">\u000a  \u0009  \u0009\u0009<li class=\"first\"><strong>Published</strong>:<span>August 25th, 2010</span></li>\u000a  \u0009  \u0009\u0009<li><strong>Comments</strong>:<span><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/#comments \">9 Comments</a></span></li>\u000a  \u0009 \u0009\u0009<li><strong>Category</strong>:<span><a href=\"http://www.softwareishard.com/blog/category/firebug/\" title=\"View all posts in Firebug\" rel=\"category tag\">Firebug</a>,  <a href=\"http://www.softwareishard.com/blog/category/planet-mozilla/\" title=\"View all posts in Planet Mozilla\" rel=\"category tag\">Planet Mozilla</a>,  <a href=\"http://www.softwareishard.com/blog/category/release/\" title=\"View all posts in Release\" rel=\"category tag\">Release</a></span></li>\u000a  \u0009  \u0009</ul>\u000a\u0009\u0009<p>We have been working on version 1.6 since the end of January this year and after twenty <a href=\"http://getfirebug.com/releases/firebug/1.6X/\">alpha releases</a> we have <a href=\"http://getfirebug.com/releases/firebug/1.6X/firebug-1.6X.0b1.xpi\">first beta</a>!</p>\u000a<p>Switching into the beta phase means a few things for Firebug 1.6 users and developers:</p>\u000a<ul>\u000a<li><strong>Feature freeze</strong>. No new features for 1.6, we are now only fixing bugs, improving stability and compatibility with Firefox 4.0</li>\u000a<li><strong>Firebug 1.7</strong> (alpha) branch has been created and all contributors and active developers are switching to it. Any new ideas and features belongs into this branch.</li>\u000a<li>We appreciate <strong>feedback</strong> from beta users! Please, let us know about any problems in the <a href=\"http://groups.google.com/group/firebug\">newsgroup</a> or file a <a href=\"http://code.google.com/p/fbug/issues/list\">bug</a> (there are Firefox 4.0 <a href=\"http://getfirebug.com/knownissues\">known issues</a>).</li>\u000a<li>If you are a <strong>translator</strong>, please help us to get rest of the strings done. Firebug locales are managed on <a href=\"http://www.babelzilla.org/index.php?option=com_wts&amp;Itemid=203&amp;type=show&amp;extension=4387\">Babelzilla</a>.</li>\u000a</ul>\u000a<p>John J. Barton already put together a list of new features on <a href=\"http://blog.getfirebug.com/2010/08/24/firebug-1-6b1/\">getfirebug.com blog</a>, but it's too awesome so, let me repeat that and add a little descriptions.</p>\u000a<style> .sihUnorderedList > LI { padding-bottom: 10px; } </style>\u000a<ul class=\"sihUnorderedList\">\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-back-and-forward-navigation/\">Back and Forward arrows in the toolbar</a> Have you ever wanted to just quickly switch to the previous Firebug panel - or to a previous file displayed within the Script panel? Now, you can just click back...</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/too-many-panels-problem-in-firebug/\">Scrolling Panels Tab Bar</a> Do you have a bunch of Firebug extensions installed and there is not enough space for all the panel-tabs? This problem is now solved by scrolling.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-command-line-available-on-all-panels/\">Command line available on all panels</a> Firebug command line is one of the strongest features and so, it's now possible to use it from any panel. So, for example, you can evaluate an expression while hanging out at a breakpoint in the Script panel.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/tabular-logs-in-firebug/\">Implemented console.table</a> New method for well known <em>console</em> object that allows to log various data structures using tabular format. Not only the layout is useful, but you can also sort by columns.</li>\u000a<li><a href=\"http://blog.getfirebug.com/2010/05/21/firebug-1-6a11/\">Disabling break on next error</a> When Firebug debugger hits a <em>debugger;</em> keyword on the page, it breaks the current execution (it works like a breakpoint in the source code). The news is that you can temporarily disable it using <em>disabled breakpoint</em> (a breakpoint with condition set to false).</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/watching-mozafterpaint-in-firebug/\">MozAfterPaint events</a> Painting events can be tracked by the Net panel and displayed on the graphical timeline together with all the other events and HTTP requests.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-tracking-also-bfcache-reads/\">Net panel reports BFCache hits</a> In order to make back/forward (BF) browsing and startup fast, Firefox uses a cache (note that it isn't the HTTP cache). Firebug now reports also reads coming from this cache.</li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/firebug-16-switch-to-the-default-locale\">Option to use en-US locale</a> Firebug UI can be switched into the default en-US locale even if Firefox uses different locale. Useful for developers who use localized Firefox but want Firebug in English.</li>\u000a<li><a href=\"http://getfirebug.com/firstrun\">First Run Page</a> A first run page is now displayed after an install or update. We want to keep you updated through this page.</li>\u000a<li><a href=\"http://getfirebug.com/testsresults\">Testbot results</a> Results from automated test-bot are continuously displayed on getfirebug.com. Anybody can <a href=\"http://getfirebug.com/wiki/index.php/Running_Automated_Test_Suite\">run</a> automated Firebug test suite and upload results to that page (so we can see that even rare configurations work).</li>\u000a<li><strong>Console Filtering</strong> The Console panel allows to filter its content using a toolbar buttons. You can filter by: error, warning, info, debug or display all logs at once.</li>\u000a</ul>\u000a<p>We have also fixed many bugs, compatibility issues, memory leaks and I see Firebug 1.6 as the best version ever.</p>\u000a\u0009\u0009<div class=\"clear\"></div>\u000a  \u0009</div> \u000a</div>\u000a\u000a<hr />\u000a<div id=\"commenti\">\u000a\u000a<div class=\"commentlist\">\u000a\u000a<a class=\"rss_commenti\" href=\"/feed/\" title=\"Feed Rss Commenti\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/rss.gif\" alt=\"Rss Commenti\"/></a>\u000a\u000a<h4 id=\"comments\">9 Comments</h4>\u000a\u000a<ol id=\"commentlist\">\u000a\u000a\u000a\u0009<li id=\"comment-19607\">\u000a    \u0009<div class=\"messaggio\"><p><strong>Twitter Trackbacks...</strong></p>\u000a<p>...</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19607\">#1</a> <a href='http://topsy.com/www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/?utm_source=pingback&amp;utm_campaign=L2' rel='external nofollow'>Anonymous</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19627\">\u000a    \u0009<div class=\"messaggio\"><p>you can use <a href=\"http://www.firebugger.com\" rel=\"nofollow\">firebug</a> for ie if you use internet explorer</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19627\">#2</a> eben\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19647\">\u000a    \u0009<div class=\"messaggio\"><p>Don't want to put my efforts in foreground, but I wanted to point out, that the console filtering is missing in the features list.</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19647\">#3</a> Sebastian Z.\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19650\">\u000a    \u0009<div class=\"messaggio\"><p>@Sebastian: yeah, you right, updated!<br />\u000aHonza</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19650\">#4</a> Honza\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19663\">\u000a    \u0009<div class=\"messaggio\"><p>Very nice, the new 1.6 is very fast and good, i love</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19663\">#5</a> <a href='http://www.auto-ready.com/' rel='external nofollow'>Luxus Autovermietung</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19679\">\u000a    \u0009<div class=\"messaggio\"><p>Firefox 4.0 and Firebug 1.6 are the perfect mix!.</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19679\">#6</a> <a href='http://www.olc.com.tr' rel='external nofollow'>Yurtdışı Eğitim</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19692\">\u000a    \u0009<div class=\"messaggio\"><p>It's me again. <img src='http://www.softwareishard.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />\u000aJust wanted to complete the list with some more of the fine features implemented in 1.6:</p>\u000a<p>- Reworked Command Line completion incl. suggestion popup<br />\u000a- Saving of breakpoints over browser sessions<br />\u000a- Filterable File Location menus<br />\u000a- SVG CSS auto-completion<br />\u000a- Visual indication for search field not finding any matches<br />\u000a- Folding for Computed CSS Styles<br />\u000a- Editor configurations improvements<br />\u000a- Other changes: different images for Break On buttons, new Firebug icon, auto-completion for \"!important\", better background colors for Console entries, improved search match highlighting for CSS and DOM Panel, \"Media\" category in Net Panel, disabled breakpoints are greyed out, ability to change Command Line font size, options for copying the CSS Style declaration and the CSS path of a selected element</p>\u000a<p>etc.</p>\u000a<p>So you see 1.6 offers even more than what this blog entry describes (not mentioning all the bug fixes done in this version).</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19692\">#7</a> Sebastian Z.\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19694\">\u000a    \u0009<div class=\"messaggio\"><p>@Sebastian: Great summary, thanks!<br />\u000aHonza</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19694\">#8</a> <a href='http://www.softwareishard.com' rel='external nofollow'>Honza</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a\u000a\u0009<li id=\"comment-19705\">\u000a    \u0009<div class=\"messaggio\"><p>I'm using it with Firefox 3.6, and it's going great<br />\u000aThanks !</p>\u000a\u0009\u0009</div>\u000a\u0009\u0009<span class=\"autore\"><a class=\"count\" href=\"#comment-19705\">#9</a> <a href='http://www.deutsched.com' rel='external nofollow'>Amr Boghdady</a>\u0009\u0009</span>\u0009\u000a\u0009</li>\u000a\u000a</ol>\u000a\u000a\u000a\u000a</div>\u000a\u000a<div class=\"form_commenti\">\u000a<h4 id=\"postcomment\">Leave a comment</h4>\u000a\u000a<form action=\"http://www.softwareishard.com/blog/wp-comments-post.php\" method=\"post\" id=\"commentform\">\u000a\u000a\u000a<label for=\"author\">Name</label><br />\u000a<input name=\"author\" type=\"text\" id=\"author\" tabindex=\"1\" value=\"\" size=\"40\" />\u000a\u000a<label for=\"email\">Email (never displayed) </label>\u000a<br />\u000a<input name=\"email\" type=\"text\" id=\"email\" tabindex=\"2\" value=\"\" size=\"40\" />\u000a\u000a<label for=\"url\">URI</label><br />\u000a<input name=\"url\" type=\"text\" id=\"url\" tabindex=\"3\" value=\"\" size=\"40\" />\u000a\u000a\u000a\u000a<!--<p><small><strong>XHTML:</strong> You can use these tags: &lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;code&gt; &lt;em&gt; &lt;i&gt; &lt;strike&gt; &lt;strong&gt; </small></p>-->\u000a\u000a<label for=\"comment\">Your Comment:</label><br />\u000a<textarea name=\"comment\" cols=\"50\" rows=\"10\" id=\"comment\" tabindex=\"4\"></textarea>\u000a\u000a<p><input name=\"submit\" type=\"submit\" id=\"submit\" tabindex=\"5\" value=\"Submit Comment\" />\u000a<input type=\"hidden\" name=\"comment_post_ID\" value=\"63\" />\u000a</p>\u000a<input type=\"hidden\" id=\"sk2_time\" name=\"sk2_time\" value=\"1286268842\" /><input type=\"hidden\" id=\"sk2_ip\" name=\"sk2_ip\" value=\"88.103.194.106\" /><input type=\"hidden\" id=\"sk2_payload\" name=\"sk2_payload\" value=\"bcd0d45e53e64aa7b5c0d344ab243578\" /><input type=\"hidden\" id=\"sk2_my_js_check1\" name=\"sk2_my_js_check1\" value=\"9yhtx0s0mn\" />\u000a<input type=\"hidden\" id=\"sk2_my_js_check2\" name=\"sk2_my_js_check2\" value=\"a563af958bc5abebf286425b64c839cd\" />\u000a<script type=\"text/javascript\">\u000a<!--\u000a\u0009document.write('<input type=\"hidden\" id=\"sk2_my_js_payload\" name=\"sk2_my_js_payload\" value=\"');\u000a\u0009document.write(Math.round ( Math.abs(Math.round ( Math.abs(((Math.round ( Math.abs((Math.min(((Math.min(1, 2) - 38) + Math.round( Math.abs(100*Math.sin(5)) ) ), 2) * 20) % 12)) + 7) + Math.round( Math.abs(100*Math.sin(19)) ) ) / 37)))));\u000a\u0009document.write('\" />');\u000a-->\u000a</script>\u000a\u000a</form>\u000a\u000a\u000a\u000a\u000a</div></div>\u000a<div class=\"clear\"></div>\u000a\u000a\u0009<!--\u000a\u0009<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\u000a\u0009\u0009\u0009\u0009xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\u000a\u0009\u0009\u0009\u0009xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\">\u000a\u0009\u0009\u0009<rdf:Description rdf:about=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\"\u000a    dc:identifier=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/\"\u000a    dc:title=\"Firebug 1.6 beta 1 Released\"\u000a    trackback:ping=\"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/trackback/\" />\u000a</rdf:RDF>\u0009-->\u000a\u000a \u000a\u000a</div>\u000a<hr />\u000a\u000a<div id=\"sidebar\">\u000a<div class=\"top\"></div>\u000a<div class=\"main_sidebar\">\u000a\u000a\u000a\u0009<div class=\"block\"><ul><li class=\"pagenav\"><h3>Pages</h3><ul><li class=\"page_item page-item-2\"><a href=\"http://www.softwareishard.com/blog/about/\" title=\"About\">About</a></li>\u000a<li class=\"page_item page-item-5\"><a href=\"http://www.softwareishard.com/blog/firecookie/\" title=\"Firecookie\">Firecookie</a></li>\u000a<li class=\"page_item page-item-33\"><a href=\"http://www.softwareishard.com/blog/netexport/\" title=\"NetExport\">NetExport</a></li>\u000a</ul></li></ul></div>\u000a\u0009<div class=\"block\"><ul>  <li id=\"linkcat-2\" class=\"linkcat\"><h2>Blogroll</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.ajaxian.com\">Ajaxian</a></li>\u000a<li><a href=\"http://www.allpeers.com/blog\" title=\"Share files with friends and family.\">AllPeers</a></li>\u000a<li><a href=\"http://blog.getfirebug.com/\" title=\"Get Firebug\">Firebug</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug/list-of-firebug-extensions/\" title=\"List of Firebug Extensions\">Firebug Extensions</a></li>\u000a<li><a href=\"http://browsing.justdiscourse.com\">Just Browsing</a></li>\u000a<li><a href=\"http://planet.mozilla.org/\">Planet Mozilla</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-37\" class=\"linkcat\"><h2>Domplate Tutorial</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/blog/planet-mozilla/domplate-examples-part-i/\" title=\"Set of examples about Domplate.\">Part I. Examples</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/domplate/domplate-examples-part-ii/\" title=\"Set of examples about Domplate.\">Part II. Examples</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-4\" class=\"linkcat\"><h2>Firebug Tutorial</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=3\">Part I. Hello World!</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=4\">Part II. Toolbar</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=7\">Part III. Options</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/?p=10\">Part IV. Localization</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-activable-panel-part-ix/\">Part IX: Activable Panel</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-domplate-part-v/\">Part V. Domplate</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-yahoo-search-part-vi/\">Part VI. Yahoo! Search</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-customize-net-panel-part-vii/\">Part VII. Customize Net Panel</a></li>\u000a<li><a href=\"http://www.softwareishard.com/blog/firebug-tutorial/extending-firebug-net-panel-listener-part-viii/\">Part VIII. Net Panel Listener</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-21\" class=\"linkcat\"><h2>Jan Odvarko</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.linkedin.com/in/odvarko\">LinkedIn</a></li>\u000a<li><a href=\"https://twitter.com/janodvarko\">Twitter</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-11\" class=\"linkcat\"><h2>Miscellaneous</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://www.softwareishard.com/domplate/runner/index.php\" title=\"Check out Domplate templates online\">Domplate Runner</a></li>\u000a<li><a href=\"http://www.softwareishard.com\" title=\"Home Page\">Home Page</a></li>\u000a<li><a href=\"http://www.softwareishard.com/har/viewer\">HTTP Archive Viewer</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a  <li id=\"linkcat-3\" class=\"linkcat\"><h2>Subscribe</h2>\u000a\u0009<ul>\u000a<li><a href=\"http://feeds.feedburner.com/CommentsForSoftwareIsHard\">Comments</a></li>\u000a<li><a href=\"http://feeds.feedburner.com/SoftwareIsHard\">Posts</a></li>\u000a\u000a\u0009</ul>\u000a</li>\u000a</ul></div>\u000a\u0009<div class=\"block\"><ul><li class=\"categories\"><h3>Categories</h3><ul>\u0009<li class=\"cat-item cat-item-69\"><a href=\"http://www.softwareishard.com/blog/category/documentation/\" title=\"View all posts filed under Documentation\">Documentation</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-19\"><a href=\"http://www.softwareishard.com/blog/category/domplate/\" title=\"View all posts filed under Domplate\">Domplate</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-81\"><a href=\"http://www.softwareishard.com/blog/category/eventbug/\" title=\"View all posts filed under Eventbug\">Eventbug</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-45\"><a href=\"http://www.softwareishard.com/blog/category/extension-architecture/\" title=\"View all posts filed under Extension Architecture\">Extension Architecture</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-5\"><a href=\"http://www.softwareishard.com/blog/category/firebug/\" title=\"View all posts filed under Firebug\">Firebug</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-4\"><a href=\"http://www.softwareishard.com/blog/category/firebug-tutorial/\" title=\"View all posts filed under Firebug Tutorial\">Firebug Tutorial</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-8\"><a href=\"http://www.softwareishard.com/blog/category/firecookie/\" title=\"View all posts filed under Firecookie\">Firecookie</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-86\"><a href=\"http://www.softwareishard.com/blog/category/firestarter/\" title=\"View all posts filed under Firestarter\">Firestarter</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-41\"><a href=\"http://www.softwareishard.com/blog/category/fireunit/\" title=\"View all posts filed under Fireunit\">Fireunit</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-75\"><a href=\"http://www.softwareishard.com/blog/category/har/\" title=\"View all posts filed under HAR\">HAR</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-59\"><a href=\"http://www.softwareishard.com/blog/category/netexport/\" title=\"View all posts filed under NetExport\">NetExport</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-18\"><a href=\"http://www.softwareishard.com/blog/category/planet-mozilla/\" title=\"View all posts filed under Planet Mozilla\">Planet Mozilla</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-34\"><a href=\"http://www.softwareishard.com/blog/category/prism/\" title=\"View all posts filed under Prism\">Prism</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-110\"><a href=\"http://www.softwareishard.com/blog/category/release/\" title=\"View all posts filed under Release\">Release</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-43\"><a href=\"http://www.softwareishard.com/blog/category/testing/\" title=\"View all posts filed under Testing\">Testing</a>\u000a</li>\u000a\u0009<li class=\"cat-item cat-item-1\"><a href=\"http://www.softwareishard.com/blog/category/uncategorized/\" title=\"View all posts filed under Uncategorized\">Uncategorized</a>\u000a</li>\u000a</ul></li></ul></div>\u000a\u000a <div class=\"block\">\u000a   <h3>Search:</h3>\u000a   <form id=\"searchform\" method=\"get\" action=\"http://www.softwareishard.com/blog\">\u000a\u0009\u0009<input class=\"cerca_modulo\" type=\"text\" name=\"s\" id=\"s\" size=\"12\" />\u000a\u0009\u0009<input class=\"cerca_invio\" type=\"submit\" value=\"Search\" />\u000a\u0009</form>\u000a </div>\u000a \u000a <div class=\"block\"><h3>Archives</h3>\u000a\u0009<ul>\u000a\u0009 \u0009<li><a href='http://www.softwareishard.com/blog/2010/09/' title='September 2010'>September 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/08/' title='August 2010'>August 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/07/' title='July 2010'>July 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/06/' title='June 2010'>June 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/05/' title='May 2010'>May 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/03/' title='March 2010'>March 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/02/' title='February 2010'>February 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2010/01/' title='January 2010'>January 2010</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/11/' title='November 2009'>November 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/10/' title='October 2009'>October 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/09/' title='September 2009'>September 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/07/' title='July 2009'>July 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/05/' title='May 2009'>May 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/04/' title='April 2009'>April 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/03/' title='March 2009'>March 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2009/01/' title='January 2009'>January 2009</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/12/' title='December 2008'>December 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/11/' title='November 2008'>November 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/10/' title='October 2008'>October 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/09/' title='September 2008'>September 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/08/' title='August 2008'>August 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/07/' title='July 2008'>July 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/06/' title='June 2008'>June 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/05/' title='May 2008'>May 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/04/' title='April 2008'>April 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/03/' title='March 2008'>March 2008</a></li>\u000a\u0009<li><a href='http://www.softwareishard.com/blog/2008/02/' title='February 2008'>February 2008</a></li>\u000a\u0009</ul>\u000a </div>\u000a \u000a<!-- <div class=\"block\"><h3>Meta:</h3>\u000a\u0009<ul>\u000a\u0009\u0009\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/wp-login.php\">Login</a></li>\u000a\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/feed/\" title=\"Syndicate this site using RSS\"><abbr title=\"Really Simple Syndication\">RSS</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://www.softwareishard.com/blog/comments/feed/\" title=\"The latest comments to all posts in RSS\">Comments <abbr title=\"Really Simple Syndication\">RSS</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://validator.w3.org/check/referer\" title=\"This page validates as XHTML 1.0 Transitional\">Valid <abbr title=\"eXtensible HyperText Markup Language\">XHTML</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://gmpg.org/xfn/\"><abbr title=\"XHTML Friends Network\">XFN</abbr></a></li>\u000a\u0009\u0009<li><a href=\"http://wordpress.org/\" title=\"Powered by WordPress, state-of-the-art semantic personal publishing platform.\"><abbr title=\"WordPress\">WP</abbr></a></li>\u000a\u0009\u0009\u0009</ul>\u000a </div>\u000a-->\u000a\u000a<!-- This is only for the demo page, remove it if you don't want this block\u000a<div class=\"block\"> \u000a\u0009<h3>Theme Switcher</h3>\u000a\u0009</div>\u000a-->\u000a\u000a</div>\u000a<div class=\"bottom\"></div>\u000a</div><div class=\"clear\"></div>\u000a\u000a<div id=\"footer\">\u000a<a href=\"http://www.wordpress.org\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/wordpress.gif\" alt=\"Wordpress.org\"/></a>\u000a<a href=\"http://www.creativebits.it/news/tema-wordpress-minibits/\"><img src=\"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/creativebits.gif\" alt=\"clearPaper by CreativeBits.it\"/></a>\u000a\u0009<span>Copyright &copy; 2007 Software is hard. All rights reserved.</span>\u000a\u0009<span><a href=\"http://validator.w3.org/check/referer\" title=\"Pagina valida XHTML 1.0 Transitional\">Xhtml</a>, <a href=\"http://jigsaw.w3.org/css-validator/check/referer\" title=\"Pagina valida CSS v.1\">Css</a>, <a href=\"http://www.softwareishard.com/blog/feed/\">Rss</a>. Powered by <a href=\"http://www.creativebits.it/news/tema-wordpress-minibits/\">miniBits</a> &amp; <a href=\"http://www.wordpress.org/\">Wordpress</a>.</span></div>\u000a\u000a</div>\u000a\u000a<div id=\"sk2-footer\" style=\"color:#FFF; background-color:#444; padding: 3px 2px 3px 2px; border-top: #888 solid 1px;\">This blog is protected by <a href=\"http://unknowngenius.com/blog/\" title=\"Dave\">Dave</a>'s <strong><a href=\"http://unknowngenius.com/blog/wordpress/spam-karma/\" title=\"SK2\">Spam Karma 2</a></strong>: <strong>27416</strong>  Spams eaten and counting...</div>\u000a<script src=\"http://www.google-analytics.com/urchin.js\" type=\"text/javascript\">\u000d\u000a</script>\u000d\u000a<script type=\"text/javascript\">\u000d\u000a_uacct = \"UA-3586722-1\";\u000d\u000aurchinTracker();\u000d\u000a</script>\u000a</body>\u000a</html>"
          },
          "redirectURL":"",
          "headersSize":323,
          "bodySize":31955
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":1097,
          "receive":122
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.105+02:00",
        "time":98,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:25:01 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fed-1dfc-bd82b140\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":788,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Etag",
              "value":"\"11fed-1dfc-bd82b140\""
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            }
          ],
          "content":{
            "size":7676,
            "mimeType":"text/css",
            "text":"/* \u000aTheme Name: miniBits \u000aTheme URI: http://www.creativebits.it/go/minibits \u000aVersion: 0.8 \u000aAuthor: Raffaele Rasini \u000aAuthor URI: http://creativebits.it/ \u000a*/ \u000a\u000a* { padding:0; margin:0; }\u000abody { padding:0px; text-align: left; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: small; color: #222222; line-height: 150%; /*background: #4A525A ;*/ background-color: #fff; }\u000ahr { display: none; margin: 0; }\u000aa { color: #6B8D20; text-decoration: underline; }\u000aa:hover { background-color: #6B8D20; color: White; text-decoration: none; }\u000aa img, .post a img, img { border: 0; text-decoration: none; border-color: white; }\u000ah1, h2, h3, h4, h5, h6 { font-family: Georgia, serif; }\u000aspan.highlight { background-color: #FFFFDB; }\u000a\u000a/* ---[ Elementi ]------------------------------- */\u000ablockquote { margin: 1em 0 1em 0; padding: 0; color: #777; background: White url(img/quote.gif) no-repeat top left; padding-top: 10px; padding-left: 35px; }\u000acode { color: #6B8D20; font-family: Monaco, monospace; text-align: left; }\u000acode strong { color: #4E6200; }\u000aabbr, acronym, .popup { font-style: normal; border-bottom: 1px dotted #999; cursor: help; }\u000aem { font-style: italic; }\u000astrong { font-weight: bold; }\u000astrike, del { text-decoration: line-through; }\u000ains { text-decoration: none; }\u000aaddress { margin: 0; padding: 0; font-style: normal; }\u000a\u000a/* ---[ Container ]------------------------------- */ \u000a#wrapper { margin: 0 auto; text-align: left; width: 760px; background: #FFFFFF ; font-size: 0.9em; line-height: 1.6em; padding: 20px 10px 0 10px; /*border-right: 2px solid #424A51; border-left: 2px solid #424A51;*/ }\u000a#wrapper .container { float: left; width: 520px; }\u000a.clear { clear: both; }\u000a\u000a/* ---[ Header ]------------------------------- */ \u000a#header { padding: 30px 0 20px 0; text-align:center; }\u000a#header h1 { font-weight: lighter; font-size: 4em; margin-bottom: 10px; }\u000a#header h1 a { color: #4A525A; text-decoration: none; }\u000a#header h1 a:hover { color: #9D4134; background-color: transparent; }\u000a#header span.desc { color: #7B8691; text-transform: uppercase; font-size: 0.9em; }\u000a\u000a/* ---[ Pagine ]------------------------------- */ \u000a.post { margin-bottom: 25px; }\u000a.post .titolo { border-bottom: 1px solid #E1E1D3; padding-bottom: 3px; }\u000a* html .post .titolo { padding-bottom: 6px; }\u000a.post h2, .post h2 a { color: #DD467B; font-size: 22.8px; font-weight: lighter; display: inline; }\u000a.post h2 a { border: 0; text-decoration: none; }\u000a.post h2 a:hover { background-color: transparent; color: #6B8D20; }\u000a.post h3 { margin-bottom: 4px; padding-bottom: 3px; font-size: 1.2em; color: #278BD8; font-weight: bold; border-bottom: 1px solid #D8D3C1; }\u000a.post span.edit { float: right; margin-top: -20px; }\u000a.post span.edit a { border: 0; font-size: 0.9em; }\u000a.post small { color: #878787; font-size: 0.9em; padding-left: 1px; }\u000a* html .post small { padding-left: 5px; }\u000a\u000a.post div.corpo ul.more_info a { color: #D87431; }\u000a.post div.corpo ul.more_info a:hover { background-color: #D87431; color: White; }\u000a.post div.corpo ul.more_info { list-style-type: none; margin: 0; padding: 3px 8px 3px 8px; width: 145px; float: right; margin-bottom: 10px; margin-left: 10px; background-color: #F8F8F6; border: 1px solid #E2E2DA; }\u000a.post div.corpo ul.more_info li { padding-top: 5px; padding-bottom: 5px; border-top: 1px solid #E2E2DA; }\u000a.post div.corpo ul.more_info li.first { border: 0; }\u000a.post div.corpo ul.more_info span { display: block; }\u000a.post div.corpo { padding-top: 6px; }\u000a.post div.corpo a.more-link { color: #9D4134; }\u000a.post div.corpo a.more-link:hover { color: White; background-color: #9D4134; }\u000a.post div.corpo ul, .post div.corpo ol{ margin: 15px 0 15px 35px; }\u000a.post div.corpo p { margin-bottom: 10px; }\u000aimg.center, img[align=\"center\"] { display: block; margin-left: auto; margin-right: auto; }\u000aimg.alignright, img[align=\"right\"] { padding: 4px 0 0 0; margin: 0 0 5px 5px; display: inline; }\u000aimg.alignleft, img[align=\"left\"] { padding: 4px 0 0 0; margin: 0 5px 5px 0; display: inline; }\u000a.post div.corpo h4 { font-size: 1.1em; margin-top: 10px; margin-bottom: 0; }\u000a\u000a/* ---[ Commenti ]------------------------------- */ \u000a#commenti { margin-top: 15px; }\u000a#commenti h4 { margin-bottom: 15px; font-size: 1.05em; color: #626C76; font-weight: bold; border-bottom: 1px solid #E1E1D3; }\u000a#commenti a.rss_commenti { border: 0; float: right; margin-top: 1px; }\u000a#commenti ol#commentlist { list-style-type: none; }\u000a#commenti ol#commentlist li { margin-bottom: 15px; }\u000a#commenti ol#commentlist li span { display: block; }\u000a#commenti ol#commentlist li div.messaggio { background: #F4FAE2; padding: 10px; }\u000a#commenti ol#commentlist li span.autore { padding: 5px 10px 5px 0; background: url(img/comment-from.gif) no-repeat 20px 0px; }\u000a#commenti ol#commentlist li span.autore a.count{ color: #999999; margin-right: 45px; font-weight: normal; }\u000a#commenti ol#commentlist li span.autore a.count:hover{ color: #666666; background-color: White; }\u000a\u000a/* Stile link per commentatore normale */ \u000a#commenti ol#commentlist li span.autore a { font-weight: bold; color: #96B236; border-color: #CFE7F7; }\u000a#commenti ol#commentlist li span.autore a:hover { background-color: White; }\u000a.nocomment { padding: 0 0 10px 0; margin: 0; }\u000a#commenti ol#commentlist li span.edit_comment { float: right; margin: -16px 0 0 0; }\u000a\u000a/* Modulo inserimento commenti */ \u000a#commenti .form_commenti { }\u000a#commenti .form_commenti form { color: #595750; padding: 0; margin-top: -4px; }\u000aform label { display: block; }\u000a\u000a/* link e maggiori info sui commenti */ \u000a#commenti .form_commenti .more_info { background-color: #FFF0F5; float: right; }\u000a#commenti .form_commenti form br { display: none; }\u000a\u000a/* ---[ Sidebar ]------------------- */ \u000a#sidebar { width: 220px; background-color: #F0F3F4; float: right; color: #727267; }\u000a#sidebar .main_sidebar { padding: 5px 10px 5px 10px; }\u000a#sidebar h3, #sidebar h2 { font-size: 1.2em; padding-bottom: 2px; color: #3C4848; border-bottom: 1px solid #CCD6D6; font-weight: lighter; margin-bottom: 4px; }\u000a#sidebar a { color: #4170BE; text-decoration: underline; }\u000a#sidebar a:hover { background-color: #4170BE; color: White; text-decoration: none; }\u000a#sidebar .top { background: url(img/sidebar_top.gif) no-repeat top center; height: 5px; }\u000a#sidebar .bottom { background: url(img/sidebar_bottom.gif) no-repeat bottom center; height: 5px; }\u000a#sidebar ul, #sidebar ol, #sidebar li { list-style-type: none; }\u000a#sidebar .block, #sidebar .linkcat { margin-bottom: 15px; }\u000a.cerca_modulo { width: 130px; }\u000a.cerca_invio { width: 60px; }\u000a\u000a/* ---[ Widget]------------- */ \u000a#wp-calendar { width: 180px; }\u000a\u000a/* ---[ Footer ]------------------------------- */ \u000a#footer { padding: 8px 0 8px 0; border-top: 1px solid #EEEEEE; margin: 0px; font-size: 0.9em; color: #999999; margin-top: 15px; }\u000a#footer img { float: left; margin-top: 5px; margin-bottom: -5px; margin-right: 5px; }\u000a#footer img a { border: 0; }\u000a#footer span{ display: block; margin-left: 60px; }\u000a#footer a { color: #333; border-color: #D8F18C; }\u000a#footer a:hover { background-color: White; color: #333; text-decoration: none; }\u000a\u000a\u000a/* ---- Honza ---- */\u000ah3 {\u000a    padding-top: 20px;\u000a}\u000a\u000a.sihTable {\u000a    margin-bottom: 20px;\u000a}\u000a\u000a.sihTableBorder {\u000a    border-top: solid 1px #D8D3C1;\u000a    border-left: solid 1px #D8D3C1;\u000a}\u000a\u000a.sihTableBorder TD {\u000a    border-right: solid 1px #D8D3C1;\u000a    border-bottom: solid 1px #D8D3C1;\u000a    padding: 7px;\u000a}\u000a\u000a.sihImageBorder {\u000a    border: 4px solid #D1D1D1;\u000a}\u000a \u000a#main_header { width: 100%; background-color: #F0F3F4; margin-bottom:40px; border:1px solid #E2E2DA;}\u000a/*#main_header .top { background: url(img/sidebar_top.gif) no-repeat top center; height: 5px; }\u000a#main_header .bottom { background: url(img/sidebar_bottom.gif) no-repeat bottom center; height: 5px; }*/\u000a\u000a"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":7676
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-12T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":1,
          "connect":30,
          "blocked":0,
          "send":0,
          "wait":67,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.107+02:00",
        "time":116,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/prototype.js?ver=1.5.1.1",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Tue, 05 Feb 2008 14:05:21 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"12054-17837-bb2cca40\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.5.1.1"
            }
          ],
          "headersSize":768,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Etag",
              "value":"\"12054-17837-bb2cca40\""
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:32 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            }
          ],
          "content":{
            "size":96309,
            "mimeType":"application/javascript",
            "text":"/*  Prototype JavaScript framework, version 1.5.1.1\u000a *  (c) 2005-2007 Sam Stephenson\u000a *\u000a *  Prototype is freely distributable under the terms of an MIT-style license.\u000a *  For details, see the Prototype web site: http://www.prototypejs.org/\u000a *\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Prototype = {\u000a  Version: '1.5.1.1',\u000a\u000a  Browser: {\u000a    IE:     !!(window.attachEvent && !window.opera),\u000a    Opera:  !!window.opera,\u000a    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,\u000a    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1\u000a  },\u000a\u000a  BrowserFeatures: {\u000a    XPath: !!document.evaluate,\u000a    ElementExtensions: !!window.HTMLElement,\u000a    SpecificElementExtensions:\u000a      (document.createElement('div').__proto__ !==\u000a       document.createElement('form').__proto__)\u000a  },\u000a\u000a  ScriptFragment: '<script[^>]*>([\\\\S\\\\s]*?)<\\/script>',\u000a  JSONFilter: /^\\/\\*-secure-([\\s\\S]*)\\*\\/\\s*$/,\u000a\u000a  emptyFunction: function() { },\u000a  K: function(x) { return x }\u000a}\u000a\u000avar Class = {\u000a  create: function() {\u000a    return function() {\u000a      this.initialize.apply(this, arguments);\u000a    }\u000a  }\u000a}\u000a\u000avar Abstract = new Object();\u000a\u000aObject.extend = function(destination, source) {\u000a  for (var property in source) {\u000a    destination[property] = source[property];\u000a  }\u000a  return destination;\u000a}\u000a\u000aObject.extend(Object, {\u000a  inspect: function(object) {\u000a    try {\u000a      if (object === undefined) return 'undefined';\u000a      if (object === null) return 'null';\u000a      return object.inspect ? object.inspect() : object.toString();\u000a    } catch (e) {\u000a      if (e instanceof RangeError) return '...';\u000a      throw e;\u000a    }\u000a  },\u000a\u000a  toJSON: function(object) {\u000a    var type = typeof object;\u000a    switch(type) {\u000a      case 'undefined':\u000a      case 'function':\u000a      case 'unknown': return;\u000a      case 'boolean': return object.toString();\u000a    }\u000a    if (object === null) return 'null';\u000a    if (object.toJSON) return object.toJSON();\u000a    if (object.ownerDocument === document) return;\u000a    var results = [];\u000a    for (var property in object) {\u000a      var value = Object.toJSON(object[property]);\u000a      if (value !== undefined)\u000a        results.push(property.toJSON() + ': ' + value);\u000a    }\u000a    return '{' + results.join(', ') + '}';\u000a  },\u000a\u000a  keys: function(object) {\u000a    var keys = [];\u000a    for (var property in object)\u000a      keys.push(property);\u000a    return keys;\u000a  },\u000a\u000a  values: function(object) {\u000a    var values = [];\u000a    for (var property in object)\u000a      values.push(object[property]);\u000a    return values;\u000a  },\u000a\u000a  clone: function(object) {\u000a    return Object.extend({}, object);\u000a  }\u000a});\u000a\u000aFunction.prototype.bind = function() {\u000a  var __method = this, args = $A(arguments), object = args.shift();\u000a  return function() {\u000a    return __method.apply(object, args.concat($A(arguments)));\u000a  }\u000a}\u000a\u000aFunction.prototype.bindAsEventListener = function(object) {\u000a  var __method = this, args = $A(arguments), object = args.shift();\u000a  return function(event) {\u000a    return __method.apply(object, [event || window.event].concat(args));\u000a  }\u000a}\u000a\u000aObject.extend(Number.prototype, {\u000a  toColorPart: function() {\u000a    return this.toPaddedString(2, 16);\u000a  },\u000a\u000a  succ: function() {\u000a    return this + 1;\u000a  },\u000a\u000a  times: function(iterator) {\u000a    $R(0, this, true).each(iterator);\u000a    return this;\u000a  },\u000a\u000a  toPaddedString: function(length, radix) {\u000a    var string = this.toString(radix || 10);\u000a    return '0'.times(length - string.length) + string;\u000a  },\u000a\u000a  toJSON: function() {\u000a    return isFinite(this) ? this.toString() : 'null';\u000a  }\u000a});\u000a\u000aDate.prototype.toJSON = function() {\u000a  return '\"' + this.getFullYear() + '-' +\u000a    (this.getMonth() + 1).toPaddedString(2) + '-' +\u000a    this.getDate().toPaddedString(2) + 'T' +\u000a    this.getHours().toPaddedString(2) + ':' +\u000a    this.getMinutes().toPaddedString(2) + ':' +\u000a    this.getSeconds().toPaddedString(2) + '\"';\u000a};\u000a\u000avar Try = {\u000a  these: function() {\u000a    var returnValue;\u000a\u000a    for (var i = 0, length = arguments.length; i < length; i++) {\u000a      var lambda = arguments[i];\u000a      try {\u000a        returnValue = lambda();\u000a        break;\u000a      } catch (e) {}\u000a    }\u000a\u000a    return returnValue;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar PeriodicalExecuter = Class.create();\u000aPeriodicalExecuter.prototype = {\u000a  initialize: function(callback, frequency) {\u000a    this.callback = callback;\u000a    this.frequency = frequency;\u000a    this.currentlyExecuting = false;\u000a\u000a    this.registerCallback();\u000a  },\u000a\u000a  registerCallback: function() {\u000a    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\u000a  },\u000a\u000a  stop: function() {\u000a    if (!this.timer) return;\u000a    clearInterval(this.timer);\u000a    this.timer = null;\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    if (!this.currentlyExecuting) {\u000a      try {\u000a        this.currentlyExecuting = true;\u000a        this.callback(this);\u000a      } finally {\u000a        this.currentlyExecuting = false;\u000a      }\u000a    }\u000a  }\u000a}\u000aObject.extend(String, {\u000a  interpret: function(value) {\u000a    return value == null ? '' : String(value);\u000a  },\u000a  specialChar: {\u000a    '\\b': '\\\\b',\u000a    '\\t': '\\\\t',\u000a    '\\n': '\\\\n',\u000a    '\\f': '\\\\f',\u000a    '\\r': '\\\\r',\u000a    '\\\\': '\\\\\\\\'\u000a  }\u000a});\u000a\u000aObject.extend(String.prototype, {\u000a  gsub: function(pattern, replacement) {\u000a    var result = '', source = this, match;\u000a    replacement = arguments.callee.prepareReplacement(replacement);\u000a\u000a    while (source.length > 0) {\u000a      if (match = source.match(pattern)) {\u000a        result += source.slice(0, match.index);\u000a        result += String.interpret(replacement(match));\u000a        source  = source.slice(match.index + match[0].length);\u000a      } else {\u000a        result += source, source = '';\u000a      }\u000a    }\u000a    return result;\u000a  },\u000a\u000a  sub: function(pattern, replacement, count) {\u000a    replacement = this.gsub.prepareReplacement(replacement);\u000a    count = count === undefined ? 1 : count;\u000a\u000a    return this.gsub(pattern, function(match) {\u000a      if (--count < 0) return match[0];\u000a      return replacement(match);\u000a    });\u000a  },\u000a\u000a  scan: function(pattern, iterator) {\u000a    this.gsub(pattern, iterator);\u000a    return this;\u000a  },\u000a\u000a  truncate: function(length, truncation) {\u000a    length = length || 30;\u000a    truncation = truncation === undefined ? '...' : truncation;\u000a    return this.length > length ?\u000a      this.slice(0, length - truncation.length) + truncation : this;\u000a  },\u000a\u000a  strip: function() {\u000a    return this.replace(/^\\s+/, '').replace(/\\s+$/, '');\u000a  },\u000a\u000a  stripTags: function() {\u000a    return this.replace(/<\\/?[^>]+>/gi, '');\u000a  },\u000a\u000a  stripScripts: function() {\u000a    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');\u000a  },\u000a\u000a  extractScripts: function() {\u000a    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');\u000a    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');\u000a    return (this.match(matchAll) || []).map(function(scriptTag) {\u000a      return (scriptTag.match(matchOne) || ['', ''])[1];\u000a    });\u000a  },\u000a\u000a  evalScripts: function() {\u000a    return this.extractScripts().map(function(script) { return eval(script) });\u000a  },\u000a\u000a  escapeHTML: function() {\u000a    var self = arguments.callee;\u000a    self.text.data = this;\u000a    return self.div.innerHTML;\u000a  },\u000a\u000a  unescapeHTML: function() {\u000a    var div = document.createElement('div');\u000a    div.innerHTML = this.stripTags();\u000a    return div.childNodes[0] ? (div.childNodes.length > 1 ?\u000a      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :\u000a      div.childNodes[0].nodeValue) : '';\u000a  },\u000a\u000a  toQueryParams: function(separator) {\u000a    var match = this.strip().match(/([^?#]*)(#.*)?$/);\u000a    if (!match) return {};\u000a\u000a    return match[1].split(separator || '&').inject({}, function(hash, pair) {\u000a      if ((pair = pair.split('='))[0]) {\u000a        var key = decodeURIComponent(pair.shift());\u000a        var value = pair.length > 1 ? pair.join('=') : pair[0];\u000a        if (value != undefined) value = decodeURIComponent(value);\u000a\u000a        if (key in hash) {\u000a          if (hash[key].constructor != Array) hash[key] = [hash[key]];\u000a          hash[key].push(value);\u000a        }\u000a        else hash[key] = value;\u000a      }\u000a      return hash;\u000a    });\u000a  },\u000a\u000a  toArray: function() {\u000a    return this.split('');\u000a  },\u000a\u000a  succ: function() {\u000a    return this.slice(0, this.length - 1) +\u000a      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);\u000a  },\u000a\u000a  times: function(count) {\u000a    var result = '';\u000a    for (var i = 0; i < count; i++) result += this;\u000a    return result;\u000a  },\u000a\u000a  camelize: function() {\u000a    var parts = this.split('-'), len = parts.length;\u000a    if (len == 1) return parts[0];\u000a\u000a    var camelized = this.charAt(0) == '-'\u000a      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)\u000a      : parts[0];\u000a\u000a    for (var i = 1; i < len; i++)\u000a      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);\u000a\u000a    return camelized;\u000a  },\u000a\u000a  capitalize: function() {\u000a    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();\u000a  },\u000a\u000a  underscore: function() {\u000a    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();\u000a  },\u000a\u000a  dasherize: function() {\u000a    return this.gsub(/_/,'-');\u000a  },\u000a\u000a  inspect: function(useDoubleQuotes) {\u000a    var escapedString = this.gsub(/[\\x00-\\x1f\\\\]/, function(match) {\u000a      var character = String.specialChar[match[0]];\u000a      return character ? character : '\\\\u00' + match[0].charCodeAt().toPaddedString(2, 16);\u000a    });\u000a    if (useDoubleQuotes) return '\"' + escapedString.replace(/\"/g, '\\\\\"') + '\"';\u000a    return \"'\" + escapedString.replace(/'/g, '\\\\\\'') + \"'\";\u000a  },\u000a\u000a  toJSON: function() {\u000a    return this.inspect(true);\u000a  },\u000a\u000a  unfilterJSON: function(filter) {\u000a    return this.sub(filter || Prototype.JSONFilter, '#{1}');\u000a  },\u000a\u000a  isJSON: function() {\u000a    var str = this.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\u000a    return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\u000a  },\u000a\u000a  evalJSON: function(sanitize) {\u000a    var json = this.unfilterJSON();\u000a    try {\u000a      if (!sanitize || json.isJSON()) return eval('(' + json + ')');\u000a    } catch (e) { }\u000a    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());\u000a  },\u000a\u000a  include: function(pattern) {\u000a    return this.indexOf(pattern) > -1;\u000a  },\u000a\u000a  startsWith: function(pattern) {\u000a    return this.indexOf(pattern) === 0;\u000a  },\u000a\u000a  endsWith: function(pattern) {\u000a    var d = this.length - pattern.length;\u000a    return d >= 0 && this.lastIndexOf(pattern) === d;\u000a  },\u000a\u000a  empty: function() {\u000a    return this == '';\u000a  },\u000a\u000a  blank: function() {\u000a    return /^\\s*$/.test(this);\u000a  }\u000a});\u000a\u000aif (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {\u000a  escapeHTML: function() {\u000a    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');\u000a  },\u000a  unescapeHTML: function() {\u000a    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');\u000a  }\u000a});\u000a\u000aString.prototype.gsub.prepareReplacement = function(replacement) {\u000a  if (typeof replacement == 'function') return replacement;\u000a  var template = new Template(replacement);\u000a  return function(match) { return template.evaluate(match) };\u000a}\u000a\u000aString.prototype.parseQuery = String.prototype.toQueryParams;\u000a\u000aObject.extend(String.prototype.escapeHTML, {\u000a  div:  document.createElement('div'),\u000a  text: document.createTextNode('')\u000a});\u000a\u000awith (String.prototype.escapeHTML) div.appendChild(text);\u000a\u000avar Template = Class.create();\u000aTemplate.Pattern = /(^|.|\\r|\\n)(#\\{(.*?)\\})/;\u000aTemplate.prototype = {\u000a  initialize: function(template, pattern) {\u000a    this.template = template.toString();\u000a    this.pattern  = pattern || Template.Pattern;\u000a  },\u000a\u000a  evaluate: function(object) {\u000a    return this.template.gsub(this.pattern, function(match) {\u000a      var before = match[1];\u000a      if (before == '\\\\') return match[2];\u000a      return before + String.interpret(object[match[3]]);\u000a    });\u000a  }\u000a}\u000a\u000avar $break = {}, $continue = new Error('\"throw $continue\" is deprecated, use \"return\" instead');\u000a\u000avar Enumerable = {\u000a  each: function(iterator) {\u000a    var index = 0;\u000a    try {\u000a      this._each(function(value) {\u000a        iterator(value, index++);\u000a      });\u000a    } catch (e) {\u000a      if (e != $break) throw e;\u000a    }\u000a    return this;\u000a  },\u000a\u000a  eachSlice: function(number, iterator) {\u000a    var index = -number, slices = [], array = this.toArray();\u000a    while ((index += number) < array.length)\u000a      slices.push(array.slice(index, index+number));\u000a    return slices.map(iterator);\u000a  },\u000a\u000a  all: function(iterator) {\u000a    var result = true;\u000a    this.each(function(value, index) {\u000a      result = result && !!(iterator || Prototype.K)(value, index);\u000a      if (!result) throw $break;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  any: function(iterator) {\u000a    var result = false;\u000a    this.each(function(value, index) {\u000a      if (result = !!(iterator || Prototype.K)(value, index))\u000a        throw $break;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  collect: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      results.push((iterator || Prototype.K)(value, index));\u000a    });\u000a    return results;\u000a  },\u000a\u000a  detect: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      if (iterator(value, index)) {\u000a        result = value;\u000a        throw $break;\u000a      }\u000a    });\u000a    return result;\u000a  },\u000a\u000a  findAll: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      if (iterator(value, index))\u000a        results.push(value);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  grep: function(pattern, iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      var stringValue = value.toString();\u000a      if (stringValue.match(pattern))\u000a        results.push((iterator || Prototype.K)(value, index));\u000a    })\u000a    return results;\u000a  },\u000a\u000a  include: function(object) {\u000a    var found = false;\u000a    this.each(function(value) {\u000a      if (value == object) {\u000a        found = true;\u000a        throw $break;\u000a      }\u000a    });\u000a    return found;\u000a  },\u000a\u000a  inGroupsOf: function(number, fillWith) {\u000a    fillWith = fillWith === undefined ? null : fillWith;\u000a    return this.eachSlice(number, function(slice) {\u000a      while(slice.length < number) slice.push(fillWith);\u000a      return slice;\u000a    });\u000a  },\u000a\u000a  inject: function(memo, iterator) {\u000a    this.each(function(value, index) {\u000a      memo = iterator(memo, value, index);\u000a    });\u000a    return memo;\u000a  },\u000a\u000a  invoke: function(method) {\u000a    var args = $A(arguments).slice(1);\u000a    return this.map(function(value) {\u000a      return value[method].apply(value, args);\u000a    });\u000a  },\u000a\u000a  max: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      value = (iterator || Prototype.K)(value, index);\u000a      if (result == undefined || value >= result)\u000a        result = value;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  min: function(iterator) {\u000a    var result;\u000a    this.each(function(value, index) {\u000a      value = (iterator || Prototype.K)(value, index);\u000a      if (result == undefined || value < result)\u000a        result = value;\u000a    });\u000a    return result;\u000a  },\u000a\u000a  partition: function(iterator) {\u000a    var trues = [], falses = [];\u000a    this.each(function(value, index) {\u000a      ((iterator || Prototype.K)(value, index) ?\u000a        trues : falses).push(value);\u000a    });\u000a    return [trues, falses];\u000a  },\u000a\u000a  pluck: function(property) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      results.push(value[property]);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  reject: function(iterator) {\u000a    var results = [];\u000a    this.each(function(value, index) {\u000a      if (!iterator(value, index))\u000a        results.push(value);\u000a    });\u000a    return results;\u000a  },\u000a\u000a  sortBy: function(iterator) {\u000a    return this.map(function(value, index) {\u000a      return {value: value, criteria: iterator(value, index)};\u000a    }).sort(function(left, right) {\u000a      var a = left.criteria, b = right.criteria;\u000a      return a < b ? -1 : a > b ? 1 : 0;\u000a    }).pluck('value');\u000a  },\u000a\u000a  toArray: function() {\u000a    return this.map();\u000a  },\u000a\u000a  zip: function() {\u000a    var iterator = Prototype.K, args = $A(arguments);\u000a    if (typeof args.last() == 'function')\u000a      iterator = args.pop();\u000a\u000a    var collections = [this].concat(args).map($A);\u000a    return this.map(function(value, index) {\u000a      return iterator(collections.pluck(index));\u000a    });\u000a  },\u000a\u000a  size: function() {\u000a    return this.toArray().length;\u000a  },\u000a\u000a  inspect: function() {\u000a    return '#<Enumerable:' + this.toArray().inspect() + '>';\u000a  }\u000a}\u000a\u000aObject.extend(Enumerable, {\u000a  map:     Enumerable.collect,\u000a  find:    Enumerable.detect,\u000a  select:  Enumerable.findAll,\u000a  member:  Enumerable.include,\u000a  entries: Enumerable.toArray\u000a});\u000avar $A = Array.from = function(iterable) {\u000a  if (!iterable) return [];\u000a  if (iterable.toArray) {\u000a    return iterable.toArray();\u000a  } else {\u000a    var results = [];\u000a    for (var i = 0, length = iterable.length; i < length; i++)\u000a      results.push(iterable[i]);\u000a    return results;\u000a  }\u000a}\u000a\u000aif (Prototype.Browser.WebKit) {\u000a  $A = Array.from = function(iterable) {\u000a    if (!iterable) return [];\u000a    if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&\u000a      iterable.toArray) {\u000a      return iterable.toArray();\u000a    } else {\u000a      var results = [];\u000a      for (var i = 0, length = iterable.length; i < length; i++)\u000a        results.push(iterable[i]);\u000a      return results;\u000a    }\u000a  }\u000a}\u000a\u000aObject.extend(Array.prototype, Enumerable);\u000a\u000aif (!Array.prototype._reverse)\u000a  Array.prototype._reverse = Array.prototype.reverse;\u000a\u000aObject.extend(Array.prototype, {\u000a  _each: function(iterator) {\u000a    for (var i = 0, length = this.length; i < length; i++)\u000a      iterator(this[i]);\u000a  },\u000a\u000a  clear: function() {\u000a    this.length = 0;\u000a    return this;\u000a  },\u000a\u000a  first: function() {\u000a    return this[0];\u000a  },\u000a\u000a  last: function() {\u000a    return this[this.length - 1];\u000a  },\u000a\u000a  compact: function() {\u000a    return this.select(function(value) {\u000a      return value != null;\u000a    });\u000a  },\u000a\u000a  flatten: function() {\u000a    return this.inject([], function(array, value) {\u000a      return array.concat(value && value.constructor == Array ?\u000a        value.flatten() : [value]);\u000a    });\u000a  },\u000a\u000a  without: function() {\u000a    var values = $A(arguments);\u000a    return this.select(function(value) {\u000a      return !values.include(value);\u000a    });\u000a  },\u000a\u000a  indexOf: function(object) {\u000a    for (var i = 0, length = this.length; i < length; i++)\u000a      if (this[i] == object) return i;\u000a    return -1;\u000a  },\u000a\u000a  reverse: function(inline) {\u000a    return (inline !== false ? this : this.toArray())._reverse();\u000a  },\u000a\u000a  reduce: function() {\u000a    return this.length > 1 ? this : this[0];\u000a  },\u000a\u000a  uniq: function(sorted) {\u000a    return this.inject([], function(array, value, index) {\u000a      if (0 == index || (sorted ? array.last() != value : !array.include(value)))\u000a        array.push(value);\u000a      return array;\u000a    });\u000a  },\u000a\u000a  clone: function() {\u000a    return [].concat(this);\u000a  },\u000a\u000a  size: function() {\u000a    return this.length;\u000a  },\u000a\u000a  inspect: function() {\u000a    return '[' + this.map(Object.inspect).join(', ') + ']';\u000a  },\u000a\u000a  toJSON: function() {\u000a    var results = [];\u000a    this.each(function(object) {\u000a      var value = Object.toJSON(object);\u000a      if (value !== undefined) results.push(value);\u000a    });\u000a    return '[' + results.join(', ') + ']';\u000a  }\u000a});\u000a\u000aArray.prototype.toArray = Array.prototype.clone;\u000a\u000afunction $w(string) {\u000a  string = string.strip();\u000a  return string ? string.split(/\\s+/) : [];\u000a}\u000a\u000aif (Prototype.Browser.Opera){\u000a  Array.prototype.concat = function() {\u000a    var array = [];\u000a    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);\u000a    for (var i = 0, length = arguments.length; i < length; i++) {\u000a      if (arguments[i].constructor == Array) {\u000a        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)\u000a          array.push(arguments[i][j]);\u000a      } else {\u000a        array.push(arguments[i]);\u000a      }\u000a    }\u000a    return array;\u000a  }\u000a}\u000avar Hash = function(object) {\u000a  if (object instanceof Hash) this.merge(object);\u000a  else Object.extend(this, object || {});\u000a};\u000a\u000aObject.extend(Hash, {\u000a  toQueryString: function(obj) {\u000a    var parts = [];\u000a    parts.add = arguments.callee.addPair;\u000a\u000a    this.prototype._each.call(obj, function(pair) {\u000a      if (!pair.key) return;\u000a      var value = pair.value;\u000a\u000a      if (value && typeof value == 'object') {\u000a        if (value.constructor == Array) value.each(function(value) {\u000a          parts.add(pair.key, value);\u000a        });\u000a        return;\u000a      }\u000a      parts.add(pair.key, value);\u000a    });\u000a\u000a    return parts.join('&');\u000a  },\u000a\u000a  toJSON: function(object) {\u000a    var results = [];\u000a    this.prototype._each.call(object, function(pair) {\u000a      var value = Object.toJSON(pair.value);\u000a      if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value);\u000a    });\u000a    return '{' + results.join(', ') + '}';\u000a  }\u000a});\u000a\u000aHash.toQueryString.addPair = function(key, value, prefix) {\u000a  key = encodeURIComponent(key);\u000a  if (value === undefined) this.push(key);\u000a  else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value)));\u000a}\u000a\u000aObject.extend(Hash.prototype, Enumerable);\u000aObject.extend(Hash.prototype, {\u000a  _each: function(iterator) {\u000a    for (var key in this) {\u000a      var value = this[key];\u000a      if (value && value == Hash.prototype[key]) continue;\u000a\u000a      var pair = [key, value];\u000a      pair.key = key;\u000a      pair.value = value;\u000a      iterator(pair);\u000a    }\u000a  },\u000a\u000a  keys: function() {\u000a    return this.pluck('key');\u000a  },\u000a\u000a  values: function() {\u000a    return this.pluck('value');\u000a  },\u000a\u000a  merge: function(hash) {\u000a    return $H(hash).inject(this, function(mergedHash, pair) {\u000a      mergedHash[pair.key] = pair.value;\u000a      return mergedHash;\u000a    });\u000a  },\u000a\u000a  remove: function() {\u000a    var result;\u000a    for(var i = 0, length = arguments.length; i < length; i++) {\u000a      var value = this[arguments[i]];\u000a      if (value !== undefined){\u000a        if (result === undefined) result = value;\u000a        else {\u000a          if (result.constructor != Array) result = [result];\u000a          result.push(value)\u000a        }\u000a      }\u000a      delete this[arguments[i]];\u000a    }\u000a    return result;\u000a  },\u000a\u000a  toQueryString: function() {\u000a    return Hash.toQueryString(this);\u000a  },\u000a\u000a  inspect: function() {\u000a    return '#<Hash:{' + this.map(function(pair) {\u000a      return pair.map(Object.inspect).join(': ');\u000a    }).join(', ') + '}>';\u000a  },\u000a\u000a  toJSON: function() {\u000a    return Hash.toJSON(this);\u000a  }\u000a});\u000a\u000afunction $H(object) {\u000a  if (object instanceof Hash) return object;\u000a  return new Hash(object);\u000a};\u000a\u000a// Safari iterates over shadowed properties\u000aif (function() {\u000a  var i = 0, Test = function(value) { this.key = value };\u000a  Test.prototype.key = 'foo';\u000a  for (var property in new Test('bar')) i++;\u000a  return i > 1;\u000a}()) Hash.prototype._each = function(iterator) {\u000a  var cache = [];\u000a  for (var key in this) {\u000a    var value = this[key];\u000a    if ((value && value == Hash.prototype[key]) || cache.include(key)) continue;\u000a    cache.push(key);\u000a    var pair = [key, value];\u000a    pair.key = key;\u000a    pair.value = value;\u000a    iterator(pair);\u000a  }\u000a};\u000aObjectRange = Class.create();\u000aObject.extend(ObjectRange.prototype, Enumerable);\u000aObject.extend(ObjectRange.prototype, {\u000a  initialize: function(start, end, exclusive) {\u000a    this.start = start;\u000a    this.end = end;\u000a    this.exclusive = exclusive;\u000a  },\u000a\u000a  _each: function(iterator) {\u000a    var value = this.start;\u000a    while (this.include(value)) {\u000a      iterator(value);\u000a      value = value.succ();\u000a    }\u000a  },\u000a\u000a  include: function(value) {\u000a    if (value < this.start)\u000a      return false;\u000a    if (this.exclusive)\u000a      return value < this.end;\u000a    return value <= this.end;\u000a  }\u000a});\u000a\u000avar $R = function(start, end, exclusive) {\u000a  return new ObjectRange(start, end, exclusive);\u000a}\u000a\u000avar Ajax = {\u000a  getTransport: function() {\u000a    return Try.these(\u000a      function() {return new XMLHttpRequest()},\u000a      function() {return new ActiveXObject('Msxml2.XMLHTTP')},\u000a      function() {return new ActiveXObject('Microsoft.XMLHTTP')}\u000a    ) || false;\u000a  },\u000a\u000a  activeRequestCount: 0\u000a}\u000a\u000aAjax.Responders = {\u000a  responders: [],\u000a\u000a  _each: function(iterator) {\u000a    this.responders._each(iterator);\u000a  },\u000a\u000a  register: function(responder) {\u000a    if (!this.include(responder))\u000a      this.responders.push(responder);\u000a  },\u000a\u000a  unregister: function(responder) {\u000a    this.responders = this.responders.without(responder);\u000a  },\u000a\u000a  dispatch: function(callback, request, transport, json) {\u000a    this.each(function(responder) {\u000a      if (typeof responder[callback] == 'function') {\u000a        try {\u000a          responder[callback].apply(responder, [request, transport, json]);\u000a        } catch (e) {}\u000a      }\u000a    });\u000a  }\u000a};\u000a\u000aObject.extend(Ajax.Responders, Enumerable);\u000a\u000aAjax.Responders.register({\u000a  onCreate: function() {\u000a    Ajax.activeRequestCount++;\u000a  },\u000a  onComplete: function() {\u000a    Ajax.activeRequestCount--;\u000a  }\u000a});\u000a\u000aAjax.Base = function() {};\u000aAjax.Base.prototype = {\u000a  setOptions: function(options) {\u000a    this.options = {\u000a      method:       'post',\u000a      asynchronous: true,\u000a      contentType:  'application/x-www-form-urlencoded',\u000a      encoding:     'UTF-8',\u000a      parameters:   ''\u000a    }\u000a    Object.extend(this.options, options || {});\u000a\u000a    this.options.method = this.options.method.toLowerCase();\u000a    if (typeof this.options.parameters == 'string')\u000a      this.options.parameters = this.options.parameters.toQueryParams();\u000a  }\u000a}\u000a\u000aAjax.Request = Class.create();\u000aAjax.Request.Events =\u000a  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];\u000a\u000aAjax.Request.prototype = Object.extend(new Ajax.Base(), {\u000a  _complete: false,\u000a\u000a  initialize: function(url, options) {\u000a    this.transport = Ajax.getTransport();\u000a    this.setOptions(options);\u000a    this.request(url);\u000a  },\u000a\u000a  request: function(url) {\u000a    this.url = url;\u000a    this.method = this.options.method;\u000a    var params = Object.clone(this.options.parameters);\u000a\u000a    if (!['get', 'post'].include(this.method)) {\u000a      // simulate other verbs over post\u000a      params['_method'] = this.method;\u000a      this.method = 'post';\u000a    }\u000a\u000a    this.parameters = params;\u000a\u000a    if (params = Hash.toQueryString(params)) {\u000a      // when GET, append parameters to URL\u000a      if (this.method == 'get')\u000a        this.url += (this.url.include('?') ? '&' : '?') + params;\u000a      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))\u000a        params += '&_=';\u000a    }\u000a\u000a    try {\u000a      if (this.options.onCreate) this.options.onCreate(this.transport);\u000a      Ajax.Responders.dispatch('onCreate', this, this.transport);\u000a\u000a      this.transport.open(this.method.toUpperCase(), this.url,\u000a        this.options.asynchronous);\u000a\u000a      if (this.options.asynchronous)\u000a        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);\u000a\u000a      this.transport.onreadystatechange = this.onStateChange.bind(this);\u000a      this.setRequestHeaders();\u000a\u000a      this.body = this.method == 'post' ? (this.options.postBody || params) : null;\u000a      this.transport.send(this.body);\u000a\u000a      /* Force Firefox to handle ready state 4 for synchronous requests */\u000a      if (!this.options.asynchronous && this.transport.overrideMimeType)\u000a        this.onStateChange();\u000a\u000a    }\u000a    catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a  },\u000a\u000a  onStateChange: function() {\u000a    var readyState = this.transport.readyState;\u000a    if (readyState > 1 && !((readyState == 4) && this._complete))\u000a      this.respondToReadyState(this.transport.readyState);\u000a  },\u000a\u000a  setRequestHeaders: function() {\u000a    var headers = {\u000a      'X-Requested-With': 'XMLHttpRequest',\u000a      'X-Prototype-Version': Prototype.Version,\u000a      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'\u000a    };\u000a\u000a    if (this.method == 'post') {\u000a      headers['Content-type'] = this.options.contentType +\u000a        (this.options.encoding ? '; charset=' + this.options.encoding : '');\u000a\u000a      /* Force \"Connection: close\" for older Mozilla browsers to work\u000a       * around a bug where XMLHttpRequest sends an incorrect\u000a       * Content-length header. See Mozilla Bugzilla #246651.\u000a       */\u000a      if (this.transport.overrideMimeType &&\u000a          (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005)\u000a            headers['Connection'] = 'close';\u000a    }\u000a\u000a    // user-defined headers\u000a    if (typeof this.options.requestHeaders == 'object') {\u000a      var extras = this.options.requestHeaders;\u000a\u000a      if (typeof extras.push == 'function')\u000a        for (var i = 0, length = extras.length; i < length; i += 2)\u000a          headers[extras[i]] = extras[i+1];\u000a      else\u000a        $H(extras).each(function(pair) { headers[pair.key] = pair.value });\u000a    }\u000a\u000a    for (var name in headers)\u000a      this.transport.setRequestHeader(name, headers[name]);\u000a  },\u000a\u000a  success: function() {\u000a    return !this.transport.status\u000a        || (this.transport.status >= 200 && this.transport.status < 300);\u000a  },\u000a\u000a  respondToReadyState: function(readyState) {\u000a    var state = Ajax.Request.Events[readyState];\u000a    var transport = this.transport, json = this.evalJSON();\u000a\u000a    if (state == 'Complete') {\u000a      try {\u000a        this._complete = true;\u000a        (this.options['on' + this.transport.status]\u000a         || this.options['on' + (this.success() ? 'Success' : 'Failure')]\u000a         || Prototype.emptyFunction)(transport, json);\u000a      } catch (e) {\u000a        this.dispatchException(e);\u000a      }\u000a\u000a      var contentType = this.getHeader('Content-type');\u000a      if (contentType && contentType.strip().\u000a        match(/^(text|application)\\/(x-)?(java|ecma)script(;.*)?$/i))\u000a          this.evalResponse();\u000a    }\u000a\u000a    try {\u000a      (this.options['on' + state] || Prototype.emptyFunction)(transport, json);\u000a      Ajax.Responders.dispatch('on' + state, this, transport, json);\u000a    } catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a\u000a    if (state == 'Complete') {\u000a      // avoid memory leak in MSIE: clean up\u000a      this.transport.onreadystatechange = Prototype.emptyFunction;\u000a    }\u000a  },\u000a\u000a  getHeader: function(name) {\u000a    try {\u000a      return this.transport.getResponseHeader(name);\u000a    } catch (e) { return null }\u000a  },\u000a\u000a  evalJSON: function() {\u000a    try {\u000a      var json = this.getHeader('X-JSON');\u000a      return json ? json.evalJSON() : null;\u000a    } catch (e) { return null }\u000a  },\u000a\u000a  evalResponse: function() {\u000a    try {\u000a      return eval((this.transport.responseText || '').unfilterJSON());\u000a    } catch (e) {\u000a      this.dispatchException(e);\u000a    }\u000a  },\u000a\u000a  dispatchException: function(exception) {\u000a    (this.options.onException || Prototype.emptyFunction)(this, exception);\u000a    Ajax.Responders.dispatch('onException', this, exception);\u000a  }\u000a});\u000a\u000aAjax.Updater = Class.create();\u000a\u000aObject.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {\u000a  initialize: function(container, url, options) {\u000a    this.container = {\u000a      success: (container.success || container),\u000a      failure: (container.failure || (container.success ? null : container))\u000a    }\u000a\u000a    this.transport = Ajax.getTransport();\u000a    this.setOptions(options);\u000a\u000a    var onComplete = this.options.onComplete || Prototype.emptyFunction;\u000a    this.options.onComplete = (function(transport, param) {\u000a      this.updateContent();\u000a      onComplete(transport, param);\u000a    }).bind(this);\u000a\u000a    this.request(url);\u000a  },\u000a\u000a  updateContent: function() {\u000a    var receiver = this.container[this.success() ? 'success' : 'failure'];\u000a    var response = this.transport.responseText;\u000a\u000a    if (!this.options.evalScripts) response = response.stripScripts();\u000a\u000a    if (receiver = $(receiver)) {\u000a      if (this.options.insertion)\u000a        new this.options.insertion(receiver, response);\u000a      else\u000a        receiver.update(response);\u000a    }\u000a\u000a    if (this.success()) {\u000a      if (this.onComplete)\u000a        setTimeout(this.onComplete.bind(this), 10);\u000a    }\u000a  }\u000a});\u000a\u000aAjax.PeriodicalUpdater = Class.create();\u000aAjax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {\u000a  initialize: function(container, url, options) {\u000a    this.setOptions(options);\u000a    this.onComplete = this.options.onComplete;\u000a\u000a    this.frequency = (this.options.frequency || 2);\u000a    this.decay = (this.options.decay || 1);\u000a\u000a    this.updater = {};\u000a    this.container = container;\u000a    this.url = url;\u000a\u000a    this.start();\u000a  },\u000a\u000a  start: function() {\u000a    this.options.onComplete = this.updateComplete.bind(this);\u000a    this.onTimerEvent();\u000a  },\u000a\u000a  stop: function() {\u000a    this.updater.options.onComplete = undefined;\u000a    clearTimeout(this.timer);\u000a    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);\u000a  },\u000a\u000a  updateComplete: function(request) {\u000a    if (this.options.decay) {\u000a      this.decay = (request.responseText == this.lastText ?\u000a        this.decay * this.options.decay : 1);\u000a\u000a      this.lastText = request.responseText;\u000a    }\u000a    this.timer = setTimeout(this.onTimerEvent.bind(this),\u000a      this.decay * this.frequency * 1000);\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    this.updater = new Ajax.Updater(this.container, this.url, this.options);\u000a  }\u000a});\u000afunction $(element) {\u000a  if (arguments.length > 1) {\u000a    for (var i = 0, elements = [], length = arguments.length; i < length; i++)\u000a      elements.push($(arguments[i]));\u000a    return elements;\u000a  }\u000a  if (typeof element == 'string')\u000a    element = document.getElementById(element);\u000a  return Element.extend(element);\u000a}\u000a\u000aif (Prototype.BrowserFeatures.XPath) {\u000a  document._getElementsByXPath = function(expression, parentElement) {\u000a    var results = [];\u000a    var query = document.evaluate(expression, $(parentElement) || document,\u000a      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\u000a    for (var i = 0, length = query.snapshotLength; i < length; i++)\u000a      results.push(query.snapshotItem(i));\u000a    return results;\u000a  };\u000a\u000a  document.getElementsByClassName = function(className, parentElement) {\u000a    var q = \".//*[contains(concat(' ', @class, ' '), ' \" + className + \" ')]\";\u000a    return document._getElementsByXPath(q, parentElement);\u000a  }\u000a\u000a} else document.getElementsByClassName = function(className, parentElement) {\u000a  var children = ($(parentElement) || document.body).getElementsByTagName('*');\u000a  var elements = [], child, pattern = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\u000a  for (var i = 0, length = children.length; i < length; i++) {\u000a    child = children[i];\u000a    var elementClassName = child.className;\u000a    if (elementClassName.length == 0) continue;\u000a    if (elementClassName == className || elementClassName.match(pattern))\u000a      elements.push(Element.extend(child));\u000a  }\u000a  return elements;\u000a};\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aif (!window.Element) var Element = {};\u000a\u000aElement.extend = function(element) {\u000a  var F = Prototype.BrowserFeatures;\u000a  if (!element || !element.tagName || element.nodeType == 3 ||\u000a   element._extended || F.SpecificElementExtensions || element == window)\u000a    return element;\u000a\u000a  var methods = {}, tagName = element.tagName, cache = Element.extend.cache,\u000a   T = Element.Methods.ByTag;\u000a\u000a  // extend methods for all tags (Safari doesn't need this)\u000a  if (!F.ElementExtensions) {\u000a    Object.extend(methods, Element.Methods),\u000a    Object.extend(methods, Element.Methods.Simulated);\u000a  }\u000a\u000a  // extend methods for specific tags\u000a  if (T[tagName]) Object.extend(methods, T[tagName]);\u000a\u000a  for (var property in methods) {\u000a    var value = methods[property];\u000a    if (typeof value == 'function' && !(property in element))\u000a      element[property] = cache.findOrStore(value);\u000a  }\u000a\u000a  element._extended = Prototype.emptyFunction;\u000a  return element;\u000a};\u000a\u000aElement.extend.cache = {\u000a  findOrStore: function(value) {\u000a    return this[value] = this[value] || function() {\u000a      return value.apply(null, [this].concat($A(arguments)));\u000a    }\u000a  }\u000a};\u000a\u000aElement.Methods = {\u000a  visible: function(element) {\u000a    return $(element).style.display != 'none';\u000a  },\u000a\u000a  toggle: function(element) {\u000a    element = $(element);\u000a    Element[Element.visible(element) ? 'hide' : 'show'](element);\u000a    return element;\u000a  },\u000a\u000a  hide: function(element) {\u000a    $(element).style.display = 'none';\u000a    return element;\u000a  },\u000a\u000a  show: function(element) {\u000a    $(element).style.display = '';\u000a    return element;\u000a  },\u000a\u000a  remove: function(element) {\u000a    element = $(element);\u000a    element.parentNode.removeChild(element);\u000a    return element;\u000a  },\u000a\u000a  update: function(element, html) {\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    $(element).innerHTML = html.stripScripts();\u000a    setTimeout(function() {html.evalScripts()}, 10);\u000a    return element;\u000a  },\u000a\u000a  replace: function(element, html) {\u000a    element = $(element);\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    if (element.outerHTML) {\u000a      element.outerHTML = html.stripScripts();\u000a    } else {\u000a      var range = element.ownerDocument.createRange();\u000a      range.selectNodeContents(element);\u000a      element.parentNode.replaceChild(\u000a        range.createContextualFragment(html.stripScripts()), element);\u000a    }\u000a    setTimeout(function() {html.evalScripts()}, 10);\u000a    return element;\u000a  },\u000a\u000a  inspect: function(element) {\u000a    element = $(element);\u000a    var result = '<' + element.tagName.toLowerCase();\u000a    $H({'id': 'id', 'className': 'class'}).each(function(pair) {\u000a      var property = pair.first(), attribute = pair.last();\u000a      var value = (element[property] || '').toString();\u000a      if (value) result += ' ' + attribute + '=' + value.inspect(true);\u000a    });\u000a    return result + '>';\u000a  },\u000a\u000a  recursivelyCollect: function(element, property) {\u000a    element = $(element);\u000a    var elements = [];\u000a    while (element = element[property])\u000a      if (element.nodeType == 1)\u000a        elements.push(Element.extend(element));\u000a    return elements;\u000a  },\u000a\u000a  ancestors: function(element) {\u000a    return $(element).recursivelyCollect('parentNode');\u000a  },\u000a\u000a  descendants: function(element) {\u000a    return $A($(element).getElementsByTagName('*')).each(Element.extend);\u000a  },\u000a\u000a  firstDescendant: function(element) {\u000a    element = $(element).firstChild;\u000a    while (element && element.nodeType != 1) element = element.nextSibling;\u000a    return $(element);\u000a  },\u000a\u000a  immediateDescendants: function(element) {\u000a    if (!(element = $(element).firstChild)) return [];\u000a    while (element && element.nodeType != 1) element = element.nextSibling;\u000a    if (element) return [element].concat($(element).nextSiblings());\u000a    return [];\u000a  },\u000a\u000a  previousSiblings: function(element) {\u000a    return $(element).recursivelyCollect('previousSibling');\u000a  },\u000a\u000a  nextSiblings: function(element) {\u000a    return $(element).recursivelyCollect('nextSibling');\u000a  },\u000a\u000a  siblings: function(element) {\u000a    element = $(element);\u000a    return element.previousSiblings().reverse().concat(element.nextSiblings());\u000a  },\u000a\u000a  match: function(element, selector) {\u000a    if (typeof selector == 'string')\u000a      selector = new Selector(selector);\u000a    return selector.match($(element));\u000a  },\u000a\u000a  up: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(element.parentNode);\u000a    var ancestors = element.ancestors();\u000a    return expression ? Selector.findElement(ancestors, expression, index) :\u000a      ancestors[index || 0];\u000a  },\u000a\u000a  down: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return element.firstDescendant();\u000a    var descendants = element.descendants();\u000a    return expression ? Selector.findElement(descendants, expression, index) :\u000a      descendants[index || 0];\u000a  },\u000a\u000a  previous: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));\u000a    var previousSiblings = element.previousSiblings();\u000a    return expression ? Selector.findElement(previousSiblings, expression, index) :\u000a      previousSiblings[index || 0];\u000a  },\u000a\u000a  next: function(element, expression, index) {\u000a    element = $(element);\u000a    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));\u000a    var nextSiblings = element.nextSiblings();\u000a    return expression ? Selector.findElement(nextSiblings, expression, index) :\u000a      nextSiblings[index || 0];\u000a  },\u000a\u000a  getElementsBySelector: function() {\u000a    var args = $A(arguments), element = $(args.shift());\u000a    return Selector.findChildElements(element, args);\u000a  },\u000a\u000a  getElementsByClassName: function(element, className) {\u000a    return document.getElementsByClassName(className, element);\u000a  },\u000a\u000a  readAttribute: function(element, name) {\u000a    element = $(element);\u000a    if (Prototype.Browser.IE) {\u000a      if (!element.attributes) return null;\u000a      var t = Element._attributeTranslations;\u000a      if (t.values[name]) return t.values[name](element, name);\u000a      if (t.names[name])  name = t.names[name];\u000a      var attribute = element.attributes[name];\u000a      return attribute ? attribute.nodeValue : null;\u000a    }\u000a    return element.getAttribute(name);\u000a  },\u000a\u000a  getHeight: function(element) {\u000a    return $(element).getDimensions().height;\u000a  },\u000a\u000a  getWidth: function(element) {\u000a    return $(element).getDimensions().width;\u000a  },\u000a\u000a  classNames: function(element) {\u000a    return new Element.ClassNames(element);\u000a  },\u000a\u000a  hasClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    var elementClassName = element.className;\u000a    if (elementClassName.length == 0) return false;\u000a    if (elementClassName == className ||\u000a        elementClassName.match(new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\")))\u000a      return true;\u000a    return false;\u000a  },\u000a\u000a  addClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element).add(className);\u000a    return element;\u000a  },\u000a\u000a  removeClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element).remove(className);\u000a    return element;\u000a  },\u000a\u000a  toggleClassName: function(element, className) {\u000a    if (!(element = $(element))) return;\u000a    Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);\u000a    return element;\u000a  },\u000a\u000a  observe: function() {\u000a    Event.observe.apply(Event, arguments);\u000a    return $A(arguments).first();\u000a  },\u000a\u000a  stopObserving: function() {\u000a    Event.stopObserving.apply(Event, arguments);\u000a    return $A(arguments).first();\u000a  },\u000a\u000a  // removes whitespace-only text node children\u000a  cleanWhitespace: function(element) {\u000a    element = $(element);\u000a    var node = element.firstChild;\u000a    while (node) {\u000a      var nextNode = node.nextSibling;\u000a      if (node.nodeType == 3 && !/\\S/.test(node.nodeValue))\u000a        element.removeChild(node);\u000a      node = nextNode;\u000a    }\u000a    return element;\u000a  },\u000a\u000a  empty: function(element) {\u000a    return $(element).innerHTML.blank();\u000a  },\u000a\u000a  descendantOf: function(element, ancestor) {\u000a    element = $(element), ancestor = $(ancestor);\u000a    while (element = element.parentNode)\u000a      if (element == ancestor) return true;\u000a    return false;\u000a  },\u000a\u000a  scrollTo: function(element) {\u000a    element = $(element);\u000a    var pos = Position.cumulativeOffset(element);\u000a    window.scrollTo(pos[0], pos[1]);\u000a    return element;\u000a  },\u000a\u000a  getStyle: function(element, style) {\u000a    element = $(element);\u000a    style = style == 'float' ? 'cssFloat' : style.camelize();\u000a    var value = element.style[style];\u000a    if (!value) {\u000a      var css = document.defaultView.getComputedStyle(element, null);\u000a      value = css ? css[style] : null;\u000a    }\u000a    if (style == 'opacity') return value ? parseFloat(value) : 1.0;\u000a    return value == 'auto' ? null : value;\u000a  },\u000a\u000a  getOpacity: function(element) {\u000a    return $(element).getStyle('opacity');\u000a  },\u000a\u000a  setStyle: function(element, styles, camelized) {\u000a    element = $(element);\u000a    var elementStyle = element.style;\u000a\u000a    for (var property in styles)\u000a      if (property == 'opacity') element.setOpacity(styles[property])\u000a      else\u000a        elementStyle[(property == 'float' || property == 'cssFloat') ?\u000a          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :\u000a          (camelized ? property : property.camelize())] = styles[property];\u000a\u000a    return element;\u000a  },\u000a\u000a  setOpacity: function(element, value) {\u000a    element = $(element);\u000a    element.style.opacity = (value == 1 || value === '') ? '' :\u000a      (value < 0.00001) ? 0 : value;\u000a    return element;\u000a  },\u000a\u000a  getDimensions: function(element) {\u000a    element = $(element);\u000a    var display = $(element).getStyle('display');\u000a    if (display != 'none' && display != null) // Safari bug\u000a      return {width: element.offsetWidth, height: element.offsetHeight};\u000a\u000a    // All *Width and *Height properties give 0 on elements with display none,\u000a    // so enable the element temporarily\u000a    var els = element.style;\u000a    var originalVisibility = els.visibility;\u000a    var originalPosition = els.position;\u000a    var originalDisplay = els.display;\u000a    els.visibility = 'hidden';\u000a    els.position = 'absolute';\u000a    els.display = 'block';\u000a    var originalWidth = element.clientWidth;\u000a    var originalHeight = element.clientHeight;\u000a    els.display = originalDisplay;\u000a    els.position = originalPosition;\u000a    els.visibility = originalVisibility;\u000a    return {width: originalWidth, height: originalHeight};\u000a  },\u000a\u000a  makePositioned: function(element) {\u000a    element = $(element);\u000a    var pos = Element.getStyle(element, 'position');\u000a    if (pos == 'static' || !pos) {\u000a      element._madePositioned = true;\u000a      element.style.position = 'relative';\u000a      // Opera returns the offset relative to the positioning context, when an\u000a      // element is position relative but top and left have not been defined\u000a      if (window.opera) {\u000a        element.style.top = 0;\u000a        element.style.left = 0;\u000a      }\u000a    }\u000a    return element;\u000a  },\u000a\u000a  undoPositioned: function(element) {\u000a    element = $(element);\u000a    if (element._madePositioned) {\u000a      element._madePositioned = undefined;\u000a      element.style.position =\u000a        element.style.top =\u000a        element.style.left =\u000a        element.style.bottom =\u000a        element.style.right = '';\u000a    }\u000a    return element;\u000a  },\u000a\u000a  makeClipping: function(element) {\u000a    element = $(element);\u000a    if (element._overflow) return element;\u000a    element._overflow = element.style.overflow || 'auto';\u000a    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')\u000a      element.style.overflow = 'hidden';\u000a    return element;\u000a  },\u000a\u000a  undoClipping: function(element) {\u000a    element = $(element);\u000a    if (!element._overflow) return element;\u000a    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;\u000a    element._overflow = null;\u000a    return element;\u000a  }\u000a};\u000a\u000aObject.extend(Element.Methods, {\u000a  childOf: Element.Methods.descendantOf,\u000a  childElements: Element.Methods.immediateDescendants\u000a});\u000a\u000aif (Prototype.Browser.Opera) {\u000a  Element.Methods._getStyle = Element.Methods.getStyle;\u000a  Element.Methods.getStyle = function(element, style) {\u000a    switch(style) {\u000a      case 'left':\u000a      case 'top':\u000a      case 'right':\u000a      case 'bottom':\u000a        if (Element._getStyle(element, 'position') == 'static') return null;\u000a      default: return Element._getStyle(element, style);\u000a    }\u000a  };\u000a}\u000aelse if (Prototype.Browser.IE) {\u000a  Element.Methods.getStyle = function(element, style) {\u000a    element = $(element);\u000a    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();\u000a    var value = element.style[style];\u000a    if (!value && element.currentStyle) value = element.currentStyle[style];\u000a\u000a    if (style == 'opacity') {\u000a      if (value = (element.getStyle('filter') || '').match(/alpha\\(opacity=(.*)\\)/))\u000a        if (value[1]) return parseFloat(value[1]) / 100;\u000a      return 1.0;\u000a    }\u000a\u000a    if (value == 'auto') {\u000a      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))\u000a        return element['offset'+style.capitalize()] + 'px';\u000a      return null;\u000a    }\u000a    return value;\u000a  };\u000a\u000a  Element.Methods.setOpacity = function(element, value) {\u000a    element = $(element);\u000a    var filter = element.getStyle('filter'), style = element.style;\u000a    if (value == 1 || value === '') {\u000a      style.filter = filter.replace(/alpha\\([^\\)]*\\)/gi,'');\u000a      return element;\u000a    } else if (value < 0.00001) value = 0;\u000a    style.filter = filter.replace(/alpha\\([^\\)]*\\)/gi, '') +\u000a      'alpha(opacity=' + (value * 100) + ')';\u000a    return element;\u000a  };\u000a\u000a  // IE is missing .innerHTML support for TABLE-related elements\u000a  Element.Methods.update = function(element, html) {\u000a    element = $(element);\u000a    html = typeof html == 'undefined' ? '' : html.toString();\u000a    var tagName = element.tagName.toUpperCase();\u000a    if (['THEAD','TBODY','TR','TD'].include(tagName)) {\u000a      var div = document.createElement('div');\u000a      switch (tagName) {\u000a        case 'THEAD':\u000a        case 'TBODY':\u000a          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';\u000a          depth = 2;\u000a          break;\u000a        case 'TR':\u000a          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';\u000a          depth = 3;\u000a          break;\u000a        case 'TD':\u000a          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';\u000a          depth = 4;\u000a      }\u000a      $A(element.childNodes).each(function(node) { element.removeChild(node) });\u000a      depth.times(function() { div = div.firstChild });\u000a      $A(div.childNodes).each(function(node) { element.appendChild(node) });\u000a    } else {\u000a      element.innerHTML = html.stripScripts();\u000a    }\u000a    setTimeout(function() { html.evalScripts() }, 10);\u000a    return element;\u000a  }\u000a}\u000aelse if (Prototype.Browser.Gecko) {\u000a  Element.Methods.setOpacity = function(element, value) {\u000a    element = $(element);\u000a    element.style.opacity = (value == 1) ? 0.999999 :\u000a      (value === '') ? '' : (value < 0.00001) ? 0 : value;\u000a    return element;\u000a  };\u000a}\u000a\u000aElement._attributeTranslations = {\u000a  names: {\u000a    colspan:   \"colSpan\",\u000a    rowspan:   \"rowSpan\",\u000a    valign:    \"vAlign\",\u000a    datetime:  \"dateTime\",\u000a    accesskey: \"accessKey\",\u000a    tabindex:  \"tabIndex\",\u000a    enctype:   \"encType\",\u000a    maxlength: \"maxLength\",\u000a    readonly:  \"readOnly\",\u000a    longdesc:  \"longDesc\"\u000a  },\u000a  values: {\u000a    _getAttr: function(element, attribute) {\u000a      return element.getAttribute(attribute, 2);\u000a    },\u000a    _flag: function(element, attribute) {\u000a      return $(element).hasAttribute(attribute) ? attribute : null;\u000a    },\u000a    style: function(element) {\u000a      return element.style.cssText.toLowerCase();\u000a    },\u000a    title: function(element) {\u000a      var node = element.getAttributeNode('title');\u000a      return node.specified ? node.nodeValue : null;\u000a    }\u000a  }\u000a};\u000a\u000a(function() {\u000a  Object.extend(this, {\u000a    href: this._getAttr,\u000a    src:  this._getAttr,\u000a    type: this._getAttr,\u000a    disabled: this._flag,\u000a    checked:  this._flag,\u000a    readonly: this._flag,\u000a    multiple: this._flag\u000a  });\u000a}).call(Element._attributeTranslations.values);\u000a\u000aElement.Methods.Simulated = {\u000a  hasAttribute: function(element, attribute) {\u000a    var t = Element._attributeTranslations, node;\u000a    attribute = t.names[attribute] || attribute;\u000a    node = $(element).getAttributeNode(attribute);\u000a    return node && node.specified;\u000a  }\u000a};\u000a\u000aElement.Methods.ByTag = {};\u000a\u000aObject.extend(Element, Element.Methods);\u000a\u000aif (!Prototype.BrowserFeatures.ElementExtensions &&\u000a document.createElement('div').__proto__) {\u000a  window.HTMLElement = {};\u000a  window.HTMLElement.prototype = document.createElement('div').__proto__;\u000a  Prototype.BrowserFeatures.ElementExtensions = true;\u000a}\u000a\u000aElement.hasAttribute = function(element, attribute) {\u000a  if (element.hasAttribute) return element.hasAttribute(attribute);\u000a  return Element.Methods.Simulated.hasAttribute(element, attribute);\u000a};\u000a\u000aElement.addMethods = function(methods) {\u000a  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;\u000a\u000a  if (!methods) {\u000a    Object.extend(Form, Form.Methods);\u000a    Object.extend(Form.Element, Form.Element.Methods);\u000a    Object.extend(Element.Methods.ByTag, {\u000a      \"FORM\":     Object.clone(Form.Methods),\u000a      \"INPUT\":    Object.clone(Form.Element.Methods),\u000a      \"SELECT\":   Object.clone(Form.Element.Methods),\u000a      \"TEXTAREA\": Object.clone(Form.Element.Methods)\u000a    });\u000a  }\u000a\u000a  if (arguments.length == 2) {\u000a    var tagName = methods;\u000a    methods = arguments[1];\u000a  }\u000a\u000a  if (!tagName) Object.extend(Element.Methods, methods || {});\u000a  else {\u000a    if (tagName.constructor == Array) tagName.each(extend);\u000a    else extend(tagName);\u000a  }\u000a\u000a  function extend(tagName) {\u000a    tagName = tagName.toUpperCase();\u000a    if (!Element.Methods.ByTag[tagName])\u000a      Element.Methods.ByTag[tagName] = {};\u000a    Object.extend(Element.Methods.ByTag[tagName], methods);\u000a  }\u000a\u000a  function copy(methods, destination, onlyIfAbsent) {\u000a    onlyIfAbsent = onlyIfAbsent || false;\u000a    var cache = Element.extend.cache;\u000a    for (var property in methods) {\u000a      var value = methods[property];\u000a      if (!onlyIfAbsent || !(property in destination))\u000a        destination[property] = cache.findOrStore(value);\u000a    }\u000a  }\u000a\u000a  function findDOMClass(tagName) {\u000a    var klass;\u000a    var trans = {\u000a      \"OPTGROUP\": \"OptGroup\", \"TEXTAREA\": \"TextArea\", \"P\": \"Paragraph\",\u000a      \"FIELDSET\": \"FieldSet\", \"UL\": \"UList\", \"OL\": \"OList\", \"DL\": \"DList\",\u000a      \"DIR\": \"Directory\", \"H1\": \"Heading\", \"H2\": \"Heading\", \"H3\": \"Heading\",\u000a      \"H4\": \"Heading\", \"H5\": \"Heading\", \"H6\": \"Heading\", \"Q\": \"Quote\",\u000a      \"INS\": \"Mod\", \"DEL\": \"Mod\", \"A\": \"Anchor\", \"IMG\": \"Image\", \"CAPTION\":\u000a      \"TableCaption\", \"COL\": \"TableCol\", \"COLGROUP\": \"TableCol\", \"THEAD\":\u000a      \"TableSection\", \"TFOOT\": \"TableSection\", \"TBODY\": \"TableSection\", \"TR\":\u000a      \"TableRow\", \"TH\": \"TableCell\", \"TD\": \"TableCell\", \"FRAMESET\":\u000a      \"FrameSet\", \"IFRAME\": \"IFrame\"\u000a    };\u000a    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';\u000a    if (window[klass]) return window[klass];\u000a    klass = 'HTML' + tagName + 'Element';\u000a    if (window[klass]) return window[klass];\u000a    klass = 'HTML' + tagName.capitalize() + 'Element';\u000a    if (window[klass]) return window[klass];\u000a\u000a    window[klass] = {};\u000a    window[klass].prototype = document.createElement(tagName).__proto__;\u000a    return window[klass];\u000a  }\u000a\u000a  if (F.ElementExtensions) {\u000a    copy(Element.Methods, HTMLElement.prototype);\u000a    copy(Element.Methods.Simulated, HTMLElement.prototype, true);\u000a  }\u000a\u000a  if (F.SpecificElementExtensions) {\u000a    for (var tag in Element.Methods.ByTag) {\u000a      var klass = findDOMClass(tag);\u000a      if (typeof klass == \"undefined\") continue;\u000a      copy(T[tag], klass.prototype);\u000a    }\u000a  }\u000a\u000a  Object.extend(Element, Element.Methods);\u000a  delete Element.ByTag;\u000a};\u000a\u000avar Toggle = { display: Element.toggle };\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.Insertion = function(adjacency) {\u000a  this.adjacency = adjacency;\u000a}\u000a\u000aAbstract.Insertion.prototype = {\u000a  initialize: function(element, content) {\u000a    this.element = $(element);\u000a    this.content = content.stripScripts();\u000a\u000a    if (this.adjacency && this.element.insertAdjacentHTML) {\u000a      try {\u000a        this.element.insertAdjacentHTML(this.adjacency, this.content);\u000a      } catch (e) {\u000a        var tagName = this.element.tagName.toUpperCase();\u000a        if (['TBODY', 'TR'].include(tagName)) {\u000a          this.insertContent(this.contentFromAnonymousTable());\u000a        } else {\u000a          throw e;\u000a        }\u000a      }\u000a    } else {\u000a      this.range = this.element.ownerDocument.createRange();\u000a      if (this.initializeRange) this.initializeRange();\u000a      this.insertContent([this.range.createContextualFragment(this.content)]);\u000a    }\u000a\u000a    setTimeout(function() {content.evalScripts()}, 10);\u000a  },\u000a\u000a  contentFromAnonymousTable: function() {\u000a    var div = document.createElement('div');\u000a    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';\u000a    return $A(div.childNodes[0].childNodes[0].childNodes);\u000a  }\u000a}\u000a\u000avar Insertion = new Object();\u000a\u000aInsertion.Before = Class.create();\u000aInsertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {\u000a  initializeRange: function() {\u000a    this.range.setStartBefore(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.parentNode.insertBefore(fragment, this.element);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.Top = Class.create();\u000aInsertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {\u000a  initializeRange: function() {\u000a    this.range.selectNodeContents(this.element);\u000a    this.range.collapse(true);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.reverse(false).each((function(fragment) {\u000a      this.element.insertBefore(fragment, this.element.firstChild);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.Bottom = Class.create();\u000aInsertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {\u000a  initializeRange: function() {\u000a    this.range.selectNodeContents(this.element);\u000a    this.range.collapse(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.appendChild(fragment);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000aInsertion.After = Class.create();\u000aInsertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {\u000a  initializeRange: function() {\u000a    this.range.setStartAfter(this.element);\u000a  },\u000a\u000a  insertContent: function(fragments) {\u000a    fragments.each((function(fragment) {\u000a      this.element.parentNode.insertBefore(fragment,\u000a        this.element.nextSibling);\u000a    }).bind(this));\u000a  }\u000a});\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aElement.ClassNames = Class.create();\u000aElement.ClassNames.prototype = {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a  },\u000a\u000a  _each: function(iterator) {\u000a    this.element.className.split(/\\s+/).select(function(name) {\u000a      return name.length > 0;\u000a    })._each(iterator);\u000a  },\u000a\u000a  set: function(className) {\u000a    this.element.className = className;\u000a  },\u000a\u000a  add: function(classNameToAdd) {\u000a    if (this.include(classNameToAdd)) return;\u000a    this.set($A(this).concat(classNameToAdd).join(' '));\u000a  },\u000a\u000a  remove: function(classNameToRemove) {\u000a    if (!this.include(classNameToRemove)) return;\u000a    this.set($A(this).without(classNameToRemove).join(' '));\u000a  },\u000a\u000a  toString: function() {\u000a    return $A(this).join(' ');\u000a  }\u000a};\u000a\u000aObject.extend(Element.ClassNames.prototype, Enumerable);\u000a/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,\u000a * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style\u000a * license.  Please see http://www.yui-ext.com/ for more information. */\u000a\u000avar Selector = Class.create();\u000a\u000aSelector.prototype = {\u000a  initialize: function(expression) {\u000a    this.expression = expression.strip();\u000a    this.compileMatcher();\u000a  },\u000a\u000a  compileMatcher: function() {\u000a    // Selectors with namespaced attributes can't use the XPath version\u000a    if (Prototype.BrowserFeatures.XPath && !(/\\[[\\w-]*?:/).test(this.expression))\u000a      return this.compileXPathMatcher();\u000a\u000a    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,\u000a        c = Selector.criteria, le, p, m;\u000a\u000a    if (Selector._cache[e]) {\u000a      this.matcher = Selector._cache[e]; return;\u000a    }\u000a    this.matcher = [\"this.matcher = function(root) {\",\u000a                    \"var r = root, h = Selector.handlers, c = false, n;\"];\u000a\u000a    while (e && le != e && (/\\S/).test(e)) {\u000a      le = e;\u000a      for (var i in ps) {\u000a        p = ps[i];\u000a        if (m = e.match(p)) {\u000a          this.matcher.push(typeof c[i] == 'function' ? c[i](m) :\u000a    \u0009      new Template(c[i]).evaluate(m));\u000a          e = e.replace(m[0], '');\u000a          break;\u000a        }\u000a      }\u000a    }\u000a\u000a    this.matcher.push(\"return h.unique(n);\\n}\");\u000a    eval(this.matcher.join('\\n'));\u000a    Selector._cache[this.expression] = this.matcher;\u000a  },\u000a\u000a  compileXPathMatcher: function() {\u000a    var e = this.expression, ps = Selector.patterns,\u000a        x = Selector.xpath, le,  m;\u000a\u000a    if (Selector._cache[e]) {\u000a      this.xpath = Selector._cache[e]; return;\u000a    }\u000a\u000a    this.matcher = ['.//*'];\u000a    while (e && le != e && (/\\S/).test(e)) {\u000a      le = e;\u000a      for (var i in ps) {\u000a        if (m = e.match(ps[i])) {\u000a          this.matcher.push(typeof x[i] == 'function' ? x[i](m) :\u000a            new Template(x[i]).evaluate(m));\u000a          e = e.replace(m[0], '');\u000a          break;\u000a        }\u000a      }\u000a    }\u000a\u000a    this.xpath = this.matcher.join('');\u000a    Selector._cache[this.expression] = this.xpath;\u000a  },\u000a\u000a  findElements: function(root) {\u000a    root = root || document;\u000a    if (this.xpath) return document._getElementsByXPath(this.xpath, root);\u000a    return this.matcher(root);\u000a  },\u000a\u000a  match: function(element) {\u000a    return this.findElements(document).include(element);\u000a  },\u000a\u000a  toString: function() {\u000a    return this.expression;\u000a  },\u000a\u000a  inspect: function() {\u000a    return \"#<Selector:\" + this.expression.inspect() + \">\";\u000a  }\u000a};\u000a\u000aObject.extend(Selector, {\u000a  _cache: {},\u000a\u000a  xpath: {\u000a    descendant:   \"//*\",\u000a    child:        \"/*\",\u000a    adjacent:     \"/following-sibling::*[1]\",\u000a    laterSibling: '/following-sibling::*',\u000a    tagName:      function(m) {\u000a      if (m[1] == '*') return '';\u000a      return \"[local-name()='\" + m[1].toLowerCase() +\u000a             \"' or local-name()='\" + m[1].toUpperCase() + \"']\";\u000a    },\u000a    className:    \"[contains(concat(' ', @class, ' '), ' #{1} ')]\",\u000a    id:           \"[@id='#{1}']\",\u000a    attrPresence: \"[@#{1}]\",\u000a    attr: function(m) {\u000a      m[3] = m[5] || m[6];\u000a      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);\u000a    },\u000a    pseudo: function(m) {\u000a      var h = Selector.xpath.pseudos[m[1]];\u000a      if (!h) return '';\u000a      if (typeof h === 'function') return h(m);\u000a      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);\u000a    },\u000a    operators: {\u000a      '=':  \"[@#{1}='#{3}']\",\u000a      '!=': \"[@#{1}!='#{3}']\",\u000a      '^=': \"[starts-with(@#{1}, '#{3}')]\",\u000a      '$=': \"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']\",\u000a      '*=': \"[contains(@#{1}, '#{3}')]\",\u000a      '~=': \"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]\",\u000a      '|=': \"[contains(concat('-', @#{1}, '-'), '-#{3}-')]\"\u000a    },\u000a    pseudos: {\u000a      'first-child': '[not(preceding-sibling::*)]',\u000a      'last-child':  '[not(following-sibling::*)]',\u000a      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',\u000a      'empty':       \"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \\t\\r\\n', '') = '')]\",\u000a      'checked':     \"[@checked]\",\u000a      'disabled':    \"[@disabled]\",\u000a      'enabled':     \"[not(@disabled)]\",\u000a      'not': function(m) {\u000a        var e = m[6], p = Selector.patterns,\u000a            x = Selector.xpath, le, m, v;\u000a\u000a        var exclusion = [];\u000a        while (e && le != e && (/\\S/).test(e)) {\u000a          le = e;\u000a          for (var i in p) {\u000a            if (m = e.match(p[i])) {\u000a              v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m);\u000a              exclusion.push(\"(\" + v.substring(1, v.length - 1) + \")\");\u000a              e = e.replace(m[0], '');\u000a              break;\u000a            }\u000a          }\u000a        }\u000a        return \"[not(\" + exclusion.join(\" and \") + \")]\";\u000a      },\u000a      'nth-child':      function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(count(./preceding-sibling::*) + 1) \", m);\u000a      },\u000a      'nth-last-child': function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(count(./following-sibling::*) + 1) \", m);\u000a      },\u000a      'nth-of-type':    function(m) {\u000a        return Selector.xpath.pseudos.nth(\"position() \", m);\u000a      },\u000a      'nth-last-of-type': function(m) {\u000a        return Selector.xpath.pseudos.nth(\"(last() + 1 - position()) \", m);\u000a      },\u000a      'first-of-type':  function(m) {\u000a        m[6] = \"1\"; return Selector.xpath.pseudos['nth-of-type'](m);\u000a      },\u000a      'last-of-type':   function(m) {\u000a        m[6] = \"1\"; return Selector.xpath.pseudos['nth-last-of-type'](m);\u000a      },\u000a      'only-of-type':   function(m) {\u000a        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);\u000a      },\u000a      nth: function(fragment, m) {\u000a        var mm, formula = m[6], predicate;\u000a        if (formula == 'even') formula = '2n+0';\u000a        if (formula == 'odd')  formula = '2n+1';\u000a        if (mm = formula.match(/^(\\d+)$/)) // digit only\u000a          return '[' + fragment + \"= \" + mm[1] + ']';\u000a        if (mm = formula.match(/^(-?\\d*)?n(([+-])(\\d+))?/)) { // an+b\u000a          if (mm[1] == \"-\") mm[1] = -1;\u000a          var a = mm[1] ? Number(mm[1]) : 1;\u000a          var b = mm[2] ? Number(mm[2]) : 0;\u000a          predicate = \"[((#{fragment} - #{b}) mod #{a} = 0) and \" +\u000a          \"((#{fragment} - #{b}) div #{a} >= 0)]\";\u000a          return new Template(predicate).evaluate({\u000a            fragment: fragment, a: a, b: b });\u000a        }\u000a      }\u000a    }\u000a  },\u000a\u000a  criteria: {\u000a    tagName:      'n = h.tagName(n, r, \"#{1}\", c);   c = false;',\u000a    className:    'n = h.className(n, r, \"#{1}\", c); c = false;',\u000a    id:           'n = h.id(n, r, \"#{1}\", c);        c = false;',\u000a    attrPresence: 'n = h.attrPresence(n, r, \"#{1}\"); c = false;',\u000a    attr: function(m) {\u000a      m[3] = (m[5] || m[6]);\u000a      return new Template('n = h.attr(n, r, \"#{1}\", \"#{3}\", \"#{2}\"); c = false;').evaluate(m);\u000a    },\u000a    pseudo:       function(m) {\u000a      if (m[6]) m[6] = m[6].replace(/\"/g, '\\\\\"');\u000a      return new Template('n = h.pseudo(n, \"#{1}\", \"#{6}\", r, c); c = false;').evaluate(m);\u000a    },\u000a    descendant:   'c = \"descendant\";',\u000a    child:        'c = \"child\";',\u000a    adjacent:     'c = \"adjacent\";',\u000a    laterSibling: 'c = \"laterSibling\";'\u000a  },\u000a\u000a  patterns: {\u000a    // combinators must be listed first\u000a    // (and descendant needs to be last combinator)\u000a    laterSibling: /^\\s*~\\s*/,\u000a    child:        /^\\s*>\\s*/,\u000a    adjacent:     /^\\s*\\+\\s*/,\u000a    descendant:   /^\\s/,\u000a\u000a    // selectors follow\u000a    tagName:      /^\\s*(\\*|[\\w\\-]+)(\\b|$)?/,\u000a    id:           /^#([\\w\\-\\*]+)(\\b|$)/,\u000a    className:    /^\\.([\\w\\-\\*]+)(\\b|$)/,\u000a    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\\((.*?)\\))?(\\b|$|\\s|(?=:))/,\u000a    attrPresence: /^\\[([\\w]+)\\]/,\u000a    attr:         /\\[((?:[\\w-]*:)?[\\w-]+)\\s*(?:([!^$*~|]?=)\\s*((['\"])([^\\]]*?)\\4|([^'\"][^\\]]*?)))?\\]/\u000a  },\u000a\u000a  handlers: {\u000a    // UTILITY FUNCTIONS\u000a    // joins two collections\u000a    concat: function(a, b) {\u000a      for (var i = 0, node; node = b[i]; i++)\u000a        a.push(node);\u000a      return a;\u000a    },\u000a\u000a    // marks an array of nodes for counting\u000a    mark: function(nodes) {\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        node._counted = true;\u000a      return nodes;\u000a    },\u000a\u000a    unmark: function(nodes) {\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        node._counted = undefined;\u000a      return nodes;\u000a    },\u000a\u000a    // mark each child node with its position (for nth calls)\u000a    // \"ofType\" flag indicates whether we're indexing for nth-of-type\u000a    // rather than nth-child\u000a    index: function(parentNode, reverse, ofType) {\u000a      parentNode._counted = true;\u000a      if (reverse) {\u000a        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {\u000a          node = nodes[i];\u000a          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;\u000a        }\u000a      } else {\u000a        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)\u000a          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;\u000a      }\u000a    },\u000a\u000a    // filters out duplicates and extends all nodes\u000a    unique: function(nodes) {\u000a      if (nodes.length == 0) return nodes;\u000a      var results = [], n;\u000a      for (var i = 0, l = nodes.length; i < l; i++)\u000a        if (!(n = nodes[i])._counted) {\u000a          n._counted = true;\u000a          results.push(Element.extend(n));\u000a        }\u000a      return Selector.handlers.unmark(results);\u000a    },\u000a\u000a    // COMBINATOR FUNCTIONS\u000a    descendant: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        h.concat(results, node.getElementsByTagName('*'));\u000a      return results;\u000a    },\u000a\u000a    child: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)\u000a          if (child.nodeType == 1 && child.tagName != '!') results.push(child);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    adjacent: function(nodes) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        var next = this.nextElementSibling(node);\u000a        if (next) results.push(next);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    laterSibling: function(nodes) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        h.concat(results, Element.nextSiblings(node));\u000a      return results;\u000a    },\u000a\u000a    nextElementSibling: function(node) {\u000a      while (node = node.nextSibling)\u000a\u0009      if (node.nodeType == 1) return node;\u000a      return null;\u000a    },\u000a\u000a    previousElementSibling: function(node) {\u000a      while (node = node.previousSibling)\u000a        if (node.nodeType == 1) return node;\u000a      return null;\u000a    },\u000a\u000a    // TOKEN FUNCTIONS\u000a    tagName: function(nodes, root, tagName, combinator) {\u000a      tagName = tagName.toUpperCase();\u000a      var results = [], h = Selector.handlers;\u000a      if (nodes) {\u000a        if (combinator) {\u000a          // fastlane for ordinary descendant combinators\u000a          if (combinator == \"descendant\") {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              h.concat(results, node.getElementsByTagName(tagName));\u000a            return results;\u000a          } else nodes = this[combinator](nodes);\u000a          if (tagName == \"*\") return nodes;\u000a        }\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node.tagName.toUpperCase() == tagName) results.push(node);\u000a        return results;\u000a      } else return root.getElementsByTagName(tagName);\u000a    },\u000a\u000a    id: function(nodes, root, id, combinator) {\u000a      var targetNode = $(id), h = Selector.handlers;\u000a      if (!nodes && root == document) return targetNode ? [targetNode] : [];\u000a      if (nodes) {\u000a        if (combinator) {\u000a          if (combinator == 'child') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (targetNode.parentNode == node) return [targetNode];\u000a          } else if (combinator == 'descendant') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (Element.descendantOf(targetNode, node)) return [targetNode];\u000a          } else if (combinator == 'adjacent') {\u000a            for (var i = 0, node; node = nodes[i]; i++)\u000a              if (Selector.handlers.previousElementSibling(targetNode) == node)\u000a                return [targetNode];\u000a          } else nodes = h[combinator](nodes);\u000a        }\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node == targetNode) return [targetNode];\u000a        return [];\u000a      }\u000a      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];\u000a    },\u000a\u000a    className: function(nodes, root, className, combinator) {\u000a      if (nodes && combinator) nodes = this[combinator](nodes);\u000a      return Selector.handlers.byClassName(nodes, root, className);\u000a    },\u000a\u000a    byClassName: function(nodes, root, className) {\u000a      if (!nodes) nodes = Selector.handlers.descendant([root]);\u000a      var needle = ' ' + className + ' ';\u000a      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {\u000a        nodeClassName = node.className;\u000a        if (nodeClassName.length == 0) continue;\u000a        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    attrPresence: function(nodes, root, attr) {\u000a      var results = [];\u000a      for (var i = 0, node; node = nodes[i]; i++)\u000a        if (Element.hasAttribute(node, attr)) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    attr: function(nodes, root, attr, value, operator) {\u000a      if (!nodes) nodes = root.getElementsByTagName(\"*\");\u000a      var handler = Selector.operators[operator], results = [];\u000a      for (var i = 0, node; node = nodes[i]; i++) {\u000a        var nodeValue = Element.readAttribute(node, attr);\u000a        if (nodeValue === null) continue;\u000a        if (handler(nodeValue, value)) results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    pseudo: function(nodes, name, value, root, combinator) {\u000a      if (nodes && combinator) nodes = this[combinator](nodes);\u000a      if (!nodes) nodes = root.getElementsByTagName(\"*\");\u000a      return Selector.pseudos[name](nodes, value, root);\u000a    }\u000a  },\u000a\u000a  pseudos: {\u000a    'first-child': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        if (Selector.handlers.previousElementSibling(node)) continue;\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a    'last-child': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        if (Selector.handlers.nextElementSibling(node)) continue;\u000a          results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a    'only-child': function(nodes, value, root) {\u000a      var h = Selector.handlers;\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))\u000a          results.push(node);\u000a      return results;\u000a    },\u000a    'nth-child':        function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root);\u000a    },\u000a    'nth-last-child':   function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, true);\u000a    },\u000a    'nth-of-type':      function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, false, true);\u000a    },\u000a    'nth-last-of-type': function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, formula, root, true, true);\u000a    },\u000a    'first-of-type':    function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, \"1\", root, false, true);\u000a    },\u000a    'last-of-type':     function(nodes, formula, root) {\u000a      return Selector.pseudos.nth(nodes, \"1\", root, true, true);\u000a    },\u000a    'only-of-type':     function(nodes, formula, root) {\u000a      var p = Selector.pseudos;\u000a      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);\u000a    },\u000a\u000a    // handles the an+b logic\u000a    getIndices: function(a, b, total) {\u000a      if (a == 0) return b > 0 ? [b] : [];\u000a      return $R(1, total).inject([], function(memo, i) {\u000a        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);\u000a        return memo;\u000a      });\u000a    },\u000a\u000a    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type\u000a    nth: function(nodes, formula, root, reverse, ofType) {\u000a      if (nodes.length == 0) return [];\u000a      if (formula == 'even') formula = '2n+0';\u000a      if (formula == 'odd')  formula = '2n+1';\u000a      var h = Selector.handlers, results = [], indexed = [], m;\u000a      h.mark(nodes);\u000a      for (var i = 0, node; node = nodes[i]; i++) {\u000a        if (!node.parentNode._counted) {\u000a          h.index(node.parentNode, reverse, ofType);\u000a          indexed.push(node.parentNode);\u000a        }\u000a      }\u000a      if (formula.match(/^\\d+$/)) { // just a number\u000a        formula = Number(formula);\u000a        for (var i = 0, node; node = nodes[i]; i++)\u000a          if (node.nodeIndex == formula) results.push(node);\u000a      } else if (m = formula.match(/^(-?\\d*)?n(([+-])(\\d+))?/)) { // an+b\u000a        if (m[1] == \"-\") m[1] = -1;\u000a        var a = m[1] ? Number(m[1]) : 1;\u000a        var b = m[2] ? Number(m[2]) : 0;\u000a        var indices = Selector.pseudos.getIndices(a, b, nodes.length);\u000a        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {\u000a          for (var j = 0; j < l; j++)\u000a            if (node.nodeIndex == indices[j]) results.push(node);\u000a        }\u000a      }\u000a      h.unmark(nodes);\u000a      h.unmark(indexed);\u000a      return results;\u000a    },\u000a\u000a    'empty': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++) {\u000a        // IE treats comments as element nodes\u000a        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\\s*$/))) continue;\u000a        results.push(node);\u000a      }\u000a      return results;\u000a    },\u000a\u000a    'not': function(nodes, selector, root) {\u000a      var h = Selector.handlers, selectorType, m;\u000a      var exclusions = new Selector(selector).findElements(root);\u000a      h.mark(exclusions);\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!node._counted) results.push(node);\u000a      h.unmark(exclusions);\u000a      return results;\u000a    },\u000a\u000a    'enabled': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (!node.disabled) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    'disabled': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (node.disabled) results.push(node);\u000a      return results;\u000a    },\u000a\u000a    'checked': function(nodes, value, root) {\u000a      for (var i = 0, results = [], node; node = nodes[i]; i++)\u000a        if (node.checked) results.push(node);\u000a      return results;\u000a    }\u000a  },\u000a\u000a  operators: {\u000a    '=':  function(nv, v) { return nv == v; },\u000a    '!=': function(nv, v) { return nv != v; },\u000a    '^=': function(nv, v) { return nv.startsWith(v); },\u000a    '$=': function(nv, v) { return nv.endsWith(v); },\u000a    '*=': function(nv, v) { return nv.include(v); },\u000a    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },\u000a    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }\u000a  },\u000a\u000a  matchElements: function(elements, expression) {\u000a    var matches = new Selector(expression).findElements(), h = Selector.handlers;\u000a    h.mark(matches);\u000a    for (var i = 0, results = [], element; element = elements[i]; i++)\u000a      if (element._counted) results.push(element);\u000a    h.unmark(matches);\u000a    return results;\u000a  },\u000a\u000a  findElement: function(elements, expression, index) {\u000a    if (typeof expression == 'number') {\u000a      index = expression; expression = false;\u000a    }\u000a    return Selector.matchElements(elements, expression || '*')[index || 0];\u000a  },\u000a\u000a  findChildElements: function(element, expressions) {\u000a    var exprs = expressions.join(','), expressions = [];\u000a    exprs.scan(/(([\\w#:.~>+()\\s-]+|\\*|\\[.*?\\])+)\\s*(,|$)/, function(m) {\u000a      expressions.push(m[1].strip());\u000a    });\u000a    var results = [], h = Selector.handlers;\u000a    for (var i = 0, l = expressions.length, selector; i < l; i++) {\u000a      selector = new Selector(expressions[i].strip());\u000a      h.concat(results, selector.findElements(element));\u000a    }\u000a    return (l > 1) ? h.unique(results) : results;\u000a  }\u000a});\u000a\u000afunction $$() {\u000a  return Selector.findChildElements(document, $A(arguments));\u000a}\u000avar Form = {\u000a  reset: function(form) {\u000a    $(form).reset();\u000a    return form;\u000a  },\u000a\u000a  serializeElements: function(elements, getHash) {\u000a    var data = elements.inject({}, function(result, element) {\u000a      if (!element.disabled && element.name) {\u000a        var key = element.name, value = $(element).getValue();\u000a        if (value != null) {\u000a         \u0009if (key in result) {\u000a            if (result[key].constructor != Array) result[key] = [result[key]];\u000a            result[key].push(value);\u000a          }\u000a          else result[key] = value;\u000a        }\u000a      }\u000a      return result;\u000a    });\u000a\u000a    return getHash ? data : Hash.toQueryString(data);\u000a  }\u000a};\u000a\u000aForm.Methods = {\u000a  serialize: function(form, getHash) {\u000a    return Form.serializeElements(Form.getElements(form), getHash);\u000a  },\u000a\u000a  getElements: function(form) {\u000a    return $A($(form).getElementsByTagName('*')).inject([],\u000a      function(elements, child) {\u000a        if (Form.Element.Serializers[child.tagName.toLowerCase()])\u000a          elements.push(Element.extend(child));\u000a        return elements;\u000a      }\u000a    );\u000a  },\u000a\u000a  getInputs: function(form, typeName, name) {\u000a    form = $(form);\u000a    var inputs = form.getElementsByTagName('input');\u000a\u000a    if (!typeName && !name) return $A(inputs).map(Element.extend);\u000a\u000a    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {\u000a      var input = inputs[i];\u000a      if ((typeName && input.type != typeName) || (name && input.name != name))\u000a        continue;\u000a      matchingInputs.push(Element.extend(input));\u000a    }\u000a\u000a    return matchingInputs;\u000a  },\u000a\u000a  disable: function(form) {\u000a    form = $(form);\u000a    Form.getElements(form).invoke('disable');\u000a    return form;\u000a  },\u000a\u000a  enable: function(form) {\u000a    form = $(form);\u000a    Form.getElements(form).invoke('enable');\u000a    return form;\u000a  },\u000a\u000a  findFirstElement: function(form) {\u000a    return $(form).getElements().find(function(element) {\u000a      return element.type != 'hidden' && !element.disabled &&\u000a        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());\u000a    });\u000a  },\u000a\u000a  focusFirstElement: function(form) {\u000a    form = $(form);\u000a    form.findFirstElement().activate();\u000a    return form;\u000a  },\u000a\u000a  request: function(form, options) {\u000a    form = $(form), options = Object.clone(options || {});\u000a\u000a    var params = options.parameters;\u000a    options.parameters = form.serialize(true);\u000a\u000a    if (params) {\u000a      if (typeof params == 'string') params = params.toQueryParams();\u000a      Object.extend(options.parameters, params);\u000a    }\u000a\u000a    if (form.hasAttribute('method') && !options.method)\u000a      options.method = form.method;\u000a\u000a    return new Ajax.Request(form.readAttribute('action'), options);\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aForm.Element = {\u000a  focus: function(element) {\u000a    $(element).focus();\u000a    return element;\u000a  },\u000a\u000a  select: function(element) {\u000a    $(element).select();\u000a    return element;\u000a  }\u000a}\u000a\u000aForm.Element.Methods = {\u000a  serialize: function(element) {\u000a    element = $(element);\u000a    if (!element.disabled && element.name) {\u000a      var value = element.getValue();\u000a      if (value != undefined) {\u000a        var pair = {};\u000a        pair[element.name] = value;\u000a        return Hash.toQueryString(pair);\u000a      }\u000a    }\u000a    return '';\u000a  },\u000a\u000a  getValue: function(element) {\u000a    element = $(element);\u000a    var method = element.tagName.toLowerCase();\u000a    return Form.Element.Serializers[method](element);\u000a  },\u000a\u000a  clear: function(element) {\u000a    $(element).value = '';\u000a    return element;\u000a  },\u000a\u000a  present: function(element) {\u000a    return $(element).value != '';\u000a  },\u000a\u000a  activate: function(element) {\u000a    element = $(element);\u000a    try {\u000a      element.focus();\u000a      if (element.select && (element.tagName.toLowerCase() != 'input' ||\u000a        !['button', 'reset', 'submit'].include(element.type)))\u000a        element.select();\u000a    } catch (e) {}\u000a    return element;\u000a  },\u000a\u000a  disable: function(element) {\u000a    element = $(element);\u000a    element.blur();\u000a    element.disabled = true;\u000a    return element;\u000a  },\u000a\u000a  enable: function(element) {\u000a    element = $(element);\u000a    element.disabled = false;\u000a    return element;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Field = Form.Element;\u000avar $F = Form.Element.Methods.getValue;\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aForm.Element.Serializers = {\u000a  input: function(element) {\u000a    switch (element.type.toLowerCase()) {\u000a      case 'checkbox':\u000a      case 'radio':\u000a        return Form.Element.Serializers.inputSelector(element);\u000a      default:\u000a        return Form.Element.Serializers.textarea(element);\u000a    }\u000a  },\u000a\u000a  inputSelector: function(element) {\u000a    return element.checked ? element.value : null;\u000a  },\u000a\u000a  textarea: function(element) {\u000a    return element.value;\u000a  },\u000a\u000a  select: function(element) {\u000a    return this[element.type == 'select-one' ?\u000a      'selectOne' : 'selectMany'](element);\u000a  },\u000a\u000a  selectOne: function(element) {\u000a    var index = element.selectedIndex;\u000a    return index >= 0 ? this.optionValue(element.options[index]) : null;\u000a  },\u000a\u000a  selectMany: function(element) {\u000a    var values, length = element.length;\u000a    if (!length) return null;\u000a\u000a    for (var i = 0, values = []; i < length; i++) {\u000a      var opt = element.options[i];\u000a      if (opt.selected) values.push(this.optionValue(opt));\u000a    }\u000a    return values;\u000a  },\u000a\u000a  optionValue: function(opt) {\u000a    // extend element because hasAttribute may not be native\u000a    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;\u000a  }\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.TimedObserver = function() {}\u000aAbstract.TimedObserver.prototype = {\u000a  initialize: function(element, frequency, callback) {\u000a    this.frequency = frequency;\u000a    this.element   = $(element);\u000a    this.callback  = callback;\u000a\u000a    this.lastValue = this.getValue();\u000a    this.registerCallback();\u000a  },\u000a\u000a  registerCallback: function() {\u000a    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);\u000a  },\u000a\u000a  onTimerEvent: function() {\u000a    var value = this.getValue();\u000a    var changed = ('string' == typeof this.lastValue && 'string' == typeof value\u000a      ? this.lastValue != value : String(this.lastValue) != String(value));\u000a    if (changed) {\u000a      this.callback(this.element, value);\u000a      this.lastValue = value;\u000a    }\u000a  }\u000a}\u000a\u000aForm.Element.Observer = Class.create();\u000aForm.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\u000a  getValue: function() {\u000a    return Form.Element.getValue(this.element);\u000a  }\u000a});\u000a\u000aForm.Observer = Class.create();\u000aForm.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {\u000a  getValue: function() {\u000a    return Form.serialize(this.element);\u000a  }\u000a});\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aAbstract.EventObserver = function() {}\u000aAbstract.EventObserver.prototype = {\u000a  initialize: function(element, callback) {\u000a    this.element  = $(element);\u000a    this.callback = callback;\u000a\u000a    this.lastValue = this.getValue();\u000a    if (this.element.tagName.toLowerCase() == 'form')\u000a      this.registerFormCallbacks();\u000a    else\u000a      this.registerCallback(this.element);\u000a  },\u000a\u000a  onElementEvent: function() {\u000a    var value = this.getValue();\u000a    if (this.lastValue != value) {\u000a      this.callback(this.element, value);\u000a      this.lastValue = value;\u000a    }\u000a  },\u000a\u000a  registerFormCallbacks: function() {\u000a    Form.getElements(this.element).each(this.registerCallback.bind(this));\u000a  },\u000a\u000a  registerCallback: function(element) {\u000a    if (element.type) {\u000a      switch (element.type.toLowerCase()) {\u000a        case 'checkbox':\u000a        case 'radio':\u000a          Event.observe(element, 'click', this.onElementEvent.bind(this));\u000a          break;\u000a        default:\u000a          Event.observe(element, 'change', this.onElementEvent.bind(this));\u000a          break;\u000a      }\u000a    }\u000a  }\u000a}\u000a\u000aForm.Element.EventObserver = Class.create();\u000aForm.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\u000a  getValue: function() {\u000a    return Form.Element.getValue(this.element);\u000a  }\u000a});\u000a\u000aForm.EventObserver = Class.create();\u000aForm.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {\u000a  getValue: function() {\u000a    return Form.serialize(this.element);\u000a  }\u000a});\u000aif (!window.Event) {\u000a  var Event = new Object();\u000a}\u000a\u000aObject.extend(Event, {\u000a  KEY_BACKSPACE: 8,\u000a  KEY_TAB:       9,\u000a  KEY_RETURN:   13,\u000a  KEY_ESC:      27,\u000a  KEY_LEFT:     37,\u000a  KEY_UP:       38,\u000a  KEY_RIGHT:    39,\u000a  KEY_DOWN:     40,\u000a  KEY_DELETE:   46,\u000a  KEY_HOME:     36,\u000a  KEY_END:      35,\u000a  KEY_PAGEUP:   33,\u000a  KEY_PAGEDOWN: 34,\u000a\u000a  element: function(event) {\u000a    return $(event.target || event.srcElement);\u000a  },\u000a\u000a  isLeftClick: function(event) {\u000a    return (((event.which) && (event.which == 1)) ||\u000a            ((event.button) && (event.button == 1)));\u000a  },\u000a\u000a  pointerX: function(event) {\u000a    return event.pageX || (event.clientX +\u000a      (document.documentElement.scrollLeft || document.body.scrollLeft));\u000a  },\u000a\u000a  pointerY: function(event) {\u000a    return event.pageY || (event.clientY +\u000a      (document.documentElement.scrollTop || document.body.scrollTop));\u000a  },\u000a\u000a  stop: function(event) {\u000a    if (event.preventDefault) {\u000a      event.preventDefault();\u000a      event.stopPropagation();\u000a    } else {\u000a      event.returnValue = false;\u000a      event.cancelBubble = true;\u000a    }\u000a  },\u000a\u000a  // find the first node with the given tagName, starting from the\u000a  // node the event was triggered on; traverses the DOM upwards\u000a  findElement: function(event, tagName) {\u000a    var element = Event.element(event);\u000a    while (element.parentNode && (!element.tagName ||\u000a        (element.tagName.toUpperCase() != tagName.toUpperCase())))\u000a      element = element.parentNode;\u000a    return element;\u000a  },\u000a\u000a  observers: false,\u000a\u000a  _observeAndCache: function(element, name, observer, useCapture) {\u000a    if (!this.observers) this.observers = [];\u000a    if (element.addEventListener) {\u000a      this.observers.push([element, name, observer, useCapture]);\u000a      element.addEventListener(name, observer, useCapture);\u000a    } else if (element.attachEvent) {\u000a      this.observers.push([element, name, observer, useCapture]);\u000a      element.attachEvent('on' + name, observer);\u000a    }\u000a  },\u000a\u000a  unloadCache: function() {\u000a    if (!Event.observers) return;\u000a    for (var i = 0, length = Event.observers.length; i < length; i++) {\u000a      Event.stopObserving.apply(this, Event.observers[i]);\u000a      Event.observers[i][0] = null;\u000a    }\u000a    Event.observers = false;\u000a  },\u000a\u000a  observe: function(element, name, observer, useCapture) {\u000a    element = $(element);\u000a    useCapture = useCapture || false;\u000a\u000a    if (name == 'keypress' &&\u000a      (Prototype.Browser.WebKit || element.attachEvent))\u000a      name = 'keydown';\u000a\u000a    Event._observeAndCache(element, name, observer, useCapture);\u000a  },\u000a\u000a  stopObserving: function(element, name, observer, useCapture) {\u000a    element = $(element);\u000a    useCapture = useCapture || false;\u000a\u000a    if (name == 'keypress' &&\u000a        (Prototype.Browser.WebKit || element.attachEvent))\u000a      name = 'keydown';\u000a\u000a    if (element.removeEventListener) {\u000a      element.removeEventListener(name, observer, useCapture);\u000a    } else if (element.detachEvent) {\u000a      try {\u000a        element.detachEvent('on' + name, observer);\u000a      } catch (e) {}\u000a    }\u000a  }\u000a});\u000a\u000a/* prevent memory leaks in IE */\u000aif (Prototype.Browser.IE)\u000a  Event.observe(window, 'unload', Event.unloadCache, false);\u000avar Position = {\u000a  // set to true if needed, warning: firefox performance problems\u000a  // NOT neeeded for page scrolling, only if draggable contained in\u000a  // scrollable elements\u000a  includeScrollOffsets: false,\u000a\u000a  // must be called before calling withinIncludingScrolloffset, every time the\u000a  // page is scrolled\u000a  prepare: function() {\u000a    this.deltaX =  window.pageXOffset\u000a                || document.documentElement.scrollLeft\u000a                || document.body.scrollLeft\u000a                || 0;\u000a    this.deltaY =  window.pageYOffset\u000a                || document.documentElement.scrollTop\u000a                || document.body.scrollTop\u000a                || 0;\u000a  },\u000a\u000a  realOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.scrollTop  || 0;\u000a      valueL += element.scrollLeft || 0;\u000a      element = element.parentNode;\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  cumulativeOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      element = element.offsetParent;\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  positionedOffset: function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      element = element.offsetParent;\u000a      if (element) {\u000a        if(element.tagName=='BODY') break;\u000a        var p = Element.getStyle(element, 'position');\u000a        if (p == 'relative' || p == 'absolute') break;\u000a      }\u000a    } while (element);\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  offsetParent: function(element) {\u000a    if (element.offsetParent) return element.offsetParent;\u000a    if (element == document.body) return element;\u000a\u000a    while ((element = element.parentNode) && element != document.body)\u000a      if (Element.getStyle(element, 'position') != 'static')\u000a        return element;\u000a\u000a    return document.body;\u000a  },\u000a\u000a  // caches x/y coordinate pair to use with overlap\u000a  within: function(element, x, y) {\u000a    if (this.includeScrollOffsets)\u000a      return this.withinIncludingScrolloffsets(element, x, y);\u000a    this.xcomp = x;\u000a    this.ycomp = y;\u000a    this.offset = this.cumulativeOffset(element);\u000a\u000a    return (y >= this.offset[1] &&\u000a            y <  this.offset[1] + element.offsetHeight &&\u000a            x >= this.offset[0] &&\u000a            x <  this.offset[0] + element.offsetWidth);\u000a  },\u000a\u000a  withinIncludingScrolloffsets: function(element, x, y) {\u000a    var offsetcache = this.realOffset(element);\u000a\u000a    this.xcomp = x + offsetcache[0] - this.deltaX;\u000a    this.ycomp = y + offsetcache[1] - this.deltaY;\u000a    this.offset = this.cumulativeOffset(element);\u000a\u000a    return (this.ycomp >= this.offset[1] &&\u000a            this.ycomp <  this.offset[1] + element.offsetHeight &&\u000a            this.xcomp >= this.offset[0] &&\u000a            this.xcomp <  this.offset[0] + element.offsetWidth);\u000a  },\u000a\u000a  // within must be called directly before\u000a  overlap: function(mode, element) {\u000a    if (!mode) return 0;\u000a    if (mode == 'vertical')\u000a      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /\u000a        element.offsetHeight;\u000a    if (mode == 'horizontal')\u000a      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /\u000a        element.offsetWidth;\u000a  },\u000a\u000a  page: function(forElement) {\u000a    var valueT = 0, valueL = 0;\u000a\u000a    var element = forElement;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a\u000a      // Safari fix\u000a      if (element.offsetParent == document.body)\u000a        if (Element.getStyle(element,'position')=='absolute') break;\u000a\u000a    } while (element = element.offsetParent);\u000a\u000a    element = forElement;\u000a    do {\u000a      if (!window.opera || element.tagName=='BODY') {\u000a        valueT -= element.scrollTop  || 0;\u000a        valueL -= element.scrollLeft || 0;\u000a      }\u000a    } while (element = element.parentNode);\u000a\u000a    return [valueL, valueT];\u000a  },\u000a\u000a  clone: function(source, target) {\u000a    var options = Object.extend({\u000a      setLeft:    true,\u000a      setTop:     true,\u000a      setWidth:   true,\u000a      setHeight:  true,\u000a      offsetTop:  0,\u000a      offsetLeft: 0\u000a    }, arguments[2] || {})\u000a\u000a    // find page position of source\u000a    source = $(source);\u000a    var p = Position.page(source);\u000a\u000a    // find coordinate system to use\u000a    target = $(target);\u000a    var delta = [0, 0];\u000a    var parent = null;\u000a    // delta [0,0] will do fine with position: fixed elements,\u000a    // position:absolute needs offsetParent deltas\u000a    if (Element.getStyle(target,'position') == 'absolute') {\u000a      parent = Position.offsetParent(target);\u000a      delta = Position.page(parent);\u000a    }\u000a\u000a    // correct by body offsets (fixes Safari)\u000a    if (parent == document.body) {\u000a      delta[0] -= document.body.offsetLeft;\u000a      delta[1] -= document.body.offsetTop;\u000a    }\u000a\u000a    // set position\u000a    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';\u000a    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';\u000a    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';\u000a    if(options.setHeight) target.style.height = source.offsetHeight + 'px';\u000a  },\u000a\u000a  absolutize: function(element) {\u000a    element = $(element);\u000a    if (element.style.position == 'absolute') return;\u000a    Position.prepare();\u000a\u000a    var offsets = Position.positionedOffset(element);\u000a    var top     = offsets[1];\u000a    var left    = offsets[0];\u000a    var width   = element.clientWidth;\u000a    var height  = element.clientHeight;\u000a\u000a    element._originalLeft   = left - parseFloat(element.style.left  || 0);\u000a    element._originalTop    = top  - parseFloat(element.style.top || 0);\u000a    element._originalWidth  = element.style.width;\u000a    element._originalHeight = element.style.height;\u000a\u000a    element.style.position = 'absolute';\u000a    element.style.top    = top + 'px';\u000a    element.style.left   = left + 'px';\u000a    element.style.width  = width + 'px';\u000a    element.style.height = height + 'px';\u000a  },\u000a\u000a  relativize: function(element) {\u000a    element = $(element);\u000a    if (element.style.position == 'relative') return;\u000a    Position.prepare();\u000a\u000a    element.style.position = 'relative';\u000a    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);\u000a    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);\u000a\u000a    element.style.top    = top + 'px';\u000a    element.style.left   = left + 'px';\u000a    element.style.height = element._originalHeight;\u000a    element.style.width  = element._originalWidth;\u000a  }\u000a}\u000a\u000a// Safari returns margins on body which is incorrect if the child is absolutely\u000a// positioned.  For performance reasons, redefine Position.cumulativeOffset for\u000a// KHTML/WebKit only.\u000aif (Prototype.Browser.WebKit) {\u000a  Position.cumulativeOffset = function(element) {\u000a    var valueT = 0, valueL = 0;\u000a    do {\u000a      valueT += element.offsetTop  || 0;\u000a      valueL += element.offsetLeft || 0;\u000a      if (element.offsetParent == document.body)\u000a        if (Element.getStyle(element, 'position') == 'absolute') break;\u000a\u000a      element = element.offsetParent;\u000a    } while (element);\u000a\u000a    return [valueL, valueT];\u000a  }\u000a}\u000a\u000aElement.addMethods();"
          },
          "redirectURL":"",
          "headersSize":234,
          "bodySize":96311
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-05T08:53:58.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":45,
          "blocked":0,
          "send":0,
          "wait":71,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.130+02:00",
        "time":112,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/scriptaculous.js?ver=1.7.1-b3",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Tue, 05 Feb 2008 14:05:28 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"12068-a41-bb979a00\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.7.1-b3"
            }
          ],
          "headersSize":785,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Etag",
              "value":"\"12068-a41-bb979a00\""
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:32 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            }
          ],
          "content":{
            "size":2625,
            "mimeType":"application/javascript",
            "text":"// script.aculo.us scriptaculous.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007\u000a\u000a// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\u000a// \u000a// Permission is hereby granted, free of charge, to any person obtaining\u000a// a copy of this software and associated documentation files (the\u000a// \"Software\"), to deal in the Software without restriction, including\u000a// without limitation the rights to use, copy, modify, merge, publish,\u000a// distribute, sublicense, and/or sell copies of the Software, and to\u000a// permit persons to whom the Software is furnished to do so, subject to\u000a// the following conditions:\u000a// \u000a// The above copyright notice and this permission notice shall be\u000a// included in all copies or substantial portions of the Software.\u000a//\u000a// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\u000a// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\u000a// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\u000a// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\u000a// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\u000a// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\u000a// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\u000a//\u000a// For details, see the script.aculo.us web site: http://script.aculo.us/\u000a\u000avar Scriptaculous = {\u000a  Version: '1.7.1_beta3',\u000a  require: function(libraryName) {\u000a    // inserting via DOM fails in Safari 2.0, so brute force approach\u000a    document.write('<script type=\"text/javascript\" src=\"'+libraryName+'\"></script>');\u000a  },\u000a  REQUIRED_PROTOTYPE: '1.5.1',\u000a  load: function() {\u000a    function convertVersionString(versionString){\u000a      var r = versionString.split('.');\u000a      return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);\u000a    }\u000a \u000a    if((typeof Prototype=='undefined') || \u000a       (typeof Element == 'undefined') || \u000a       (typeof Element.Methods=='undefined') ||\u000a       (convertVersionString(Prototype.Version) < \u000a        convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))\u000a       throw(\"script.aculo.us requires the Prototype JavaScript framework >= \" +\u000a        Scriptaculous.REQUIRED_PROTOTYPE);\u000a    \u000a    $A(document.getElementsByTagName(\"script\")).findAll( function(s) {\u000a      return (s.src && s.src.match(/scriptaculous\\.js(\\?.*)?$/))\u000a    }).each( function(s) {\u000a      var path = s.src.replace(/scriptaculous\\.js(\\?.*)?$/,'');\u000a      var includes = s.src.match(/\\?.*load=([a-z,]*)/);\u000a      if ( includes )\u000a       includes[1].split(',').each(\u000a       function(include) { Scriptaculous.require(path+include+'.js') });\u000a    });\u000a  }\u000a}\u000a\u000aScriptaculous.load();\u000a"
          },
          "redirectURL":"",
          "headersSize":232,
          "bodySize":2625
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-05T08:53:58.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":41,
          "blocked":0,
          "send":0,
          "wait":71,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.131+02:00",
        "time":127,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/js/scriptaculous/effects.js?ver=1.7.1-b3",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Tue, 05 Feb 2008 14:05:26 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"12065-9554-bb791580\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[{
              "name":"ver",
              "value":"1.7.1-b3"
            }
          ],
          "headersSize":780,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Etag",
              "value":"\"12065-9554-bb791580\""
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:32 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            }
          ],
          "content":{
            "size":38228,
            "mimeType":"application/javascript",
            "text":"// script.aculo.us effects.js v1.7.1_beta3, Fri May 25 17:19:41 +0200 2007\u000a\u000a// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)\u000a// Contributors:\u000a//  Justin Palmer (http://encytemedia.com/)\u000a//  Mark Pilgrim (http://diveintomark.org/)\u000a//  Martin Bialasinki\u000a// \u000a// script.aculo.us is freely distributable under the terms of an MIT-style license.\u000a// For details, see the script.aculo.us web site: http://script.aculo.us/ \u000a\u000a// converts rgb() and #xxx to #xxxxxx format,  \u000a// returns self (or first argument) if not convertable  \u000aString.prototype.parseColor = function() {  \u000a  var color = '#';\u000a  if(this.slice(0,4) == 'rgb(') {  \u000a    var cols = this.slice(4,this.length-1).split(',');  \u000a    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  \u000a  } else {  \u000a    if(this.slice(0,1) == '#') {  \u000a      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  \u000a      if(this.length==7) color = this.toLowerCase();  \u000a    }  \u000a  }  \u000a  return(color.length==7 ? color : (arguments[0] || this));  \u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aElement.collectTextNodes = function(element) {  \u000a  return $A($(element).childNodes).collect( function(node) {\u000a    return (node.nodeType==3 ? node.nodeValue : \u000a      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));\u000a  }).flatten().join('');\u000a}\u000a\u000aElement.collectTextNodesIgnoreClass = function(element, className) {  \u000a  return $A($(element).childNodes).collect( function(node) {\u000a    return (node.nodeType==3 ? node.nodeValue : \u000a      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? \u000a        Element.collectTextNodesIgnoreClass(node, className) : ''));\u000a  }).flatten().join('');\u000a}\u000a\u000aElement.setContentZoom = function(element, percent) {\u000a  element = $(element);  \u000a  element.setStyle({fontSize: (percent/100) + 'em'});   \u000a  if(Prototype.Browser.WebKit) window.scrollBy(0,0);\u000a  return element;\u000a}\u000a\u000aElement.getInlineOpacity = function(element){\u000a  return $(element).style.opacity || '';\u000a}\u000a\u000aElement.forceRerendering = function(element) {\u000a  try {\u000a    element = $(element);\u000a    var n = document.createTextNode(' ');\u000a    element.appendChild(n);\u000a    element.removeChild(n);\u000a  } catch(e) { }\u000a};\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000aArray.prototype.call = function() {\u000a  var args = arguments;\u000a  this.each(function(f){ f.apply(this, args) });\u000a}\u000a\u000a/*--------------------------------------------------------------------------*/\u000a\u000avar Effect = {\u000a  _elementDoesNotExistError: {\u000a    name: 'ElementDoesNotExistError',\u000a    message: 'The specified DOM element does not exist, but is required for this effect to operate'\u000a  },\u000a  tagifyText: function(element) {\u000a    if(typeof Builder == 'undefined')\u000a      throw(\"Effect.tagifyText requires including script.aculo.us' builder.js library\");\u000a      \u000a    var tagifyStyle = 'position:relative';\u000a    if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';\u000a    \u000a    element = $(element);\u000a    $A(element.childNodes).each( function(child) {\u000a      if(child.nodeType==3) {\u000a        child.nodeValue.toArray().each( function(character) {\u000a          element.insertBefore(\u000a            Builder.node('span',{style: tagifyStyle},\u000a              character == ' ' ? String.fromCharCode(160) : character), \u000a              child);\u000a        });\u000a        Element.remove(child);\u000a      }\u000a    });\u000a  },\u000a  multiple: function(element, effect) {\u000a    var elements;\u000a    if(((typeof element == 'object') || \u000a        (typeof element == 'function')) && \u000a       (element.length))\u000a      elements = element;\u000a    else\u000a      elements = $(element).childNodes;\u000a      \u000a    var options = Object.extend({\u000a      speed: 0.1,\u000a      delay: 0.0\u000a    }, arguments[2] || {});\u000a    var masterDelay = options.delay;\u000a\u000a    $A(elements).each( function(element, index) {\u000a      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));\u000a    });\u000a  },\u000a  PAIRS: {\u000a    'slide':  ['SlideDown','SlideUp'],\u000a    'blind':  ['BlindDown','BlindUp'],\u000a    'appear': ['Appear','Fade']\u000a  },\u000a  toggle: function(element, effect) {\u000a    element = $(element);\u000a    effect = (effect || 'appear').toLowerCase();\u000a    var options = Object.extend({\u000a      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }\u000a    }, arguments[2] || {});\u000a    Effect[element.visible() ? \u000a      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);\u000a  }\u000a};\u000a\u000avar Effect2 = Effect; // deprecated\u000a\u000a/* ------------- transitions ------------- */\u000a\u000aEffect.Transitions = {\u000a  linear: Prototype.K,\u000a  sinoidal: function(pos) {\u000a    return (-Math.cos(pos*Math.PI)/2) + 0.5;\u000a  },\u000a  reverse: function(pos) {\u000a    return 1-pos;\u000a  },\u000a  flicker: function(pos) {\u000a    var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;\u000a    return (pos > 1 ? 1 : pos);\u000a  },\u000a  wobble: function(pos) {\u000a    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;\u000a  },\u000a  pulse: function(pos, pulses) { \u000a    pulses = pulses || 5; \u000a    return (\u000a      Math.round((pos % (1/pulses)) * pulses) == 0 ? \u000a            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : \u000a        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))\u000a      );\u000a  },\u000a  none: function(pos) {\u000a    return 0;\u000a  },\u000a  full: function(pos) {\u000a    return 1;\u000a  }\u000a};\u000a\u000a/* ------------- core effects ------------- */\u000a\u000aEffect.ScopedQueue = Class.create();\u000aObject.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {\u000a  initialize: function() {\u000a    this.effects  = [];\u000a    this.interval = null;    \u000a  },\u000a  _each: function(iterator) {\u000a    this.effects._each(iterator);\u000a  },\u000a  add: function(effect) {\u000a    var timestamp = new Date().getTime();\u000a    \u000a    var position = (typeof effect.options.queue == 'string') ? \u000a      effect.options.queue : effect.options.queue.position;\u000a    \u000a    switch(position) {\u000a      case 'front':\u000a        // move unstarted effects after this effect  \u000a        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {\u000a            e.startOn  += effect.finishOn;\u000a            e.finishOn += effect.finishOn;\u000a          });\u000a        break;\u000a      case 'with-last':\u000a        timestamp = this.effects.pluck('startOn').max() || timestamp;\u000a        break;\u000a      case 'end':\u000a        // start effect after last queued effect has finished\u000a        timestamp = this.effects.pluck('finishOn').max() || timestamp;\u000a        break;\u000a    }\u000a    \u000a    effect.startOn  += timestamp;\u000a    effect.finishOn += timestamp;\u000a\u000a    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))\u000a      this.effects.push(effect);\u000a    \u000a    if(!this.interval)\u000a      this.interval = setInterval(this.loop.bind(this), 15);\u000a  },\u000a  remove: function(effect) {\u000a    this.effects = this.effects.reject(function(e) { return e==effect });\u000a    if(this.effects.length == 0) {\u000a      clearInterval(this.interval);\u000a      this.interval = null;\u000a    }\u000a  },\u000a  loop: function() {\u000a    var timePos = new Date().getTime();\u000a    for(var i=0, len=this.effects.length;i<len;i++) \u000a      this.effects[i] && this.effects[i].loop(timePos);\u000a  }\u000a});\u000a\u000aEffect.Queues = {\u000a  instances: $H(),\u000a  get: function(queueName) {\u000a    if(typeof queueName != 'string') return queueName;\u000a    \u000a    if(!this.instances[queueName])\u000a      this.instances[queueName] = new Effect.ScopedQueue();\u000a      \u000a    return this.instances[queueName];\u000a  }\u000a}\u000aEffect.Queue = Effect.Queues.get('global');\u000a\u000aEffect.DefaultOptions = {\u000a  transition: Effect.Transitions.sinoidal,\u000a  duration:   1.0,   // seconds\u000a  fps:        100,   // 100= assume 66fps max.\u000a  sync:       false, // true for combining\u000a  from:       0.0,\u000a  to:         1.0,\u000a  delay:      0.0,\u000a  queue:      'parallel'\u000a}\u000a\u000aEffect.Base = function() {};\u000aEffect.Base.prototype = {\u000a  position: null,\u000a  start: function(options) {\u000a    function codeForEvent(options,eventName){\u000a      return (\u000a        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +\u000a        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')\u000a      );\u000a    }\u000a    if(options.transition === false) options.transition = Effect.Transitions.linear;\u000a    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});\u000a    this.currentFrame = 0;\u000a    this.state        = 'idle';\u000a    this.startOn      = this.options.delay*1000;\u000a    this.finishOn     = this.startOn+(this.options.duration*1000);\u000a    this.fromToDelta  = this.options.to-this.options.from;\u000a    this.totalTime    = this.finishOn-this.startOn;\u000a    this.totalFrames  = this.options.fps*this.options.duration;\u000a    \u000a    eval('this.render = function(pos){ '+\u000a      'if(this.state==\"idle\"){this.state=\"running\";'+\u000a      codeForEvent(options,'beforeSetup')+\u000a      (this.setup ? 'this.setup();':'')+ \u000a      codeForEvent(options,'afterSetup')+\u000a      '};if(this.state==\"running\"){'+\u000a      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+\u000a      'this.position=pos;'+\u000a      codeForEvent(options,'beforeUpdate')+\u000a      (this.update ? 'this.update(pos);':'')+\u000a      codeForEvent(options,'afterUpdate')+\u000a      '}}');\u000a    \u000a    this.event('beforeStart');\u000a    if(!this.options.sync)\u000a      Effect.Queues.get(typeof this.options.queue == 'string' ? \u000a        'global' : this.options.queue.scope).add(this);\u000a  },\u000a  loop: function(timePos) {\u000a    if(timePos >= this.startOn) {\u000a      if(timePos >= this.finishOn) {\u000a        this.render(1.0);\u000a        this.cancel();\u000a        this.event('beforeFinish');\u000a        if(this.finish) this.finish(); \u000a        this.event('afterFinish');\u000a        return;  \u000a      }\u000a      var pos   = (timePos - this.startOn) / this.totalTime,\u000a          frame = Math.round(pos * this.totalFrames);\u000a      if(frame > this.currentFrame) {\u000a        this.render(pos);\u000a        this.currentFrame = frame;\u000a      }\u000a    }\u000a  },\u000a  cancel: function() {\u000a    if(!this.options.sync)\u000a      Effect.Queues.get(typeof this.options.queue == 'string' ? \u000a        'global' : this.options.queue.scope).remove(this);\u000a    this.state = 'finished';\u000a  },\u000a  event: function(eventName) {\u000a    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);\u000a    if(this.options[eventName]) this.options[eventName](this);\u000a  },\u000a  inspect: function() {\u000a    var data = $H();\u000a    for(property in this)\u000a      if(typeof this[property] != 'function') data[property] = this[property];\u000a    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';\u000a  }\u000a}\u000a\u000aEffect.Parallel = Class.create();\u000aObject.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {\u000a  initialize: function(effects) {\u000a    this.effects = effects || [];\u000a    this.start(arguments[1]);\u000a  },\u000a  update: function(position) {\u000a    this.effects.invoke('render', position);\u000a  },\u000a  finish: function(position) {\u000a    this.effects.each( function(effect) {\u000a      effect.render(1.0);\u000a      effect.cancel();\u000a      effect.event('beforeFinish');\u000a      if(effect.finish) effect.finish(position);\u000a      effect.event('afterFinish');\u000a    });\u000a  }\u000a});\u000a\u000aEffect.Event = Class.create();\u000aObject.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {\u000a  initialize: function() {\u000a    var options = Object.extend({\u000a      duration: 0\u000a    }, arguments[0] || {});\u000a    this.start(options);\u000a  },\u000a  update: Prototype.emptyFunction\u000a});\u000a\u000aEffect.Opacity = Class.create();\u000aObject.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    // make this work on IE on elements without 'layout'\u000a    if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))\u000a      this.element.setStyle({zoom: 1});\u000a    var options = Object.extend({\u000a      from: this.element.getOpacity() || 0.0,\u000a      to:   1.0\u000a    }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  update: function(position) {\u000a    this.element.setOpacity(position);\u000a  }\u000a});\u000a\u000aEffect.Move = Class.create();\u000aObject.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      x:    0,\u000a      y:    0,\u000a      mode: 'relative'\u000a    }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    // Bug in Opera: Opera returns the \"real\" position of a static element or\u000a    // relative element that does not have top/left explicitly set.\u000a    // ==> Always set top and left for position relative elements in your stylesheets \u000a    // (to 0 if you do not need them) \u000a    this.element.makePositioned();\u000a    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');\u000a    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');\u000a    if(this.options.mode == 'absolute') {\u000a      // absolute movement, so we need to calc deltaX and deltaY\u000a      this.options.x = this.options.x - this.originalLeft;\u000a      this.options.y = this.options.y - this.originalTop;\u000a    }\u000a  },\u000a  update: function(position) {\u000a    this.element.setStyle({\u000a      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',\u000a      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'\u000a    });\u000a  }\u000a});\u000a\u000a// for backwards compatibility\u000aEffect.MoveBy = function(element, toTop, toLeft) {\u000a  return new Effect.Move(element, \u000a    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));\u000a};\u000a\u000aEffect.Scale = Class.create();\u000aObject.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {\u000a  initialize: function(element, percent) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      scaleX: true,\u000a      scaleY: true,\u000a      scaleContent: true,\u000a      scaleFromCenter: false,\u000a      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values\u000a      scaleFrom: 100.0,\u000a      scaleTo:   percent\u000a    }, arguments[2] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    this.restoreAfterFinish = this.options.restoreAfterFinish || false;\u000a    this.elementPositioning = this.element.getStyle('position');\u000a    \u000a    this.originalStyle = {};\u000a    ['top','left','width','height','fontSize'].each( function(k) {\u000a      this.originalStyle[k] = this.element.style[k];\u000a    }.bind(this));\u000a      \u000a    this.originalTop  = this.element.offsetTop;\u000a    this.originalLeft = this.element.offsetLeft;\u000a    \u000a    var fontSize = this.element.getStyle('font-size') || '100%';\u000a    ['em','px','%','pt'].each( function(fontSizeType) {\u000a      if(fontSize.indexOf(fontSizeType)>0) {\u000a        this.fontSize     = parseFloat(fontSize);\u000a        this.fontSizeType = fontSizeType;\u000a      }\u000a    }.bind(this));\u000a    \u000a    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;\u000a    \u000a    this.dims = null;\u000a    if(this.options.scaleMode=='box')\u000a      this.dims = [this.element.offsetHeight, this.element.offsetWidth];\u000a    if(/^content/.test(this.options.scaleMode))\u000a      this.dims = [this.element.scrollHeight, this.element.scrollWidth];\u000a    if(!this.dims)\u000a      this.dims = [this.options.scaleMode.originalHeight,\u000a                   this.options.scaleMode.originalWidth];\u000a  },\u000a  update: function(position) {\u000a    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);\u000a    if(this.options.scaleContent && this.fontSize)\u000a      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });\u000a    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);\u000a  },\u000a  finish: function(position) {\u000a    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);\u000a  },\u000a  setDimensions: function(height, width) {\u000a    var d = {};\u000a    if(this.options.scaleX) d.width = Math.round(width) + 'px';\u000a    if(this.options.scaleY) d.height = Math.round(height) + 'px';\u000a    if(this.options.scaleFromCenter) {\u000a      var topd  = (height - this.dims[0])/2;\u000a      var leftd = (width  - this.dims[1])/2;\u000a      if(this.elementPositioning == 'absolute') {\u000a        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';\u000a        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';\u000a      } else {\u000a        if(this.options.scaleY) d.top = -topd + 'px';\u000a        if(this.options.scaleX) d.left = -leftd + 'px';\u000a      }\u000a    }\u000a    this.element.setStyle(d);\u000a  }\u000a});\u000a\u000aEffect.Highlight = Class.create();\u000aObject.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});\u000a    this.start(options);\u000a  },\u000a  setup: function() {\u000a    // Prevent executing on elements not in the layout flow\u000a    if(this.element.getStyle('display')=='none') { this.cancel(); return; }\u000a    // Disable background image during the effect\u000a    this.oldStyle = {};\u000a    if (!this.options.keepBackgroundImage) {\u000a      this.oldStyle.backgroundImage = this.element.getStyle('background-image');\u000a      this.element.setStyle({backgroundImage: 'none'});\u000a    }\u000a    if(!this.options.endcolor)\u000a      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');\u000a    if(!this.options.restorecolor)\u000a      this.options.restorecolor = this.element.getStyle('background-color');\u000a    // init color calculations\u000a    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));\u000a    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));\u000a  },\u000a  update: function(position) {\u000a    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){\u000a      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });\u000a  },\u000a  finish: function() {\u000a    this.element.setStyle(Object.extend(this.oldStyle, {\u000a      backgroundColor: this.options.restorecolor\u000a    }));\u000a  }\u000a});\u000a\u000aEffect.ScrollTo = Class.create();\u000aObject.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    this.start(arguments[1] || {});\u000a  },\u000a  setup: function() {\u000a    Position.prepare();\u000a    var offsets = Position.cumulativeOffset(this.element);\u000a    if(this.options.offset) offsets[1] += this.options.offset;\u000a    var max = window.innerHeight ? \u000a      window.height - window.innerHeight :\u000a      document.body.scrollHeight - \u000a        (document.documentElement.clientHeight ? \u000a          document.documentElement.clientHeight : document.body.clientHeight);\u000a    this.scrollStart = Position.deltaY;\u000a    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;\u000a  },\u000a  update: function(position) {\u000a    Position.prepare();\u000a    window.scrollTo(Position.deltaX, \u000a      this.scrollStart + (position*this.delta));\u000a  }\u000a});\u000a\u000a/* ------------- combination effects ------------- */\u000a\u000aEffect.Fade = function(element) {\u000a  element = $(element);\u000a  var oldOpacity = element.getInlineOpacity();\u000a  var options = Object.extend({\u000a  from: element.getOpacity() || 1.0,\u000a  to:   0.0,\u000a  afterFinishInternal: function(effect) { \u000a    if(effect.options.to!=0) return;\u000a    effect.element.hide().setStyle({opacity: oldOpacity}); \u000a  }}, arguments[1] || {});\u000a  return new Effect.Opacity(element,options);\u000a}\u000a\u000aEffect.Appear = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),\u000a  to:   1.0,\u000a  // force Safari to render floated elements properly\u000a  afterFinishInternal: function(effect) {\u000a    effect.element.forceRerendering();\u000a  },\u000a  beforeSetup: function(effect) {\u000a    effect.element.setOpacity(effect.options.from).show(); \u000a  }}, arguments[1] || {});\u000a  return new Effect.Opacity(element,options);\u000a}\u000a\u000aEffect.Puff = function(element) {\u000a  element = $(element);\u000a  var oldStyle = { \u000a    opacity: element.getInlineOpacity(), \u000a    position: element.getStyle('position'),\u000a    top:  element.style.top,\u000a    left: element.style.left,\u000a    width: element.style.width,\u000a    height: element.style.height\u000a  };\u000a  return new Effect.Parallel(\u000a   [ new Effect.Scale(element, 200, \u000a      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), \u000a     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], \u000a     Object.extend({ duration: 1.0, \u000a      beforeSetupInternal: function(effect) {\u000a        Position.absolutize(effect.effects[0].element)\u000a      },\u000a      afterFinishInternal: function(effect) {\u000a         effect.effects[0].element.hide().setStyle(oldStyle); }\u000a     }, arguments[1] || {})\u000a   );\u000a}\u000a\u000aEffect.BlindUp = function(element) {\u000a  element = $(element);\u000a  element.makeClipping();\u000a  return new Effect.Scale(element, 0,\u000a    Object.extend({ scaleContent: false, \u000a      scaleX: false, \u000a      restoreAfterFinish: true,\u000a      afterFinishInternal: function(effect) {\u000a        effect.element.hide().undoClipping();\u000a      } \u000a    }, arguments[1] || {})\u000a  );\u000a}\u000a\u000aEffect.BlindDown = function(element) {\u000a  element = $(element);\u000a  var elementDimensions = element.getDimensions();\u000a  return new Effect.Scale(element, 100, Object.extend({ \u000a    scaleContent: false, \u000a    scaleX: false,\u000a    scaleFrom: 0,\u000a    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\u000a    restoreAfterFinish: true,\u000a    afterSetup: function(effect) {\u000a      effect.element.makeClipping().setStyle({height: '0px'}).show(); \u000a    },  \u000a    afterFinishInternal: function(effect) {\u000a      effect.element.undoClipping();\u000a    }\u000a  }, arguments[1] || {}));\u000a}\u000a\u000aEffect.SwitchOff = function(element) {\u000a  element = $(element);\u000a  var oldOpacity = element.getInlineOpacity();\u000a  return new Effect.Appear(element, Object.extend({\u000a    duration: 0.4,\u000a    from: 0,\u000a    transition: Effect.Transitions.flicker,\u000a    afterFinishInternal: function(effect) {\u000a      new Effect.Scale(effect.element, 1, { \u000a        duration: 0.3, scaleFromCenter: true,\u000a        scaleX: false, scaleContent: false, restoreAfterFinish: true,\u000a        beforeSetup: function(effect) { \u000a          effect.element.makePositioned().makeClipping();\u000a        },\u000a        afterFinishInternal: function(effect) {\u000a          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});\u000a        }\u000a      })\u000a    }\u000a  }, arguments[1] || {}));\u000a}\u000a\u000aEffect.DropOut = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.getStyle('top'),\u000a    left: element.getStyle('left'),\u000a    opacity: element.getInlineOpacity() };\u000a  return new Effect.Parallel(\u000a    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), \u000a      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],\u000a    Object.extend(\u000a      { duration: 0.5,\u000a        beforeSetup: function(effect) {\u000a          effect.effects[0].element.makePositioned(); \u000a        },\u000a        afterFinishInternal: function(effect) {\u000a          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);\u000a        } \u000a      }, arguments[1] || {}));\u000a}\u000a\u000aEffect.Shake = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.getStyle('top'),\u000a    left: element.getStyle('left') };\u000a    return new Effect.Move(element, \u000a      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {\u000a    new Effect.Move(effect.element,\u000a      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {\u000a        effect.element.undoPositioned().setStyle(oldStyle);\u000a  }}) }}) }}) }}) }}) }});\u000a}\u000a\u000aEffect.SlideDown = function(element) {\u000a  element = $(element).cleanWhitespace();\u000a  // SlideDown need to have the content of the element wrapped in a container element with fixed height!\u000a  var oldInnerBottom = element.down().getStyle('bottom');\u000a  var elementDimensions = element.getDimensions();\u000a  return new Effect.Scale(element, 100, Object.extend({ \u000a    scaleContent: false, \u000a    scaleX: false, \u000a    scaleFrom: window.opera ? 0 : 1,\u000a    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},\u000a    restoreAfterFinish: true,\u000a    afterSetup: function(effect) {\u000a      effect.element.makePositioned();\u000a      effect.element.down().makePositioned();\u000a      if(window.opera) effect.element.setStyle({top: ''});\u000a      effect.element.makeClipping().setStyle({height: '0px'}).show(); \u000a    },\u000a    afterUpdateInternal: function(effect) {\u000a      effect.element.down().setStyle({bottom:\u000a        (effect.dims[0] - effect.element.clientHeight) + 'px' }); \u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      effect.element.undoClipping().undoPositioned();\u000a      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }\u000a    }, arguments[1] || {})\u000a  );\u000a}\u000a\u000aEffect.SlideUp = function(element) {\u000a  element = $(element).cleanWhitespace();\u000a  var oldInnerBottom = element.down().getStyle('bottom');\u000a  return new Effect.Scale(element, window.opera ? 0 : 1,\u000a   Object.extend({ scaleContent: false, \u000a    scaleX: false, \u000a    scaleMode: 'box',\u000a    scaleFrom: 100,\u000a    restoreAfterFinish: true,\u000a    beforeStartInternal: function(effect) {\u000a      effect.element.makePositioned();\u000a      effect.element.down().makePositioned();\u000a      if(window.opera) effect.element.setStyle({top: ''});\u000a      effect.element.makeClipping().show();\u000a    },  \u000a    afterUpdateInternal: function(effect) {\u000a      effect.element.down().setStyle({bottom:\u000a        (effect.dims[0] - effect.element.clientHeight) + 'px' });\u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});\u000a      effect.element.down().undoPositioned();\u000a    }\u000a   }, arguments[1] || {})\u000a  );\u000a}\u000a\u000a// Bug in opera makes the TD containing this element expand for a instance after finish \u000aEffect.Squish = function(element) {\u000a  return new Effect.Scale(element, window.opera ? 1 : 0, { \u000a    restoreAfterFinish: true,\u000a    beforeSetup: function(effect) {\u000a      effect.element.makeClipping(); \u000a    },  \u000a    afterFinishInternal: function(effect) {\u000a      effect.element.hide().undoClipping(); \u000a    }\u000a  });\u000a}\u000a\u000aEffect.Grow = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a    direction: 'center',\u000a    moveTransition: Effect.Transitions.sinoidal,\u000a    scaleTransition: Effect.Transitions.sinoidal,\u000a    opacityTransition: Effect.Transitions.full\u000a  }, arguments[1] || {});\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    height: element.style.height,\u000a    width: element.style.width,\u000a    opacity: element.getInlineOpacity() };\u000a\u000a  var dims = element.getDimensions();    \u000a  var initialMoveX, initialMoveY;\u000a  var moveX, moveY;\u000a  \u000a  switch (options.direction) {\u000a    case 'top-left':\u000a      initialMoveX = initialMoveY = moveX = moveY = 0; \u000a      break;\u000a    case 'top-right':\u000a      initialMoveX = dims.width;\u000a      initialMoveY = moveY = 0;\u000a      moveX = -dims.width;\u000a      break;\u000a    case 'bottom-left':\u000a      initialMoveX = moveX = 0;\u000a      initialMoveY = dims.height;\u000a      moveY = -dims.height;\u000a      break;\u000a    case 'bottom-right':\u000a      initialMoveX = dims.width;\u000a      initialMoveY = dims.height;\u000a      moveX = -dims.width;\u000a      moveY = -dims.height;\u000a      break;\u000a    case 'center':\u000a      initialMoveX = dims.width / 2;\u000a      initialMoveY = dims.height / 2;\u000a      moveX = -dims.width / 2;\u000a      moveY = -dims.height / 2;\u000a      break;\u000a  }\u000a  \u000a  return new Effect.Move(element, {\u000a    x: initialMoveX,\u000a    y: initialMoveY,\u000a    duration: 0.01, \u000a    beforeSetup: function(effect) {\u000a      effect.element.hide().makeClipping().makePositioned();\u000a    },\u000a    afterFinishInternal: function(effect) {\u000a      new Effect.Parallel(\u000a        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),\u000a          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),\u000a          new Effect.Scale(effect.element, 100, {\u000a            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, \u000a            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})\u000a        ], Object.extend({\u000a             beforeSetup: function(effect) {\u000a               effect.effects[0].element.setStyle({height: '0px'}).show(); \u000a             },\u000a             afterFinishInternal: function(effect) {\u000a               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); \u000a             }\u000a           }, options)\u000a      )\u000a    }\u000a  });\u000a}\u000a\u000aEffect.Shrink = function(element) {\u000a  element = $(element);\u000a  var options = Object.extend({\u000a    direction: 'center',\u000a    moveTransition: Effect.Transitions.sinoidal,\u000a    scaleTransition: Effect.Transitions.sinoidal,\u000a    opacityTransition: Effect.Transitions.none\u000a  }, arguments[1] || {});\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    height: element.style.height,\u000a    width: element.style.width,\u000a    opacity: element.getInlineOpacity() };\u000a\u000a  var dims = element.getDimensions();\u000a  var moveX, moveY;\u000a  \u000a  switch (options.direction) {\u000a    case 'top-left':\u000a      moveX = moveY = 0;\u000a      break;\u000a    case 'top-right':\u000a      moveX = dims.width;\u000a      moveY = 0;\u000a      break;\u000a    case 'bottom-left':\u000a      moveX = 0;\u000a      moveY = dims.height;\u000a      break;\u000a    case 'bottom-right':\u000a      moveX = dims.width;\u000a      moveY = dims.height;\u000a      break;\u000a    case 'center':  \u000a      moveX = dims.width / 2;\u000a      moveY = dims.height / 2;\u000a      break;\u000a  }\u000a  \u000a  return new Effect.Parallel(\u000a    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),\u000a      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),\u000a      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })\u000a    ], Object.extend({            \u000a         beforeStartInternal: function(effect) {\u000a           effect.effects[0].element.makePositioned().makeClipping(); \u000a         },\u000a         afterFinishInternal: function(effect) {\u000a           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }\u000a       }, options)\u000a  );\u000a}\u000a\u000aEffect.Pulsate = function(element) {\u000a  element = $(element);\u000a  var options    = arguments[1] || {};\u000a  var oldOpacity = element.getInlineOpacity();\u000a  var transition = options.transition || Effect.Transitions.sinoidal;\u000a  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };\u000a  reverser.bind(transition);\u000a  return new Effect.Opacity(element, \u000a    Object.extend(Object.extend({  duration: 2.0, from: 0,\u000a      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }\u000a    }, options), {transition: reverser}));\u000a}\u000a\u000aEffect.Fold = function(element) {\u000a  element = $(element);\u000a  var oldStyle = {\u000a    top: element.style.top,\u000a    left: element.style.left,\u000a    width: element.style.width,\u000a    height: element.style.height };\u000a  element.makeClipping();\u000a  return new Effect.Scale(element, 5, Object.extend({   \u000a    scaleContent: false,\u000a    scaleX: false,\u000a    afterFinishInternal: function(effect) {\u000a    new Effect.Scale(element, 1, { \u000a      scaleContent: false, \u000a      scaleY: false,\u000a      afterFinishInternal: function(effect) {\u000a        effect.element.hide().undoClipping().setStyle(oldStyle);\u000a      } });\u000a  }}, arguments[1] || {}));\u000a};\u000a\u000aEffect.Morph = Class.create();\u000aObject.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {\u000a  initialize: function(element) {\u000a    this.element = $(element);\u000a    if(!this.element) throw(Effect._elementDoesNotExistError);\u000a    var options = Object.extend({\u000a      style: {}\u000a    }, arguments[1] || {});\u000a    if (typeof options.style == 'string') {\u000a      if(options.style.indexOf(':') == -1) {\u000a        var cssText = '', selector = '.' + options.style;\u000a        $A(document.styleSheets).reverse().each(function(styleSheet) {\u000a          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;\u000a          else if (styleSheet.rules) cssRules = styleSheet.rules;\u000a          $A(cssRules).reverse().each(function(rule) {\u000a            if (selector == rule.selectorText) {\u000a              cssText = rule.style.cssText;\u000a              throw $break;\u000a            }\u000a          });\u000a          if (cssText) throw $break;\u000a        });\u000a        this.style = cssText.parseStyle();\u000a        options.afterFinishInternal = function(effect){\u000a          effect.element.addClassName(effect.options.style);\u000a          effect.transforms.each(function(transform) {\u000a            if(transform.style != 'opacity')\u000a              effect.element.style[transform.style] = '';\u000a          });\u000a        }\u000a      } else this.style = options.style.parseStyle();\u000a    } else this.style = $H(options.style)\u000a    this.start(options);\u000a  },\u000a  setup: function(){\u000a    function parseColor(color){\u000a      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';\u000a      color = color.parseColor();\u000a      return $R(0,2).map(function(i){\u000a        return parseInt( color.slice(i*2+1,i*2+3), 16 ) \u000a      });\u000a    }\u000a    this.transforms = this.style.map(function(pair){\u000a      var property = pair[0], value = pair[1], unit = null;\u000a\u000a      if(value.parseColor('#zzzzzz') != '#zzzzzz') {\u000a        value = value.parseColor();\u000a        unit  = 'color';\u000a      } else if(property == 'opacity') {\u000a        value = parseFloat(value);\u000a        if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))\u000a          this.element.setStyle({zoom: 1});\u000a      } else if(Element.CSS_LENGTH.test(value)) {\u000a          var components = value.match(/^([\\+\\-]?[0-9\\.]+)(.*)$/);\u000a          value = parseFloat(components[1]);\u000a          unit = (components.length == 3) ? components[2] : null;\u000a      }\u000a\u000a      var originalValue = this.element.getStyle(property);\u000a      return { \u000a        style: property.camelize(), \u000a        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), \u000a        targetValue: unit=='color' ? parseColor(value) : value,\u000a        unit: unit\u000a      };\u000a    }.bind(this)).reject(function(transform){\u000a      return (\u000a        (transform.originalValue == transform.targetValue) ||\u000a        (\u000a          transform.unit != 'color' &&\u000a          (isNaN(transform.originalValue) || isNaN(transform.targetValue))\u000a        )\u000a      )\u000a    });\u000a  },\u000a  update: function(position) {\u000a    var style = {}, transform, i = this.transforms.length;\u000a    while(i--)\u000a      style[(transform = this.transforms[i]).style] = \u000a        transform.unit=='color' ? '#'+\u000a          (Math.round(transform.originalValue[0]+\u000a            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +\u000a          (Math.round(transform.originalValue[1]+\u000a            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +\u000a          (Math.round(transform.originalValue[2]+\u000a            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :\u000a        transform.originalValue + Math.round(\u000a          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;\u000a    this.element.setStyle(style, true);\u000a  }\u000a});\u000a\u000aEffect.Transform = Class.create();\u000aObject.extend(Effect.Transform.prototype, {\u000a  initialize: function(tracks){\u000a    this.tracks  = [];\u000a    this.options = arguments[1] || {};\u000a    this.addTracks(tracks);\u000a  },\u000a  addTracks: function(tracks){\u000a    tracks.each(function(track){\u000a      var data = $H(track).values().first();\u000a      this.tracks.push($H({\u000a        ids:     $H(track).keys().first(),\u000a        effect:  Effect.Morph,\u000a        options: { style: data }\u000a      }));\u000a    }.bind(this));\u000a    return this;\u000a  },\u000a  play: function(){\u000a    return new Effect.Parallel(\u000a      this.tracks.map(function(track){\u000a        var elements = [$(track.ids) || $$(track.ids)].flatten();\u000a        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });\u000a      }).flatten(),\u000a      this.options\u000a    );\u000a  }\u000a});\u000a\u000aElement.CSS_PROPERTIES = $w(\u000a  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + \u000a  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +\u000a  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +\u000a  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +\u000a  'fontSize fontWeight height left letterSpacing lineHeight ' +\u000a  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+\u000a  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +\u000a  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +\u000a  'right textIndent top width wordSpacing zIndex');\u000a  \u000aElement.CSS_LENGTH = /^(([\\+\\-]?[0-9\\.]+)(em|ex|px|in|cm|mm|pt|pc|\\%))|0$/;\u000a\u000aString.prototype.parseStyle = function(){\u000a  var element = document.createElement('div');\u000a  element.innerHTML = '<div style=\"' + this + '\"></div>';\u000a  var style = element.childNodes[0].style, styleRules = $H();\u000a  \u000a  Element.CSS_PROPERTIES.each(function(property){\u000a    if(style[property]) styleRules[property] = style[property]; \u000a  });\u000a  if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {\u000a    styleRules.opacity = this.match(/opacity:\\s*((?:0|1)?(?:\\.\\d*)?)/)[1];\u000a  }\u000a  return styleRules;\u000a};\u000a\u000aElement.morph = function(element, style) {\u000a  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));\u000a  return element;\u000a};\u000a\u000a['getInlineOpacity','forceRerendering','setContentZoom',\u000a 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( \u000a  function(f) { Element.Methods[f] = Element[f]; }\u000a);\u000a\u000aElement.Methods.visualEffect = function(element, effect, options) {\u000a  s = effect.dasherize().camelize();\u000a  effect_class = s.charAt(0).toUpperCase() + s.substring(1);\u000a  new Effect[effect_class](element, options);\u000a  return $(element);\u000a};\u000a\u000aElement.addMethods();"
          },
          "redirectURL":"",
          "headersSize":233,
          "bodySize":38228
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-05T08:53:58.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":45,
          "blocked":0,
          "send":0,
          "wait":82,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.132+02:00",
        "time":143,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/deans_code_highlighter/geshi.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sat, 26 Apr 2008 09:29:28 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11e4a-40a-51af6e00\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":793,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=50"
            },
            {
              "name":"Etag",
              "value":"\"11e4a-40a-51af6e00\""
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            }
          ],
          "content":{
            "size":1034,
            "mimeType":"text/css",
            "text":"/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */\u000d\u000a.dean_ch{border: 1px dotted #a0a0a0; font-family: 'Courier New', Courier, monospace; background-color: #f0f0f0; color: #000000; overflow: auto;}\u000d\u000a.dean_ch .de1, .dean_ch .de2 {font-weight:normal;background:transparent;color:#000; padding-left: 5px;}\u000d\u000a.dean_ch .kw1 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .kw2 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .kw3 {color: #000066;}\u000d\u000a.dean_ch .kw4 {color: #f63333;}\u000d\u000a.dean_ch .co1, .dean_ch .co2, .dean_ch .coMULTI{color: rgb(0, 128, 0);}\u000d\u000a.dean_ch .es0 {color: #000033; font-weight: bold;}\u000d\u000a.dean_ch .br0 {color: rgb(197, 143, 0);}\u000d\u000a.dean_ch .st0 {color: #ff0000;}\u000d\u000a.dean_ch .nu0 {color: rgb(128, 0, 128);}\u000d\u000a.dean_ch .me0 {color: #006600;}\u000d\u000a.dean_ch .re0 {color: rgb(128, 128, 128);}\u000d\u000a.dean_ch .re1 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .re2 {color: rgb(0, 0, 255);}\u000d\u000a.dean_ch .st0 {color: rgb(255, 0, 0);}\u000d\u000a\u000d\u000adiv .dean_ch {\u000d\u000a  margin-top:20px;\u000a  margin-bottom:20px;\u000a  padding-bottom:0px;\u000a}\u000d\u000a\u000d\u000apre {\u000a  margin-top:20px;\u000a  margin-bottom:20px;\u000a}"
          },
          "redirectURL":"",
          "headersSize":236,
          "bodySize":1034
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-12T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":52,
          "blocked":0,
          "send":0,
          "wait":91,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.133+02:00",
        "time":157,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/css/lightbox.css",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"text/css,*/*;q=0.1"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sat, 26 Apr 2008 09:51:18 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"e32c2-589-9fc47180\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":790,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Etag",
              "value":"\"e32c2-589-9fc47180\""
            },
            {
              "name":"Expires",
              "value":"Tue, 12 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=604800"
            }
          ],
          "content":{
            "size":1417,
            "mimeType":"text/css",
            "text":"#lightbox{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009z-index: 100;\u000d\u000a\u0009text-align: center;\u000d\u000a\u0009line-height: 0;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#lightbox a img{ border: none; }\u000d\u000a\u000d\u000a#outerImageContainer{\u000d\u000a\u0009position: relative;\u000d\u000a\u0009background-color: #fff;\u000d\u000a\u0009width: 250px;\u000d\u000a\u0009height: 250px;\u000d\u000a\u0009margin: 0 auto;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#imageContainer{\u000d\u000a\u0009padding: 10px;\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#loading{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 40%;\u000d\u000a\u0009left: 0%;\u000d\u000a\u0009height: 25%;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009text-align: center;\u000d\u000a\u0009line-height: 0;\u000d\u000a\u0009}\u000d\u000a#hoverNav{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 0;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009height: 100%;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009z-index: 10;\u000d\u000a\u0009}\u000d\u000a#imageContainer>#hoverNav{ left: 0;}\u000d\u000a#hoverNav a{ outline: none;}\u000d\u000a\u000d\u000a#prevLink, #nextLink{\u000d\u000a\u0009width: 49%;\u000d\u000a\u0009height: 100%;\u000d\u000a\u0009display: block;\u000d\u000a\u0009}\u000d\u000a#prevLink { left: 0; float: left;}\u000d\u000a#nextLink { right: 0; float: right;}\u000d\u000a\u000d\u000a#imageDataContainer{\u000d\u000a\u0009font: 10px Verdana, Helvetica, sans-serif;\u000d\u000a\u0009background-color: #fff;\u000d\u000a\u0009margin: 0 auto;\u000d\u000a\u0009line-height: 1.4em;\u000d\u000a\u0009overflow: auto;\u000d\u000a\u0009width: 100%\u0009\u000d\u000a\u0009}\u000d\u000a\u000d\u000a#imageData{\u0009padding:0 10px; color: #666; }\u000d\u000a#imageData #imageDetails{ width: 70%; float: left; text-align: left; }\u0009\u000d\u000a#imageData #caption{ font-weight: bold;\u0009}\u000d\u000a#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em;\u0009}\u0009\u0009\u0009\u000d\u000a#imageData #bottomNavClose{ width: 66px; float: right;  padding-bottom: 0.7em;\u0009}\u0009\u000d\u000a\u0009\u0009\u000d\u000a#overlay{\u000d\u000a\u0009position: absolute;\u000d\u000a\u0009top: 0;\u000d\u000a\u0009left: 0;\u000d\u000a\u0009z-index: 90;\u000d\u000a\u0009width: 100%;\u000d\u000a\u0009height: 500px;\u000d\u000a\u0009background-color: #000;\u000d\u000a\u0009}"
          },
          "redirectURL":"",
          "headersSize":236,
          "bodySize":1417
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-12T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":70,
          "send":0,
          "wait":87,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.134+02:00",
        "time":173,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/js/lightbox.js",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sat, 26 Apr 2008 09:51:21 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"e32d7-5d1d-9ff23840\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":774,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=47"
            },
            {
              "name":"Etag",
              "value":"\"e32d7-5d1d-9ff23840\""
            },
            {
              "name":"Expires",
              "value":"Tue, 05 Oct 2010 08:54:32 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=30"
            }
          ],
          "content":{
            "size":23837,
            "mimeType":"application/javascript",
            "text":"// -----------------------------------------------------------------------------------\u000a//\u000a//\u0009Lightbox v2.03.3\u000a//\u0009by Lokesh Dhakar - http://www.huddletogether.com\u000a//\u00095/21/06\u000a//\u000a//\u0009For more information on this script, visit:\u000a//\u0009http://huddletogether.com/projects/lightbox2/\u000a//\u000a//\u0009Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/\u000a//\u0009\u000a//\u0009Credit also due to those who have helped, inspired, and made their code available to the public.\u000a//\u0009Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), Thomas Fuchs(mir.aculo.us), and others.\u000a//\u000a//\u000a// -----------------------------------------------------------------------------------\u000a/*\u000a\u000a\u0009Table of Contents\u000a\u0009-----------------\u000a\u0009Configuration\u000a\u0009Global Variables\u000a\u000a\u0009Extending Built-in Objects\u0009\u000a\u0009- Object.extend(Element)\u000a\u0009- Array.prototype.removeDuplicates()\u000a\u0009- Array.prototype.empty()\u000a\u000a\u0009Lightbox Class Declaration\u000a\u0009- initialize()\u000a\u0009- updateImageList()\u000a\u0009- start()\u000a\u0009- changeImage()\u000a\u0009- resizeImageContainer()\u000a\u0009- showImage()\u000a\u0009- updateDetails()\u000a\u0009- updateNav()\u000a\u0009- enableKeyboardNav()\u000a\u0009- disableKeyboardNav()\u000a\u0009- keyboardAction()\u000a\u0009- preloadNeighborImages()\u000a\u0009- end()\u000a\u0009\u000a\u0009Miscellaneous Functions\u000a\u0009- getPageScroll()\u000a\u0009- getPageSize()\u000a\u0009- getKey()\u000a\u0009- listenKey()\u000a\u0009- showSelectBoxes()\u000a\u0009- hideSelectBoxes()\u000a\u0009- showFlash()\u000a\u0009- hideFlash()\u000a\u0009- pause()\u000a\u0009- initLightbox()\u000a\u0009\u000a\u0009Function Calls\u000a\u0009- addLoadEvent(initLightbox)\u000a\u0009\u000a*/\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Configuration\u000a//\u000a//var fileLoadingImage = \"images/loading.gif\";\u0009\u0009\u000a//var fileBottomNavCloseImage = \"images/closelabel.gif\";\u000a\u000avar overlayOpacity = 0.8;\u0009// controls transparency of shadow overlay\u000a\u000avar animate = true;\u0009\u0009\u0009// toggles resizing animations\u000avar resizeSpeed = 7;\u0009\u0009// controls the speed of the image resizing animations (1=slowest and 10=fastest)\u000a\u000avar borderSize = 10;\u0009\u0009//if you adjust the padding in the CSS, you will need to update this variable\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Global Variables\u000a//\u000avar imageArray = new Array;\u000avar activeImage;\u000a\u000aif(animate == true){\u000a\u0009overlayDuration = 0.2;\u0009// shadow fade in/out duration\u000a\u0009if(resizeSpeed > 10){ resizeSpeed = 10;}\u000a\u0009if(resizeSpeed < 1){ resizeSpeed = 1;}\u000a\u0009resizeDuration = (11 - resizeSpeed) * 0.15;\u000a} else { \u000a\u0009overlayDuration = 0;\u000a\u0009resizeDuration = 0;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Additional methods for Element added by SU, Couloir\u000a//\u0009- further additions by Lokesh Dhakar (huddletogether.com)\u000a//\u000aObject.extend(Element, {\u000a\u0009getWidth: function(element) {\u000a\u0009   \u0009element = $(element);\u000a\u0009   \u0009return element.offsetWidth; \u000a\u0009},\u000a\u0009setWidth: function(element,w) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.width = w +\"px\";\u000a\u0009},\u000a\u0009setHeight: function(element,h) {\u000a   \u0009\u0009element = $(element);\u000a    \u0009element.style.height = h +\"px\";\u000a\u0009},\u000a\u0009setTop: function(element,t) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.top = t +\"px\";\u000a\u0009},\u000a\u0009setLeft: function(element,l) {\u000a\u0009   \u0009element = $(element);\u000a    \u0009element.style.left = l +\"px\";\u000a\u0009},\u000a\u0009setSrc: function(element,src) {\u000a    \u0009element = $(element);\u000a    \u0009element.src = src; \u000a\u0009},\u000a\u0009setHref: function(element,href) {\u000a    \u0009element = $(element);\u000a    \u0009element.href = href; \u000a\u0009},\u000a\u0009setInnerHTML: function(element,content) {\u000a\u0009\u0009element = $(element);\u000a\u0009\u0009element.innerHTML = content;\u000a\u0009}\u000a});\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Extending built-in Array object\u000a//\u0009- array.removeDuplicates()\u000a//\u0009- array.empty()\u000a//\u000aArray.prototype.removeDuplicates = function () {\u000a    for(i = 0; i < this.length; i++){\u000a        for(j = this.length-1; j>i; j--){        \u000a            if(this[i][0] == this[j][0]){\u000a                this.splice(j,1);\u000a            }\u000a        }\u000a    }\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000aArray.prototype.empty = function () {\u000a\u0009for(i = 0; i <= this.length; i++){\u000a\u0009\u0009this.shift();\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a//\u0009Lightbox Class Declaration\u000a//\u0009- initialize()\u000a//\u0009- start()\u000a//\u0009- changeImage()\u000a//\u0009- resizeImageContainer()\u000a//\u0009- showImage()\u000a//\u0009- updateDetails()\u000a//\u0009- updateNav()\u000a//\u0009- enableKeyboardNav()\u000a//\u0009- disableKeyboardNav()\u000a//\u0009- keyboardNavAction()\u000a//\u0009- preloadNeighborImages()\u000a//\u0009- end()\u000a//\u000a//\u0009Structuring of code inspired by Scott Upton (http://www.uptonic.com/)\u000a//\u000avar Lightbox = Class.create();\u000a\u000aLightbox.prototype = {\u000a\u0009\u000a\u0009// initialize()\u000a\u0009// Constructor runs on completion of the DOM loading. Calls updateImageList and then\u000a\u0009// the function inserts html at the bottom of the page which is used to display the shadow \u000a\u0009// overlay and the image container.\u000a\u0009//\u000a\u0009initialize: function() {\u0009\u000a\u0009\u0009\u000a\u0009\u0009this.updateImageList();\u000a\u000a\u0009\u0009// Code inserts html at the bottom of the page that looks similar to this:\u000a\u0009\u0009//\u000a\u0009\u0009//\u0009<div id=\"overlay\"></div>\u000a\u0009\u0009//\u0009<div id=\"lightbox\">\u000a\u0009\u0009//\u0009\u0009<div id=\"outerImageContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009<div id=\"imageContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<img id=\"lightboxImage\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div style=\"\" id=\"hoverNav\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"prevLink\"></a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"nextLink\"></a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"loading\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"loadingLink\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009<img src=\"images/loading.gif\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009</a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009<div id=\"imageDataContainer\">\u000a\u0009\u0009//\u0009\u0009\u0009<div id=\"imageData\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"imageDetails\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<span id=\"caption\"></span>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<span id=\"numberDisplay\"></span>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009<div id=\"bottomNav\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009<a href=\"#\" id=\"bottomNavClose\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009<img src=\"images/close.gif\">\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009</a>\u000a\u0009\u0009//\u0009\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009\u0009</div>\u000a\u0009\u0009//\u0009\u0009</div>\u000a\u0009\u0009//\u0009</div>\u000a\u000a\u000a\u0009\u0009var objBody = document.getElementsByTagName(\"body\").item(0);\u000a\u0009\u0009\u000a\u0009\u0009var objOverlay = document.createElement(\"div\");\u000a\u0009\u0009objOverlay.setAttribute('id','overlay');\u000a\u0009\u0009objOverlay.style.display = 'none';\u000a\u0009\u0009objOverlay.onclick = function() { myLightbox.end(); }\u000a\u0009\u0009objBody.appendChild(objOverlay);\u000a\u0009\u0009\u000a\u0009\u0009var objLightbox = document.createElement(\"div\");\u000a\u0009\u0009objLightbox.setAttribute('id','lightbox');\u000a\u0009\u0009objLightbox.style.display = 'none';\u000a\u0009\u0009objLightbox.onclick = function(e) {\u0009// close Lightbox is user clicks shadow overlay\u000a\u0009\u0009\u0009if (!e) var e = window.event;\u000a\u0009\u0009\u0009var clickObj = Event.element(e).id;\u000a\u0009\u0009\u0009if ( clickObj == 'lightbox') {\u000a\u0009\u0009\u0009\u0009myLightbox.end();\u000a\u0009\u0009\u0009}\u000a\u0009\u0009};\u000a\u0009\u0009objBody.appendChild(objLightbox);\u000a\u0009\u0009\u0009\u000a\u0009\u0009var objOuterImageContainer = document.createElement(\"div\");\u000a\u0009\u0009objOuterImageContainer.setAttribute('id','outerImageContainer');\u000a\u0009\u0009objLightbox.appendChild(objOuterImageContainer);\u000a\u000a\u0009\u0009// When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.\u000a\u0009\u0009// If animations are turned off, it will be hidden as to prevent a flicker of a\u000a\u0009\u0009// white 250 by 250 box.\u000a\u0009\u0009if(animate){\u000a\u0009\u0009\u0009Element.setWidth('outerImageContainer', 250);\u000a\u0009\u0009\u0009Element.setHeight('outerImageContainer', 250);\u0009\u0009\u0009\u000a\u0009\u0009} else {\u000a\u0009\u0009\u0009Element.setWidth('outerImageContainer', 1);\u000a\u0009\u0009\u0009Element.setHeight('outerImageContainer', 1);\u0009\u0009\u0009\u000a\u0009\u0009}\u000a\u000a\u0009\u0009var objImageContainer = document.createElement(\"div\");\u000a\u0009\u0009objImageContainer.setAttribute('id','imageContainer');\u000a\u0009\u0009objOuterImageContainer.appendChild(objImageContainer);\u000a\u0009\u000a\u0009\u0009var objLightboxImage = document.createElement(\"img\");\u000a\u0009\u0009objLightboxImage.setAttribute('id','lightboxImage');\u000a\u0009\u0009objImageContainer.appendChild(objLightboxImage);\u000a\u0009\u000a\u0009\u0009var objHoverNav = document.createElement(\"div\");\u000a\u0009\u0009objHoverNav.setAttribute('id','hoverNav');\u000a\u0009\u0009objImageContainer.appendChild(objHoverNav);\u000a\u0009\u000a\u0009\u0009var objPrevLink = document.createElement(\"a\");\u000a\u0009\u0009objPrevLink.setAttribute('id','prevLink');\u000a\u0009\u0009objPrevLink.setAttribute('href','#');\u000a\u0009\u0009objHoverNav.appendChild(objPrevLink);\u000a\u0009\u0009\u000a\u0009\u0009var objNextLink = document.createElement(\"a\");\u000a\u0009\u0009objNextLink.setAttribute('id','nextLink');\u000a\u0009\u0009objNextLink.setAttribute('href','#');\u000a\u0009\u0009objHoverNav.appendChild(objNextLink);\u000a\u0009\u000a\u0009\u0009var objLoading = document.createElement(\"div\");\u000a\u0009\u0009objLoading.setAttribute('id','loading');\u000a\u0009\u0009objImageContainer.appendChild(objLoading);\u000a\u0009\u000a\u0009\u0009var objLoadingLink = document.createElement(\"a\");\u000a\u0009\u0009objLoadingLink.setAttribute('id','loadingLink');\u000a\u0009\u0009objLoadingLink.setAttribute('href','#');\u000a\u0009\u0009objLoadingLink.onclick = function() { myLightbox.end(); return false; }\u000a\u0009\u0009objLoading.appendChild(objLoadingLink);\u000a\u0009\u000a\u0009\u0009var objLoadingImage = document.createElement(\"img\");\u000a\u0009\u0009objLoadingImage.setAttribute('src', fileLoadingImage);\u000a\u0009\u0009objLoadingLink.appendChild(objLoadingImage);\u000a\u000a\u0009\u0009var objImageDataContainer = document.createElement(\"div\");\u000a\u0009\u0009objImageDataContainer.setAttribute('id','imageDataContainer');\u000a\u0009\u0009objLightbox.appendChild(objImageDataContainer);\u000a\u000a\u0009\u0009var objImageData = document.createElement(\"div\");\u000a\u0009\u0009objImageData.setAttribute('id','imageData');\u000a\u0009\u0009objImageDataContainer.appendChild(objImageData);\u000a\u0009\u000a\u0009\u0009var objImageDetails = document.createElement(\"div\");\u000a\u0009\u0009objImageDetails.setAttribute('id','imageDetails');\u000a\u0009\u0009objImageData.appendChild(objImageDetails);\u000a\u0009\u000a\u0009\u0009var objCaption = document.createElement(\"span\");\u000a\u0009\u0009objCaption.setAttribute('id','caption');\u000a\u0009\u0009objImageDetails.appendChild(objCaption);\u000a\u0009\u000a\u0009\u0009var objNumberDisplay = document.createElement(\"span\");\u000a\u0009\u0009objNumberDisplay.setAttribute('id','numberDisplay');\u000a\u0009\u0009objImageDetails.appendChild(objNumberDisplay);\u000a\u0009\u0009\u000a\u0009\u0009var objBottomNav = document.createElement(\"div\");\u000a\u0009\u0009objBottomNav.setAttribute('id','bottomNav');\u000a\u0009\u0009objImageData.appendChild(objBottomNav);\u000a\u0009\u000a\u0009\u0009var objBottomNavCloseLink = document.createElement(\"a\");\u000a\u0009\u0009objBottomNavCloseLink.setAttribute('id','bottomNavClose');\u000a\u0009\u0009objBottomNavCloseLink.setAttribute('href','#');\u000a\u0009\u0009objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }\u000a\u0009\u0009objBottomNav.appendChild(objBottomNavCloseLink);\u000a\u0009\u000a\u0009\u0009var objBottomNavCloseImage = document.createElement(\"img\");\u000a\u0009\u0009objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);\u000a\u0009\u0009objBottomNavCloseLink.appendChild(objBottomNavCloseImage);\u000a\u0009},\u000a\u000a\u000a\u0009//\u000a\u0009// updateImageList()\u000a\u0009// Loops through anchor tags looking for 'lightbox' references and applies onclick\u000a\u0009// events to appropriate links. You can rerun after dynamically adding images w/ajax.\u000a\u0009//\u000a\u0009updateImageList: function() {\u0009\u000a\u0009\u0009if (!document.getElementsByTagName){ return; }\u000a\u0009\u0009var anchors = document.getElementsByTagName('a');\u000a\u0009\u0009var areas = document.getElementsByTagName('area');\u000a\u000a\u0009\u0009// loop through all anchor tags\u000a\u0009\u0009for (var i=0; i<anchors.length; i++){\u000a\u0009\u0009\u0009var anchor = anchors[i];\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009var relAttribute = String(anchor.getAttribute('rel'));\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009// use the string.match() method to catch 'lightbox' references in the rel attribute\u000a\u0009\u0009\u0009if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){\u000a\u0009\u0009\u0009\u0009anchor.onclick = function () {myLightbox.start(this); return false;}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// loop through all area tags\u000a\u0009\u0009// todo: combine anchor & area tag loops\u000a\u0009\u0009for (var i=0; i< areas.length; i++){\u000a\u0009\u0009\u0009var area = areas[i];\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009var relAttribute = String(area.getAttribute('rel'));\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009// use the string.match() method to catch 'lightbox' references in the rel attribute\u000a\u0009\u0009\u0009if (area.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){\u000a\u0009\u0009\u0009\u0009area.onclick = function () {myLightbox.start(this); return false;}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u0009},\u000a\u0009\u000a\u0009\u000a\u0009//\u000a\u0009//\u0009start()\u000a\u0009//\u0009Display overlay and lightbox. If image is part of a set, add siblings to imageArray.\u000a\u0009//\u000a\u0009start: function(imageLink) {\u0009\u000a\u000a\u0009\u0009hideSelectBoxes();\u000a\u0009\u0009hideFlash();\u000a\u000a\u0009\u0009// stretch overlay to fill page and fade in\u000a\u0009\u0009var arrayPageSize = getPageSize();\u000a\u0009\u0009Element.setWidth('overlay', arrayPageSize[0]);\u000a\u0009\u0009Element.setHeight('overlay', arrayPageSize[1]);\u000a\u000a\u0009\u0009new Effect.Appear('overlay', { duration: overlayDuration, from: 0.0, to: overlayOpacity });\u000a\u000a\u0009\u0009imageArray = [];\u000a\u0009\u0009imageNum = 0;\u0009\u0009\u000a\u000a\u0009\u0009if (!document.getElementsByTagName){ return; }\u000a\u0009\u0009var anchors = document.getElementsByTagName( imageLink.tagName);\u000a\u000a\u0009\u0009// if image is NOT part of a set..\u000a\u0009\u0009if((imageLink.getAttribute('rel') == 'lightbox')){\u000a\u0009\u0009\u0009// add single image to imageArray\u000a\u0009\u0009\u0009imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));\u0009\u0009\u0009\u000a\u0009\u0009} else {\u000a\u0009\u0009// if image is part of a set..\u000a\u000a\u0009\u0009\u0009// loop through anchors, find other images in set, and add them to imageArray\u000a\u0009\u0009\u0009for (var i=0; i<anchors.length; i++){\u000a\u0009\u0009\u0009\u0009var anchor = anchors[i];\u000a\u0009\u0009\u0009\u0009if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){\u000a\u0009\u0009\u0009\u0009\u0009imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));\u000a\u0009\u0009\u0009\u0009}\u000a\u0009\u0009\u0009}\u000a\u0009\u0009\u0009imageArray.removeDuplicates();\u000a\u0009\u0009\u0009while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// calculate top and left offset for the lightbox \u000a\u0009\u0009var arrayPageScroll = getPageScroll();\u000a\u0009\u0009var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 10);\u000a\u0009\u0009var lightboxLeft = arrayPageScroll[0];\u000a\u0009\u0009Element.setTop('lightbox', lightboxTop);\u000a\u0009\u0009Element.setLeft('lightbox', lightboxLeft);\u000a\u0009\u0009\u000a\u0009\u0009Element.show('lightbox');\u000a\u0009\u0009\u000a\u0009\u0009this.changeImage(imageNum);\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009changeImage()\u000a\u0009//\u0009Hide most elements and preload image in preparation for resizing image container.\u000a\u0009//\u000a\u0009changeImage: function(imageNum) {\u0009\u000a\u0009\u0009\u000a\u0009\u0009activeImage = imageNum;\u0009// update global var\u000a\u000a\u0009\u0009// hide elements during transition\u000a\u0009\u0009if(animate){ Element.show('loading');}\u000a\u0009\u0009Element.hide('lightboxImage');\u000a\u0009\u0009Element.hide('hoverNav');\u000a\u0009\u0009Element.hide('prevLink');\u000a\u0009\u0009Element.hide('nextLink');\u000a\u0009\u0009Element.hide('imageDataContainer');\u000a\u0009\u0009Element.hide('numberDisplay');\u0009\u0009\u000a\u0009\u0009\u000a\u0009\u0009imgPreloader = new Image();\u000a\u0009\u0009\u000a\u0009\u0009// once image is preloaded, resize image container\u000a\u0009\u0009imgPreloader.onload=function(){\u000a\u0009\u0009\u0009Element.setSrc('lightboxImage', imageArray[activeImage][0]);\u000a\u0009\u0009\u0009myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);\u000a\u0009\u0009\u0009\u000a\u0009\u0009\u0009imgPreloader.onload=function(){};\u0009//\u0009clear onLoad, IE behaves irratically with animated gifs otherwise \u000a\u0009\u0009}\u000a\u0009\u0009imgPreloader.src = imageArray[activeImage][0];\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009resizeImageContainer()\u000a\u0009//\u000a\u0009resizeImageContainer: function( imgWidth, imgHeight) {\u000a\u000a\u0009\u0009// get curren width and height\u000a\u0009\u0009this.widthCurrent = Element.getWidth('outerImageContainer');\u000a\u0009\u0009this.heightCurrent = Element.getHeight('outerImageContainer');\u000a\u000a\u0009\u0009// get new width and height\u000a\u0009\u0009var widthNew = (imgWidth  + (borderSize * 2));\u000a\u0009\u0009var heightNew = (imgHeight  + (borderSize * 2));\u000a\u000a\u0009\u0009// scalars based on change from old to new\u000a\u0009\u0009this.xScale = ( widthNew / this.widthCurrent) * 100;\u000a\u0009\u0009this.yScale = ( heightNew / this.heightCurrent) * 100;\u000a\u000a\u0009\u0009// calculate size difference between new and old image, and resize if necessary\u000a\u0009\u0009wDiff = this.widthCurrent - widthNew;\u000a\u0009\u0009hDiff = this.heightCurrent - heightNew;\u000a\u000a\u0009\u0009if(!( hDiff == 0)){ new Effect.Scale('outerImageContainer', this.yScale, {scaleX: false, duration: resizeDuration, queue: 'front'}); }\u000a\u0009\u0009if(!( wDiff == 0)){ new Effect.Scale('outerImageContainer', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration}); }\u000a\u000a\u0009\u0009// if new and old image are same size and no scaling transition is necessary, \u000a\u0009\u0009// do a quick pause to prevent image flicker.\u000a\u0009\u0009if((hDiff == 0) && (wDiff == 0)){\u000a\u0009\u0009\u0009if (navigator.appVersion.indexOf(\"MSIE\")!=-1){ pause(250); } else { pause(100);} \u000a\u0009\u0009}\u000a\u000a\u0009\u0009Element.setHeight('prevLink', imgHeight);\u000a\u0009\u0009Element.setHeight('nextLink', imgHeight);\u000a\u0009\u0009Element.setWidth( 'imageDataContainer', widthNew);\u000a\u000a\u0009\u0009this.showImage();\u000a\u0009},\u000a\u0009\u000a\u0009//\u000a\u0009//\u0009showImage()\u000a\u0009//\u0009Display image and begin preloading neighbors.\u000a\u0009//\u000a\u0009showImage: function(){\u000a\u0009\u0009Element.hide('loading');\u000a\u0009\u0009new Effect.Appear('lightboxImage', { duration: resizeDuration, queue: 'end', afterFinish: function(){\u0009myLightbox.updateDetails(); } });\u000a\u0009\u0009this.preloadNeighborImages();\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009updateDetails()\u000a\u0009//\u0009Display caption, image number, and bottom nav.\u000a\u0009//\u000a\u0009updateDetails: function() {\u000a\u0009\u000a\u0009\u0009// if caption is not null\u000a\u0009\u0009if(imageArray[activeImage][1]){\u000a\u0009\u0009\u0009Element.show('caption');\u000a\u0009\u0009\u0009Element.setInnerHTML( 'caption', imageArray[activeImage][1]);\u000a\u0009\u0009}\u000a\u0009\u0009\u000a\u0009\u0009// if image is part of set display 'Image x of x' \u000a\u0009\u0009if(imageArray.length > 1){\u000a\u0009\u0009\u0009Element.show('numberDisplay');\u000a\u0009\u0009\u0009Element.setInnerHTML( 'numberDisplay', \"Image \" + eval(activeImage + 1) + \" of \" + imageArray.length);\u000a\u0009\u0009}\u000a\u000a\u0009\u0009new Effect.Parallel(\u000a\u0009\u0009\u0009[ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }), \u000a\u0009\u0009\u0009  new Effect.Appear('imageDataContainer', { sync: true, duration: resizeDuration }) ], \u000a\u0009\u0009\u0009{ duration: resizeDuration, afterFinish: function() {\u000a\u0009\u0009\u0009\u0009// update overlay size and update nav\u000a\u0009\u0009\u0009\u0009var arrayPageSize = getPageSize();\u000a\u0009\u0009\u0009\u0009Element.setHeight('overlay', arrayPageSize[1]);\u000a\u0009\u0009\u0009\u0009myLightbox.updateNav();\u000a\u0009\u0009\u0009\u0009}\u000a\u0009\u0009\u0009} \u000a\u0009\u0009);\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009updateNav()\u000a\u0009//\u0009Display appropriate previous and next hover navigation.\u000a\u0009//\u000a\u0009updateNav: function() {\u000a\u000a\u0009\u0009Element.show('hoverNav');\u0009\u0009\u0009\u0009\u000a\u000a\u0009\u0009// if not first image in set, display prev image button\u000a\u0009\u0009if(activeImage != 0){\u000a\u0009\u0009\u0009Element.show('prevLink');\u000a\u0009\u0009\u0009document.getElementById('prevLink').onclick = function() {\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage - 1); return false;\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009\u0009// if not last image in set, display next image button\u000a\u0009\u0009if(activeImage != (imageArray.length - 1)){\u000a\u0009\u0009\u0009Element.show('nextLink');\u000a\u0009\u0009\u0009document.getElementById('nextLink').onclick = function() {\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage + 1); return false;\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u0009\u0009\u000a\u0009\u0009this.enableKeyboardNav();\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009enableKeyboardNav()\u000a\u0009//\u000a\u0009enableKeyboardNav: function() {\u000a\u0009\u0009document.onkeydown = this.keyboardAction; \u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009disableKeyboardNav()\u000a\u0009//\u000a\u0009disableKeyboardNav: function() {\u000a\u0009\u0009document.onkeydown = '';\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009keyboardAction()\u000a\u0009//\u000a\u0009keyboardAction: function(e) {\u000a\u0009\u0009if (e == null) { // ie\u000a\u0009\u0009\u0009keycode = event.keyCode;\u000a\u0009\u0009\u0009escapeKey = 27;\u000a\u0009\u0009} else { // mozilla\u000a\u0009\u0009\u0009keycode = e.keyCode;\u000a\u0009\u0009\u0009escapeKey = e.DOM_VK_ESCAPE;\u000a\u0009\u0009}\u000a\u000a\u0009\u0009key = String.fromCharCode(keycode).toLowerCase();\u000a\u0009\u0009\u000a\u0009\u0009if((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)){\u0009// close lightbox\u000a\u0009\u0009\u0009myLightbox.end();\u000a\u0009\u0009} else if((key == 'p') || (keycode == 37)){\u0009// display previous image\u000a\u0009\u0009\u0009if(activeImage != 0){\u000a\u0009\u0009\u0009\u0009myLightbox.disableKeyboardNav();\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage - 1);\u000a\u0009\u0009\u0009}\u000a\u0009\u0009} else if((key == 'n') || (keycode == 39)){\u0009// display next image\u000a\u0009\u0009\u0009if(activeImage != (imageArray.length - 1)){\u000a\u0009\u0009\u0009\u0009myLightbox.disableKeyboardNav();\u000a\u0009\u0009\u0009\u0009myLightbox.changeImage(activeImage + 1);\u000a\u0009\u0009\u0009}\u000a\u0009\u0009}\u000a\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009preloadNeighborImages()\u000a\u0009//\u0009Preload previous and next images.\u000a\u0009//\u000a\u0009preloadNeighborImages: function(){\u000a\u000a\u0009\u0009if((imageArray.length - 1) > activeImage){\u000a\u0009\u0009\u0009preloadNextImage = new Image();\u000a\u0009\u0009\u0009preloadNextImage.src = imageArray[activeImage + 1][0];\u000a\u0009\u0009}\u000a\u0009\u0009if(activeImage > 0){\u000a\u0009\u0009\u0009preloadPrevImage = new Image();\u000a\u0009\u0009\u0009preloadPrevImage.src = imageArray[activeImage - 1][0];\u000a\u0009\u0009}\u000a\u0009\u000a\u0009},\u000a\u000a\u0009//\u000a\u0009//\u0009end()\u000a\u0009//\u000a\u0009end: function() {\u000a\u0009\u0009this.disableKeyboardNav();\u000a\u0009\u0009Element.hide('lightbox');\u000a\u0009\u0009new Effect.Fade('overlay', { duration: overlayDuration});\u000a\u0009\u0009showSelectBoxes();\u000a\u0009\u0009showFlash();\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getPageScroll()\u000a// Returns array with x,y page scroll values.\u000a// Core code from - quirksmode.com\u000a//\u000afunction getPageScroll(){\u000a\u000a\u0009var xScroll, yScroll;\u000a\u000a\u0009if (self.pageYOffset) {\u000a\u0009\u0009yScroll = self.pageYOffset;\u000a\u0009\u0009xScroll = self.pageXOffset;\u000a\u0009} else if (document.documentElement && document.documentElement.scrollTop){\u0009 // Explorer 6 Strict\u000a\u0009\u0009yScroll = document.documentElement.scrollTop;\u000a\u0009\u0009xScroll = document.documentElement.scrollLeft;\u000a\u0009} else if (document.body) {// all other Explorers\u000a\u0009\u0009yScroll = document.body.scrollTop;\u000a\u0009\u0009xScroll = document.body.scrollLeft;\u0009\u000a\u0009}\u000a\u000a\u0009arrayPageScroll = new Array(xScroll,yScroll) \u000a\u0009return arrayPageScroll;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getPageSize()\u000a// Returns array with page width, height and window width, height\u000a// Core code from - quirksmode.com\u000a// Edit for Firefox by pHaez\u000a//\u000afunction getPageSize(){\u000a\u0009\u000a\u0009var xScroll, yScroll;\u000a\u0009\u000a\u0009if (window.innerHeight && window.scrollMaxY) {\u0009\u000a\u0009\u0009xScroll = window.innerWidth + window.scrollMaxX;\u000a\u0009\u0009yScroll = window.innerHeight + window.scrollMaxY;\u000a\u0009} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac\u000a\u0009\u0009xScroll = document.body.scrollWidth;\u000a\u0009\u0009yScroll = document.body.scrollHeight;\u000a\u0009} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari\u000a\u0009\u0009xScroll = document.body.offsetWidth;\u000a\u0009\u0009yScroll = document.body.offsetHeight;\u000a\u0009}\u000a\u0009\u000a\u0009var windowWidth, windowHeight;\u000a\u0009\u000a//\u0009console.log(self.innerWidth);\u000a//\u0009console.log(document.documentElement.clientWidth);\u000a\u000a\u0009if (self.innerHeight) {\u0009// all except Explorer\u000a\u0009\u0009if(document.documentElement.clientWidth){\u000a\u0009\u0009\u0009windowWidth = document.documentElement.clientWidth; \u000a\u0009\u0009} else {\u000a\u0009\u0009\u0009windowWidth = self.innerWidth;\u000a\u0009\u0009}\u000a\u0009\u0009windowHeight = self.innerHeight;\u000a\u0009} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode\u000a\u0009\u0009windowWidth = document.documentElement.clientWidth;\u000a\u0009\u0009windowHeight = document.documentElement.clientHeight;\u000a\u0009} else if (document.body) { // other Explorers\u000a\u0009\u0009windowWidth = document.body.clientWidth;\u000a\u0009\u0009windowHeight = document.body.clientHeight;\u000a\u0009}\u0009\u000a\u0009\u000a\u0009// for small pages with total height less then height of the viewport\u000a\u0009if(yScroll < windowHeight){\u000a\u0009\u0009pageHeight = windowHeight;\u000a\u0009} else { \u000a\u0009\u0009pageHeight = yScroll;\u000a\u0009}\u000a\u000a//\u0009console.log(\"xScroll \" + xScroll)\u000a//\u0009console.log(\"windowWidth \" + windowWidth)\u000a\u000a\u0009// for small pages with total width less then width of the viewport\u000a\u0009if(xScroll < windowWidth){\u0009\u000a\u0009\u0009pageWidth = xScroll;\u0009\u0009\u000a\u0009} else {\u000a\u0009\u0009pageWidth = windowWidth;\u000a\u0009}\u000a//\u0009console.log(\"pageWidth \" + pageWidth)\u000a\u000a\u0009arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) \u000a\u0009return arrayPageSize;\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// getKey(key)\u000a// Gets keycode. If 'x' is pressed then it hides the lightbox.\u000a//\u000afunction getKey(e){\u000a\u0009if (e == null) { // ie\u000a\u0009\u0009keycode = event.keyCode;\u000a\u0009} else { // mozilla\u000a\u0009\u0009keycode = e.which;\u000a\u0009}\u000a\u0009key = String.fromCharCode(keycode).toLowerCase();\u000a\u0009\u000a\u0009if(key == 'x'){\u000a\u0009}\u000a}\u000a\u000a// -----------------------------------------------------------------------------------\u000a\u000a//\u000a// listenKey()\u000a//\u000afunction listenKey () {\u0009document.onkeypress = getKey; }\u000a\u0009\u000a// ---------------------------------------------------\u000a\u000afunction showSelectBoxes(){\u000a\u0009var selects = document.getElementsByTagName(\"select\");\u000a\u0009for (i = 0; i != selects.length; i++) {\u000a\u0009\u0009selects[i].style.visibility = \"visible\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction hideSelectBoxes(){\u000a\u0009var selects = document.getElementsByTagName(\"select\");\u000a\u0009for (i = 0; i != selects.length; i++) {\u000a\u0009\u0009selects[i].style.visibility = \"hidden\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction showFlash(){\u000a\u0009var flashObjects = document.getElementsByTagName(\"object\");\u000a\u0009for (i = 0; i < flashObjects.length; i++) {\u000a\u0009\u0009flashObjects[i].style.visibility = \"visible\";\u000a\u0009}\u000a\u000a\u0009var flashEmbeds = document.getElementsByTagName(\"embed\");\u000a\u0009for (i = 0; i < flashEmbeds.length; i++) {\u000a\u0009\u0009flashEmbeds[i].style.visibility = \"visible\";\u000a\u0009}\u000a}\u000a\u000a// ---------------------------------------------------\u000a\u000afunction hideFlash(){\u000a\u0009var flashObjects = document.getElementsByTagName(\"object\");\u000a\u0009for (i = 0; i < flashObjects.length; i++) {\u000a\u0009\u0009flashObjects[i].style.visibility = \"hidden\";\u000a\u0009}\u000a\u000a\u0009var flashEmbeds = document.getElementsByTagName(\"embed\");\u000a\u0009for (i = 0; i < flashEmbeds.length; i++) {\u000a\u0009\u0009flashEmbeds[i].style.visibility = \"hidden\";\u000a\u0009}\u000a\u000a}\u000a\u000a\u000a// ---------------------------------------------------\u000a\u000a//\u000a// pause(numberMillis)\u000a// Pauses code execution for specified time. Uses busy code, not good.\u000a// Help from Ran Bar-On [ran2103@gmail.com]\u000a//\u000a\u000afunction pause(ms){\u000a\u0009var date = new Date();\u000a\u0009curDate = null;\u000a\u0009do{var curDate = new Date();}\u000a\u0009while( curDate - date < ms);\u000a}\u000a/*\u000afunction pause(numberMillis) {\u000a\u0009var curently = new Date().getTime() + sender;\u000a\u0009while (new Date().getTime();\u0009\u000a}\u000a*/\u000a// ---------------------------------------------------\u000a\u000a\u000a\u000afunction initLightbox() { myLightbox = new Lightbox(); }\u000aEvent.observe(window, 'load', initLightbox, false);"
          },
          "redirectURL":"",
          "headersSize":233,
          "bodySize":23837
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-05T08:53:58.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":72,
          "send":0,
          "wait":101,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.291+02:00",
        "time":50,
        "request":{
          "method":"GET",
          "url":"http://www.google-analytics.com/urchin.js",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.google-analytics.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"*/*"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"If-Modified-Since",
              "value":"Thu, 02 Sep 2010 18:46:49 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":514,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:45 GMT"
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:53:45 GMT"
            },
            {
              "name":"Age",
              "value":"17"
            },
            {
              "name":"Server",
              "value":"GFE/2.0"
            }
          ],
          "content":{
            "size":22678,
            "mimeType":"text/javascript",
            "text":"//-- Google Analytics Urchin Module\u000a//-- Copyright 2007 Google, All Rights Reserved.\u000a\u000a//-- Urchin On Demand Settings ONLY\u000avar _uacct=\"\";\u0009\u0009\u0009// set up the Urchin Account\u000avar _userv=1;\u0009\u0009\u0009// service mode (0=local,1=remote,2=both)\u000a\u000a//-- UTM User Settings\u000avar _ufsc=1;\u0009\u0009\u0009// set client info flag (1=on|0=off)\u000avar _udn=\"auto\";\u0009\u0009// (auto|none|domain) set the domain name for cookies\u000avar _uhash=\"on\";\u0009\u0009// (on|off) unique domain hash for cookies\u000avar _utimeout=\"1800\";   \u0009// set the inactive session timeout in seconds\u000avar _ugifpath=\"/__utm.gif\";\u0009// set the web path to the __utm.gif file\u000avar _utsp=\"|\";\u0009\u0009\u0009// transaction field separator\u000avar _uflash=1;\u0009\u0009\u0009// set flash version detect option (1=on|0=off)\u000avar _utitle=1;\u0009\u0009\u0009// set the document title detect option (1=on|0=off)\u000avar _ulink=0;\u0009\u0009\u0009// enable linker functionality (1=on|0=off)\u000avar _uanchor=0;\u0009\u0009\u0009// enable use of anchors for campaign (1=on|0=off)\u000avar _utcp=\"/\";\u0009\u0009\u0009// the cookie path for tracking\u000avar _usample=100;\u0009\u0009// The sampling % of visitors to track (1-100).\u000a\u000a//-- UTM Campaign Tracking Settings\u000avar _uctm=1;\u0009\u0009\u0009// set campaign tracking module (1=on|0=off)\u000avar _ucto=\"15768000\";\u0009\u0009// set timeout in seconds (6 month default)\u000avar _uccn=\"utm_campaign\";\u0009// name\u000avar _ucmd=\"utm_medium\";\u0009\u0009// medium (cpc|cpm|link|email|organic)\u000avar _ucsr=\"utm_source\";\u0009\u0009// source\u000avar _uctr=\"utm_term\";\u0009\u0009// term/keyword\u000avar _ucct=\"utm_content\";\u0009// content\u000avar _ucid=\"utm_id\";\u0009\u0009// id number\u000avar _ucno=\"utm_nooverride\";\u0009// don't override\u000a\u000a//-- Auto/Organic Sources and Keywords\u000avar _uOsr=new Array();\u000avar _uOkw=new Array();\u000a_uOsr[0]=\"google\";\u0009_uOkw[0]=\"q\";\u000a_uOsr[1]=\"yahoo\";\u0009_uOkw[1]=\"p\";\u000a_uOsr[2]=\"msn\";\u0009\u0009_uOkw[2]=\"q\";\u000a_uOsr[3]=\"aol\";\u0009\u0009_uOkw[3]=\"query\";\u000a_uOsr[4]=\"aol\";\u0009\u0009_uOkw[4]=\"encquery\";\u000a_uOsr[5]=\"lycos\";\u0009_uOkw[5]=\"query\";\u000a_uOsr[6]=\"ask\";\u0009\u0009_uOkw[6]=\"q\";\u000a_uOsr[7]=\"altavista\";\u0009_uOkw[7]=\"q\";\u000a_uOsr[8]=\"netscape\";\u0009_uOkw[8]=\"query\";\u000a_uOsr[9]=\"cnn\";\u0009_uOkw[9]=\"query\";\u000a_uOsr[10]=\"looksmart\";\u0009_uOkw[10]=\"qt\";\u000a_uOsr[11]=\"about\";\u0009_uOkw[11]=\"terms\";\u000a_uOsr[12]=\"mamma\";\u0009_uOkw[12]=\"query\";\u000a_uOsr[13]=\"alltheweb\";\u0009_uOkw[13]=\"q\";\u000a_uOsr[14]=\"gigablast\";\u0009_uOkw[14]=\"q\";\u000a_uOsr[15]=\"voila\";\u0009_uOkw[15]=\"rdata\";\u000a_uOsr[16]=\"virgilio\";\u0009_uOkw[16]=\"qs\";\u000a_uOsr[17]=\"live\";\u0009_uOkw[17]=\"q\";\u000a_uOsr[18]=\"baidu\";\u0009_uOkw[18]=\"wd\";\u000a_uOsr[19]=\"alice\";\u0009_uOkw[19]=\"qs\";\u000a_uOsr[20]=\"yandex\";\u0009_uOkw[20]=\"text\";\u000a_uOsr[21]=\"najdi\";\u0009_uOkw[21]=\"q\";\u000a_uOsr[22]=\"aol\";\u0009_uOkw[22]=\"q\";\u000a_uOsr[23]=\"club-internet\"; _uOkw[23]=\"query\";\u000a_uOsr[24]=\"mama\";\u0009_uOkw[24]=\"query\";\u000a_uOsr[25]=\"seznam\";\u0009_uOkw[25]=\"q\";\u000a_uOsr[26]=\"search\";\u0009_uOkw[26]=\"q\";\u000a_uOsr[27]=\"wp\";\u0009_uOkw[27]=\"szukaj\";\u000a_uOsr[28]=\"onet\";\u0009_uOkw[28]=\"qt\";\u000a_uOsr[29]=\"netsprint\";\u0009_uOkw[29]=\"q\";\u000a_uOsr[30]=\"google.interia\";\u0009_uOkw[30]=\"q\";\u000a_uOsr[31]=\"szukacz\";\u0009_uOkw[31]=\"q\";\u000a_uOsr[32]=\"yam\";\u0009_uOkw[32]=\"k\";\u000a_uOsr[33]=\"pchome\";\u0009_uOkw[33]=\"q\";\u000a_uOsr[34]=\"kvasir\";\u0009_uOkw[34]=\"searchExpr\";\u000a_uOsr[35]=\"sesam\";\u0009_uOkw[35]=\"q\";\u000a_uOsr[36]=\"ozu\"; _uOkw[36]=\"q\";\u000a_uOsr[37]=\"terra\"; _uOkw[37]=\"query\";\u000a_uOsr[38]=\"nostrum\"; _uOkw[38]=\"query\";\u000a_uOsr[39]=\"mynet\"; _uOkw[39]=\"q\";\u000a_uOsr[40]=\"ekolay\"; _uOkw[40]=\"q\";\u000a_uOsr[41]=\"search.ilse\"; _uOkw[41]=\"search_for\";\u000a_uOsr[42]=\"bing\"; _uOkw[42]=\"q\";\u000a\u000a//-- Auto/Organic Keywords to Ignore\u000avar _uOno=new Array();\u000a//_uOno[0]=\"urchin\";\u000a//_uOno[1]=\"urchin.com\";\u000a//_uOno[2]=\"www.urchin.com\";\u000a\u000a//-- Referral domains to Ignore\u000avar _uRno=new Array();\u000a//_uRno[0]=\".urchin.com\";\u000a\u000a//-- **** Don't modify below this point ***\u000avar _uff,_udh,_udt,_ubl=0,_udo=\"\",_uu,_ufns=0,_uns=0,_ur=\"-\",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh=\"\",_uwv=\"1.3\";\u000avar _ugifpath2=\"http://www.google-analytics.com/__utm.gif\";\u000aif (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#'));\u000aif (_udl.protocol==\"https:\") _ugifpath2=\"https://ssl.google-analytics.com/__utm.gif\";\u000aif (!_utcp || _utcp==\"\") _utcp=\"/\";\u000afunction urchinTracker(page) {\u000a if (_udl.protocol==\"file:\") return;\u000a if (_uff && (!page || page==\"\")) return;\u000a var a,b,c,xx,v,z,k,x=\"\",s=\"\",f=0,nv=0;\u000a var nx=\" expires=\"+_uNx()+\";\";\u000a var dc=_ubd.cookie;\u000a _udh=_uDomain();\u000a if (!_uVG()) return;\u000a _uu=Math.round(Math.random()*2147483647);\u000a _udt=new Date();\u000a _ust=Math.round(_udt.getTime()/1000);\u000a a=dc.indexOf(\"__utma=\"+_udh+\".\");\u000a b=dc.indexOf(\"__utmb=\"+_udh);\u000a c=dc.indexOf(\"__utmc=\"+_udh);\u000a if (_udn && _udn!=\"\") { _udo=\" domain=\"+_udn+\";\"; }\u000a if (_utimeout && _utimeout!=\"\") {\u000a  x=new Date(_udt.getTime()+(_utimeout*1000));\u000a  x=\" expires=\"+x.toGMTString()+\";\";\u000a }\u000a if (_ulink) {\u000a  if (_uanchor && _udlh && _udlh!=\"\") s=_udlh+\"&\";\u000a  s+=_udl.search;\u000a  if(s && s!=\"\" && s.indexOf(\"__utma=\")>=0) {\u000a   if (!(_uIN(a=_uGC(s,\"__utma=\",\"&\")))) a=\"-\";\u000a   if (!(_uIN(b=_uGC(s,\"__utmb=\",\"&\")))) b=\"-\";\u000a   if (!(_uIN(c=_uGC(s,\"__utmc=\",\"&\")))) c=\"-\";\u000a   v=_uGC(s,\"__utmv=\",\"&\");\u000a   z=_uGC(s,\"__utmz=\",\"&\");\u000a   k=_uGC(s,\"__utmk=\",\"&\");\u000a   xx=_uGC(s,\"__utmx=\",\"&\");\u000a   if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a=\"-\";b=\"-\";c=\"-\";xx=\"-\";z=\"-\";v=\"-\";}\u000a   if (a!=\"-\" && b!=\"-\" && c!=\"-\") f=1;\u000a   else if(a!=\"-\") f=2;\u000a  }\u000a }\u000a if(f==1) {\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+b+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+c+\"; path=\"+_utcp+\";\"+_udo;\u000a } else if (f==2) {\u000a  a=_uFixA(s,\"&\",_ust);\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+_udh+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+_udh+\"; path=\"+_utcp+\";\"+_udo;\u000a  _ufns=1;\u000a } else if (a>=0 && b>=0 && c>=0) {\u000a   b = _uGC(dc,\"__utmb=\"+_udh,\";\");\u000a   b = (\"-\" == b) ? _udh : b;  \u000a  _ubd.cookie=\"__utmb=\"+b+\"; path=\"+_utcp+\";\"+x+_udo;\u000a } else {\u000a  if (a>=0) a=_uFixA(_ubd.cookie,\";\",_ust);\u000a  else {\u000a   a=_udh+\".\"+_uu+\".\"+_ust+\".\"+_ust+\".\"+_ust+\".1\";\u000a   nv=1;\u000a  }\u000a  _ubd.cookie=\"__utma=\"+a+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a  _ubd.cookie=\"__utmb=\"+_udh+\"; path=\"+_utcp+\";\"+x+_udo;\u000a  _ubd.cookie=\"__utmc=\"+_udh+\"; path=\"+_utcp+\";\"+_udo;\u000a  _ufns=1;\u000a }\u000a if (_ulink && xx && xx!=\"\" && xx!=\"-\") {\u000a   xx=_uUES(xx);\u000a   if (xx.indexOf(\";\")==-1) _ubd.cookie=\"__utmx=\"+xx+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a if (_ulink && v && v!=\"\" && v!=\"-\") {\u000a  v=_uUES(v);\u000a  if (v.indexOf(\";\")==-1) _ubd.cookie=\"__utmv=\"+v+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a var wc=window;\u000a var c=_ubd.cookie;\u000a if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){\u000a  var g=wc.gaGlobal;\u000a  var ua=c.split(\"__utma=\"+_udh+\".\")[1].split(\";\")[0].split(\".\");\u000a  if(g.sid)ua[3]=g.sid;\u000a  if(nv>0){\u000a   ua[2]=ua[3];\u000a   if(g.vid){\u000a    var v=g.vid.split(\".\");\u000a    ua[0]=v[0];\u000a    ua[1]=v[1];\u000a   }\u000a  }\u000a  _ubd.cookie=\"__utma=\"+_udh+\".\"+ua.join(\".\")+\"; path=\"+_utcp+\";\"+nx+_udo;\u000a }\u000a _uInfo(page);\u000a _ufns=0;\u000a _ufno=0;\u000a if (!page || page==\"\") _uff=1;\u000a}\u000afunction _uGH() {\u000a var hid;\u000a var wc=window;\u000a if (wc && wc.gaGlobal && wc.gaGlobal.hid) {\u000a  hid=wc.gaGlobal.hid;\u000a } else {\u000a  hid=Math.round(Math.random()*0x7fffffff);\u000a  if (!wc.gaGlobal) wc.gaGlobal={};\u000a  wc.gaGlobal.hid=hid;\u000a }\u000a return hid;\u000a}\u000afunction _uInfo(page) {\u000a var p,s=\"\",dm=\"\",pg=_udl.pathname+_udl.search;\u000a if (page && page!=\"\") pg=_uES(page,1);\u000a _ur=_ubd.referrer;\u000a if (!_ur || _ur==\"\") { _ur=\"-\"; }\u000a else {\u000a  dm=_ubd.domain;\u000a  if(_utcp && _utcp!=\"/\") dm+=_utcp;\u000a  p=_ur.indexOf(dm);\u000a  if ((p>=0) && (p<=8)) { _ur=\"0\"; }\u000a  if (_ur.indexOf(\"[\")==0 && _ur.lastIndexOf(\"]\")==(_ur.length-1)) { _ur=\"-\"; }\u000a }\u000a s+=\"&utmn=\"+_uu;\u000a if (_ufsc) s+=_uBInfo();\u000a if (_uctm) s+=_uCInfo();\u000a if (_utitle && _ubd.title && _ubd.title!=\"\") s+=\"&utmdt=\"+_uES(_ubd.title);\u000a if (_udl.hostname && _udl.hostname!=\"\") s+=\"&utmhn=\"+_uES(_udl.hostname);\u000a if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a s+=\"&utmhid=\"+_uGH();\u000a s+=\"&utmr=\"+_ur;\u000a s+=\"&utmp=\"+pg;\u000a if ((_userv==0 || _userv==2) && _uSP()) {\u000a  var i=new Image(1,1);\u000a  i.src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a  i.onload=function() { _uVoid(); }\u000a }\u000a if ((_userv==1 || _userv==2) && _uSP()) {\u000a  var i2=new Image(1,1);\u000a  i2.src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+_uGCS();\u000a  i2.onload=function() { _uVoid(); }\u000a }\u000a return;\u000a}\u000afunction _uVoid() { return; }\u000afunction _uCInfo() {\u000a if (!_ucto || _ucto==\"\") { _ucto=\"15768000\"; }\u000a if (!_uVG()) return;\u000a var c=\"\",t=\"-\",t2=\"-\",t3=\"-\",o=0,cs=0,cn=0,i=0,z=\"-\",s=\"\";\u000a if (_uanchor && _udlh && _udlh!=\"\") s=_udlh+\"&\";\u000a s+=_udl.search;\u000a var x=new Date(_udt.getTime()+(_ucto*1000));\u000a var dc=_ubd.cookie;\u000a x=\" expires=\"+x.toGMTString()+\";\";\u000a if (_ulink && !_ubl) {\u000a  z=_uUES(_uGC(s,\"__utmz=\",\"&\"));\u000a  if (z!=\"-\" && z.indexOf(\";\")==-1) { _ubd.cookie=\"__utmz=\"+z+\"; path=\"+_utcp+\";\"+x+_udo; return \"\"; }\u000a }\u000a z=dc.indexOf(\"__utmz=\"+_udh+\".\");\u000a if (z>-1) { z=_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"); }\u000a else { z=\"-\"; }\u000a t=_uGC(s,_ucid+\"=\",\"&\");\u000a t2=_uGC(s,_ucsr+\"=\",\"&\");\u000a t3=_uGC(s,\"gclid=\",\"&\");\u000a if ((t!=\"-\" && t!=\"\") || (t2!=\"-\" && t2!=\"\") || (t3!=\"-\" && t3!=\"\")) {\u000a  if (t!=\"-\" && t!=\"\") c+=\"utmcid=\"+_uEC(t);\u000a  if (t2!=\"-\" && t2!=\"\") { if (c != \"\") c+=\"|\"; c+=\"utmcsr=\"+_uEC(t2); }\u000a  if (t3!=\"-\" && t3!=\"\") { if (c != \"\") c+=\"|\"; c+=\"utmgclid=\"+_uEC(t3); }\u000a  t=_uGC(s,_uccn+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmccn=\"+_uEC(t);\u000a  else c+=\"|utmccn=(not+set)\";\u000a  t=_uGC(s,_ucmd+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmcmd=\"+_uEC(t);\u000a  else  c+=\"|utmcmd=(not+set)\";\u000a  t=_uGC(s,_uctr+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmctr=\"+_uEC(t);\u000a  else { t=_uOrg(1); if (t!=\"-\" && t!=\"\") c+=\"|utmctr=\"+_uEC(t); }\u000a  t=_uGC(s,_ucct+\"=\",\"&\");\u000a  if (t!=\"-\" && t!=\"\") c+=\"|utmcct=\"+_uEC(t);\u000a  t=_uGC(s,_ucno+\"=\",\"&\");\u000a  if (t==\"1\") o=1;\u000a  if (z!=\"-\" && o==1) return \"\";\u000a }\u000a if (c==\"-\" || c==\"\") { c=_uOrg(); if (z!=\"-\" && _ufno==1)  return \"\"; }\u000a if (c==\"-\" || c==\"\") { if (_ufns==1)  c=_uRef(); if (z!=\"-\" && _ufno==1)  return \"\"; }\u000a if (c==\"-\" || c==\"\") {\u000a  if (z==\"-\" && _ufns==1) { c=\"utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)\"; }\u000a  if (c==\"-\" || c==\"\") return \"\";\u000a }\u000a if (z!=\"-\") {\u000a  i=z.indexOf(\".\");\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  if (i>-1) i=z.indexOf(\".\",i+1);\u000a  t=z.substring(i+1,z.length);\u000a  if (t.toLowerCase()==c.toLowerCase()) cs=1;\u000a  t=z.substring(0,i);\u000a  if ((i=t.lastIndexOf(\".\")) > -1) {\u000a   t=t.substring(i+1,t.length);\u000a   cn=(t*1);\u000a  }\u000a }\u000a if (cs==0 || _ufns==1) {\u000a  t=_uGC(dc,\"__utma=\"+_udh+\".\",\";\");\u000a  if ((i=t.lastIndexOf(\".\")) > 9) {\u000a   _uns=t.substring(i+1,t.length);\u000a   _uns=(_uns*1);\u000a  }\u000a  cn++;\u000a  if (_uns==0) _uns=1;\u000a  _ubd.cookie=\"__utmz=\"+_udh+\".\"+_ust+\".\"+_uns+\".\"+cn+\".\"+c+\"; path=\"+_utcp+\"; \"+x+_udo;\u000a }\u000a if (cs==0 || _ufns==1) return \"&utmcn=1\";\u000a else return \"&utmcr=1\";\u000a}\u000afunction _uRef() {\u000a if (_ur==\"0\" || _ur==\"\" || _ur==\"-\") return \"\";\u000a var i=0,h,k,n;\u000a if ((i=_ur.indexOf(\"://\"))<0 || _uGCse()) return \"\";\u000a h=_ur.substring(i+3,_ur.length);\u000a if (h.indexOf(\"/\") > -1) {\u000a  k=h.substring(h.indexOf(\"/\"),h.length);\u000a  if (k.indexOf(\"?\") > -1) k=k.substring(0,k.indexOf(\"?\"));\u000a  h=h.substring(0,h.indexOf(\"/\"));\u000a }\u000a h=h.toLowerCase();\u000a n=h;\u000a if ((i=n.indexOf(\":\")) > -1) n=n.substring(0,i);\u000a for (var ii=0;ii<_uRno.length;ii++) {\u000a  if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; }\u000a }\u000a if (h.indexOf(\"www.\")==0) h=h.substring(4,h.length);\u000a return \"utmccn=(referral)|utmcsr=\"+_uEC(h)+\"|\"+\"utmcct=\"+_uEC(k)+\"|utmcmd=referral\";\u000a}\u000afunction _uOrg(t) {\u000a if (_ur==\"0\" || _ur==\"\" || _ur==\"-\") return \"\";\u000a var i=0,h,k;\u000a if ((i=_ur.indexOf(\"://\"))<0 || _uGCse()) return \"\";\u000a h=_ur.substring(i+3,_ur.length);\u000a if (h.indexOf(\"/\") > -1) {\u000a  h=h.substring(0,h.indexOf(\"/\"));\u000a }\u000a for (var ii=0;ii<_uOsr.length;ii++) {\u000a  if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {\u000a   if ((i=_ur.indexOf(\"?\"+_uOkw[ii]+\"=\")) > -1 || (i=_ur.indexOf(\"&\"+_uOkw[ii]+\"=\")) > -1) {\u000a    k=_ur.substring(i+_uOkw[ii].length+2,_ur.length);\u000a    if ((i=k.indexOf(\"&\")) > -1) k=k.substring(0,i);\u000a    for (var yy=0;yy<_uOno.length;yy++) {\u000a     if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; }\u000a    }\u000a    if (t) return _uEC(k);\u000a    else return \"utmccn=(organic)|utmcsr=\"+_uEC(_uOsr[ii])+\"|\"+\"utmctr=\"+_uEC(k)+\"|utmcmd=organic\";\u000a   }\u000a  }\u000a }\u000a return \"\";\u000a}\u000afunction _uGCse() {\u000a var h,p;\u000a h=p=_ur.split(\"://\")[1];\u000a if(h.indexOf(\"/\")>-1) {\u000a  h=h.split(\"/\")[0];\u000a  p=p.substring(p.indexOf(\"/\")+1,p.length);\u000a }\u000a if(p.indexOf(\"?\")>-1) {\u000a  p=p.split(\"?\")[0];\u000a }\u000a if(h.toLowerCase().indexOf(\"google\")>-1) {\u000a  if(_ur.indexOf(\"?q=\")>-1 || _ur.indexOf(\"&q=\")>-1) {\u000a   if (p.toLowerCase().indexOf(\"cse\")>-1) {\u000a    return true;\u000a   }\u000a  }\u000a }\u000a}\u000afunction _uBInfo() {\u000a var sr=\"-\",sc=\"-\",ul=\"-\",fl=\"-\",cs=\"-\",je=1;\u000a var n=navigator;\u000a if (self.screen) {\u000a  sr=screen.width+\"x\"+screen.height;\u000a  sc=screen.colorDepth+\"-bit\";\u000a } else if (self.java) {\u000a  var j=java.awt.Toolkit.getDefaultToolkit();\u000a  var s=j.getScreenSize();\u000a  sr=s.width+\"x\"+s.height;\u000a }\u000a if (n.language) { ul=n.language.toLowerCase(); }\u000a else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); }\u000a je=n.javaEnabled()?1:0;\u000a if (_uflash) fl=_uFlash();\u000a if (_ubd.characterSet) cs=_uES(_ubd.characterSet);\u000a else if (_ubd.charset) cs=_uES(_ubd.charset);\u000a return \"&utmcs=\"+cs+\"&utmsr=\"+sr+\"&utmsc=\"+sc+\"&utmul=\"+ul+\"&utmje=\"+je+\"&utmfl=\"+fl;\u000a}\u000afunction __utmSetTrans() {\u000a var e;\u000a if (_ubd.getElementById) e=_ubd.getElementById(\"utmtrans\");\u000a else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans;\u000a if (!e) return;\u000a var l=e.value.split(\"UTM:\");\u000a var i,i2,c;\u000a if (_userv==0 || _userv==2) i=new Array();\u000a if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); }\u000a\u000a for (var ii=0;ii<l.length;ii++) {\u000a  l[ii]=_uTrim(l[ii]);\u000a  if (l[ii].charAt(0)!='T' && l[ii].charAt(0)!='I') continue;\u000a  var r=Math.round(Math.random()*2147483647);\u000a  if (!_utsp || _utsp==\"\") _utsp=\"|\";\u000a  var f=l[ii].split(_utsp),s=\"\";\u000a  if (f[0].charAt(0)=='T') {\u000a   s=\"&utmt=tran\"+\"&utmn=\"+r;\u000a   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!=\"\") s+=\"&utmtid=\"+_uES(f[1]);\u000a   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!=\"\") s+=\"&utmtst=\"+_uES(f[2]);\u000a   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!=\"\") s+=\"&utmtto=\"+_uES(f[3]);\u000a   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!=\"\") s+=\"&utmttx=\"+_uES(f[4]);\u000a   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!=\"\") s+=\"&utmtsp=\"+_uES(f[5]);\u000a   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!=\"\") s+=\"&utmtci=\"+_uES(f[6]);\u000a   f[7]=_uTrim(f[7]); if(f[7]&&f[7]!=\"\") s+=\"&utmtrg=\"+_uES(f[7]);\u000a   f[8]=_uTrim(f[8]); if(f[8]&&f[8]!=\"\") s+=\"&utmtco=\"+_uES(f[8]);\u000a  } else {\u000a   s=\"&utmt=item\"+\"&utmn=\"+r;\u000a   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!=\"\") s+=\"&utmtid=\"+_uES(f[1]);\u000a   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!=\"\") s+=\"&utmipc=\"+_uES(f[2]);\u000a   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!=\"\") s+=\"&utmipn=\"+_uES(f[3]);\u000a   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!=\"\") s+=\"&utmiva=\"+_uES(f[4]);\u000a   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!=\"\") s+=\"&utmipr=\"+_uES(f[5]);\u000a   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!=\"\") s+=\"&utmiqt=\"+_uES(f[6]);\u000a  }\u000a  if (_udl.hostname && _udl.hostname!=\"\") s+=\"&utmhn=\"+_uES(_udl.hostname);\u000a  if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a\u000a  if ((_userv==0 || _userv==2) && _uSP()) {\u000a   i[ii]=new Image(1,1);\u000a   i[ii].src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a   i[ii].onload=function() { _uVoid(); }\u000a  }\u000a  if ((_userv==1 || _userv==2) && _uSP()) {\u000a   i2[ii]=new Image(1,1);\u000a   i2[ii].src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+c;\u000a   i2[ii].onload=function() { _uVoid(); }\u000a  }\u000a }\u000a return;\u000a}\u000afunction _uFlash() {\u000a var f=\"-\",n=navigator;\u000a if (n.plugins && n.plugins.length) {\u000a  for (var ii=0;ii<n.plugins.length;ii++) {\u000a   if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {\u000a    f=n.plugins[ii].description.split('Shockwave Flash ')[1];\u000a    break;\u000a   }\u000a  }\u000a } else {\u000a  var fl;\u000a  try {\u000a   fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");\u000a   f = fl.GetVariable(\"$version\");\u000a  } catch(e) {}\u000a  if (f == \"-\") {\u000a   try {\u000a    fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");\u000a    f = \"WIN 6,0,21,0\";\u000a    fl.AllowScriptAccess = \"always\";\u000a    f = fl.GetVariable(\"$version\");\u000a   } catch(e) {}\u000a  }\u000a  if (f == \"-\") {\u000a   try {\u000a    fl = new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");\u000a    f = fl.GetVariable(\"$version\");\u000a   } catch(e) {}\u000a  }\u000a  if (f != \"-\") {\u000a   f = f.split(\" \")[1].split(\",\");\u000a   f = f[0] + \".\" + f[1] + \" r\" + f[2];\u000a  }\u000a }\u000a return f;\u000a}\u000afunction __utmLinkerUrl(l,h) {\u000a var p,k,a=\"-\",b=\"-\",c=\"-\",x=\"-\",z=\"-\",v=\"-\";\u000a var dc=_ubd.cookie;\u000a var iq = l.indexOf(\"?\");\u000a var ih = l.indexOf(\"#\");\u000a var url=l;\u000a if (dc) {\u000a  a=_uES(_uGC(dc,\"__utma=\"+_udh+\".\",\";\"));\u000a  b=_uES(_uGC(dc,\"__utmb=\"+_udh,\";\"));\u000a  c=_uES(_uGC(dc,\"__utmc=\"+_udh,\";\"));\u000a  x=_uES(_uGC(dc,\"__utmx=\"+_udh,\";\"));\u000a  z=_uES(_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"));\u000a  v=_uES(_uGC(dc,\"__utmv=\"+_udh+\".\",\";\"));\u000a  k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1);\u000a  p=\"__utma=\"+a+\"&__utmb=\"+b+\"&__utmc=\"+c+\"&__utmx=\"+x+\"&__utmz=\"+z+\"&__utmv=\"+v+\"&__utmk=\"+k;\u000a }\u000a if (p) {\u000a  if (h && ih>-1) return;\u000a  if (h) { url=l+\"#\"+p; }\u000a  else {\u000a   if (iq==-1 && ih==-1) url=l+\"?\"+p;\u000a   else if (ih==-1) url=l+\"&\"+p;\u000a   else if (iq==-1) url=l.substring(0,ih-1)+\"?\"+p+l.substring(ih);\u000a   else url=l.substring(0,ih-1)+\"&\"+p+l.substring(ih);\u000a  }\u000a }\u000a return url;\u000a}\u000afunction __utmLinker(l,h) {\u000a if (!_ulink || !l || l==\"\") return;\u000a _udl.href=__utmLinkerUrl(l,h);\u000a}\u000afunction __utmLinkPost(f,h) {\u000a if (!_ulink || !f || !f.action) return;\u000a f.action=__utmLinkerUrl(f.action, h);\u000a return;\u000a}\u000afunction __utmSetVar(v) {\u000a if (!v || v==\"\") return;\u000a if (!_udo || _udo == \"\") {\u000a  _udh=_uDomain();\u000a  if (_udn && _udn!=\"\") { _udo=\" domain=\"+_udn+\";\"; }\u000a }\u000a if (!_uVG()) return;\u000a var r=Math.round(Math.random() * 2147483647);\u000a _ubd.cookie=\"__utmv=\"+_udh+\".\"+_uES(v)+\"; path=\"+_utcp+\"; expires=\"+_uNx()+\";\"+_udo;\u000a var s=\"&utmt=var&utmn=\"+r;\u000a if (_usample && _usample != 100) s+=\"&utmsp=\"+_uES(_usample);\u000a if ((_userv==0 || _userv==2) && _uSP()) {\u000a  var i=new Image(1,1);\u000a  i.src=_ugifpath+\"?\"+\"utmwv=\"+_uwv+s;\u000a  i.onload=function() { _uVoid(); }\u000a }\u000a if ((_userv==1 || _userv==2) && _uSP()) {\u000a  var i2=new Image(1,1);\u000a  i2.src=_ugifpath2+\"?\"+\"utmwv=\"+_uwv+s+\"&utmac=\"+_uacct+\"&utmcc=\"+_uGCS();\u000a  i2.onload=function() { _uVoid(); }\u000a }\u000a}\u000afunction _uGCS() {\u000a var t,c=\"\",dc=_ubd.cookie;\u000a if ((t=_uGC(dc,\"__utma=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utma=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmx=\"+_udh,\";\"))!=\"-\") c+=_uES(\"__utmx=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmz=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utmz=\"+t+\";+\");\u000a if ((t=_uGC(dc,\"__utmv=\"+_udh+\".\",\";\"))!=\"-\") c+=_uES(\"__utmv=\"+t+\";\");\u000a if (c.charAt(c.length-1)==\"+\") c=c.substring(0,c.length-1);\u000a return c;\u000a}\u000afunction _uGC(l,n,s) {\u000a if (!l || l==\"\" || !n || n==\"\" || !s || s==\"\") return \"-\";\u000a var i,i2,i3,c=\"-\";\u000a i=l.indexOf(n);\u000a i3=n.indexOf(\"=\")+1;\u000a if (i > -1) {\u000a  i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }\u000a  c=l.substring((i+i3),i2);\u000a }\u000a return c;\u000a}\u000afunction _uDomain() {\u000a if (!_udn || _udn==\"\" || _udn==\"none\") { _udn=\"\"; return 1; }\u000a if (_udn==\"auto\") {\u000a  var d=_ubd.domain;\u000a  if (d.substring(0,4)==\"www.\") {\u000a   d=d.substring(4,d.length);\u000a  }\u000a  _udn=d;\u000a }\u000a _udn = _udn.toLowerCase(); \u000a if (_uhash==\"off\") return 1;\u000a return _uHash(_udn);\u000a}\u000afunction _uHash(d) {\u000a if (!d || d==\"\") return 1;\u000a var h=0,g=0;\u000a for (var i=d.length-1;i>=0;i--) {\u000a  var c=parseInt(d.charCodeAt(i));\u000a  h=((h << 6) & 0xfffffff) + c + (c << 14);\u000a  if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21));\u000a }\u000a return h;\u000a}\u000afunction _uFixA(c,s,t) {\u000a if (!c || c==\"\" || !s || s==\"\" || !t || t==\"\") return \"-\";\u000a var a=_uGC(c,\"__utma=\"+_udh+\".\",s);\u000a var lt=0,i=0;\u000a if ((i=a.lastIndexOf(\".\")) > 9) {\u000a  _uns=a.substring(i+1,a.length);\u000a  _uns=(_uns*1)+1;\u000a  a=a.substring(0,i);\u000a  if ((i=a.lastIndexOf(\".\")) > 7) {\u000a   lt=a.substring(i+1,a.length);\u000a   a=a.substring(0,i);\u000a  }\u000a  if ((i=a.lastIndexOf(\".\")) > 5) {\u000a   a=a.substring(0,i);\u000a  }\u000a  a+=\".\"+lt+\".\"+t+\".\"+_uns;\u000a }\u000a return a;\u000a}\u000afunction _uTrim(s) {\u000a  if (!s || s==\"\") return \"\";\u000a  while ((s.charAt(0)==' ') || (s.charAt(0)=='\\n') || (s.charAt(0,1)=='\\r')) s=s.substring(1,s.length);\u000a  while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\\n') || (s.charAt(s.length-1)=='\\r')) s=s.substring(0,s.length-1);\u000a  return s;\u000a}\u000afunction _uEC(s) {\u000a  var n=\"\";\u000a  if (!s || s==\"\") return \"\";\u000a  for (var i=0;i<s.length;i++) {if (s.charAt(i)==\" \") n+=\"+\"; else n+=s.charAt(i);}\u000a  return n;\u000a}\u000afunction __utmVisitorCode(f) {\u000a var r=0,t=0,i=0,i2=0,m=31;\u000a var a=_uGC(_ubd.cookie,\"__utma=\"+_udh+\".\",\";\");\u000a if ((i=a.indexOf(\".\",0))<0) return;\u000a if ((i2=a.indexOf(\".\",i+1))>0) r=a.substring(i+1,i2); else return \"\";  \u000a if ((i=a.indexOf(\".\",i2+1))>0) t=a.substring(i2+1,i); else return \"\";  \u000a if (f) {\u000a  return r;\u000a } else {\u000a  var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');\u000a  return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+\"-\"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+\"-\"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m];\u000a }\u000a}\u000afunction _uIN(n) {\u000a if (!n) return false;\u000a for (var i=0;i<n.length;i++) {\u000a  var c=n.charAt(i);\u000a  if ((c<\"0\" || c>\"9\") && (c!=\".\")) return false;\u000a }\u000a return true;\u000a}\u000afunction _uES(s,u) {\u000a if (typeof(encodeURIComponent) == 'function') {\u000a  if (u) return encodeURI(s);\u000a  else return encodeURIComponent(s);\u000a } else {\u000a  return escape(s);\u000a }\u000a}\u000afunction _uUES(s) {\u000a if (typeof(decodeURIComponent) == 'function') {\u000a  return decodeURIComponent(s);\u000a } else {\u000a  return unescape(s);\u000a }\u000a}\u000afunction _uVG() {\u000a if((_udn.indexOf(\"www.google.\") == 0 || _udn.indexOf(\".google.\") == 0 || _udn.indexOf(\"google.\") == 0) && _utcp=='/' && _udn.indexOf(\"google.org\")==-1) {\u000a  return false;\u000a }\u000a return true;\u000a}\u000afunction _uSP() {\u000a var s=100;\u000a if (_usample) s=_usample;\u000a if(s>=100 || s<=0) return true;\u000a return ((__utmVisitorCode(1)%10000)<(s*100));\u000a}\u000afunction urchinPathCopy(p){\u000a var d=document,nx,tx,sx,i,c,cs,t,h,o;\u000a cs=new Array(\"a\",\"b\",\"c\",\"v\",\"x\",\"z\");\u000a h=_uDomain(); if (_udn && _udn!=\"\") o=\" domain=\"+_udn+\";\";\u000a nx=_uNx()+\";\";\u000a tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000));\u000a tx=tx.toGMTString()+\";\";\u000a sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000));\u000a sx=sx.toGMTString()+\";\";\u000a for (i=0;i<6;i++){\u000a  t=\" expires=\";\u000a  if (i==1) t+=tx; else if (i==2) t=\"\"; else if (i==5) t+=sx; else t+=nx;\u000a  c=_uGC(d.cookie,\"__utm\"+cs[i]+\"=\"+h,\";\");\u000a  if (c!=\"-\") d.cookie=\"__utm\"+cs[i]+\"=\"+c+\"; path=\"+p+\";\"+t+o;\u000a }\u000a}\u000afunction _uCO() {\u000a if (!_utk || _utk==\"\" || _utk.length<10) return;\u000a var d='www.google.com';\u000a if (_utk.charAt(0)=='!') d='analytics.corp.google.com';\u000a _ubd.cookie=\"GASO=\"+_utk+\"; path=\"+_utcp+\";\"+_udo;\u000a var sc=document.createElement('script');\u000a sc.type='text/javascript';\u000a sc.id=\"_gasojs\";\u000a sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random();\u000a document.getElementsByTagName('head')[0].appendChild(sc);  \u000a}\u000afunction _uGT() {\u000a var h=location.hash, a;\u000a if (h && h!=\"\" && h.indexOf(\"#gaso=\")==0) {\u000a  a=_uGC(h,\"gaso=\",\"&\");\u000a } else {\u000a  a=_uGC(_ubd.cookie,\"GASO=\",\";\");\u000a }\u000a return a;\u000a}\u000avar _utk=_uGT();\u000aif (_utk && _utk!=\"\" && _utk.length>10 && _utk.indexOf(\"=\")==-1) {\u000a if (window.addEventListener) {\u000a  window.addEventListener('load', _uCO, false); \u000a } else if (window.attachEvent) { \u000a  window.attachEvent('onload', _uCO);\u000a }\u000a}\u000a\u000afunction _uNx() {\u000a  return (new Date((new Date()).getTime()+63072000000)).toGMTString();\u000a}\u000a"
          },
          "redirectURL":"",
          "headersSize":132,
          "bodySize":6847
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:11.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":50,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.329+02:00",
        "time":27,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/images/x.png",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Thu, 06 Mar 2008 19:51:47 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"26750-556-115b3ac0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":764,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Etag",
              "value":"\"26750-556-115b3ac0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":1366,
            "mimeType":"image/png"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":1366
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":27,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.332+02:00",
        "time":40,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/rss.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fe8-26b-bd642cc0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":804,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Etag",
              "value":"\"11fe8-26b-bd642cc0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":619,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":619
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":40,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.333+02:00",
        "time":55,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-includes/images/smilies/icon_smile.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Tue, 05 Feb 2008 14:05:17 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"12043-ae-baefc140\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":797,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Etag",
              "value":"\"12043-ae-baefc140\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":174,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":236,
          "bodySize":174
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":1,
          "send":0,
          "wait":54,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.336+02:00",
        "time":68,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/comment-from.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:24:57 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"6c1050-7e-bd45a840\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":823,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=49"
            },
            {
              "name":"Etag",
              "value":"\"6c1050-7e-bd45a840\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":126,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":126
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":68,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.341+02:00",
        "time":78,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/wordpress.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:25:00 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fec-208-bd736f00\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":810,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Etag",
              "value":"\"11fec-208-bd736f00\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":520,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":520
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":78,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.342+02:00",
        "time":93,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/creativebits.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:24:57 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fe4-155-bd45a840\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":813,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=46"
            },
            {
              "name":"Etag",
              "value":"\"11fe4-155-bd45a840\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":341,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":341
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":93,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.343+02:00",
        "time":107,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/sidebar_top.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fea-6d-bd642cc0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":821,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Etag",
              "value":"\"11fea-6d-bd642cc0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":109,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":236,
          "bodySize":109
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":14,
          "send":0,
          "wait":93,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.347+02:00",
        "time":119,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/img/sidebar_bottom.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/wp-content/themes/miniBits/miniBits/style.css"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sun, 27 Jun 2010 08:24:59 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"11fe9-71-bd642cc0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":824,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Etag",
              "value":"\"11fe9-71-bd642cc0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:02 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":113,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":236,
          "bodySize":113
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":4
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":25,
          "send":0,
          "wait":94,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.384+02:00",
        "time":123,
        "request":{
          "method":"GET",
          "url":"http://www.google-analytics.com/__utm.gif?utmwv=1.3&utmn=1264412328&utmcs=UTF-8&utmsr=1280x768&utmsc=24-bit&utmul=en-us&utmje=1&utmfl=10.1%20r82&utmdt=Software%20is%20hard%20%7C%20Firebug%201.6%20beta%201%20Released&utmhn=www.softwareishard.com&utmhid=620543842&utmr=0&utmp=/blog/firebug/firebug-16-beta-1-released/&utmac=UA-3586722-1&utmcc=__utma%3D57327400.167033691.1286268803.1286268803.1286268803.1%3B%2B__utmz%3D57327400.1286268803.1.1.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Host",
              "value":"www.google-analytics.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            }
          ],
          "queryString":[{
              "name":"utmac",
              "value":"UA-3586722-1"
            },
            {
              "name":"utmcc",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1;+__utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none);+"
            },
            {
              "name":"utmcs",
              "value":"UTF-8"
            },
            {
              "name":"utmdt",
              "value":"Software is hard | Firebug 1.6 beta 1 Released"
            },
            {
              "name":"utmfl",
              "value":"10.1 r82"
            },
            {
              "name":"utmhid",
              "value":"620543842"
            },
            {
              "name":"utmhn",
              "value":"www.softwareishard.com"
            },
            {
              "name":"utmje",
              "value":"1"
            },
            {
              "name":"utmn",
              "value":"1264412328"
            },
            {
              "name":"utmp",
              "value":"/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"utmr",
              "value":"0"
            },
            {
              "name":"utmsc",
              "value":"24-bit"
            },
            {
              "name":"utmsr",
              "value":"1280x768"
            },
            {
              "name":"utmul",
              "value":"en-us"
            },
            {
              "name":"utmwv",
              "value":"1.3"
            }
          ],
          "headersSize":930,
          "bodySize":-1
        },
        "response":{
          "status":200,
          "statusText":"OK",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:53:46 GMT"
            },
            {
              "name":"Content-Length",
              "value":"35"
            },
            {
              "name":"Pragma",
              "value":"no-cache"
            },
            {
              "name":"Expires",
              "value":"Wed, 19 Apr 2000 11:43:00 GMT"
            },
            {
              "name":"Last-Modified",
              "value":"Wed, 21 Jan 2004 19:51:30 GMT"
            },
            {
              "name":"Content-Type",
              "value":"image/gif"
            },
            {
              "name":"Server",
              "value":"Golfe"
            },
            {
              "name":"Cache-Control",
              "value":"private, no-cache, no-cache=Set-Cookie, proxy-revalidate"
            }
          ],
          "content":{
            "size":35,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":293,
          "bodySize":35
        },
        "cache":{},
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":123,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.516+02:00",
        "time":29,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/loading.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sat, 26 Apr 2008 09:51:19 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"e32ca-acf-9fd3b3c0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":807,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:03 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Etag",
              "value":"\"e32ca-acf-9fd3b3c0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:03 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":2767,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":2767
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":6
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":0,
          "send":0,
          "wait":29,
          "receive":0
        }
      },
      {
        "pageref":"page_26935",
        "startedDateTime":"2010-10-05T10:53:28.518+02:00",
        "time":42,
        "request":{
          "method":"GET",
          "url":"http://www.softwareishard.com/blog/wp-content/plugins/wp-lightbox2/images/closelabel.gif",
          "httpVersion":"HTTP/1.1",
          "cookies":[{
              "name":"__utma",
              "value":"57327400.167033691.1286268803.1286268803.1286268803.1"
            },
            {
              "name":"__utmb",
              "value":"57327400"
            },
            {
              "name":"__utmc",
              "value":"57327400"
            },
            {
              "name":"__utmz",
              "value":"57327400.1286268803.1.1.utmccn"
            }
          ],
          "headers":[{
              "name":"Host",
              "value":"www.softwareishard.com"
            },
            {
              "name":"User-Agent",
              "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12pre) Gecko/20101004 Namoroka/3.6.12pre (.NET CLR 3.5.30729)"
            },
            {
              "name":"Accept",
              "value":"image/png,image/*;q=0.8,*/*;q=0.5"
            },
            {
              "name":"Accept-Language",
              "value":"en-us,en;q=0.5"
            },
            {
              "name":"Accept-Encoding",
              "value":"gzip,deflate"
            },
            {
              "name":"Accept-Charset",
              "value":"ISO-8859-1,utf-8;q=0.7,*;q=0.7"
            },
            {
              "name":"Keep-Alive",
              "value":"115"
            },
            {
              "name":"Connection",
              "value":"keep-alive"
            },
            {
              "name":"Referer",
              "value":"http://www.softwareishard.com/blog/firebug/firebug-16-beta-1-released/"
            },
            {
              "name":"Cookie",
              "value":"__utma=57327400.167033691.1286268803.1286268803.1286268803.1; __utmb=57327400; __utmc=57327400; __utmz=57327400.1286268803.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"
            },
            {
              "name":"If-Modified-Since",
              "value":"Sat, 26 Apr 2008 09:51:19 GMT"
            },
            {
              "name":"If-None-Match",
              "value":"\"e32c8-3d3-9fd3b3c0\""
            },
            {
              "name":"Cache-Control",
              "value":"max-age=0"
            }
          ],
          "queryString":[],
          "headersSize":810,
          "bodySize":-1
        },
        "response":{
          "status":304,
          "statusText":"Not Modified",
          "httpVersion":"HTTP/1.1",
          "cookies":[],
          "headers":[{
              "name":"Date",
              "value":"Tue, 05 Oct 2010 08:54:03 GMT"
            },
            {
              "name":"Server",
              "value":"Apache"
            },
            {
              "name":"Connection",
              "value":"Keep-Alive"
            },
            {
              "name":"Keep-Alive",
              "value":"timeout=5, max=48"
            },
            {
              "name":"Etag",
              "value":"\"e32c8-3d3-9fd3b3c0\""
            },
            {
              "name":"Expires",
              "value":"Tue, 19 Oct 2010 08:54:03 GMT"
            },
            {
              "name":"Cache-Control",
              "value":"max-age=1209600"
            }
          ],
          "content":{
            "size":979,
            "mimeType":"image/gif"
          },
          "redirectURL":"",
          "headersSize":237,
          "bodySize":979
        },
        "cache":{
          "afterRequest":{
            "expires":"2010-10-19T08:53:28.000Z",
            "lastAccess":"2010-10-05T08:53:28.000Z",
            "eTag":"",
            "hitCount":6
          }
        },
        "timings":{
          "dns":0,
          "connect":0,
          "blocked":1,
          "send":0,
          "wait":41,
          "receive":0
        }
      }
    ]
  }
}