{ "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":"\u000a\u000a\u000a\u000a\u0009\u000a\u000a\u0009Software is hard | Firebug 1.6 beta 1 Released\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u000a\u000a\u0009\u000a\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a \u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u0009\u000a \u000a\u000a\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u000a\u000a\u000a\u000d\u000a\u000a
\u000a\u000a
\u000a
\u000a\u000a
\u000a
\u000a

Software is hard

\u000a More musings on software development\u000a
Jan Odvarko
\u000a
\u000a \u000a
\u000a
\u000a
\u000a\u000a
\u000a
\u000a\u0009\u000a
\u000a
\u000a\u000a\u000a\u000a\u000a\u000a
\u000a\u0009
\u000a\u0009\u0009

Firebug 1.6 beta 1 Released

\u000a \u0009\u0009by Honza\u000a\u0009
\u000a \u0009\u000a\u000a \u0009
\u000a \u0009 \u0009\u000a\u0009\u0009

We have been working on version 1.6 since the end of January this year and after twenty alpha releases we have first beta!

\u000a

Switching into the beta phase means a few things for Firebug 1.6 users and developers:

\u000a
    \u000a
  • Feature freeze. No new features for 1.6, we are now only fixing bugs, improving stability and compatibility with Firefox 4.0
  • \u000a
  • Firebug 1.7 (alpha) branch has been created and all contributors and active developers are switching to it. Any new ideas and features belongs into this branch.
  • \u000a
  • We appreciate feedback from beta users! Please, let us know about any problems in the newsgroup or file a bug (there are Firefox 4.0 known issues).
  • \u000a
  • If you are a translator, please help us to get rest of the strings done. Firebug locales are managed on Babelzilla.
  • \u000a
\u000a

John J. Barton already put together a list of new features on getfirebug.com blog, but it's too awesome so, let me repeat that and add a little descriptions.

\u000a\u000a
    \u000a
  • Back and Forward arrows in the toolbar 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...
  • \u000a
  • Scrolling Panels Tab Bar 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.
  • \u000a
  • Command line available on all panels 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.
  • \u000a
  • Implemented console.table New method for well known console object that allows to log various data structures using tabular format. Not only the layout is useful, but you can also sort by columns.
  • \u000a
  • Disabling break on next error When Firebug debugger hits a debugger; 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 disabled breakpoint (a breakpoint with condition set to false).
  • \u000a
  • MozAfterPaint events Painting events can be tracked by the Net panel and displayed on the graphical timeline together with all the other events and HTTP requests.
  • \u000a
  • Net panel reports BFCache hits 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.
  • \u000a
  • Option to use en-US locale 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.
  • \u000a
  • First Run Page A first run page is now displayed after an install or update. We want to keep you updated through this page.
  • \u000a
  • Testbot results Results from automated test-bot are continuously displayed on getfirebug.com. Anybody can run automated Firebug test suite and upload results to that page (so we can see that even rare configurations work).
  • \u000a
  • Console Filtering 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.
  • \u000a
\u000a

We have also fixed many bugs, compatibility issues, memory leaks and I see Firebug 1.6 as the best version ever.

\u000a\u0009\u0009
\u000a \u0009
\u000a
\u000a\u000a
\u000a
\u000a\u000a
\u000a\u000a\"Rss\u000a\u000a

9 Comments

\u000a\u000a
    \u000a\u000a\u000a\u0009
  1. \u000a \u0009

    Twitter Trackbacks...

    \u000a

    ...

    \u000a\u0009\u0009
    \u000a\u0009\u0009#1 Anonymous\u0009\u0009\u0009\u000a\u0009
  2. \u000a\u000a\u000a\u0009
  3. \u000a \u0009

    you can use firebug for ie if you use internet explorer

    \u000a\u0009\u0009
    \u000a\u0009\u0009#2 eben\u0009\u0009\u0009\u000a\u0009
  4. \u000a\u000a\u000a\u0009
  5. \u000a \u0009

    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.

    \u000a\u0009\u0009
    \u000a\u0009\u0009#3 Sebastian Z.\u0009\u0009\u0009\u000a\u0009
  6. \u000a\u000a\u000a\u0009
  7. \u000a \u0009

    @Sebastian: yeah, you right, updated!
    \u000aHonza

    \u000a\u0009\u0009
    \u000a\u0009\u0009#4 Honza\u0009\u0009\u0009\u000a\u0009
  8. \u000a\u000a\u000a\u0009
  9. \u000a \u0009

    Very nice, the new 1.6 is very fast and good, i love

    \u000a\u0009\u0009
    \u000a\u0009\u0009#5 Luxus Autovermietung\u0009\u0009\u0009\u000a\u0009
  10. \u000a\u000a\u000a\u0009
  11. \u000a \u0009

    Firefox 4.0 and Firebug 1.6 are the perfect mix!.

    \u000a\u0009\u0009
    \u000a\u0009\u0009#6 Yurtdışı Eğitim\u0009\u0009\u0009\u000a\u0009
  12. \u000a\u000a\u000a\u0009
  13. \u000a \u0009

    It's me again. :-)
    \u000aJust wanted to complete the list with some more of the fine features implemented in 1.6:

    \u000a

    - Reworked Command Line completion incl. suggestion popup
    \u000a- Saving of breakpoints over browser sessions
    \u000a- Filterable File Location menus
    \u000a- SVG CSS auto-completion
    \u000a- Visual indication for search field not finding any matches
    \u000a- Folding for Computed CSS Styles
    \u000a- Editor configurations improvements
    \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

    \u000a

    etc.

    \u000a

    So you see 1.6 offers even more than what this blog entry describes (not mentioning all the bug fixes done in this version).

    \u000a\u0009\u0009
    \u000a\u0009\u0009#7 Sebastian Z.\u0009\u0009\u0009\u000a\u0009
  14. \u000a\u000a\u000a\u0009
  15. \u000a \u0009

    @Sebastian: Great summary, thanks!
    \u000aHonza

    \u000a\u0009\u0009
    \u000a\u0009\u0009#8 Honza\u0009\u0009\u0009\u000a\u0009
  16. \u000a\u000a\u000a\u0009
  17. \u000a \u0009

    I'm using it with Firefox 3.6, and it's going great
    \u000aThanks !

    \u000a\u0009\u0009
    \u000a\u0009\u0009#9 Amr Boghdady\u0009\u0009\u0009\u000a\u0009
  18. \u000a\u000a
\u000a\u000a\u000a\u000a
\u000a\u000a
\u000a

Leave a comment

\u000a\u000a
\u000a\u000a\u000a
\u000a\u000a\u000a\u000a
\u000a\u000a\u000a
\u000a\u000a\u000a\u000a\u000a\u000a\u000a
\u000a\u000a\u000a

\u000a\u000a

\u000a\u000a\u000a\u000a\u000a
\u000a\u000a\u000a\u000a\u000a
\u000a
\u000a\u000a\u0009\u000a\u000a \u000a\u000a
\u000a
\u000a\u000a
\u000a
\u000a
\u000a\u000a\u000a\u0009
\u000a\u0009
\u000a\u0009
\u000a\u000a
\u000a

Search:

\u000a
\u000a\u0009\u0009\u000a\u0009\u0009\u000a\u0009
\u000a
\u000a \u000a

Archives

\u000a\u0009\u000a
\u000a \u000a\u000a\u000a\u000a\u000a
\u000a
\u000a
\u000a\u000a
\u000a\"Wordpress.org\"/\u000a\"clearPaper\u000a\u0009Copyright © 2007 Software is hard. All rights reserved.\u000a\u0009Xhtml, Css, Rss. Powered by miniBits & Wordpress.
\u000a\u000a
\u000a\u000a
This blog is protected by Dave's Spam Karma 2: 27416 Spams eaten and counting...
\u000a\u000d\u000a\u000a\u000a" }, "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: ']*>([\\\\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,'&').replace(//g,'>');\u000a },\u000a unescapeHTML: function() {\u000a return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/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 '#';\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 '#';\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 = '' + html.stripScripts() + '
';\u000a depth = 2;\u000a break;\u000a case 'TR':\u000a div.innerHTML = '' + html.stripScripts() + '
';\u000a depth = 3;\u000a break;\u000a case 'TD':\u000a div.innerHTML = '
' + html.stripScripts() + '
';\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 = '' + this.content + '
';\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 \"#\";\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('');\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= 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 '#';\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 = '
';\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
\u000a\u0009\u0009//\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009
\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 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-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;i0) 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\"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":"\u000a\u000a\u000a\u000a\u0009\u000a\u000a\u0009Software is hard | Firebug 1.6 beta 1 Released\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u000a\u000a\u0009\u000a\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a \u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u0009\u000a \u000a\u000a\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u0009\u000a\u000a\u000a\u000a\u000d\u000a\u000a
\u000a\u000a
\u000a
\u000a\u000a
\u000a
\u000a

Software is hard

\u000a More musings on software development\u000a
Jan Odvarko
\u000a
\u000a \u000a
\u000a
\u000a
\u000a\u000a
\u000a
\u000a\u0009\u000a
\u000a
\u000a\u000a\u000a\u000a\u000a\u000a
\u000a\u0009
\u000a\u0009\u0009

Firebug 1.6 beta 1 Released

\u000a \u0009\u0009by Honza\u000a\u0009
\u000a \u0009\u000a\u000a \u0009
\u000a \u0009 \u0009\u000a\u0009\u0009

We have been working on version 1.6 since the end of January this year and after twenty alpha releases we have first beta!

\u000a

Switching into the beta phase means a few things for Firebug 1.6 users and developers:

\u000a
    \u000a
  • Feature freeze. No new features for 1.6, we are now only fixing bugs, improving stability and compatibility with Firefox 4.0
  • \u000a
  • Firebug 1.7 (alpha) branch has been created and all contributors and active developers are switching to it. Any new ideas and features belongs into this branch.
  • \u000a
  • We appreciate feedback from beta users! Please, let us know about any problems in the newsgroup or file a bug (there are Firefox 4.0 known issues).
  • \u000a
  • If you are a translator, please help us to get rest of the strings done. Firebug locales are managed on Babelzilla.
  • \u000a
\u000a

John J. Barton already put together a list of new features on getfirebug.com blog, but it's too awesome so, let me repeat that and add a little descriptions.

\u000a\u000a
    \u000a
  • Back and Forward arrows in the toolbar 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...
  • \u000a
  • Scrolling Panels Tab Bar 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.
  • \u000a
  • Command line available on all panels 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.
  • \u000a
  • Implemented console.table New method for well known console object that allows to log various data structures using tabular format. Not only the layout is useful, but you can also sort by columns.
  • \u000a
  • Disabling break on next error When Firebug debugger hits a debugger; 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 disabled breakpoint (a breakpoint with condition set to false).
  • \u000a
  • MozAfterPaint events Painting events can be tracked by the Net panel and displayed on the graphical timeline together with all the other events and HTTP requests.
  • \u000a
  • Net panel reports BFCache hits 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.
  • \u000a
  • Option to use en-US locale 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.
  • \u000a
  • First Run Page A first run page is now displayed after an install or update. We want to keep you updated through this page.
  • \u000a
  • Testbot results Results from automated test-bot are continuously displayed on getfirebug.com. Anybody can run automated Firebug test suite and upload results to that page (so we can see that even rare configurations work).
  • \u000a
  • Console Filtering 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.
  • \u000a
\u000a

We have also fixed many bugs, compatibility issues, memory leaks and I see Firebug 1.6 as the best version ever.

\u000a\u0009\u0009
\u000a \u0009
\u000a
\u000a\u000a
\u000a
\u000a\u000a
\u000a\u000a\"Rss\u000a\u000a

9 Comments

\u000a\u000a
    \u000a\u000a\u000a\u0009
  1. \u000a \u0009

    Twitter Trackbacks...

    \u000a

    ...

    \u000a\u0009\u0009
    \u000a\u0009\u0009#1 Anonymous\u0009\u0009\u0009\u000a\u0009
  2. \u000a\u000a\u000a\u0009
  3. \u000a \u0009

    you can use firebug for ie if you use internet explorer

    \u000a\u0009\u0009
    \u000a\u0009\u0009#2 eben\u0009\u0009\u0009\u000a\u0009
  4. \u000a\u000a\u000a\u0009
  5. \u000a \u0009

    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.

    \u000a\u0009\u0009
    \u000a\u0009\u0009#3 Sebastian Z.\u0009\u0009\u0009\u000a\u0009
  6. \u000a\u000a\u000a\u0009
  7. \u000a \u0009

    @Sebastian: yeah, you right, updated!
    \u000aHonza

    \u000a\u0009\u0009
    \u000a\u0009\u0009#4 Honza\u0009\u0009\u0009\u000a\u0009
  8. \u000a\u000a\u000a\u0009
  9. \u000a \u0009

    Very nice, the new 1.6 is very fast and good, i love

    \u000a\u0009\u0009
    \u000a\u0009\u0009#5 Luxus Autovermietung\u0009\u0009\u0009\u000a\u0009
  10. \u000a\u000a\u000a\u0009
  11. \u000a \u0009

    Firefox 4.0 and Firebug 1.6 are the perfect mix!.

    \u000a\u0009\u0009
    \u000a\u0009\u0009#6 Yurtdışı Eğitim\u0009\u0009\u0009\u000a\u0009
  12. \u000a\u000a\u000a\u0009
  13. \u000a \u0009

    It's me again. :-)
    \u000aJust wanted to complete the list with some more of the fine features implemented in 1.6:

    \u000a

    - Reworked Command Line completion incl. suggestion popup
    \u000a- Saving of breakpoints over browser sessions
    \u000a- Filterable File Location menus
    \u000a- SVG CSS auto-completion
    \u000a- Visual indication for search field not finding any matches
    \u000a- Folding for Computed CSS Styles
    \u000a- Editor configurations improvements
    \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

    \u000a

    etc.

    \u000a

    So you see 1.6 offers even more than what this blog entry describes (not mentioning all the bug fixes done in this version).

    \u000a\u0009\u0009
    \u000a\u0009\u0009#7 Sebastian Z.\u0009\u0009\u0009\u000a\u0009
  14. \u000a\u000a\u000a\u0009
  15. \u000a \u0009

    @Sebastian: Great summary, thanks!
    \u000aHonza

    \u000a\u0009\u0009
    \u000a\u0009\u0009#8 Honza\u0009\u0009\u0009\u000a\u0009
  16. \u000a\u000a\u000a\u0009
  17. \u000a \u0009

    I'm using it with Firefox 3.6, and it's going great
    \u000aThanks !

    \u000a\u0009\u0009
    \u000a\u0009\u0009#9 Amr Boghdady\u0009\u0009\u0009\u000a\u0009
  18. \u000a\u000a
\u000a\u000a\u000a\u000a
\u000a\u000a
\u000a

Leave a comment

\u000a\u000a
\u000a\u000a\u000a
\u000a\u000a\u000a\u000a
\u000a\u000a\u000a
\u000a\u000a\u000a\u000a\u000a\u000a\u000a
\u000a\u000a\u000a

\u000a\u000a

\u000a\u000a\u000a\u000a\u000a
\u000a\u000a\u000a\u000a\u000a
\u000a
\u000a\u000a\u0009\u000a\u000a \u000a\u000a
\u000a
\u000a\u000a
\u000a
\u000a
\u000a\u000a\u000a\u0009
\u000a\u0009
\u000a\u0009
\u000a\u000a
\u000a

Search:

\u000a
\u000a\u0009\u0009\u000a\u0009\u0009\u000a\u0009
\u000a
\u000a \u000a

Archives

\u000a\u0009\u000a
\u000a \u000a\u000a\u000a\u000a\u000a
\u000a
\u000a
\u000a\u000a
\u000a\"Wordpress.org\"/\u000a\"clearPaper\u000a\u0009Copyright © 2007 Software is hard. All rights reserved.\u000a\u0009Xhtml, Css, Rss. Powered by miniBits & Wordpress.
\u000a\u000a
\u000a\u000a
This blog is protected by Dave's Spam Karma 2: 27416 Spams eaten and counting...
\u000a\u000d\u000a\u000a\u000a" }, "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: ']*>([\\\\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,'&').replace(//g,'>');\u000a },\u000a unescapeHTML: function() {\u000a return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/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 '#';\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 '#';\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 = '' + html.stripScripts() + '
';\u000a depth = 2;\u000a break;\u000a case 'TR':\u000a div.innerHTML = '' + html.stripScripts() + '
';\u000a depth = 3;\u000a break;\u000a case 'TD':\u000a div.innerHTML = '
' + html.stripScripts() + '
';\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 = '' + this.content + '
';\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 \"#\";\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('');\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= 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 '#';\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 = '
';\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
\u000a\u0009\u0009//\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009\u0009\u000a\u0009\u0009//\u0009\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009\u0009
\u000a\u0009\u0009//\u0009\u0009
\u000a\u0009\u0009//\u0009
\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 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-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;i0) 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\"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 } } ] } }