diff --git a/.gitignore b/.gitignore index 2eb58db0..0c62f097 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ /extension/build/ /extension/release/ *.graphml +/webapp-build/ # Files from NPM /extension/node_modules/ diff --git a/README.md b/README.md index 60be8695..6ee0dba4 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,17 @@ Testing Development ----------- -* To start the build, go to the webapp/scripts directory and execute the following command: - -`..\..\requirejs\build\build.bat app.build.js` - +* Run from source on NodeJS using RequireJS or PINF JavaScript module loader: +```` + cd dev + npm install + npm start + open http://localhost:8080 +```` +* Run from source (PHP) using RequireJS module loader: + * Build client to `./webapp-build`: `ant` + * Mount document root: `./webapp` + * Open in web browser +* Build and publish to github pages: + * Run: `ant publish-to-github` + * Open: http://fireconsole.github.io/harviewer/ diff --git a/build.xml b/build.xml index d37d8088..c0a5ab57 100644 --- a/build.xml +++ b/build.xml @@ -74,8 +74,21 @@ + + + + + + + + + + + + + - + diff --git a/dev/.gitignore b/dev/.gitignore new file mode 100644 index 00000000..b93a7a0d --- /dev/null +++ b/dev/.gitignore @@ -0,0 +1,3 @@ +/client/.rt/ +/node_modules/ +/npm-debug.log \ No newline at end of file diff --git a/dev/package.json b/dev/package.json new file mode 100644 index 00000000..09108161 --- /dev/null +++ b/dev/package.json @@ -0,0 +1,18 @@ +{ + "name": "dev", + "version": "0.0.0", + "private": true, + "main": "./server.js", + "dependencies": { + "express": "^4.7.2", + "pinf-for-nodejs": "0.1.x", + "send": "^0.7.3", + "pinf-to-github-pages": "0.1.x", + "rework": "^1.0.1", + "rework-import": "^2.0.0", + "rework-plugin-inline": "^1.0.1" + }, + "scripts": { + "start": "rm -Rf client/.rt ../fireconsole/.rt ; node server.js" + } +} diff --git a/dev/server.js b/dev/server.js new file mode 100644 index 00000000..7c87d3c3 --- /dev/null +++ b/dev/server.js @@ -0,0 +1,81 @@ + +const PATH = require("path"); +const FS = require("fs"); +const PINF = require("pinf-for-nodejs"); +const EXPRESS = require("express"); +const SEND = require("send"); +const HTTP = require("http"); +const REWORK = require("rework"); +const REWORK_IMPORT = require("rework-import"); +const REWORK_INLINE = require("rework-plugin-inline"); + + +const PORT = process.env.PORT || 8080; + +return PINF.main(function(options, callback) { + + var app = EXPRESS(); + + app.get(/^\/scripts\/css\/(.+\.css)$/, function (req, res, next) { + var basePath = PATH.join(__dirname, "../webapp/scripts/css"); + + var source = FS.readFileSync(PATH.join(basePath, req.params[0]), "utf8"); + + source = REWORK(source) + .use(REWORK_IMPORT({ + path: basePath + })) + .toString(); + + source = source.replace(/(background[\s\w-]*:[\s#\w]*]*)url(\('?"?images\/)/g, "$1inline$2"); + + source = res.end(REWORK(source) + .use(REWORK_INLINE(basePath)) + .toString()); + + return res.end(source); + }); + + // For RequireJS loader. + app.get(/^\/scripts\/(.+)$/, function (req, res, next) { + return SEND(req, req.params[0], { + root: PATH.join(__dirname, "../webapp/scripts") + }).on("error", next).pipe(res); + }); + app.get(/^\/examples\/(.+)$/, function (req, res, next) { + return SEND(req, req.params[0], { + root: PATH.join(__dirname, "../webapp/scripts/examples") + }).on("error", next).pipe(res); + }); + + // For PINF loader. + app.get(/^\/lib\/pinf-loader-js\/(.+)$/, function (req, res, next) { + return SEND(req, req.params[0], { + root: PATH.join(__dirname, "node_modules/pinf-for-nodejs/node_modules/pinf-loader-js") + }).on("error", next).pipe(res); + }); + app.get(/^\/(plugin.+)$/, PINF.hoist(PATH.join(__dirname, "../fireconsole/program.json"), options.$pinf.makeOptions({ + debug: true, + verbose: true, + PINF_RUNTIME: "", + $pinf: options.$pinf + }))); + + // For both loaders and dev helper files. + app.get(/^(\/.*)$/, function (req, res, next) { + var path = req.params[0]; + if (path === "/") path = "/index.html"; + return SEND(req, path, { + root: PATH.join(__dirname, "www") + }).on("error", next).pipe(res); + }); + + HTTP.createServer(app).listen(PORT) + + // Wait for debug output from `PINF.hoist()` to finish. + setTimeout(function() { + console.log("Open browser to: http://localhost:" + PORT + "/"); + }, 2 * 1000); + +}, module); + diff --git a/dev/www/index.html b/dev/www/index.html new file mode 100644 index 00000000..6e004bb8 --- /dev/null +++ b/dev/www/index.html @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/dev/www/pinf.htm b/dev/www/pinf.htm new file mode 100644 index 00000000..9bab53de --- /dev/null +++ b/dev/www/pinf.htm @@ -0,0 +1,19 @@ + + + + HTTP Archive Viewer @VERSION@ + + + + +
+ + + + \ No newline at end of file diff --git a/dev/www/requirejs.htm b/dev/www/requirejs.htm new file mode 100644 index 00000000..db134b9d --- /dev/null +++ b/dev/www/requirejs.htm @@ -0,0 +1,15 @@ + + + + HTTP Archive Viewer @VERSION@ + + + +
+ + + + + diff --git a/fireconsole/.gitignore b/fireconsole/.gitignore new file mode 100644 index 00000000..61a1f8e7 --- /dev/null +++ b/fireconsole/.gitignore @@ -0,0 +1 @@ +/.rt/ \ No newline at end of file diff --git a/fireconsole/README.md b/fireconsole/README.md new file mode 100644 index 00000000..2f4f8fbc --- /dev/null +++ b/fireconsole/README.md @@ -0,0 +1,4 @@ +FireConsole Plugin +================== + +Everything needed to use the harviewer as a [FireConsole](http://fireconsole.org) plugin. diff --git a/fireconsole/bundles/plugin.js b/fireconsole/bundles/plugin.js new file mode 100644 index 00000000..69ba143b --- /dev/null +++ b/fireconsole/bundles/plugin.js @@ -0,0 +1,21294 @@ +// @pinf-bundle-ignore: +PINF.bundle("", function(require) { +// @pinf-bundle-header: {"helper":"amd"} +function define(id, dependencies, moduleInitializer) { + if (typeof dependencies === "undefined" && typeof moduleInitializer === "undefined") { + if (typeof id === "function") { + moduleInitializer = id; + } else { + var exports = id; + moduleInitializer = function() { return exports; } + } + dependencies = ["require", "exports", "module"]; + id = null; + } else + if (Array.isArray(id) && typeof dependencies === "function" && typeof moduleInitializer === "undefined") { + moduleInitializer = dependencies; + dependencies = id; + id = null; + } else + if (typeof id === "string" && typeof dependencies === "function" && typeof moduleInitializer === "undefined") { + moduleInitializer = dependencies; + dependencies = ["require", "exports", "module"]; + } + return function(realRequire, exports, module) { + function require(id) { + if (Array.isArray(id)) { + var apis = []; + var callback = arguments[1]; + id.forEach(function(moduleId, index) { + realRequire.async(moduleId, function(api) { + apis[index] = api + if (apis.length === id.length) { + if (callback) callback.apply(null, apis); + } + }, function(err) { + throw err; + }); + }); + } else { + return realRequire(id); + } + } + require.toUrl = function(id) { + return realRequire.sandbox.id.replace(/\/[^\/]*$/, "") + realRequire.id(id); + } + require.sandbox = realRequire.sandbox; + require.id = realRequire.id; + if (typeof amdRequireImplementation !== "undefined") { + amdRequireImplementation = require; + } + if (typeof moduleInitializer === "function") { + return moduleInitializer.apply(moduleInitializer, dependencies.map(function(name) { + if (name === "require") return require; + if (name === "exports") return exports; + if (name === "module") return module; + return require(name); + })); + } else + if (typeof dependencies === "object") { + return dependencies; + } + } +} +define.amd = { jQuery: true }; +require.def = define; +// @pinf-bundle-module: {"file":"plugin.js","mtime":1420588688,"wrapper":"commonjs","format":"commonjs","id":"/plugin.js"} +require.memoize("/plugin.js", +function(require, exports, module) {var __dirname = ''; + +var JQUERY = require("jquery/jquery"); +var HARVIEWER = require("harviewer"); + +exports.main = function (domNode) { + + HARVIEWER.init(domNode || JQUERY("#content")[0]); + +} + +} +, {"filename":"plugin.js"}); +// @pinf-bundle-module: {"file":"../webapp/scripts/jquery/jquery.js","mtime":1420421820,"wrapper":"amd","format":"amd","id":"45d7de3498542e1f7118e3db47ee8e06dbc24163-jquery/jquery.js"} +require.memoize("45d7de3498542e1f7118e3db47ee8e06dbc24163-jquery/jquery.js", +/*! + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ + +define([],function () { + +return (function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The deferred used on DOM ready + readyList, + + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.5.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + // A third-party is pushing the ready event forwards + if ( wait === true ) { + jQuery.readyWait--; + } + + // Make sure that the DOM is not already loaded + if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); + + if ( jQuery.support.scriptEval() ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( object ) { + var lastIndex = arguments.length, + deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? + object : + jQuery.Deferred(), + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } + } else if ( deferred !== object ) { + deferred.resolve( object ); + } + return promise; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySubclass( selector, context ) { + return new jQuerySubclass.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySubclass, this ); + jQuerySubclass.superclass = this; + jQuerySubclass.fn = jQuerySubclass.prototype = this(); + jQuerySubclass.fn.constructor = jQuerySubclass; + jQuerySubclass.subclass = this.subclass; + jQuerySubclass.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { + context = jQuerySubclass(context); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); + }; + jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; + var rootjQuerySubclass = jQuerySubclass(document); + return jQuerySubclass; + }, + + browser: {} +}); + +// Create readyList deferred +readyList = jQuery._Deferred(); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +(function() { + + jQuery.support = {}; + + var div = document.createElement("div"); + + div.style.display = "none"; + div.innerHTML = "
a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0], + select = document.createElement("select"), + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: input.value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Will be defined later + deleteExpando: true, + optDisabled: false, + checkClone: false, + noCloneEvent: true, + noCloneChecked: true, + boxModel: null, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableHiddenOffsets: true + }; + + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as diabled) + select.disabled = true; + jQuery.support.optDisabled = !opt.disabled; + + var _scriptEval = null; + jQuery.support.scriptEval = function() { + if ( _scriptEval === null ) { + var root = document.documentElement, + script = document.createElement("script"), + id = "script" + jQuery.now(); + + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + _scriptEval = true; + delete window[ id ]; + } else { + _scriptEval = false; + } + + root.removeChild( script ); + // release memory in IE + root = script = id = null; + } + + return _scriptEval; + }; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"), + body = document.getElementsByTagName("body")[0]; + + // Frameset documents with no body should not run this code + if ( !body ) { + return; + } + + div.style.width = div.style.paddingLeft = "1px"; + body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; + } + + div.innerHTML = "
t
"; + var tds = div.getElementsByTagName("td"); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; + div.innerHTML = ""; + + body.removeChild( div ).style.display = "none"; + div = tds = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( !el.attachEvent ) { + return true; + } + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + div = all = a = null; +})(); + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = name.substr( 5 ); + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + data = elem.getAttribute( "data-" + key ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspaces = /\s+/, + rreturn = /\r/g, + rspecialurl = /^(?:href|src|style)$/, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rradiocheck = /^(?:radio|checkbox)$/i; + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspaces ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( !arguments.length ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray(val) ) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + // 'in' checks fail in Blackberry 4.7 #6931 + if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + if ( value === null ) { + if ( elem.nodeType === 1 ) { + elem.removeAttribute( name ); + } + + } else { + elem[ name ] = value; + } + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + // Ensure that missing attributes return undefined + // Blackberry 4.7 returns "" from getAttribute #6938 + if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { + return undefined; + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + // Handle everything which isn't a DOM element node + if ( set ) { + elem[ name ] = value; + } + return elem[ name ]; + } +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspace = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + } + catch ( e ) {} + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + // XXX This code smells terrible. event.js should not be directly + // inspecting the data cache + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery._data( elem, "handle" ); + + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + event.preventDefault(); + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (inlineError) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var old, + target = event.target, + targetType = type.replace( rnamespaces, "" ), + isClick = jQuery.nodeName( target, "a" ) && targetType === "click", + special = jQuery.event.special[ targetType ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ targetType ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + targetType ]; + + if ( old ) { + target[ "on" + targetType ] = null; + } + + jQuery.event.triggered = true; + target[ targetType ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (triggerError) {} + + if ( old ) { + target[ "on" + targetType ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace_re, events, + namespace_sort = [], + args = jQuery.makeArray( arguments ); + + event = args[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.namespace = event.namespace || namespace_sort.join("."); + + events = jQuery._data(this, "events"); + + handlers = (events || {})[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, + body = document.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) || data === false ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === elem.getAttribute( 'type' ); + }, + radio: function( elem ) { + return "radio" === elem.type; + }, + + checkbox: function( elem ) { + return "checkbox" === elem.type; + }, + + file: function( elem ) { + return "file" === elem.type; + }, + password: function( elem ) { + return "password" === elem.type; + }, + + submit: function( elem ) { + return "submit" === elem.type; + }, + + image: function( elem ) { + return "image" === elem.type; + }, + + reset: function( elem ) { + return "reset" === elem.type; + }, + + button: function( elem ) { + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + if ( matches ) { + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + return matches.call( node, expr ); + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), + length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + var pos = POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique(ret) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + +
+ + + + \ No newline at end of file diff --git a/fireconsole/tests/package.json b/fireconsole/tests/package.json new file mode 100644 index 00000000..ab86f774 --- /dev/null +++ b/fireconsole/tests/package.json @@ -0,0 +1,6 @@ +{ + "main": "./_all.js", + "mappings": { + "examples": "../../webapp/examples" + } +} \ No newline at end of file diff --git a/program.json b/program.json new file mode 100644 index 00000000..638077f7 --- /dev/null +++ b/program.json @@ -0,0 +1,9 @@ +{ + "config": { + "github.com/pinf-to/pinf-to-github-pages/0": { + "programs": { + "fireconsole": "./fireconsole/program.json" + } + } + } +} \ No newline at end of file diff --git a/requirejs/bin/x b/requirejs/bin/x old mode 100644 new mode 100755 diff --git a/requirejs/bin/x.bat b/requirejs/bin/x.bat old mode 100644 new mode 100755 diff --git a/requirejs/bin/xdebug b/requirejs/bin/xdebug old mode 100644 new mode 100755 diff --git a/requirejs/bin/xdebug.bat b/requirejs/bin/xdebug.bat old mode 100644 new mode 100755 diff --git a/requirejs/bin/xj b/requirejs/bin/xj old mode 100644 new mode 100755 diff --git a/requirejs/bin/xj.bat b/requirejs/bin/xj.bat old mode 100644 new mode 100755 diff --git a/requirejs/bin/xjdebug b/requirejs/bin/xjdebug old mode 100644 new mode 100755 diff --git a/requirejs/bin/xjdebug.bat b/requirejs/bin/xjdebug.bat old mode 100644 new mode 100755 diff --git a/requirejs/build/build.bat b/requirejs/build/build.bat old mode 100644 new mode 100755 diff --git a/requirejs/build/build.sh b/requirejs/build/build.sh old mode 100644 new mode 100755 diff --git a/requirejs/build/buildj.bat b/requirejs/build/buildj.bat old mode 100644 new mode 100755 diff --git a/requirejs/build/buildj.sh b/requirejs/build/buildj.sh old mode 100644 new mode 100755 diff --git a/webapp/index.php b/webapp/index.php index 471b8fb2..0ba3bc98 100644 --- a/webapp/index.php +++ b/webapp/index.php @@ -7,9 +7,10 @@
- + - diff --git a/webapp/scripts/core/lib.js b/webapp/scripts/core/lib.js index 61d70eb7..688b3f17 100644 --- a/webapp/scripts/core/lib.js +++ b/webapp/scripts/core/lib.js @@ -1,10 +1,11 @@ /* See license.txt for terms of usage */ require.def("core/lib", [ + "jquery/jquery", "core/trace" ], -function(Trace) { +function(jQuery, Trace) { //***********************************************************************************************// diff --git a/webapp/scripts/core/package.json b/webapp/scripts/core/package.json new file mode 100644 index 00000000..791b72d1 --- /dev/null +++ b/webapp/scripts/core/package.json @@ -0,0 +1,9 @@ +{ + "mappings": { + "core": ".", + "jquery": "../jquery" + }, + "directories": { + "lib": "." + } +} \ No newline at end of file diff --git a/webapp/css/SyntaxHighlighter.css b/webapp/scripts/css/SyntaxHighlighter.css similarity index 100% rename from webapp/css/SyntaxHighlighter.css rename to webapp/scripts/css/SyntaxHighlighter.css diff --git a/webapp/css/aboutTab.css b/webapp/scripts/css/aboutTab.css similarity index 100% rename from webapp/css/aboutTab.css rename to webapp/scripts/css/aboutTab.css diff --git a/webapp/css/domTab.css b/webapp/scripts/css/domTab.css similarity index 100% rename from webapp/css/domTab.css rename to webapp/scripts/css/domTab.css diff --git a/webapp/css/domTree.css b/webapp/scripts/css/domTree.css similarity index 100% rename from webapp/css/domTree.css rename to webapp/scripts/css/domTree.css diff --git a/webapp/css/dragdrop.css b/webapp/scripts/css/dragdrop.css similarity index 100% rename from webapp/css/dragdrop.css rename to webapp/scripts/css/dragdrop.css diff --git a/webapp/scripts/css/embedTab.css b/webapp/scripts/css/embedTab.css new file mode 100644 index 00000000..a7982fea --- /dev/null +++ b/webapp/scripts/css/embedTab.css @@ -0,0 +1,20 @@ +/* See license.txt for terms of usage */ + +.EmbedTab { + margin-left: 100px; +} + +.tabEmbedBody { + font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; + font-size: 11.7px; + font-style: normal; + font-weight: 400; +} + +.embedBody { + padding: 8px; +} + +.tabEmbedBody code { + color: green; +} diff --git a/webapp/css/harPreview.css b/webapp/scripts/css/harPreview.css similarity index 100% rename from webapp/css/harPreview.css rename to webapp/scripts/css/harPreview.css diff --git a/webapp/css/harView.css b/webapp/scripts/css/harView.css similarity index 100% rename from webapp/css/harView.css rename to webapp/scripts/css/harView.css diff --git a/webapp/css/harViewer.css b/webapp/scripts/css/harViewer.css similarity index 96% rename from webapp/css/harViewer.css rename to webapp/scripts/css/harViewer.css index 25fe7981..8d2f4bff 100644 --- a/webapp/css/harViewer.css +++ b/webapp/scripts/css/harViewer.css @@ -24,6 +24,7 @@ @import url("homeTab.css"); @import url("domTab.css"); @import url("schemaTab.css"); +@import url("embedTab.css"); @import url("previewTab.css"); @import url("search.css"); diff --git a/webapp/css/homeTab.css b/webapp/scripts/css/homeTab.css similarity index 100% rename from webapp/css/homeTab.css rename to webapp/scripts/css/homeTab.css diff --git a/webapp/css/images/ajax-loader.gif b/webapp/scripts/css/images/ajax-loader.gif similarity index 100% rename from webapp/css/images/ajax-loader.gif rename to webapp/scripts/css/images/ajax-loader.gif diff --git a/webapp/css/images/bg-button.gif b/webapp/scripts/css/images/bg-button.gif similarity index 100% rename from webapp/css/images/bg-button.gif rename to webapp/scripts/css/images/bg-button.gif diff --git a/webapp/css/images/blank.gif b/webapp/scripts/css/images/blank.gif similarity index 100% rename from webapp/css/images/blank.gif rename to webapp/scripts/css/images/blank.gif diff --git a/webapp/css/images/button-background.png b/webapp/scripts/css/images/button-background.png similarity index 100% rename from webapp/css/images/button-background.png rename to webapp/scripts/css/images/button-background.png diff --git a/webapp/css/images/checkmark.gif b/webapp/scripts/css/images/checkmark.gif similarity index 100% rename from webapp/css/images/checkmark.gif rename to webapp/scripts/css/images/checkmark.gif diff --git a/webapp/css/images/checkmark.png b/webapp/scripts/css/images/checkmark.png similarity index 100% rename from webapp/css/images/checkmark.png rename to webapp/scripts/css/images/checkmark.png diff --git a/webapp/css/images/close-sprites.png b/webapp/scripts/css/images/close-sprites.png similarity index 100% rename from webapp/css/images/close-sprites.png rename to webapp/scripts/css/images/close-sprites.png diff --git a/webapp/css/images/contextMenuTarget.png b/webapp/scripts/css/images/contextMenuTarget.png similarity index 100% rename from webapp/css/images/contextMenuTarget.png rename to webapp/scripts/css/images/contextMenuTarget.png diff --git a/webapp/css/images/contextMenuTargetHover.png b/webapp/scripts/css/images/contextMenuTargetHover.png similarity index 100% rename from webapp/css/images/contextMenuTargetHover.png rename to webapp/scripts/css/images/contextMenuTargetHover.png diff --git a/webapp/css/images/download-sprites.png b/webapp/scripts/css/images/download-sprites.png similarity index 100% rename from webapp/css/images/download-sprites.png rename to webapp/scripts/css/images/download-sprites.png diff --git a/webapp/css/images/downloadButtons-aero.png b/webapp/scripts/css/images/downloadButtons-aero.png similarity index 100% rename from webapp/css/images/downloadButtons-aero.png rename to webapp/scripts/css/images/downloadButtons-aero.png diff --git a/webapp/css/images/group.gif b/webapp/scripts/css/images/group.gif similarity index 100% rename from webapp/css/images/group.gif rename to webapp/scripts/css/images/group.gif diff --git a/webapp/css/images/loading_16.gif b/webapp/scripts/css/images/loading_16.gif similarity index 100% rename from webapp/css/images/loading_16.gif rename to webapp/scripts/css/images/loading_16.gif diff --git a/webapp/css/images/menu/previewMenuHandle.png b/webapp/scripts/css/images/menu/previewMenuHandle.png similarity index 100% rename from webapp/css/images/menu/previewMenuHandle.png rename to webapp/scripts/css/images/menu/previewMenuHandle.png diff --git a/webapp/css/images/menu/shadowAlpha.png b/webapp/scripts/css/images/menu/shadowAlpha.png similarity index 100% rename from webapp/css/images/menu/shadowAlpha.png rename to webapp/scripts/css/images/menu/shadowAlpha.png diff --git a/webapp/css/images/menu/tabMenuCheckbox.png b/webapp/scripts/css/images/menu/tabMenuCheckbox.png similarity index 100% rename from webapp/css/images/menu/tabMenuCheckbox.png rename to webapp/scripts/css/images/menu/tabMenuCheckbox.png diff --git a/webapp/css/images/menu/tabMenuPin.png b/webapp/scripts/css/images/menu/tabMenuPin.png similarity index 100% rename from webapp/css/images/menu/tabMenuPin.png rename to webapp/scripts/css/images/menu/tabMenuPin.png diff --git a/webapp/css/images/menu/tabMenuRadio.png b/webapp/scripts/css/images/menu/tabMenuRadio.png similarity index 100% rename from webapp/css/images/menu/tabMenuRadio.png rename to webapp/scripts/css/images/menu/tabMenuRadio.png diff --git a/webapp/css/images/netBarBlocking.gif b/webapp/scripts/css/images/netBarBlocking.gif similarity index 100% rename from webapp/css/images/netBarBlocking.gif rename to webapp/scripts/css/images/netBarBlocking.gif diff --git a/webapp/css/images/netBarBlocking2.gif b/webapp/scripts/css/images/netBarBlocking2.gif similarity index 100% rename from webapp/css/images/netBarBlocking2.gif rename to webapp/scripts/css/images/netBarBlocking2.gif diff --git a/webapp/css/images/netBarCached.gif b/webapp/scripts/css/images/netBarCached.gif similarity index 100% rename from webapp/css/images/netBarCached.gif rename to webapp/scripts/css/images/netBarCached.gif diff --git a/webapp/css/images/netBarConnecting.gif b/webapp/scripts/css/images/netBarConnecting.gif similarity index 100% rename from webapp/css/images/netBarConnecting.gif rename to webapp/scripts/css/images/netBarConnecting.gif diff --git a/webapp/css/images/netBarLoaded.gif b/webapp/scripts/css/images/netBarLoaded.gif similarity index 100% rename from webapp/css/images/netBarLoaded.gif rename to webapp/scripts/css/images/netBarLoaded.gif diff --git a/webapp/css/images/netBarReceiving.gif b/webapp/scripts/css/images/netBarReceiving.gif similarity index 100% rename from webapp/css/images/netBarReceiving.gif rename to webapp/scripts/css/images/netBarReceiving.gif diff --git a/webapp/css/images/netBarResolving.gif b/webapp/scripts/css/images/netBarResolving.gif similarity index 100% rename from webapp/css/images/netBarResolving.gif rename to webapp/scripts/css/images/netBarResolving.gif diff --git a/webapp/css/images/netBarResponded.gif b/webapp/scripts/css/images/netBarResponded.gif similarity index 100% rename from webapp/css/images/netBarResponded.gif rename to webapp/scripts/css/images/netBarResponded.gif diff --git a/webapp/css/images/netBarSending.gif b/webapp/scripts/css/images/netBarSending.gif similarity index 100% rename from webapp/css/images/netBarSending.gif rename to webapp/scripts/css/images/netBarSending.gif diff --git a/webapp/css/images/netBarWaiting.gif b/webapp/scripts/css/images/netBarWaiting.gif similarity index 100% rename from webapp/css/images/netBarWaiting.gif rename to webapp/scripts/css/images/netBarWaiting.gif diff --git a/webapp/css/images/page-timeline.png b/webapp/scripts/css/images/page-timeline.png similarity index 100% rename from webapp/css/images/page-timeline.png rename to webapp/scripts/css/images/page-timeline.png diff --git a/webapp/css/images/save.png b/webapp/scripts/css/images/save.png similarity index 100% rename from webapp/css/images/save.png rename to webapp/scripts/css/images/save.png diff --git a/webapp/css/images/splitterh.png b/webapp/scripts/css/images/splitterh.png similarity index 100% rename from webapp/css/images/splitterh.png rename to webapp/scripts/css/images/splitterh.png diff --git a/webapp/css/images/spriteArrows.gif b/webapp/scripts/css/images/spriteArrows.gif similarity index 100% rename from webapp/css/images/spriteArrows.gif rename to webapp/scripts/css/images/spriteArrows.gif diff --git a/webapp/css/images/spriteArrows.png b/webapp/scripts/css/images/spriteArrows.png similarity index 100% rename from webapp/css/images/spriteArrows.png rename to webapp/scripts/css/images/spriteArrows.png diff --git a/webapp/css/images/tabEnabled.png b/webapp/scripts/css/images/tabEnabled.png similarity index 100% rename from webapp/css/images/tabEnabled.png rename to webapp/scripts/css/images/tabEnabled.png diff --git a/webapp/css/images/timeline-sprites.png b/webapp/scripts/css/images/timeline-sprites.png similarity index 100% rename from webapp/css/images/timeline-sprites.png rename to webapp/scripts/css/images/timeline-sprites.png diff --git a/webapp/css/images/tooltipConnectorUp.png b/webapp/scripts/css/images/tooltipConnectorUp.png similarity index 100% rename from webapp/css/images/tooltipConnectorUp.png rename to webapp/scripts/css/images/tooltipConnectorUp.png diff --git a/webapp/css/images/twisty-sprites.png b/webapp/scripts/css/images/twisty-sprites.png similarity index 100% rename from webapp/css/images/twisty-sprites.png rename to webapp/scripts/css/images/twisty-sprites.png diff --git a/webapp/css/infoTip.css b/webapp/scripts/css/infoTip.css similarity index 100% rename from webapp/css/infoTip.css rename to webapp/scripts/css/infoTip.css diff --git a/webapp/scripts/css/loader.js b/webapp/scripts/css/loader.js new file mode 100644 index 00000000..6571d7da --- /dev/null +++ b/webapp/scripts/css/loader.js @@ -0,0 +1,27 @@ +/* See license.txt for terms of usage */ + +define([ + "jquery/jquery", + "text!./harViewer.css", + "require" +], + +function($, HarviewerCss, require) { + return { + initialize: function () { + +/* + var url = null; + if (typeof require.sandbox !== "undefined") { + url = require.sandbox.id + require.id("./harViewer.css"); + } else { + url = require.toUrl("./harViewer.css"); + } + $('').appendTo("HEAD"); +*/ + + $('').appendTo("HEAD").html(HarviewerCss); + + } + }; +}); diff --git a/webapp/scripts/css/package.json b/webapp/scripts/css/package.json new file mode 100644 index 00000000..2d6f2264 --- /dev/null +++ b/webapp/scripts/css/package.json @@ -0,0 +1,8 @@ +{ + "mappings": { + "jquery": "../jquery" + }, + "directories": { + "lib": "." + } +} \ No newline at end of file diff --git a/webapp/css/pageList.css b/webapp/scripts/css/pageList.css similarity index 100% rename from webapp/css/pageList.css rename to webapp/scripts/css/pageList.css diff --git a/webapp/css/pageStats.css b/webapp/scripts/css/pageStats.css similarity index 100% rename from webapp/css/pageStats.css rename to webapp/scripts/css/pageStats.css diff --git a/webapp/css/pageTimeline.css b/webapp/scripts/css/pageTimeline.css similarity index 100% rename from webapp/css/pageTimeline.css rename to webapp/scripts/css/pageTimeline.css diff --git a/webapp/css/popupMenu.css b/webapp/scripts/css/popupMenu.css similarity index 100% rename from webapp/css/popupMenu.css rename to webapp/scripts/css/popupMenu.css diff --git a/webapp/css/previewMenu.css b/webapp/scripts/css/previewMenu.css similarity index 100% rename from webapp/css/previewMenu.css rename to webapp/scripts/css/previewMenu.css diff --git a/webapp/css/previewTab.css b/webapp/scripts/css/previewTab.css similarity index 100% rename from webapp/css/previewTab.css rename to webapp/scripts/css/previewTab.css diff --git a/webapp/css/requestBody.css b/webapp/scripts/css/requestBody.css similarity index 100% rename from webapp/css/requestBody.css rename to webapp/scripts/css/requestBody.css diff --git a/webapp/css/requestList.css b/webapp/scripts/css/requestList.css similarity index 100% rename from webapp/css/requestList.css rename to webapp/scripts/css/requestList.css diff --git a/webapp/css/schemaTab.css b/webapp/scripts/css/schemaTab.css similarity index 100% rename from webapp/css/schemaTab.css rename to webapp/scripts/css/schemaTab.css diff --git a/webapp/css/search.css b/webapp/scripts/css/search.css similarity index 100% rename from webapp/css/search.css rename to webapp/scripts/css/search.css diff --git a/webapp/css/tabView.css b/webapp/scripts/css/tabView.css similarity index 100% rename from webapp/css/tabView.css rename to webapp/scripts/css/tabView.css diff --git a/webapp/css/tableView.css b/webapp/scripts/css/tableView.css similarity index 100% rename from webapp/css/tableView.css rename to webapp/scripts/css/tableView.css diff --git a/webapp/css/toolTip.css b/webapp/scripts/css/toolTip.css similarity index 100% rename from webapp/css/toolTip.css rename to webapp/scripts/css/toolTip.css diff --git a/webapp/css/toolbar.css b/webapp/scripts/css/toolbar.css similarity index 100% rename from webapp/css/toolbar.css rename to webapp/scripts/css/toolbar.css diff --git a/webapp/css/validationError.css b/webapp/scripts/css/validationError.css similarity index 100% rename from webapp/css/validationError.css rename to webapp/scripts/css/validationError.css diff --git a/webapp/css/xhrSpy.css b/webapp/scripts/css/xhrSpy.css similarity index 100% rename from webapp/css/xhrSpy.css rename to webapp/scripts/css/xhrSpy.css diff --git a/webapp/scripts/domplate/domplate.js b/webapp/scripts/domplate/domplate.js index 0bb6552b..06340b8f 100644 --- a/webapp/scripts/domplate/domplate.js +++ b/webapp/scripts/domplate/domplate.js @@ -1,6 +1,8 @@ /* See license.txt for terms of usage */ -require.def("domplate/domplate", [], function() { +require.def("domplate/domplate", [ + "jquery/jquery" +], function($) { //************************************************************************************************* diff --git a/webapp/scripts/domplate/infoTip.js b/webapp/scripts/domplate/infoTip.js index ee8a1c6b..ebcb600c 100644 --- a/webapp/scripts/domplate/infoTip.js +++ b/webapp/scripts/domplate/infoTip.js @@ -1,12 +1,13 @@ /* See license.txt for terms of usage */ require.def("domplate/infoTip", [ + "jquery/jquery", "domplate/domplate", "core/lib", "core/trace" ], -function(Domplate, Lib, Trace) { with (Domplate) { +function($, Domplate, Lib, Trace) { with (Domplate) { //***********************************************************************************************// diff --git a/webapp/scripts/domplate/package.json b/webapp/scripts/domplate/package.json new file mode 100644 index 00000000..2e7ecdef --- /dev/null +++ b/webapp/scripts/domplate/package.json @@ -0,0 +1,11 @@ +{ + "mappings": { + "domplate": ".", + "core": "../core", + "nls": "../nls", + "jquery": "../jquery" + }, + "directories": { + "lib": "." + } +} \ No newline at end of file diff --git a/webapp/scripts/domplate/toolbar.js b/webapp/scripts/domplate/toolbar.js index ebd8fa8e..1fb3713b 100644 --- a/webapp/scripts/domplate/toolbar.js +++ b/webapp/scripts/domplate/toolbar.js @@ -1,13 +1,14 @@ /* See license.txt for terms of usage */ require.def("domplate/toolbar", [ + "jquery/jquery", "domplate/domplate", "core/lib", "core/trace", "domplate/popupMenu" ], -function(Domplate, Lib, Trace, Menu) { with (Domplate) { +function($, Domplate, Lib, Trace, Menu) { with (Domplate) { //************************************************************************************************* diff --git a/webapp/scripts/downloadify/js/swfobject.js b/webapp/scripts/downloadify/js/swfobject.js index 08fb2700..f1ce0331 100644 --- a/webapp/scripts/downloadify/js/swfobject.js +++ b/webapp/scripts/downloadify/js/swfobject.js @@ -2,4 +2,5 @@ Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis This software is released under the MIT License */ -var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("\n\n\nCuzillion\n\n\n\n\n\n\n
\n \n  Cuzillion'cuz there are a zillion pages to check\n
\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n
\n
\n  \n
\n
\n\n
\n
\n
\n <HTML>\n <HEAD>\n
\n\t
    \n\t
    \n\t
    \n </HEAD>\n <BODY>\n
    \n\t
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    • image

      on domain1 with a 2 second delay using HTML tags

      \n
    \n\t
    \n\t
    \n </BODY>\n </HTML>\n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n\n  \n  \n  \n\n
    \n
    \n\n
    \n
    \n\n
    \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2439 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 186, + "blocked": 1, + "send": 0, + "wait": 253, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.513+01:00", + "time": 2405, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=1&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 185, + "blocked": 0, + "send": 0, + "wait": 2220, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.515+01:00", + "time": 2490, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=2&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "2" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 492, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 307, + "bodySize": 492 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 187, + "blocked": 0, + "send": 0, + "wait": 2302, + "receive": 1 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.517+01:00", + "time": 2465, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=3&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "3" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 1, + "connect": 189, + "blocked": 1, + "send": 0, + "wait": 2274, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.519+01:00", + "time": 2446, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=4&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "4" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "492" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 492, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 492 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 189, + "blocked": 1, + "send": 0, + "wait": 2256, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.521+01:00", + "time": 2454, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=5&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "5" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 194, + "blocked": 1, + "send": 0, + "wait": 2259, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.523+01:00", + "time": 2465, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=6&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "6" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:48 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:50 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 194, + "blocked": 1, + "send": 0, + "wait": 2270, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.525+01:00", + "time": 4610, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=7&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "7" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:50 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:52 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 2394, + "send": 0, + "wait": 2216, + "receive": 0 + } + }, + { + "pageref": "page_7689", + "startedDateTime": "2010-01-02T15:39:42.526+01:00", + "time": 4652, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=8&t=1262443187", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "8" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262443187" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:39:50 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:39:52 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 2439, + "send": 0, + "wait": 2213, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:21.935+01:00", + "time": 438, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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" + } + ], + "queryString": [ + { + "name": "c0", + "value": "bi1hfff2_0_f" + }, + { + "name": "c1", + "value": "bi1hfff2_0_f" + }, + { + "name": "c2", + "value": "bi1hfff2_0_f" + }, + { + "name": "c3", + "value": "bi1hfff2_0_f" + }, + { + "name": "c4", + "value": "bi1hfff2_0_f" + }, + { + "name": "c5", + "value": "bi1hfff2_0_f" + }, + { + "name": "c6", + "value": "bi1hfff2_0_f" + }, + { + "name": "c7", + "value": "bi1hfff2_0_f" + }, + { + "name": "t", + "value": "1258547264277" + } + ], + "headersSize": 552, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:27 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "X-Powered-By", + "value": "PHP/5.2.3" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "2439" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "text/html" + } + ], + "content": { + "size": 11576, + "mimeType": "text/html", + "text": "\n\n\n\nCuzillion\n\n\n\n\n\n\n
    \n \n  Cuzillion'cuz there are a zillion pages to check\n
    \n\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    \n
    \n
    \n  \n
    \n
    \n\n
    \n
    \n
    \n <HTML>\n <HEAD>\n
    \n\t
      \n\t
      \n\t
      \n </HEAD>\n <BODY>\n
      \n\t
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      • image

        on domain1 with a 2 second delay using HTML tags

        \n
      \n\t
      \n\t
      \n </BODY>\n </HTML>\n
      \n
      \n
      \n
      \n\n
      \n
      \n
      \n\n  \n  \n  \n\n
      \n
      \n\n
      \n
      \n\n
      \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2439 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 183, + "blocked": 0, + "send": 0, + "wait": 255, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.403+01:00", + "time": 200, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/logo-32x32.gif", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + ], + "headersSize": 581, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:27 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Last-Modified", + "value": "Mon, 16 Nov 2009 20:19:20 GMT" + }, + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Content-Length", + "value": "1057" + }, + { + "name": "Cache-Control", + "value": "max-age=315360000" + }, + { + "name": "Expires", + "value": "Tue, 31 Dec 2019 15:40:27 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1057, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 316, + "bodySize": 1057 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 0, + "send": 0, + "wait": 192, + "receive": 8 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.403+01:00", + "time": 2437, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=1&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:28 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:30 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 2, + "connect": 188, + "blocked": 0, + "send": 0, + "wait": 2247, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.405+01:00", + "time": 2418, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=2&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "2" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:28 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:30 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "492" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 492, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 492 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 190, + "blocked": 3, + "send": 0, + "wait": 2225, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.405+01:00", + "time": 4633, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=3&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "3" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:30 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:32 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1334, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 306, + "bodySize": 1334 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 2418, + "send": 0, + "wait": 2215, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.408+01:00", + "time": 4645, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=4&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "4" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:30 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:32 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 2435, + "send": 0, + "wait": 2210, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.408+01:00", + "time": 6845, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=5&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "5" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:32 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:34 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=98" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 4630, + "send": 0, + "wait": 2215, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.410+01:00", + "time": 6853, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=6&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "6" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:32 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:34 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1334" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=98" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1334, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1334 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 4643, + "send": 0, + "wait": 2210, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.410+01:00", + "time": 9055, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=7&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "7" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:34 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:36 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1334" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=97" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1334, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 300, + "bodySize": 1334 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 6843, + "send": 0, + "wait": 2212, + "receive": 0 + } + }, + { + "pageref": "page_12043", + "startedDateTime": "2010-01-02T16:40:22.413+01:00", + "time": 9067, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=2&n=8&t=1262446827", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff2_0_f&c1=bi1hfff2_0_f&c2=bi1hfff2_0_f&c3=bi1hfff2_0_f&c4=bi1hfff2_0_f&c5=bi1hfff2_0_f&c6=bi1hfff2_0_f&c7=bi1hfff2_0_f&t=1258547264277" + } + ], + "queryString": [ + { + "name": "n", + "value": "8" + }, + { + "name": "sleep", + "value": "2" + }, + { + "name": "t", + "value": "1262446827" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 606, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:40:34 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:40:36 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=97" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 492, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 306, + "bodySize": 492 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 6850, + "send": 0, + "wait": 2217, + "receive": 0 + } + } + ] + } +} \ No newline at end of file diff --git a/webapp/scripts/examples/google.com.har b/webapp/scripts/examples/google.com.har new file mode 100644 index 00000000..b090391e --- /dev/null +++ b/webapp/scripts/examples/google.com.har @@ -0,0 +1,612 @@ +{ + "log":{ + "version":"1.1", + "creator":{ + "name":"Firebug", + "version":"1.5X.0b8" + }, + "browser":{ + "name":"Firefox", + "version":"3.6b6pre" + }, + "pages":[{ + "startedDateTime":"2010-01-02T14:51:01.186+01:00", + "id":"page_62143", + "title":"Google", + "pageTimings":{ + "onContentLoad":90, + "onLoad":245 + } + } + ], + "entries":[{ + "pageref":"page_62143", + "startedDateTime":"2010-01-02T14:51:01.186+01:00", + "time":63, + "request":{ + "method":"GET", + "url":"http://www.google.cz/", + "httpVersion":"HTTP/1.1", + "cookies":[{ + "name":"PREF", + "value":"ID" + }, + { + "name":"NID", + "value":"29" + } + ], + "headers":[{ + "name":"Host", + "value":"www.google.cz" + }, + { + "name":"User-Agent", + "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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":"Cookie", + "value":"PREF=ID=580ec4c5a3534337:U=37a8fcc41ff49f78:TM=1260796678:LM=1260796682:S=9BgbomVM6pcnfah0; NID=29=OHyg2zMZl4IpG8C4a-Z5itM3gCXOuBPogGpTPVFPNsdpmIHJWX78ymRL_gqptvhr_IQrP319GQ1fxlKUsqaIokpxasPIIDq5ijatDmYiyamnCfJz8rXyNvt5GPjCJp2I" + } + ], + "queryString":[], + "headersSize":632, + "bodySize":-1 + }, + "response":{ + "status":200, + "statusText":"OK", + "httpVersion":"HTTP/1.1", + "cookies":[], + "headers":[{ + "name":"Date", + "value":"Sat, 02 Jan 2010 13:51:06 GMT" + }, + { + "name":"Expires", + "value":"-1" + }, + { + "name":"Cache-Control", + "value":"private, max-age=0" + }, + { + "name":"Content-Type", + "value":"text/html; charset=UTF-8" + }, + { + "name":"Content-Encoding", + "value":"gzip" + }, + { + "name":"Server", + "value":"gws" + }, + { + "name":"Content-Length", + "value":"3694" + }, + { + "name":"X-XSS-Protection", + "value":"0" + } + ], + "content":{ + "size":8564, + "mimeType":"text/html", + "text":"Google


       
        Rozšířené vyhledávání
        Jazykové nástroje


      Inzerujte s Googlem - Vše o Google - Google.com in English

      ©2010 - Osobní údaje

      " + }, + "redirectURL":"", + "headersSize":224, + "bodySize":3694 + }, + "cache":{}, + "timings":{ + "dns":0, + "connect":0, + "blocked":0, + "send":0, + "wait":63, + "receive":0 + } + }, + { + "pageref":"page_62143", + "startedDateTime":"2010-01-02T14:51:01.280+01:00", + "time":62, + "request":{ + "method":"GET", + "url":"http://www.google.cz/intl/en_com/images/logo_plain.png", + "httpVersion":"HTTP/1.1", + "cookies":[{ + "name":"PREF", + "value":"ID" + }, + { + "name":"NID", + "value":"29" + } + ], + "headers":[{ + "name":"Host", + "value":"www.google.cz" + }, + { + "name":"User-Agent", + "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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.google.cz/" + }, + { + "name":"Cookie", + "value":"PREF=ID=580ec4c5a3534337:U=37a8fcc41ff49f78:TM=1260796678:LM=1260796682:S=9BgbomVM6pcnfah0; NID=29=OHyg2zMZl4IpG8C4a-Z5itM3gCXOuBPogGpTPVFPNsdpmIHJWX78ymRL_gqptvhr_IQrP319GQ1fxlKUsqaIokpxasPIIDq5ijatDmYiyamnCfJz8rXyNvt5GPjCJp2I" + } + ], + "queryString":[], + "headersSize":667, + "bodySize":-1 + }, + "response":{ + "status":200, + "statusText":"OK", + "httpVersion":"HTTP/1.1", + "cookies":[], + "headers":[{ + "name":"Content-Type", + "value":"image/png" + }, + { + "name":"Last-Modified", + "value":"Mon, 17 Mar 2008 22:38:58 GMT" + }, + { + "name":"Date", + "value":"Sat, 02 Jan 2010 13:51:05 GMT" + }, + { + "name":"Expires", + "value":"Sun, 02 Jan 2011 13:51:05 GMT" + }, + { + "name":"Server", + "value":"gws" + }, + { + "name":"Content-Length", + "value":"7582" + }, + { + "name":"Cache-Control", + "value":"public, max-age=31536000" + }, + { + "name":"Age", + "value":"1" + }, + { + "name":"X-XSS-Protection", + "value":"0" + } + ], + "content":{ + "size":7582, + "mimeType":"image/png" + }, + "redirectURL":"", + "headersSize":272, + "bodySize":7582 + }, + "cache":{}, + "timings":{ + "dns":0, + "connect":0, + "blocked":0, + "send":0, + "wait":31, + "receive":31 + } + }, + { + "pageref":"page_62143", + "startedDateTime":"2010-01-02T14:51:01.296+01:00", + "time":78, + "request":{ + "method":"GET", + "url":"http://www.google.cz/extern_js/f/CgJjcxICY3orMAo4QUAdLCswDjgKLCswFjgULCswFzgELCswGDgELCswGTgNLCswJTjJiAEsKzAmOAgsKzAnOAIsKzA8OAEsKzBFOAAs/n26cL0r9CnM.js", + "httpVersion":"HTTP/1.1", + "cookies":[{ + "name":"PREF", + "value":"ID" + }, + { + "name":"NID", + "value":"29" + } + ], + "headers":[{ + "name":"Host", + "value":"www.google.cz" + }, + { + "name":"User-Agent", + "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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.google.cz/" + }, + { + "name":"Cookie", + "value":"PREF=ID=580ec4c5a3534337:U=37a8fcc41ff49f78:TM=1260796678:LM=1260796682:S=9BgbomVM6pcnfah0; NID=29=OHyg2zMZl4IpG8C4a-Z5itM3gCXOuBPogGpTPVFPNsdpmIHJWX78ymRL_gqptvhr_IQrP319GQ1fxlKUsqaIokpxasPIIDq5ijatDmYiyamnCfJz8rXyNvt5GPjCJp2I" + } + ], + "queryString":[], + "headersSize":735, + "bodySize":-1 + }, + "response":{ + "status":200, + "statusText":"OK", + "httpVersion":"HTTP/1.1", + "cookies":[], + "headers":[{ + "name":"Content-Type", + "value":"text/javascript; charset=UTF-8" + }, + { + "name":"Expires", + "value":"Sat, 01 Jan 2011 00:00:00 GMT" + }, + { + "name":"Last-Modified", + "value":"Sat, 03 Jan 2009 00:00:00 GMT" + }, + { + "name":"Cache-Control", + "value":"private, x-gzip-ok=\"\"" + }, + { + "name":"Content-Encoding", + "value":"gzip" + }, + { + "name":"Date", + "value":"Sat, 02 Jan 2010 13:51:06 GMT" + }, + { + "name":"Server", + "value":"gws" + }, + { + "name":"Content-Length", + "value":"8646" + }, + { + "name":"X-XSS-Protection", + "value":"0" + } + ], + "content":{ + "size":22832, + "mimeType":"text/javascript", + "text":"(function(){\u000aif(!google.nocsixjs&&google.timers&&google.timers.load.t)google.timers.load.t.xjses=(new Date).getTime();\u000a})();\u000a(function(){\u000agoogle.isOpera=false;google.isIE=false;google.isSafari=false;\u000agoogle.xhr=function(){var a=null;try{a=new XMLHttpRequest}catch(d){}return a};\u000agoogle.getComputedStyle=function(a,d,c){var b=c?\"\":0;var e=document.defaultView&&document.defaultView.getComputedStyle(a,\"\");b=e.getPropertyValue(d);b=c?b:parseInt(b,10);return b};google.getHeight=function(a){return google.getComputedStyle(a,\"height\")};google.getWidth=function(a){return google.getComputedStyle(a,\"width\")};google.getPageOffsetTop=function(a){return a.offsetTop+(a.offsetParent?google.getPageOffsetTop(a.offsetParent):0)};\u000agoogle.getPageOffsetLeft=function(a){return a.offsetLeft+(a.offsetParent?google.getPageOffsetLeft(a.offsetParent):0)};google.getPageOffsetStart=function(a){return google.getPageOffsetLeft(a)};google.getColor=function(a){return google.getComputedStyle(a,\"color\",true)};google.rhs=function(){};var f,h=location;\u000agoogle.nav=function(a,d){try{var c=location.protocol+\"//\"+location.host;if((new RegExp(\"^(\"+c+\")?/url\\\\?.*&rct=j(&|$)\")).test(a))if(d){google.r=1;d.location.replace(a)}else{if(!f){f=document.createElement(\"iframe\");f.style.display=\"none\";google.append(f)}google.r=1;f.src=a}else h.href=a}catch(b){h.href=a}};google.append=function(a){return(document.getElementById(\"xjsc\")||document.body).appendChild(a)};google.bind=function(a,d,c){a.addEventListener(d,c,false);};\u000a})();\u000a(function(){\u000avar c=window,f=Object,h=google,i=\"push\",j=\"length\",k=\"propertyIsEnumerable\",l=\"prototype\",m=\"call\";\u000afunction n(a){var b=typeof a;if(b==\"object\")if(a){if(a instanceof Array||!(a instanceof f)&&f[l].toString[m](a)==\"[object Array]\"||typeof a[j]==\"number\"&&typeof a.splice!=\"undefined\"&&typeof a[k]!=\"undefined\"&&!a[k](\"splice\"))return\"array\";if(!(a instanceof f)&&(f[l].toString[m](a)==\"[object Function]\"||typeof a[m]!=\"undefined\"&&typeof a[k]!=\"undefined\"&&!a[k](\"call\")))return\"function\"}else return\"null\";else if(b==\"function\"&&typeof a[m]==\"undefined\")return\"object\";return b}\u000afunction o(a){return(new p).serialize(a)}function p(){}p[l].serialize=function(a){var b=[];this.a(a,b);return b.join(\"\")};p[l].a=function(a,b){switch(typeof a){case \"string\":this.b(a,b);break;case \"number\":this.d(a,b);break;case \"boolean\":b[i](a);break;case \"undefined\":b[i](\"null\");break;case \"object\":if(a==null){b[i](\"null\");break}if(n(a)==\"array\"){this.c(a,b);break}this.e(a,b);break;case \"function\":break;default:throw Error(\"Unknown type: \"+typeof a);}};\u000avar q={'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\",\"/\":\"\\\\/\",\"\\u0008\":\"\\\\b\",\"\\u000c\":\"\\\\f\",\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\u000b\":\"\\\\u000b\"},r=/\\uffff/.test(\"\\uffff\")?/[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g:/[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;p[l].b=function(a,b){b[i]('\"',a.replace(r,function(g){if(g in q)return q[g];var d=g.charCodeAt(0),e=\"\\\\u\";if(d<16)e+=\"000\";else if(d<256)e+=\"00\";else if(d<4096)e+=\"0\";return q[g]=e+d.toString(16)}),'\"')};p[l].d=function(a,b){b[i](isFinite(a)&&!isNaN(a)?a:\"null\")};\u000ap[l].c=function(a,b){var g=a[j];b[i](\"[\");for(var d=\"\",e=0;ed?Math.min(9999,c-d)+\"px\":(google.isIE?\"\":0)}};function e(){a=document.getElementById(\"tads\");b=document.getElementById(\"3po\");google.rhs()}e();google.bind(window,\"resize\",google.rhs);google.rein.push(e);\u000a})();\u000a(function(){\u000avar f=0,g=[];google.fx={};google.fx.linear=function(a){return a};google.fx.easeOut=function(a){return 1-Math.pow(1-a,3)};google.fx.easeInAndOut=function easeInAndOut(a){return(3-2*a)*a*a};google.fx.animate=function(a,d,e){for(var c=0,b;b=d[c++];){b[5]=b[5]==null?\"px\":b[5];b[4]=b[4]||google.fx.linear;h(b[0],b[1],b[2]+b[5])}g.push({b:a,a:e,d:google.time(),c:d});f=f||window.setInterval(i,15)};function i(){for(var a=0,d;d=g[a++];)j(d)||g.splice(--a,1);if(!g.length){window.clearInterval(f);f=0}}function j(a){var d=\u000agoogle.time()-a.d;if(d>=a.b){for(var e=0,c;c=a.c[e++];)h(c[0],c[1],c[3]+c[5]);a.a&&a.a();return 0}else{for(var e=0,c;c=a.c[e++];){var b=c[2]+(c[3]-c[2])*c[4](d/a.b);if(c[5]==\"px\")b=Math.round(b);h(c[0],c[1],b+c[5])}return 1}}function h(a){for(var d=1;db)a=0;else if(a<-1)a=b-1;q=a;p=o.item(a);p.className=\"gac_b\";X(p.completeString);w.value=p.completeId}\u000afunction P(){if(D){window.clearTimeout(D);D=e}v&&(v.visibility=\"hidden\");}function Y(){v&&(v.visibility=\"visible\");U();E=1}function pa(){return!!v&&v.visibility==\"visible\"}\u000afunction fa(){if(u){u.innerHTML=\"\";}}\u000afunction sa(a){B>0&&B--;if(!u||a[0]!=i)return;if(D){window.clearTimeout(D);D=e}m=a[0];fa();var d=c;for(var k=0,f;k0?Y:P)()}function ja(){P();if(z.value!=t.value)w.value=o&&o.item(q)&&o.item(q).completeId;else{z.value=\"\";if(B>=10)w.value=\"o\"}}\u000afunction W(){if(j!=i&&i){B++;F&&G.removeChild(F);F=document.createElement(\"script\");F.src=[\"http://\",ga,A,\"&q=\",encodeURIComponent(i),\"&cp=\"+I].join(\"\");G.appendChild(F);t.focus()}j=i;var a=100;for(var b=1;b<=(B-2)/2;++b)a*=\u000a2;a+=50;n=window.setTimeout(W,a)}function X(a){if(t)t.value=h=a}function na(a,b){var d=0;while(a){d+=a[b];a=a.offsetParent}return d}function $(a,b){a.appendChild(document.createTextNode(b))}\u000afunction Z(a){a.stopPropagation();return c}\u000afunction ma(a){var b=0,d=0;if(va(a)){b=a.selectionStart;d=a.selectionEnd}return b&&d&&b==d?b:0}\u000afunction va(a){try{return typeof a.selectionStart==\"number\"}catch(b){return c}}window.google.ac={i:ia,h:sa,u:X};google.bind(window,\"resize\",U);google.dstr.push(ea);\u000a})();\u000a(function(){\u000awindow.ManyBox={};var e,g,h=1,j=google.History.client(i);function k(a){for(var b in e)if(e[b].c&&a(e[b]))return}function l(a,b,c,d,f){this.c=a;this.i=b;this.C=d;this.o=f;this.q=\"/mbd?\"+(b?\"docid=\"+b:\"\")+\"&resnum=\"+a.replace(/[^0-9]/,\"\")+\"&mbtype=\"+d+\"&usg=\"+c+\"&hl=\"+(google.kHL||\"\");this.e={};this.l=\"\";g[a]={r:0,F:this.e,i:this.i,f:0};this.n=0}l.prototype.append=function(a){this.l+=\"&\"+a.join(\"&\")};function m(a,b){return document.getElementById(\"mb\"+b+a.c)}function n(a,b){a.h.style.paddingTop=b+\"px\";\u000aa.h.style.display=a.h.innerHTML?\"\":\"none\";if(b>a.n)a.n=b}function q(a){if(!a.B){a.B=1;a.d=m(a,\"b\");a.j=0;a.a=m(a,\"l\");a.m=a.a.getElementsByTagName(\"DIV\")[0];a.p=a.a.getElementsByTagName(\"A\")[0];a.z=a.p.innerHTML;a.o=a.o||a.z;a.m.title=\"Pro další informace klikněte zde...\";a.a.G=function(b,c){var d=google.getPageOffsetStart(a.a),f=google.getPageOffsetTop(a.a);return b>d-5&&bf-5&&cgoogle.getPageOffsetStart(b)+google.getWidth(b);a.b=document.createElement(\"div\");n(a,0);a.b.style.position=\"absolute\";\u000aa.b.style.paddingTop=(a.b.style.paddingBottom=\"6px\");a.b.style.display=\"none\";a.b.className=\"med\";var c=document.createElement(\"div\");a.b.appendChild(c);c.className=\"std\";c.innerHTML=a.e.k;a.h.parentNode.insertBefore(a.b,a.h)}}function i(a){h=0;ManyBox.init();k(function(b){if(b.i==a[b.c].i){b.e=a[b.c].F;if(a[b.c].r!=b.j)x(b)}else a[b.c].f=0});g=a;h=1;google.History.save(j,g)}ManyBox.create=function(a,\u000ab,c,d,f){return new l(a,b,c,d,f)};ManyBox.register=function(a,b,c,d,f){return e[a]=ManyBox.create(a,b,c,d,f)};google.bind(document,\"click\",function(a){a=a||window.event;var b=a.target||a.srcElement;while(b.parentNode){if(b.tagName==\"A\"||b.onclick)return;b=b.parentNode}k(function(c){if(c.a.G(a.clientX,a.clientY)){c.a.go();return 1}})});function z(){e={};g={};history.navigationMode=history.navigationMode&&\"fast\"}z();ManyBox.init=function(){k(q)};function A(a,b){a.b.style.clip=\"rect(0px,\"+(a.d.width||\u000a\"34em\")+\",\"+(b||1)+\"px,0px)\"}l.prototype.insert=function(a){this.e.k=a};function B(a){a.g=m(a,\"cb\");var b=a.g&&a.g.getAttribute(\"mbopen\");if(b){eval(b);a.onopen(a.g)}}function C(a){a.b.style.display=\"none\";a.m.style.backgroundPosition=\"-91px -74px\";a.p.innerHTML=a.z;a.j=(g[a.c].r=0);google.History.save(j,g)}function D(a,b,c,d,f){var u=c>0?150:75,v=google.time()-f,w=v1?c-10:c),o=Math.max(a.s,b+w),p=o-a.s;A(a,p);a.d.style.height=o<0?0:(p?o+\"px\":\"\");n(a,Math.max(0,p-5));google.rhs();if(Math.abs(w)<\u000aMath.abs(c))window.setTimeout(function(){D(a,b,c,d-1,f)},30);else window.setTimeout(function(){c<0?C(a):B(a);if(!google.isIE&&a.I)a.b.style.width=\"100px\";a.b.style.position=(a.d.style.height=\"\");n(a,0);google.rhs();a.d.w=0},0)}function x(a){a.u=0;if(!a.d.w){a.d.w=1;var b;if(!a.j){a.s=google.getHeight(a.d);y(a);n(a,0);a.n=0;k(function(d){d.m.title=\"\"});a.m.style.backgroundPosition=\"-105px -74px\";a.p.innerHTML=a.o;A(a,1);a.b.style.position=\"absolute\";a.b.style.display=\"\";a.j=(g[a.c].r=1);google.History.save(j,\u000ag);b=a.b.offsetHeight}else{var c=a.g&&a.g.getAttribute(\"mbclose\");if(c){eval(c);a.onclose(a.g)}b=a.s-google.getHeight(a.d);a.h.style.display=\"none\";n(a,a.n);a.b.style.position=\"absolute\"}D(a,google.getHeight(a.d),b,google.isSafari?2:1,google.time())}}google.dstr&&google.dstr.push(z);\u000a})();\u000a(function(){\u000avar h=false,i=true,k,m;\u000afunction o(){k=document.createElement(\"style\");document.getElementsByTagName(\"head\")[0].appendChild(k);m=k.sheet;}\u000agoogle.addCSSRule=function(a,b){k||o();var e=a+\"{\"+b+\"}\";m.insertRule(e,m.cssRules.length);};google.acrs=function(a){for(var b=a.split(/{|}/),c=1;c0,f=google.Toolbelt.isToolbeltOpen(),e=c||!!document.getElementById(\"tbt5\")||mbtb1.na;if(f&&!s){H(h,e);google.log(\"toolbelt\",\"0&ei=\"+google.kEI);r=i}else if(d){H(i,\u000ae);r&&google.log(\"toolbelt\",\"1&ei=\"+google.kEI)}else{mbtb1.insert=w;var g=google.xhr();if(g){g.open(\"GET\",[google.pageState?google.pageState.replace(\"#\",\"/mbd?\"):google.base_href.replace(/^\\/search\\?/,\"/mbd?\"),\"&mbtype=29&resnum=1&tbo=1\",mbtb1.tbs?\"&tbs=\"+mbtb1.tbs:\"\",\"&docid=\",mbtb1.docid,\"&usg=\",mbtb1.usg,\"&zx=\",google.time()].join(\"\"),i);g.onreadystatechange=function(){if(g.readyState==4&&g.status==200)try{eval(g.responseText)}catch(q){window.location.replace(a.href)}};g.send(null);s=i;H(i,e)}return h}google.History.save(y,\u000a{content:u,open:s||!f});return s=h};function I(a){for(;a&&a.className!=\"tbt\";)a=a.parentNode;return a}google.Toolbelt.ctlClk=function(a,b){a=a||\"cdr_opt\";b=b||\"cdr_min\";var c=document.getElementById(a);if(c){c.className=\"tbots\";var d=I(c);if(d){for(var f=0,e;e=d.childNodes[f++];)if(e.className==\"tbos\")e.className=\"tbotu\";var g=document.getElementById(b);g&&g.focus()}}return h};google.Toolbelt.cdrClk=google.Toolbelt.ctlClk;\u000afunction J(a){return a.replace(/_/g,\"_1\").replace(/,/g,\"_2\").replace(/:/g,\"_3\")}google.Toolbelt.cdrSbt=function(){return K(\"ctbs\",{cdr_min:\"cd_min\",cdr_max:\"cd_max\"})};google.Toolbelt.clSbt=function(){return K(\"ltbs\",{l_in:\"cl_loc\"})};function K(a,b){var c=document.getElementById(a);if(c)for(var d in b){var f=J(document.getElementById(d).value),e=new RegExp(\"(\"+b[d]+\":)([^,]*)\");c.value=c.value.replace(e,\"$1\"+f)}return i}\u000agoogle.Toolbelt.tbosClk=function(a){var b=a||window.event,c=b.target||b.srcElement;if(c&&c.className==\"tbotu\"){c.className=\"tbos\";var d=I(c);if(d)for(var f=0,e;e=d.childNodes[f++];)if(e.className==\"tbots\")e.className=\"tbou\"}};var L=google.fx.easeOut,M=[[\"tads\",\"margin-left\",\"marginLeft\"],[\"res\",\"margin-left\",\"marginLeft\"],[\"tbd\",\"margin-left\",\"marginLeft\"],[\"mbEnd\",\"width\",\"width\"],[\"tbt3\",\"left\",\"left\"],[\"tbt8\",\"left\",\"left\"],[\"tbt5\",\"margin-left\",\"marginLeft\"]],N=h;\u000afunction O(a){for(var b=0,c=0,d;d=M[c++];){var f=document.getElementById(d[0]);f&&a(f,d,b++)}}function P(){var a=[];O(function(b,c){var d=c[1];a.push(d==\"width\"?b.offsetWidth:google.getComputedStyle(b,d))});return a}\u000afunction H(a,b){if(!N){var c=[],d=P(),f=google.getComputedStyle(v,\"left\",i),e=document.getElementById(\"cdr_min\"),g=document.getElementById(\"cdr_max\");if(e&&g){e.style.width=google.getComputedStyle(e,\"width\",i);g.style.width=google.getComputedStyle(g,\"width\",i)}document.body.className=document.body.className.replace(/\\btbo\\b/,\"\")+(a?\" tbo\":\"\");google.Toolbelt.updateTbo();B();if(!b){if(a){f=google.getComputedStyle(v,\"left\",i);if(e&&g){e.style.width=google.getComputedStyle(e,\"width\",i);g.style.width=\u000agoogle.getComputedStyle(g,\"width\",i)}}var q=P();O(function(l,x,G){c.push([l,x[2],d[G],q[G],L])});var j=google.fx.wrap(v);j.style.position=\"absolute\";j.style.overflow=\"hidden\";j.style.left=f;v.style.display=\"block\";v.style.position=\"static\";N=i;google.fx.animate(a?400:200,c,function(){O(function(l,x){l.style[x[2]]=\"\"});v.style.position=\"absolute\";v.style.display=\"\";google.fx.unwrap(v);if(e&&g){e.style.width=\"\";g.style.width=\"\"}N=h})}}};\u000a})();\u000aif(!window.gbar||!gbar.close){window.gbar={};(function(){var e=window.gbar,g,j;function k(a){var b=window.encodeURIComponent&&(document.forms[0].q||\"\").value;if(b)a.href=a.href.replace(/([?&])q=[^&]*|$/,function(h,d){return(d||\"&\")+\"q=\"+encodeURIComponent(b)})}e.qs=k;function m(a,b,h,d,f,l){var i=document.getElementById(a),c=i.style;if(i){c.left=d?\"auto\":b+\"px\";c.right=d?b+\"px\":\"auto\";c.top=h+\"px\";c.visibility=j?\"hidden\":\"visible\";if(f){c.width=f+\"px\";c.height=l+\"px\"}else{m(g,b,h,d,i.offsetWidth,i.offsetHeight);j=j?\"\":a}}}e.tg=function(a){a=a||window.event;var b=a.target||a.srcElement;a.cancelBubble=true;if(!g){a=document.createElement(Array.every||window.createPopup?\"iframe\":\"div\");a.frameBorder=\"0\";a.src=\"#\";g=b.parentNode.appendChild(a).id=\"gbs\";document.onclick=e.close;if(e.alld){e.alld(function(){n(b)});return}}n(b)};function n(a){var b=0,h,d=window.navExtra;if(a.className!=\"gb3\")a=a.parentNode;var f=a.getAttribute(\"aria-owns\")||\"gbi\",l=a.offsetWidth,i=a.offsetTop>20?46:24,c;do b+=a.offsetLeft||0;while(a=a.offsetParent);if(f==\"gbi\")for(a=document.getElementById(f);d&&(h=d.pop());)a.insertBefore(h,a.firstChild).className=\"gb2\";else c=b=(document.documentElement.clientWidth||document.body.clientWidth)-b-l;j!=f&&e.close();m(f,b,i,c)}e.close=function(){j&&m(j,0,0)}})();;};\u000aif(google.y.first){for(var a=0,b;b=google.y.first[a];++a)b();delete google.y.first}for(a in google.y)google.y[a][1]?google.y[a][1].apply(google.y[a][0]):google.y[a][0].go();google.y.x=google.x;google.x=function(d,c){c&&c.apply(d);return false};google.y.first=[];\u000a(function (){\u000avar a=\"google\";if(window[a]){window[a].a={};window[a].c=1;function o(d,f,e){var b=d.t[f],c=d.t.start;if(!b||!(c||e))return undefined;if(e!=undefined)c=e;return b>c?b-c:c-b}window[a].report=function(d,f,e){var b=\"\";if(window[a].pt){b+=\"&srt=\"+window[a].pt;delete window[a].pt}{var c=document.getElementById(\"csi\");if(c){var h;if(window[a]._bfr!=undefined)h=window[a]._bfr;else{h=c.value;window[a]._bfr=h;c.value=1}if(h)return\"\"}}if(d.b)b+=\"&\"+d.b;if(window.parent!=window)b+=\"&wif=1\";var i=d.t,p=i.start,k=[];for(var j in i){if(j==\u000a\"start\")continue;p&&k.push(j+\".\"+o(d,j))}delete i.start;if(f)for(var l in f)b+=\"&\"+l+\"=\"+f[l];var m=[e?e:\"/csi\",\"?v=3\",\"&s=\"+(window[a].sn||\"GWS\")+\"&action=\",d.name,\"\",\"\",b,\"&rt=\",k.join(\",\")].join(\"\");{var g=new Image,n=window[a].c++;window[a].a[n]=g;g.onload=(g.onerror=function(){delete window[a].a[n]});g.src=m;g=null}return m}};if(google.timers&&google.timers.load.t){if(!google.nocsixjs)google.timers.load.t.xjsee=google.time();window.setTimeout(function(){if(google.timers.load.t){google.timers.load.t.xjs=google.time();google.timers.load.t.ol&&google.report(google.timers.load,google.kCSI)}},0)};\u000a})();\u000a" + }, + "redirectURL":"", + "headersSize":306, + "bodySize":8646 + }, + "cache":{}, + "timings":{ + "dns":0, + "connect":0, + "blocked":0, + "send":0, + "wait":62, + "receive":16 + } + }, + { + "pageref":"page_62143", + "startedDateTime":"2010-01-02T14:51:01.389+01:00", + "time":47, + "request":{ + "method":"GET", + "url":"http://clients1.google.cz/generate_204", + "httpVersion":"HTTP/1.1", + "cookies":[{ + "name":"PREF", + "value":"ID" + }, + { + "name":"NID", + "value":"29" + } + ], + "headers":[{ + "name":"Host", + "value":"clients1.google.cz" + }, + { + "name":"User-Agent", + "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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.google.cz/" + }, + { + "name":"Cookie", + "value":"PREF=ID=580ec4c5a3534337:U=37a8fcc41ff49f78:TM=1260796678:LM=1260796682:S=9BgbomVM6pcnfah0; NID=29=OHyg2zMZl4IpG8C4a-Z5itM3gCXOuBPogGpTPVFPNsdpmIHJWX78ymRL_gqptvhr_IQrP319GQ1fxlKUsqaIokpxasPIIDq5ijatDmYiyamnCfJz8rXyNvt5GPjCJp2I" + } + ], + "queryString":[], + "headersSize":651, + "bodySize":-1 + }, + "response":{ + "status":204, + "statusText":"No Content", + "httpVersion":"HTTP/1.1", + "cookies":[], + "headers":[{ + "name":"Content-Length", + "value":"0" + }, + { + "name":"Content-Type", + "value":"text/html" + }, + { + "name":"Date", + "value":"Sat, 02 Jan 2010 13:51:06 GMT" + }, + { + "name":"Server", + "value":"GFE/2.0" + }, + { + "name":"X-XSS-Protection", + "value":"0" + } + ], + "content":{ + "size":0, + "mimeType":"text/html" + }, + "redirectURL":"", + "headersSize":146, + "bodySize":0 + }, + "cache":{}, + "timings":{ + "dns":0, + "connect":0, + "blocked":0, + "send":0, + "wait":47, + "receive":0 + } + }, + { + "pageref":"page_62143", + "startedDateTime":"2010-01-02T14:51:01.452+01:00", + "time":31, + "request":{ + "method":"GET", + "url":"http://www.google.cz/images/nav_logo7.png", + "httpVersion":"HTTP/1.1", + "cookies":[{ + "name":"PREF", + "value":"ID" + }, + { + "name":"NID", + "value":"29" + } + ], + "headers":[{ + "name":"Host", + "value":"www.google.cz" + }, + { + "name":"User-Agent", + "value":"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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.google.cz/" + }, + { + "name":"Cookie", + "value":"PREF=ID=580ec4c5a3534337:U=37a8fcc41ff49f78:TM=1260796678:LM=1260796682:S=9BgbomVM6pcnfah0; NID=29=OHyg2zMZl4IpG8C4a-Z5itM3gCXOuBPogGpTPVFPNsdpmIHJWX78ymRL_gqptvhr_IQrP319GQ1fxlKUsqaIokpxasPIIDq5ijatDmYiyamnCfJz8rXyNvt5GPjCJp2I" + } + ], + "queryString":[], + "headersSize":654, + "bodySize":-1 + }, + "response":{ + "status":200, + "statusText":"OK", + "httpVersion":"HTTP/1.1", + "cookies":[], + "headers":[{ + "name":"Content-Type", + "value":"image/png" + }, + { + "name":"Last-Modified", + "value":"Thu, 23 Jul 2009 17:45:03 GMT" + }, + { + "name":"Date", + "value":"Sat, 02 Jan 2010 13:05:54 GMT" + }, + { + "name":"Expires", + "value":"Sun, 02 Jan 2011 13:05:54 GMT" + }, + { + "name":"Server", + "value":"gws" + }, + { + "name":"Content-Length", + "value":"5401" + }, + { + "name":"Cache-Control", + "value":"public, max-age=31536000" + }, + { + "name":"Age", + "value":"2712" + }, + { + "name":"X-XSS-Protection", + "value":"0" + } + ], + "content":{ + "size":5401, + "mimeType":"image/png" + }, + "redirectURL":"", + "headersSize":275, + "bodySize":5401 + }, + "cache":{}, + "timings":{ + "dns":0, + "connect":0, + "blocked":0, + "send":0, + "wait":31, + "receive":0 + } + } + ] + } +} \ No newline at end of file diff --git a/webapp/scripts/examples/inline-scripts-block.har b/webapp/scripts/examples/inline-scripts-block.har new file mode 100644 index 00000000..eb4f6d29 --- /dev/null +++ b/webapp/scripts/examples/inline-scripts-block.har @@ -0,0 +1,1066 @@ +{ + "log": { + "version": "1.1", + "creator": { + "name": "Firebug", + "version": "1.5X.0b8" + }, + "browser": { + "name": "Firefox", + "version": "3.6b6pre" + }, + "comment": "Inline scripts block the page load.", + "pages": [ + { + "startedDateTime": "2010-01-02T15:38:46.686+01:00", + "id": "page_21396", + "title": "Cuzillion", + "pageTimings": { + "onContentLoad": 5605, + "onLoad": 6964 + }, + "comment": "See the gap between the third and fourth request (click this bar to expand the page log and see all requests). This is caused by execution of an inline script." + }, + { + "startedDateTime": "2010-01-02T16:12:32.738+01:00", + "id": "page_20633", + "title": "Cuzillion", + "pageTimings": { + "onContentLoad": 5564, + "onLoad": 5572 + }, + "comment": "The script is moved to the bottom of the page in this case." + } + ], + "entries": [ + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:46.686+01:00", + "time": 525, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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" + } + ], + "queryString": [ + { + "name": "ex", + "value": "10100" + }, + { + "name": "title", + "value": "Inline Scripts Block" + } + ], + "headersSize": 444, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "X-Powered-By", + "value": "PHP/5.2.3" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "2725" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "text/html" + } + ], + "content": { + "size": 8836, + "mimeType": "text/html", + "text": "\n\n\n\nCuzillion\n\n\n\n\n\n\n
      \n \n  Cuzillion'cuz there are a zillion pages to check\n
      \n\n
      \n\n
      \n
      posted by Steve Souders, March 24, 2009 11:41 PM
      Inline scripts block downloads and rendering, just like external scripts. Any resources below an inline script don't get downloaded until the inline script finishes executing. Nothing in the page is rendered until the inline script is done executing. When you click Reload, notice that the page is white for five seconds.
      \n

      \n\n\n\n\n\n\n\n\n\n\n\n\n
      \n
      \n
      \n  \n
      \n
      \n\n
      \n
      \n
      \n <HTML>\n <HEAD>\n
      \n\t
        \n\t
        \n\t
        \n </HEAD>\n <BODY>\n
        \n\t
        • image

          on domain1 with a 1 second delay using HTML tags

          \n
        • inline script block

          with a 5 second execute time using HTML tags

          \n
        • image

          on domain1 with a 1 second delay using HTML tags

          \n
        \n\t
        \n\t
        \n </BODY>\n </HTML>\n
        \n
        \n
        \n
        \n\n
        \n
        \n
        \n\n  \n  \n  \n\n
        \n
        \n\n
        \n
        \n\n
        \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2725 + }, + "cache": { + }, + "timings": { + "dns": 2, + "connect": 183, + "blocked": 0, + "send": 0, + "wait": 340, + "receive": 0 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:47.238+01:00", + "time": 193, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/logo-32x32.gif", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + ], + "headersSize": 473, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Last-Modified", + "value": "Mon, 16 Nov 2009 20:19:20 GMT" + }, + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Content-Length", + "value": "1057" + }, + { + "name": "Cache-Control", + "value": "max-age=315360000" + }, + { + "name": "Expires", + "value": "Tue, 31 Dec 2019 14:38:52 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1057, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 316, + "bodySize": 1057 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 0, + "send": 0, + "wait": 190, + "receive": 3 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:47.238+01:00", + "time": 1430, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=1&t=1262443132", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262443132" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 498, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:38:53 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 193, + "blocked": 0, + "send": 0, + "wait": 1237, + "receive": 0 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:52.243+01:00", + "time": 1400, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=3&t=1262443132", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + { + "name": "n", + "value": "3" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262443132" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 498, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:57 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:38:58 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 185, + "blocked": 0, + "send": 0, + "wait": 1215, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:32.738+01:00", + "time": 450, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + }, + { + "name": "Cache-Control", + "value": "max-age=0" + } + ], + "queryString": [ + { + "name": "c0", + "value": "bi1hfff1_0_f" + }, + { + "name": "c1", + "value": "bi1hfff1_0_f" + }, + { + "name": "c2", + "value": "bb0hfff0_5_f" + }, + { + "name": "t", + "value": "1262445132270" + } + ], + "headersSize": 579, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "X-Powered-By", + "value": "PHP/5.2.3" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "2456" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "text/html" + } + ], + "content": { + "size": 8125, + "mimeType": "text/html", + "text": "\n\n\n\nCuzillion\n\n\n\n\n\n\n
        \n \n  Cuzillion'cuz there are a zillion pages to check\n
        \n\n
        \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
        \n
        \n
        \n  \n
        \n
        \n\n
        \n
        \n
        \n <HTML>\n <HEAD>\n
        \n\t
          \n\t
          \n\t
          \n </HEAD>\n <BODY>\n
          \n\t
          • image

            on domain1 with a 1 second delay using HTML tags

            \n
          • image

            on domain1 with a 1 second delay using HTML tags

            \n
          • inline script block

            with a 5 second execute time using HTML tags

            \n
          \n\t
          \n\t
          \n </BODY>\n </HTML>\n
          \n
          \n
          \n
          \n\n
          \n
          \n
          \n\n  \n  \n  \n\n
          \n
          \n\n
          \n
          \n\n
          \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2456 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 185, + "blocked": 0, + "send": 0, + "wait": 265, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.211+01:00", + "time": 195, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/logo-32x32.gif", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + }, + { + "name": "If-Modified-Since", + "value": "Mon, 16 Nov 2009 20:19:20 GMT" + }, + { + "name": "Cache-Control", + "value": "max-age=0" + } + ], + "queryString": [ + ], + "headersSize": 577, + "bodySize": -1 + }, + "response": { + "status": 304, + "statusText": "Not Modified", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Etag", + "value": "\"231b822-421-b97e8200\"" + }, + { + "name": "Expires", + "value": "Tue, 31 Dec 2019 15:12:38 GMT" + }, + { + "name": "Cache-Control", + "value": "max-age=315360000" + } + ], + "content": { + "size": 1057, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 241, + "bodySize": 1057 + }, + "cache": { + "afterRequest": { + "expires": "2019-12-31T15:12:33.000Z", + "lastAccess": "2010-01-02T15:12:38.000Z", + "eTag": "", + "hitCount": 4 + } + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 0, + "send": 0, + "wait": 195, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.213+01:00", + "time": 1403, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=1&t=1262445158", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262445158" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 526, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:12:39 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 190, + "blocked": 0, + "send": 0, + "wait": 1213, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.213+01:00", + "time": 1448, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=2&t=1262445158", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + } + ], + "queryString": [ + { + "name": "n", + "value": "2" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262445158" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 526, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:12:39 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 307, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 190, + "blocked": 0, + "send": 0, + "wait": 1258, + "receive": 0 + } + } + ] + } +} \ No newline at end of file diff --git a/webapp/scripts/examples/inline-scripts-block.harp b/webapp/scripts/examples/inline-scripts-block.harp new file mode 100644 index 00000000..c9926c01 --- /dev/null +++ b/webapp/scripts/examples/inline-scripts-block.harp @@ -0,0 +1,1065 @@ +onInputData({ + "log": { + "version": "1.1", + "creator": { + "name": "Firebug", + "version": "1.5X.0b8" + }, + "browser": { + "name": "Firefox", + "version": "3.6b6pre" + }, + "pages": [ + { + "startedDateTime": "2010-01-02T15:38:46.686+01:00", + "id": "page_21396", + "title": "Cuzillion", + "pageTimings": { + "onContentLoad": 5605, + "onLoad": 6964 + }, + "comment": "See the gap between the third and fourth request (click this bar to expand the page log and see all requests). This is caused by execution of an inline script." + }, + { + "startedDateTime": "2010-01-02T16:12:32.738+01:00", + "id": "page_20633", + "title": "Cuzillion", + "pageTimings": { + "onContentLoad": 5564, + "onLoad": 5572 + }, + "comment": "The script is moved to the bottom of the page in this case." + } + ], + "entries": [ + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:46.686+01:00", + "time": 525, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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" + } + ], + "queryString": [ + { + "name": "ex", + "value": "10100" + }, + { + "name": "title", + "value": "Inline Scripts Block" + } + ], + "headersSize": 444, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "X-Powered-By", + "value": "PHP/5.2.3" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "2725" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "text/html" + } + ], + "content": { + "size": 8836, + "mimeType": "text/html", + "text": "\n\n\n\nCuzillion\n\n\n\n\n\n\n
          \n \n  Cuzillion'cuz there are a zillion pages to check\n
          \n\n
          \n\n
          \n
          posted by Steve Souders, March 24, 2009 11:41 PM
          Inline scripts block downloads and rendering, just like external scripts. Any resources below an inline script don't get downloaded until the inline script finishes executing. Nothing in the page is rendered until the inline script is done executing. When you click Reload, notice that the page is white for five seconds.
          \n

          \n\n\n\n\n\n\n\n\n\n\n\n\n
          \n
          \n
          \n  \n
          \n
          \n\n
          \n
          \n
          \n <HTML>\n <HEAD>\n
          \n\t
            \n\t
            \n\t
            \n </HEAD>\n <BODY>\n
            \n\t
            • image

              on domain1 with a 1 second delay using HTML tags

              \n
            • inline script block

              with a 5 second execute time using HTML tags

              \n
            • image

              on domain1 with a 1 second delay using HTML tags

              \n
            \n\t
            \n\t
            \n </BODY>\n </HTML>\n
            \n
            \n
            \n
            \n\n
            \n
            \n
            \n\n  \n  \n  \n\n
            \n
            \n\n
            \n
            \n\n
            \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2725 + }, + "cache": { + }, + "timings": { + "dns": 2, + "connect": 183, + "blocked": 0, + "send": 0, + "wait": 340, + "receive": 0 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:47.238+01:00", + "time": 193, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/logo-32x32.gif", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + ], + "headersSize": 473, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Last-Modified", + "value": "Mon, 16 Nov 2009 20:19:20 GMT" + }, + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Content-Length", + "value": "1057" + }, + { + "name": "Cache-Control", + "value": "max-age=315360000" + }, + { + "name": "Expires", + "value": "Tue, 31 Dec 2019 14:38:52 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1057, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 316, + "bodySize": 1057 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 0, + "send": 0, + "wait": 190, + "receive": 3 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:47.238+01:00", + "time": 1430, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=1&t=1262443132", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262443132" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 498, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:52 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:38:53 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 193, + "blocked": 0, + "send": 0, + "wait": 1237, + "receive": 0 + } + }, + { + "pageref": "page_21396", + "startedDateTime": "2010-01-02T15:38:52.243+01:00", + "time": 1400, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=3&t=1262443132", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + } + ], + "queryString": [ + { + "name": "n", + "value": "3" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262443132" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 498, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 14:38:57 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 14:38:58 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1525" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 185, + "blocked": 0, + "send": 0, + "wait": 1215, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:32.738+01:00", + "time": 450, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?ex=10100&title=Inline+Scripts+Block" + }, + { + "name": "Cache-Control", + "value": "max-age=0" + } + ], + "queryString": [ + { + "name": "c0", + "value": "bi1hfff1_0_f" + }, + { + "name": "c1", + "value": "bi1hfff1_0_f" + }, + { + "name": "c2", + "value": "bb0hfff0_5_f" + }, + { + "name": "t", + "value": "1262445132270" + } + ], + "headersSize": 579, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "X-Powered-By", + "value": "PHP/5.2.3" + }, + { + "name": "Vary", + "value": "Accept-Encoding" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "2456" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "text/html" + } + ], + "content": { + "size": 8125, + "mimeType": "text/html", + "text": "\n\n\n\nCuzillion\n\n\n\n\n\n\n
            \n \n  Cuzillion'cuz there are a zillion pages to check\n
            \n\n
            \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
            \n
            \n
            \n  \n
            \n
            \n\n
            \n
            \n
            \n <HTML>\n <HEAD>\n
            \n\t
              \n\t
              \n\t
              \n </HEAD>\n <BODY>\n
              \n\t
              • image

                on domain1 with a 1 second delay using HTML tags

                \n
              • image

                on domain1 with a 1 second delay using HTML tags

                \n
              • inline script block

                with a 5 second execute time using HTML tags

                \n
              \n\t
              \n\t
              \n </BODY>\n </HTML>\n
              \n
              \n
              \n
              \n\n
              \n
              \n
              \n\n  \n  \n  \n\n
              \n
              \n\n
              \n
              \n\n
              \n\n\n\n\n\n\n" + }, + "redirectURL": "", + "headersSize": 247, + "bodySize": 2456 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 185, + "blocked": 0, + "send": 0, + "wait": 265, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.211+01:00", + "time": 195, + "request": { + "method": "GET", + "url": "http://stevesouders.com/cuzillion/logo-32x32.gif", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "stevesouders.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + }, + { + "name": "If-Modified-Since", + "value": "Mon, 16 Nov 2009 20:19:20 GMT" + }, + { + "name": "Cache-Control", + "value": "max-age=0" + } + ], + "queryString": [ + ], + "headersSize": 577, + "bodySize": -1 + }, + "response": { + "status": 304, + "statusText": "Not Modified", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=99" + }, + { + "name": "Etag", + "value": "\"231b822-421-b97e8200\"" + }, + { + "name": "Expires", + "value": "Tue, 31 Dec 2019 15:12:38 GMT" + }, + { + "name": "Cache-Control", + "value": "max-age=315360000" + } + ], + "content": { + "size": 1057, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 241, + "bodySize": 1057 + }, + "cache": { + "afterRequest": { + "expires": "2019-12-31T15:12:33.000Z", + "lastAccess": "2010-01-02T15:12:38.000Z", + "eTag": "", + "hitCount": 4 + } + }, + "timings": { + "dns": 0, + "connect": 0, + "blocked": 0, + "send": 0, + "wait": 195, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.213+01:00", + "time": 1403, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=1&t=1262445158", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + } + ], + "queryString": [ + { + "name": "n", + "value": "1" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262445158" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 526, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:12:39 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Content-Length", + "value": "1076" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1076, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 301, + "bodySize": 1076 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 190, + "blocked": 0, + "send": 0, + "wait": 1213, + "receive": 0 + } + }, + { + "pageref": "page_20633", + "startedDateTime": "2010-01-02T16:12:33.213+01:00", + "time": 1448, + "request": { + "method": "GET", + "url": "http://1.cuzillion.com/bin/resource.cgi?type=gif&sleep=1&n=2&t=1262445158", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Host", + "value": "1.cuzillion.com" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2b6pre) Gecko/20091230 Namoroka/3.6b6pre (.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://stevesouders.com/cuzillion/?c0=bi1hfff1_0_f&c1=bi1hfff1_0_f&c2=bb0hfff0_5_f&t=1262445132270" + } + ], + "queryString": [ + { + "name": "n", + "value": "2" + }, + { + "name": "sleep", + "value": "1" + }, + { + "name": "t", + "value": "1262445158" + }, + { + "name": "type", + "value": "gif" + } + ], + "headersSize": 526, + "bodySize": -1 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "cookies": [ + ], + "headers": [ + { + "name": "Date", + "value": "Sat, 02 Jan 2010 15:12:38 GMT" + }, + { + "name": "Server", + "value": "Apache" + }, + { + "name": "Expires", + "value": "Mon, 01 Feb 2010 15:12:39 GMT" + }, + { + "name": "Cache-Control", + "value": "public, max-age=2592000" + }, + { + "name": "Last-Modified", + "value": "Sun, 15 Jan 2006 12:00:00 GMT" + }, + { + "name": "Keep-Alive", + "value": "timeout=2, max=100" + }, + { + "name": "Connection", + "value": "Keep-Alive" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + }, + { + "name": "Content-Type", + "value": "image/gif" + } + ], + "content": { + "size": 1525, + "mimeType": "image/gif" + }, + "redirectURL": "", + "headersSize": 307, + "bodySize": 1525 + }, + "cache": { + }, + "timings": { + "dns": 0, + "connect": 190, + "blocked": 0, + "send": 0, + "wait": 1258, + "receive": 0 + } + } + ] + } +}); \ No newline at end of file diff --git a/webapp/scripts/examples/loader.js b/webapp/scripts/examples/loader.js new file mode 100644 index 00000000..70d2fe29 --- /dev/null +++ b/webapp/scripts/examples/loader.js @@ -0,0 +1,24 @@ +/* See license.txt for terms of usage */ + +define([ + "require" +], + +function(require) { + return { + load: function (path) { + + var href = document.location.href; + var index = href.indexOf("?"); + var url = href.substr(0, index) + "?path="; + + if (typeof require.sandbox !== "undefined") { + url += require.sandbox.id + require.id(path.replace(/^examples\//, "./")); + } else { + url += path; + } + + document.location = url; + } + }; +}); diff --git a/webapp/scripts/examples/package.json b/webapp/scripts/examples/package.json new file mode 100644 index 00000000..03df66c3 --- /dev/null +++ b/webapp/scripts/examples/package.json @@ -0,0 +1,10 @@ +{ + "directories": { + "lib": "." + }, + "exports": { + "styles": { + "*": "./*" + } + } +} \ No newline at end of file diff --git a/webapp/scripts/examples/softwareishard.com.har b/webapp/scripts/examples/softwareishard.com.har new file mode 100644 index 00000000..e3a3e00f --- /dev/null +++ b/webapp/scripts/examples/softwareishard.com.har @@ -0,0 +1,5323 @@ +{ + "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 + } + } + ] + } +} \ No newline at end of file diff --git a/webapp/scripts/harViewer.js b/webapp/scripts/harViewer.js index 93f5eb3e..0159d595 100644 --- a/webapp/scripts/harViewer.js +++ b/webapp/scripts/harViewer.js @@ -1,21 +1,25 @@ /* See license.txt for terms of usage */ require.def("harViewer", [ + "jquery/jquery", "domplate/tabView", "tabs/homeTab", "tabs/aboutTab", "tabs/previewTab", "tabs/schemaTab", + "tabs/embedTab", "tabs/domTab", "preview/harModel", "i18n!nls/harViewer", "preview/requestList", + "css/loader", "core/lib", - "core/trace" + "core/trace", + "require" ], -function(TabView, HomeTab, AboutTab, PreviewTab, SchemaTab, DomTab, HarModel, - Strings, RequestList, Lib, Trace) { +function($, TabView, HomeTab, AboutTab, PreviewTab, SchemaTab, EmbedTab, DomTab, HarModel, + Strings, RequestList, CssLoader, Lib, Trace, require) { // ********************************************************************************************* // // The Application @@ -33,6 +37,7 @@ function HarView() this.appendTab(new DomTab()); this.appendTab(new AboutTab()); this.appendTab(new SchemaTab()); + this.appendTab(new EmbedTab()); } /** @@ -62,7 +67,7 @@ HarView.prototype = Lib.extend(new TabView(), initialize: function(content) { // Global application properties. - this.version = content.getAttribute("version"); + this.version = content.getAttribute("version") || ""; this.harSpecURL = "http://www.softwareishard.com/blog/har-12-spec/"; this.render(content); @@ -189,15 +194,28 @@ HarView.prototype = Lib.extend(new TabView(), // ********************************************************************************************* // // Initialization -var content = document.getElementById("content"); -var harView = content.repObject = new HarView(); +var api = { + init: function (domNode) { -// Fire some events for listeners. This is useful for extending/customizing the viewer. -Lib.fireEvent(content, "onViewerPreInit"); -harView.initialize(content); -Lib.fireEvent(content, "onViewerInit"); + var content = domNode; + var harView = content.repObject = new HarView(); -Trace.log("HarViewer; initialized OK"); + CssLoader.initialize(); + + // Fire some events for listeners. This is useful for extending/customizing the viewer. + Lib.fireEvent(content, "onViewerPreInit"); + harView.initialize(content); + Lib.fireEvent(content, "onViewerInit"); + + Trace.log("HarViewer; initialized OK"); + } +}; + +if (window.harviewerInitOnLoad) { + api.init(document.getElementById("content")); +} + +return api; // ********************************************************************************************* // }); diff --git a/webapp/scripts/jquery-plugins/jquery.json.js b/webapp/scripts/jquery-plugins/jquery.json.js index 3e1e9b1e..8360f679 100644 --- a/webapp/scripts/jquery-plugins/jquery.json.js +++ b/webapp/scripts/jquery-plugins/jquery.json.js @@ -152,6 +152,11 @@ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO NOT CONTROL. */ + +define([ + "jquery/jquery" +], function (jQuery) { + ;(function($) { if (!JSON) { var JSON = {}; @@ -487,4 +492,6 @@ return JSON.stringify(value, replacer, space); }; -})(jQuery); \ No newline at end of file +})(jQuery); + +}); \ No newline at end of file diff --git a/webapp/scripts/jquery-plugins/package.json b/webapp/scripts/jquery-plugins/package.json new file mode 100644 index 00000000..2d6f2264 --- /dev/null +++ b/webapp/scripts/jquery-plugins/package.json @@ -0,0 +1,8 @@ +{ + "mappings": { + "jquery": "../jquery" + }, + "directories": { + "lib": "." + } +} \ No newline at end of file diff --git a/webapp/scripts/jquery.js b/webapp/scripts/jquery/jquery.js similarity index 99% rename from webapp/scripts/jquery.js rename to webapp/scripts/jquery/jquery.js index 78fcfa46..23b4d433 100644 --- a/webapp/scripts/jquery.js +++ b/webapp/scripts/jquery/jquery.js @@ -13,7 +13,10 @@ * * Date: Wed Feb 23 13:55:29 2011 -0500 */ -(function( window, undefined ) { + +define(function () { + +return (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document; @@ -8312,5 +8315,8 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { }); -window.jQuery = window.$ = jQuery; +//window.jQuery = window.$ = jQuery; +return jQuery; })(window); + +}); \ No newline at end of file diff --git a/webapp/scripts/nls/harViewer.js b/webapp/scripts/nls/harViewer.js index 696ee240..d537490b 100644 --- a/webapp/scripts/nls/harViewer.js +++ b/webapp/scripts/nls/harViewer.js @@ -4,6 +4,7 @@ define( { "root": { "aboutTabLabel": "About", - "schemaTabLabel": "Schema" + "schemaTabLabel": "Schema", + "embedTabLabel": "Embed" } }); diff --git a/webapp/scripts/package.json b/webapp/scripts/package.json new file mode 100644 index 00000000..7d6b914c --- /dev/null +++ b/webapp/scripts/package.json @@ -0,0 +1,12 @@ +{ + "main": "./harViewer.js", + "mappings": { + "preview": "./preview", + "core": "./core", + "domplate": "./domplate", + "tabs": "./tabs", + "nls": "./nls", + "jquery": "./jquery", + "css": "./css" + } +} \ No newline at end of file diff --git a/webapp/scripts/preview/harModel.js b/webapp/scripts/preview/harModel.js index be1b9102..4eb5b226 100644 --- a/webapp/scripts/preview/harModel.js +++ b/webapp/scripts/preview/harModel.js @@ -1,6 +1,7 @@ /* See license.txt for terms of usage */ require.def("preview/harModel", [ + "jquery/jquery", "core/lib", "preview/jsonSchema", "preview/ref", @@ -11,7 +12,7 @@ require.def("preview/harModel", [ "jquery-plugins/jquery.json" ], -function(Lib, JSONSchema, Ref, HarSchema, Cookies, Trace, Strings) { +function($, Lib, JSONSchema, Ref, HarSchema, Cookies, Trace, Strings) { //************************************************************************************************* // Statistics @@ -189,7 +190,7 @@ HarModel.parse = function(jsonString, validate) try { if (typeof(jsonString) === "string") - input = jQuery.parseJSON(jsonString); + input = $.parseJSON(jsonString); } catch (err) { diff --git a/webapp/scripts/preview/package.json b/webapp/scripts/preview/package.json new file mode 100644 index 00000000..379c4460 --- /dev/null +++ b/webapp/scripts/preview/package.json @@ -0,0 +1,17 @@ +{ + "mappings": { + "preview": ".", + "domplate": "../domplate", + "core": "../core", + "nls": "../nls", + "jquery-plugins": "../jquery-plugins", + "syntax-highlighter": "../syntax-highlighter", + "jquery": "../jquery" + }, + "directories": { + "lib": "." + }, + "require.async": { + "harSchema.js": "./harSchema" + } +} \ No newline at end of file diff --git a/webapp/scripts/tabs/aboutTab.js b/webapp/scripts/tabs/aboutTab.js index dc4203da..eee8b7d4 100644 --- a/webapp/scripts/tabs/aboutTab.js +++ b/webapp/scripts/tabs/aboutTab.js @@ -1,14 +1,15 @@ /* See license.txt for terms of usage */ require.def("tabs/aboutTab", [ + "jquery/jquery", "domplate/domplate", "domplate/tabView", "core/lib", - "i18n!nls/harViewer" + "i18n!nls/harViewer", + "require" ], -function(Domplate, TabView, Lib, Strings) { with (Domplate) { - +function($, Domplate, TabView, Lib, Strings, require) { with (Domplate) { //************************************************************************************************* // Home Tab diff --git a/webapp/scripts/tabs/embedTab.html b/webapp/scripts/tabs/embedTab.html new file mode 100644 index 00000000..0911e9ee --- /dev/null +++ b/webapp/scripts/tabs/embedTab.html @@ -0,0 +1,49 @@ +
              +

              Embed the HTTP Archive Viewer in your own tooling

              + + + + + + + + + + + + + +
              + +

              You can embed the HTTP Archive Viewer as a widget in your own tooling by loading it right from github pages or serving the static files from your own webserver.

              + +
              + +

              Load from github pages

              + +
              +	<script src="http://fireconsole.github.io/harviewer/fireconsole/bundles/loader.js"></script>
              +	 
              +	<div id="content" version="@VERSION@"></div>
              +	 
              +	<script>
              +	  PINF.sandbox("http://fireconsole.github.io/harviewer/fireconsole/bundles/plugin.js", function (sandbox) {
              +	      sandbox.main();
              +	  }, function (err) {
              +	      console.error("Error while loading plugin.js bundle':", err.stack);
              +	  });
              +	</script>
              +
              + +

              See it in action on JSFiddle: http://jsfiddle.net/cadorn/z9py15jw/

              + +

              Paste this sample HAR file into the widget.

              + +
              + +

              Serve your own static files

              + +

              The widget is composed of a few files that get loaded using the PINF JavaScript Loader. You can find the widget files here and a sample bootstrap file in addition to the info above here. It is recommended that you continuously deploy updates to these files as changes are comitted.

              + +
              +
              diff --git a/webapp/scripts/tabs/embedTab.js b/webapp/scripts/tabs/embedTab.js new file mode 100644 index 00000000..f1e40a33 --- /dev/null +++ b/webapp/scripts/tabs/embedTab.js @@ -0,0 +1,42 @@ +/* See license.txt for terms of usage */ + +require.def("tabs/embedTab", [ + "jquery/jquery", + "domplate/domplate", + "domplate/tabView", + "core/lib", + "i18n!nls/harViewer", + "text!tabs/embedTab.html", + "require" +], + +function($, Domplate, TabView, Lib, Strings, EmbedTabHtml, require) { with (Domplate) { +//************************************************************************************************* +// Home Tab + +function EmbedTab() {} +EmbedTab.prototype = +{ + id: "Embed", + label: Strings.embedTabLabel, + + tabHeaderTag: + A({"class": "$tab.id\\Tab tab", view: "$tab.id", _repObject: "$tab"}, + "$tab.label" + ), + + bodyTag: + DIV({"class": "embedBody"}), + + onUpdateBody: function(tabView, body) + { + var self = this; + body = this.bodyTag.replace({}, body); + body.innerHTML = EmbedTabHtml; + } +}; + +return EmbedTab; + +//************************************************************************************************* +}}); diff --git a/webapp/scripts/tabs/homeTab.js b/webapp/scripts/tabs/homeTab.js index d909177e..cfb7b7d4 100644 --- a/webapp/scripts/tabs/homeTab.js +++ b/webapp/scripts/tabs/homeTab.js @@ -1,6 +1,7 @@ /* See license.txt for terms of usage */ require.def("tabs/homeTab", [ + "jquery/jquery", "domplate/domplate", "domplate/tabView", "core/lib", @@ -8,10 +9,11 @@ require.def("tabs/homeTab", [ "core/trace", "i18n!nls/homeTab", "text!tabs/homeTab.html", - "preview/harModel" + "preview/harModel", + "examples/loader" ], -function(Domplate, TabView, Lib, Cookies, Trace, Strings, HomeTabHtml, HarModel) { with (Domplate) { +function($, Domplate, TabView, Lib, Cookies, Trace, Strings, HomeTabHtml, HarModel, ExamplesLoader) { with (Domplate) { //************************************************************************************************* // Home Tab @@ -85,9 +87,7 @@ HomeTab.prototype = Lib.extend(TabView.Tab.prototype, var e = Lib.fixEvent(event); var path = e.target.getAttribute("path"); - var href = document.location.href; - var index = href.indexOf("?"); - document.location = href.substr(0, index) + "?path=" + path; + ExamplesLoader.load(path); // Show timeline and stats by default if an example is displayed. Cookies.setCookie("timeline", true); diff --git a/webapp/scripts/tabs/package.json b/webapp/scripts/tabs/package.json new file mode 100644 index 00000000..bf7131f3 --- /dev/null +++ b/webapp/scripts/tabs/package.json @@ -0,0 +1,18 @@ +{ + "mappings": { + "tabs": ".", + "domplate": "../domplate", + "core": "../core", + "nls": "../nls", + "jquery-plugins": "../jquery-plugins", + "json-query": "../json-query", + "syntax-highlighter": "../syntax-highlighter", + "downloadify": "../downloadify", + "preview": "../preview", + "jquery": "../jquery", + "examples": "../examples" + }, + "directories": { + "lib": "." + } +} \ No newline at end of file diff --git a/webapp/scripts/tabs/pageStats.js b/webapp/scripts/tabs/pageStats.js index 601f4086..637229c3 100644 --- a/webapp/scripts/tabs/pageStats.js +++ b/webapp/scripts/tabs/pageStats.js @@ -1,6 +1,7 @@ /* See license.txt for terms of usage */ require.def("tabs/pageStats", [ + "jquery/jquery", "domplate/domplate", "core/lib", "i18n!nls/pageStats", @@ -11,7 +12,7 @@ require.def("tabs/pageStats", [ "core/trace" ], -function(Domplate, Lib, Strings, HarSchema, HarModel, Cookies, InfoTip, Trace) { with (Domplate) { +function($, Domplate, Lib, Strings, HarSchema, HarModel, Cookies, InfoTip, Trace) { with (Domplate) { //************************************************************************************************* // Page Load Statistics diff --git a/webapp/scripts/tabs/pageTimeline.js b/webapp/scripts/tabs/pageTimeline.js index 3107e406..9b0fdeeb 100644 --- a/webapp/scripts/tabs/pageTimeline.js +++ b/webapp/scripts/tabs/pageTimeline.js @@ -1,6 +1,7 @@ /* See license.txt for terms of usage */ require.def("tabs/pageTimeline", [ + "jquery/jquery", "domplate/domplate", "core/lib", "core/trace", @@ -8,7 +9,7 @@ require.def("tabs/pageTimeline", [ "preview/harModel" ], -function(Domplate, Lib, Trace, Strings, HarModel) { with (Domplate) { +function($, Domplate, Lib, Trace, Strings, HarModel) { with (Domplate) { //************************************************************************************************* // Timeline diff --git a/webapp/scripts/tabs/previewTab.js b/webapp/scripts/tabs/previewTab.js index 58c53531..f616ddde 100644 --- a/webapp/scripts/tabs/previewTab.js +++ b/webapp/scripts/tabs/previewTab.js @@ -1,6 +1,7 @@ /* See license.txt for terms of usage */ require.def("tabs/previewTab", [ + "jquery/jquery", "domplate/domplate", "domplate/tabView", "core/lib", @@ -15,7 +16,7 @@ require.def("tabs/previewTab", [ "downloadify/src/downloadify" ], -function(Domplate, TabView, Lib, Strings, Toolbar, Timeline, Stats, PageList, Cookies, +function($, Domplate, TabView, Lib, Strings, Toolbar, Timeline, Stats, PageList, Cookies, ValidationError) { with (Domplate) { diff --git a/webapp/scripts/tabs/schemaTab.js b/webapp/scripts/tabs/schemaTab.js index 22908a0c..fe991aba 100644 --- a/webapp/scripts/tabs/schemaTab.js +++ b/webapp/scripts/tabs/schemaTab.js @@ -1,15 +1,17 @@ /* See license.txt for terms of usage */ require.def("tabs/schemaTab", [ + "jquery/jquery", "domplate/domplate", "domplate/tabView", "core/lib", "i18n!nls/harViewer", "syntax-highlighter/shCore", - "core/trace" + "core/trace", + "require" ], -function(Domplate, TabView, Lib, Strings, dp, Trace) { with (Domplate) { +function($, Domplate, TabView, Lib, Strings, dp, Trace, require) { with (Domplate) { //************************************************************************************************* // Home Tab @@ -25,21 +27,11 @@ SchemaTab.prototype = onUpdateBody: function(tabView, body) { - $.ajax({ - url: "scripts/preview/harSchema.js", - context: this, - - success: function(response) - { - var code = body.firstChild; - code.innerHTML = response; - dp.SyntaxHighlighter.HighlightAll(code); - }, - - error: function(response, ioArgs) - { - Trace.error("SchemaTab.onUpdateBody; ERROR ", response); - } + require(["text!preview/harSchema.js"], function(source) + { + var code = body.firstChild; + code.innerHTML = (typeof source === "string") ? source : JSON.stringify(source, null, 4); + dp.SyntaxHighlighter.HighlightAll(code); }); } };