You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2014/10/11 15:39:14 UTC

[22/38] Goodbye Futon, old friend <3

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/jquery.resizer.js
----------------------------------------------------------------------
diff --git a/share/www/script/jquery.resizer.js b/share/www/script/jquery.resizer.js
deleted file mode 100644
index 42f0cc7..0000000
--- a/share/www/script/jquery.resizer.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-(function($) {
-
-  $.fn.makeResizable = function(options) {
-    options = options || {};
-    options.always = options.always || false;
-    options.grippie = options.grippie || null;
-    options.horizontal = options.horizontal || false;
-    options.minWidth = options.minWidth || 100;
-    options.maxWidth = options.maxWidth || null;
-    options.vertical = options.vertical || false;
-    options.minHeight = options.minHeight || 32;
-    options.maxHeight = options.maxHeight || null;
-
-    return this.each(function() {
-      if ($(this).is("textarea") && !options.always &&
-          $.browser.safari && parseInt($.browser.version) >= 522)
-        return this; // safari3 and later provides textarea resizing natively
-
-      var grippie = options.grippie;
-      if (!grippie) grippie = $("<div></div>").appendTo(this.parentNode);
-      grippie.addClass("grippie");
-      if (options.horizontal && options.vertical) {
-        grippie.css("cursor", "nwse-resize");
-      } else if (options.horizontal) {
-        grippie.css("cursor", "col-resize");
-      } else if (options.vertical) {
-        grippie.css("cursor", "row-resize");
-      }
-
-      var elem = $(this);
-      grippie.mousedown(function(e) {
-        var pos = {x: e.screenX, y: e.screenY};
-        var dimensions = {width: elem.width(), height: elem.height()};
-        $(document)
-          .mousemove(function(e) {
-            if (options.horizontal) {
-              var offset = e.screenX - pos.x;
-              if (offset) {
-                var newWidth = dimensions.width + offset;
-                if (newWidth >= options.minWidth &&
-                    (!options.maxWidth || newWidth <= options.maxWidth)) {
-                  elem.width(newWidth);
-                  dimensions.width = newWidth;
-                }
-                pos.x = e.screenX;
-              }
-            }
-            if (options.vertical) {
-              var offset = e.screenY - pos.y;
-              if (offset) {
-                var newHeight = dimensions.height + offset;
-                if (newHeight >= options.minHeight &&
-                    (!options.maxHeight || newHeight <= options.maxHeight)) {
-                  elem.height(newHeight);
-                  dimensions.height = newHeight;
-                }
-                pos.y = e.screenY;
-              }
-            }
-            document.onselectstart = function() { return false }; // for IE
-            return false;
-          })
-          .one("mouseup", function() {
-            $(document).unbind("mousemove");
-            document.onselectstart = null; // for IE
-          });
-        return true;
-      });
-    });
-  }
-
-})(jQuery);

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/jquery.suggest.js
----------------------------------------------------------------------
diff --git a/share/www/script/jquery.suggest.js b/share/www/script/jquery.suggest.js
deleted file mode 100644
index cad020d..0000000
--- a/share/www/script/jquery.suggest.js
+++ /dev/null
@@ -1,161 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-(function($) {
-
-  function suggest(elem, options) {
-    var timer = null;
-    var prevVal = null;
-    var cache = {};
-    var cacheKeys = [];
-
-    var input = $(elem).attr("autocomplete", "off");
-    var dropdown = $('<ul style="display: none; position: absolute; z-index: 10000"></ul>')
-      .addClass(options.dropdownClass).appendTo(document.body);
-
-    input
-      .blur(function() {
-        if (timer) clearTimeout(timer);
-        setTimeout(function() { dropdown.hide() }, 200);
-      })
-      .keydown(function(e) {
-        if ($.inArray(e.keyCode, [16, 17, 18, 20, 144, 91, 93, 224]) != -1) {
-          return; // ignore modifier keys
-        }
-        if (timer) clearTimeout(timer);
-        if ($.inArray(e.keyCode, [38, 40]) != -1 ||
-            (dropdown.is(":visible") && (e.keyCode == 27 ||
-             ($.inArray(e.keyCode, [9, 13]) != -1 && getSelection())))) {
-          switch(e.keyCode) {
-            case 38: // up
-              moveUp();
-              break;
-            case 40: // down
-              moveDown();
-              break;
-            case 9:  // tab
-            case 13: // return
-              commit();
-              if (e.keyCode == 9) return true;
-              break;
-            case 27: // escape
-              dropdown.hide();
-              break;
-          }
-          e.preventDefault(); e.stopPropagation();
-          return false;
-        } else {
-          timer = setTimeout(function() { suggest() }, options.delay);
-        }
-      });
-
-    function suggest(force) {
-      var newVal = $.trim(input.val());
-      if (force || newVal != prevVal) {
-        if (force || newVal.length >= options.minChars) {
-          if (options.cache && cache.hasOwnProperty(newVal)) {
-            show(cache[newVal].items, cache[newVal].render);
-          } else {
-            options.callback.apply(elem, [newVal, function(items, render) {
-              if (options.cache) {
-                if (cacheKeys.length >= options.cacheLimit) {
-                  delete cache[cacheKeys.shift()];
-                }
-                cache[newVal] = {items: items, render: render};
-                cacheKeys.push(newVal);
-              }
-              show(items, render);
-            }]);
-          }
-        } else {
-          dropdown.hide();
-        }
-        prevVal = newVal;
-      }
-    }
-
-    function show(items, render) {
-      if (!items) return;
-      if (!items.length) { dropdown.hide(); return; }
-      var offset = input.offset();
-      dropdown.empty().css({
-        top: (offset.top + input.outerHeight()) + "px", left: offset.left + "px",
-        minWidth: input.css("width")
-      });
-      render = render || function(idx, value) { return value; }
-      for (var i = 0; i < items.length; i++) {
-        var item = $("<li></li>").data("value", items[i]);
-        var rendered = render(i, items[i]);
-        if (typeof(rendered) == "string") {
-          item.text(rendered);
-        } else {
-          item.append(rendered);
-        }
-        item.appendTo(dropdown);
-      }
-      dropdown.slideDown("fast");
-      dropdown.children("li").click(function(e) {
-        $(this).addClass("selected");
-        commit();
-      });
-    }
-
-    function commit() {
-      var sel = getSelection();
-      if (sel) {
-        prevVal = sel.data("value");
-        input.val(prevVal);
-        if (options.select) {
-          options.select.apply(elem, [prevVal]);
-        }
-        dropdown.hide();
-      }
-      if (timer) clearTimeout(timer)
-    }
-
-    function getSelection() {
-      if (!dropdown.is(":visible")) return null;
-      var sel = dropdown.children("li.selected");
-      return sel.length ? sel : null;
-    }
-
-    function moveDown() {
-      if (!dropdown.is(":visible")) suggest(true);
-      var sel = getSelection();
-      if (sel) sel.removeClass("selected").next().addClass("selected");
-      else dropdown.children("li:first-child").addClass("selected");
-    }
-
-    function moveUp() {
-      if (!dropdown.is(":visible")) suggest(true);
-      var sel = getSelection();
-      if (sel) sel.removeClass("selected").prev().addClass("selected");
-      else dropdown.children("li:last-child").addClass("selected");
-    }
-  }
-
-  $.fn.suggest = function(callback, options) {
-    options = $.extend({
-      cache: true,
-      cacheLimit: 10,
-      callback: callback,
-      delay: 250,
-      dropdownClass: "suggest-dropdown",
-      minChars: 1,
-      select: null
-    }, options || {});
-    return this.each(function() {
-      suggest(this, options);
-    });
-  };
-
-})(jQuery);

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/json2.js
----------------------------------------------------------------------
diff --git a/share/www/script/json2.js b/share/www/script/json2.js
deleted file mode 100644
index a1a3b17..0000000
--- a/share/www/script/json2.js
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
-    http://www.JSON.org/json2.js
-    2010-03-20
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects. It can be a
-                        function or an array of strings.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the value
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 ? '0' + n : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array of strings, then it will be
-            used to select the members to be serialized. It filters the results
-            such that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date ?
-                    'Date(' + this[key] + ')' : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-*/
-
-/*jslint evil: true, strict: false */
-
-/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
-    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (!this.JSON) {
-    this.JSON = {};
-}
-
-(function () {
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return n < 10 ? '0' + n : n;
-    }
-
-    if (typeof Date.prototype.toJSON !== 'function') {
-
-        Date.prototype.toJSON = function (key) {
-
-            return isFinite(this.valueOf()) ?
-                   this.getUTCFullYear()   + '-' +
-                 f(this.getUTCMonth() + 1) + '-' +
-                 f(this.getUTCDate())      + 'T' +
-                 f(this.getUTCHours())     + ':' +
-                 f(this.getUTCMinutes())   + ':' +
-                 f(this.getUTCSeconds())   + 'Z' : null;
-        };
-
-        String.prototype.toJSON =
-        Number.prototype.toJSON =
-        Boolean.prototype.toJSON = function (key) {
-            return this.valueOf();
-        };
-    }
-
-    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        gap,
-        indent,
-        meta = {    // table of character substitutions
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '"' : '\\"',
-            '\\': '\\\\'
-        },
-        rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        escapable.lastIndex = 0;
-        return escapable.test(string) ?
-            '"' + string.replace(escapable, function (a) {
-                var c = meta[a];
-                return typeof c === 'string' ? c :
-                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + '"' :
-            '"' + string + '"';
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i,          // The loop counter.
-            k,          // The member key.
-            v,          // The member value.
-            length,
-            mind = gap,
-            partial,
-            value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (value && typeof value === 'object' &&
-                typeof value.toJSON === 'function') {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === 'function') {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case 'string':
-            return quote(value);
-
-        case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return isFinite(value) ? String(value) : 'null';
-
-        case 'boolean':
-        case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-        case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-            if (!value) {
-                return 'null';
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || 'null';
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0 ? '[]' :
-                    gap ? '[\n' + gap +
-                            partial.join(',\n' + gap) + '\n' +
-                                mind + ']' :
-                          '[' + partial.join(',') + ']';
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === 'object') {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    k = rep[i];
-                    if (typeof k === 'string') {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0 ? '{}' :
-                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
-                        mind + '}' : '{' + partial.join(',') + '}';
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== 'function') {
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = '';
-            indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === 'number') {
-                for (i = 0; i < space; i += 1) {
-                    indent += ' ';
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === 'string') {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== 'function' &&
-                    (typeof replacer !== 'object' ||
-                     typeof replacer.length !== 'number')) {
-                throw new Error('JSON.stringify');
-            }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-            return str('', {'': value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== 'function') {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k, v, value = holder[key];
-                if (value && typeof value === 'object') {
-                    for (k in value) {
-                        if (Object.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            cx.lastIndex = 0;
-            if (cx.test(text)) {
-                text = text.replace(cx, function (a) {
-                    return '\\u' +
-                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-            if (/^[\],:{}\s]*$/.
-test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return typeof reviver === 'function' ?
-                    walk({'': j}, '') : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError('JSON.parse');
-        };
-    }
-}());

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/jspec/jspec.css
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.css b/share/www/script/jspec/jspec.css
deleted file mode 100644
index 629d41c..0000000
--- a/share/www/script/jspec/jspec.css
+++ /dev/null
@@ -1,149 +0,0 @@
-body.jspec {
-  margin: 45px 0;
-  font: 12px "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-  background: #efefef url(images/bg.png) top left repeat-x;
-  text-align: center;
-}
-#jspec {
-  margin: 0 auto;
-  padding-top: 30px;
-  width: 1008px;
-  background: url(images/vr.png) top left repeat-y;
-  text-align: left;
-}
-#jspec-top {
-  position: relative;
-  margin: 0 auto;
-  width: 1008px;
-  height: 40px;
-  background: url(images/sprites.bg.png) top left no-repeat;
-}
-#jspec-bottom {
-  margin: 0 auto;
-  width: 1008px;
-  height: 15px;
-  background: url(images/sprites.bg.png) bottom left no-repeat;
-}
-#jspec .loading {
-  margin-top: -45px;
-  width: 1008px;
-  height: 80px;
-  background: url(images/loading.gif) 50% 50% no-repeat;
-}
-#jspec-title {
-  position: absolute;
-  top: 15px;
-  left: 20px;
-  width: 160px;
-  font-size: 22px;
-  font-weight: normal;
-  background: url(images/sprites.png) 0 -126px no-repeat;
-  text-align: center;
-}
-#jspec-title em {
-  font-size: 10px;
-  font-style: normal;
-  color: #BCC8D1;
-}
-#jspec-report * {
-	margin: 0;
-	padding: 0;
-	background: none;
-	border: none;
-}
-#jspec-report {
-  padding: 15px 40px;
-	font: 11px "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-	color: #7B8D9B;
-}
-#jspec-report.has-failures {
-  padding-bottom: 30px;
-}
-#jspec-report .hidden {
-  display: none;
-}
-#jspec-report .heading {
-  margin-bottom: 15px;
-}
-#jspec-report .heading span {
-  padding-right: 10px;
-}
-#jspec-report .heading .passes em {
-  color: #0ea0eb;
-}
-#jspec-report .heading .failures em {
-  color: #FA1616;
-}
-#jspec-report table {
-  font-size: 11px;
-  border-collapse: collapse;
-}
-#jspec-report td {
-  padding: 8px;
-  text-indent: 30px;
-  color: #7B8D9B;
-}
-#jspec-report tr.body {
-  display: none;
-}
-#jspec-report tr.body pre {
-  margin: 0;
-  padding: 0 0 5px 25px;
-}
-#jspec-report tr.even:hover + tr.body, 
-#jspec-report tr.odd:hover + tr.body {
-  display: block;
-}
-#jspec-report tr td:first-child em {
-	display: block;
-	clear: both;
-  font-style: normal;
-  font-weight: normal;
-  color: #7B8D9B;
-}
-#jspec-report tr.even:hover, 
-#jspec-report tr.odd:hover {
-  text-shadow: 1px 1px 1px #fff;
-  background: #F2F5F7;
-}
-#jspec-report td + td {
-  padding-right: 0;
-  width: 15px;
-}
-#jspec-report td.pass {
-  background: url(images/sprites.png) 3px -7px no-repeat;
-}
-#jspec-report td.fail {
-  background: url(images/sprites.png) 3px -158px no-repeat;
-  font-weight: bold;
-  color: #FC0D0D;
-}
-#jspec-report td.requires-implementation {
-  background: url(images/sprites.png) 3px -333px no-repeat;
-}
-#jspec-report tr.description td {
-  margin-top: 25px;
-  padding-top: 25px;
-  font-size: 12px;
-  font-weight: bold;
-  text-indent: 0;
-  color: #1a1a1a;
-}
-#jspec-report tr.description:first-child td {
-  border-top: none;  
-}
-#jspec-report .assertion {
-  display: block;
-  float: left;
-  margin: 0 0 0 1px;
-  padding: 0;
-  width: 1px;
-  height: 5px;
-  background: #7B8D9B;
-}
-#jspec-report .assertion.failed {
-  background: red;
-}
-.jspec-sandbox {
-  display: none;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/jspec/jspec.jquery.js
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.jquery.js b/share/www/script/jspec/jspec.jquery.js
deleted file mode 100644
index fcad7ab..0000000
--- a/share/www/script/jspec/jspec.jquery.js
+++ /dev/null
@@ -1,72 +0,0 @@
-
-// JSpec - jQuery - Copyright TJ Holowaychuk <tj...@vision-media.ca> (MIT Licensed)
-
-JSpec
-.requires('jQuery', 'when using jspec.jquery.js')
-.include({
-  name: 'jQuery',
-  
-  // --- Initialize
-  
-  init : function() {
-    jQuery.ajaxSetup({ async: false })
-  },
-  
-  // --- Utilities
-  
-  utilities : {
-    element:  jQuery,
-    elements: jQuery,
-    sandbox : function() {
-      return jQuery('<div class="sandbox"></div>')
-    }
-  },
-  
-  // --- Matchers
-  
-  matchers : {
-    have_tag      : "jQuery(expected, actual).length === 1",
-    have_one      : "alias have_tag",
-    have_tags     : "jQuery(expected, actual).length > 1",
-    have_many     : "alias have_tags",
-    have_any      : "alias have_tags",
-    have_child    : "jQuery(actual).children(expected).length === 1",
-    have_children : "jQuery(actual).children(expected).length > 1",
-    have_text     : "jQuery(actual).text() === expected",
-    have_value    : "jQuery(actual).val() === expected",
-    be_enabled    : "!jQuery(actual).attr('disabled')",
-    have_class    : "jQuery(actual).hasClass(expected)",
-    
-    be_visible : function(actual) {
-      return jQuery(actual).css('display') != 'none' &&
-             jQuery(actual).css('visibility') != 'hidden' &&
-             jQuery(actual).attr('type') != 'hidden'
-    },
-    
-    be_hidden : function(actual) {
-      return !JSpec.does(actual, 'be_visible')
-    },
-
-    have_classes : function(actual) {
-      return !JSpec.any(JSpec.toArray(arguments, 1), function(arg){
-        return !JSpec.does(actual, 'have_class', arg)
-      })
-    },
-
-    have_attr : function(actual, attr, value) {
-      return value ? jQuery(actual).attr(attr) == value:
-                     jQuery(actual).attr(attr)
-    },
-    
-    'be disabled selected checked' : function(attr) {
-      return 'jQuery(actual).attr("' + attr + '")'
-    },
-    
-    'have type id title alt href src sel rev name target' : function(attr) {
-      return function(actual, value) {
-        return JSpec.does(actual, 'have_attr', attr, value)
-      }
-    }
-  }
-})
-

http://git-wip-us.apache.org/repos/asf/couchdb/blob/b9e6fe7c/share/www/script/jspec/jspec.js
----------------------------------------------------------------------
diff --git a/share/www/script/jspec/jspec.js b/share/www/script/jspec/jspec.js
deleted file mode 100644
index b2ea476..0000000
--- a/share/www/script/jspec/jspec.js
+++ /dev/null
@@ -1,1756 +0,0 @@
-
-// JSpec - Core - Copyright TJ Holowaychuk <tj...@vision-media.ca> (MIT Licensed)
-
-;(function(){
-
-  JSpec = {
-    version   : '3.3.2',
-    assert    : true,
-    cache     : {},
-    suites    : [],
-    modules   : [],
-    allSuites : [],
-    matchers  : {},
-    stubbed   : [],
-    options   : {},
-    request   : 'XMLHttpRequest' in this ? XMLHttpRequest : null,
-    stats     : { specs: 0, assertions: 0, failures: 0, passes: 0, specsFinished: 0, suitesFinished: 0 },
-
-    /**
-     * Default context in which bodies are evaluated.
-     *
-     * Replace context simply by setting JSpec.context
-     * to your own like below:
-     *
-     * JSpec.context = { foo : 'bar' }
-     *
-     * Contexts can be changed within any body, this can be useful
-     * in order to provide specific helper methods to specific suites.
-     *
-     * To reset (usually in after hook) simply set to null like below:
-     *
-     * JSpec.context = null
-     *
-     */
-
-     defaultContext : {
-      
-      /**
-       * Return an object used for proxy assertions. 
-       * This object is used to indicate that an object
-       * should be an instance of _object_, not the constructor
-       * itself.
-       *
-       * @param  {function} constructor
-       * @return {hash}
-       * @api public
-       */
-      
-      an_instance_of : function(constructor) {
-        return { an_instance_of : constructor }
-      },
-      
-      /**
-       * Load fixture at _path_.
-       *
-       * Fixtures are resolved as:
-       *
-       *  - <path>
-       *  - <path>.html
-       *
-       * @param  {string} path
-       * @return {string}
-       * @api public
-       */
-      
-      fixture : function(path) {
-        if (JSpec.cache[path]) return JSpec.cache[path]
-        return JSpec.cache[path] = 
-          JSpec.tryLoading(JSpec.options.fixturePath + '/' + path) ||
-          JSpec.tryLoading(JSpec.options.fixturePath + '/' + path + '.html')
-      }
-    },
-
-    // --- Objects
-    
-    reporters : {
-      
-      /**
-       * Report to server.
-       * 
-       * Options:
-       *  - uri           specific uri to report to.
-       *  - verbose       weither or not to output messages
-       *  - failuresOnly  output failure messages only
-       *
-       * @api public
-       */
-      
-      Server : function(results, options) {
-        var uri = options.uri || window.location.protocol + "//" + window.location.host + '/results'
-        JSpec.post(uri, {
-          stats: JSpec.stats,
-          options: options,
-          results: map(results.allSuites, function(suite) {
-            if (suite.hasSpecs())
-              return {
-                description: suite.description,
-                specs: map(suite.specs, function(spec) {
-                  return {
-                    description: spec.description,
-                    message: !spec.passed() ? spec.failure().message : null,
-                    status: spec.requiresImplementation() ? 'pending' :
-                              spec.passed() ? 'pass' :
-                                'fail',
-                    assertions: map(spec.assertions, function(assertion){
-                      return {
-                        passed: assertion.passed  
-                      }
-                    })
-                  }
-                })
-              }
-          })
-        })
-  			if ('close' in main) main.close()
-      },
-
-      /**
-       * Default reporter, outputting to the DOM.
-       *
-       * Options:
-       *   - reportToId    id of element to output reports to, defaults to 'jspec'
-       *   - failuresOnly  displays only suites with failing specs
-       *
-       * @api public
-       */
-
-      DOM : function(results, options) {
-        var id = option('reportToId') || 'jspec',
-            report = document.getElementById(id),
-            failuresOnly = option('failuresOnly'),
-            classes = results.stats.failures ? 'has-failures' : ''
-        if (!report) throw 'JSpec requires the element #' + id + ' to output its reports'
-        
-        function bodyContents(body) {
-          return JSpec.
-            escape(JSpec.contentsOf(body)).
-            replace(/^ */gm, function(a){ return (new Array(Math.round(a.length / 3))).join(' ') }).
-            replace(/\r\n|\r|\n/gm, '<br/>')
-        }
-        
-        report.innerHTML = '<div id="jspec-report" class="' + classes + '"><div class="heading"> \
-        <span class="passes">Passes: <em>' + results.stats.passes + '</em></span>                \
-        <span class="failures">Failures: <em>' + results.stats.failures + '</em></span>          \
-        <span class="passes">Duration: <em>' + results.duration + '</em> ms</span>          \
-        </div><table class="suites">' + map(results.allSuites, function(suite) {
-          var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
-          if (displaySuite && suite.hasSpecs())
-            return '<tr class="description"><td colspan="2">' + escape(suite.description) + '</td></tr>' +
-              map(suite.specs, function(i, spec) {
-                return '<tr class="' + (i % 2 ? 'odd' : 'even') + '">' +
-                  (spec.requiresImplementation() ?
-                    '<td class="requires-implementation" colspan="2">' + escape(spec.description) + '</td>' :
-                      (spec.passed() && !failuresOnly) ?
-                        '<td class="pass">' + escape(spec.description)+ '</td><td>' + spec.assertionsGraph() + '</td>' :
-                          !spec.passed() ?
-                            '<td class="fail">' + escape(spec.description) + 
-  													map(spec.failures(), function(a){ return '<em>' + escape(a.message) + '</em>' }).join('') +
- 														'</td><td>' + spec.assertionsGraph() + '</td>' :
-                              '') +
-                  '<tr class="body"><td colspan="2"><pre>' + bodyContents(spec.body) + '</pre></td></tr>'
-              }).join('') + '</tr>'
-        }).join('') + '</table></div>'
-      },
-      
-      /**
-       * Terminal reporter.
-       *
-       * @api public
-       */
-       
-       Terminal : function(results, options) {
-         var failuresOnly = option('failuresOnly')
-         print(color("\n Passes: ", 'bold') + color(results.stats.passes, 'green') + 
-               color(" Failures: ", 'bold') + color(results.stats.failures, 'red') +
-               color(" Duration: ", 'bold') + color(results.duration, 'green') + " ms \n")
-              
-         function indent(string) {
-           return string.replace(/^(.)/gm, '  $1')
-         }
-         
-         each(results.allSuites, function(suite) {
-           var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
-            if (displaySuite && suite.hasSpecs()) {
-              print(color(' ' + suite.description, 'bold'))
-              each(suite.specs, function(spec){
-                var assertionsGraph = inject(spec.assertions, '', function(graph, assertion){
-                  return graph + color('.', assertion.passed ? 'green' : 'red')
-                })
-                if (spec.requiresImplementation())
-                  print(color('  ' + spec.description, 'blue') + assertionsGraph)
-                else if (spec.passed() && !failuresOnly)
-                  print(color('  ' + spec.description, 'green') + assertionsGraph)
-                else if (!spec.passed())
-                  print(color('  ' + spec.description, 'red') + assertionsGraph + 
-                        "\n" + indent(map(spec.failures(), function(a){ return a.message }).join("\n")) + "\n")
-              })
-              print("")
-            }
-         })
-         
-         quit(results.stats.failures)
-       }
-    },
-    
-    Assertion : function(matcher, actual, expected, negate) {
-      extend(this, {
-        message: '',
-        passed: false,
-        actual: actual,
-        negate: negate,
-        matcher: matcher,
-        expected: expected,
-        
-        // Report assertion results
-        
-        report : function() {
-          if (JSpec.assert) 
-            this.passed ? JSpec.stats.passes++ : JSpec.stats.failures++
-          return this
-        },
-        
-        // Run the assertion
-        
-        run : function() {
-          // TODO: remove unshifting 
-          expected.unshift(actual)
-          this.result = matcher.match.apply(this, expected)
-          this.passed = negate ? !this.result : this.result
-          if (!this.passed) this.message = matcher.message.call(this, actual, expected, negate, matcher.name)
-          return this
-        }
-      })
-    },
-    
-    ProxyAssertion : function(object, method, times, negate) {
-      var self = this
-      var old = object[method]
-      
-      // Proxy
-      
-      object[method] = function(){
-        args = toArray(arguments)
-        result = old.apply(object, args)
-        self.calls.push({ args : args, result : result })
-        return result
-      }
-      
-      // Times
-      
-      this.times = {
-        once  : 1,
-        twice : 2
-      }[times] || times || 1
-      
-      extend(this, {
-        calls: [],
-        message: '',
-        defer: true,
-        passed: false,
-        negate: negate,
-        object: object,
-        method: method,
-        
-        // Proxy return value
-        
-        and_return : function(result) {
-          this.expectedResult = result
-          return this
-        },
-        
-        // Proxy arguments passed
-        
-        with_args : function() {
-          this.expectedArgs = toArray(arguments)
-          return this
-        },
-        
-        // Check if any calls have failing results
-        
-        anyResultsFail : function() {
-          return any(this.calls, function(call){
-            return self.expectedResult.an_instance_of ?
-                     call.result.constructor != self.expectedResult.an_instance_of:
-                       !equal(self.expectedResult, call.result)
-          })
-        },
-        
-        // Check if any calls have passing results
-        
-        anyResultsPass : function() {
-          return any(this.calls, function(call){
-            return self.expectedResult.an_instance_of ?
-                     call.result.constructor == self.expectedResult.an_instance_of:
-                       equal(self.expectedResult, call.result)
-          })
-        },
-        
-        // Return the passing result
-        
-        passingResult : function() {
-          return this.anyResultsPass().result
-        },
-
-        // Return the failing result
-        
-        failingResult : function() {
-          return this.anyResultsFail().result
-        },
-        
-        // Check if any arguments fail
-        
-        anyArgsFail : function() {
-          return any(this.calls, function(call){
-            return any(self.expectedArgs, function(i, arg){
-              if (arg == null) return call.args[i] == null
-              return arg.an_instance_of ?
-                       call.args[i].constructor != arg.an_instance_of:
-                         !equal(arg, call.args[i])
-                       
-            })
-          })
-        },
-        
-        // Check if any arguments pass
-        
-        anyArgsPass : function() {
-          return any(this.calls, function(call){
-            return any(self.expectedArgs, function(i, arg){
-              return arg.an_instance_of ?
-                       call.args[i].constructor == arg.an_instance_of:
-                         equal(arg, call.args[i])
-                       
-            })
-          })
-        },
-        
-        // Return the passing args
-        
-        passingArgs : function() {
-          return this.anyArgsPass().args
-        },
-                
-        // Return the failing args
-        
-        failingArgs : function() {
-          return this.anyArgsFail().args
-        },
-        
-        // Report assertion results
-        
-        report : function() {
-          if (JSpec.assert) 
-            this.passed ? ++JSpec.stats.passes : ++JSpec.stats.failures
-          return this
-        },
-        
-        // Run the assertion
-                
-        run : function() {
-          var methodString = 'expected ' + object.toString() + '.' + method + '()' + (negate ? ' not' : '' )
-          
-          function times(n) {
-            return n > 2 ?  n + ' times' : { 1: 'once', 2: 'twice' }[n]
-          }
-          
-          if (this.expectedResult != null && (negate ? this.anyResultsPass() : this.anyResultsFail()))
-            this.message = methodString + ' to return ' + puts(this.expectedResult) + 
-              ' but ' + (negate ? 'it did' : 'got ' + puts(this.failingResult())) 
-
-          if (this.expectedArgs && (negate ? !this.expectedResult && this.anyArgsPass() : this.anyArgsFail()))
-            this.message = methodString + ' to be called with ' + puts.apply(this, this.expectedArgs) +
-             ' but was' + (negate ? '' : ' called with ' + puts.apply(this, this.failingArgs()))
-
-          if (negate ? !this.expectedResult && !this.expectedArgs && this.calls.length >= this.times : this.calls.length != this.times)
-            this.message = methodString + ' to be called ' + times(this.times) + 
-            ', but ' +  (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
-                
-          if (!this.message.length) 
-            this.passed = true
-          
-          return this
-        }
-      })
-    },
-      
-    /**
-     * Specification Suite block object.
-     *
-     * @param {string} description
-     * @param {function} body
-     * @api private
-     */
-
-    Suite : function(description, body) {
-      var self = this
-      extend(this, {
-        body: body,
-        description: description,
-        suites: [],
-        specs: [],
-        ran: false,
-        hooks: { 'before' : [], 'after' : [], 'before_each' : [], 'after_each' : [] },
-        
-        // Add a spec to the suite
-
-        addSpec : function(description, body) {
-          var spec = new JSpec.Spec(description, body)
-          this.specs.push(spec)
-          JSpec.stats.specs++ // TODO: abstract
-          spec.suite = this
-        },
-
-        // Add a hook to the suite
-
-        addHook : function(hook, body) {
-          this.hooks[hook].push(body)
-        },
-
-        // Add a nested suite
-
-        addSuite : function(description, body) {
-          var suite = new JSpec.Suite(description, body)
-          JSpec.allSuites.push(suite)
-          suite.name = suite.description
-          suite.description = this.description + ' ' + suite.description
-          this.suites.push(suite)
-          suite.suite = this
-        },
-
-        // Invoke a hook in context to this suite
-
-        hook : function(hook) {
-          if (this.suite) this.suite.hook(hook)
-          each(this.hooks[hook], function(body) {
-            JSpec.evalBody(body, "Error in hook '" + hook + "', suite '" + self.description + "': ")
-          })
-        },
-
-        // Check if nested suites are present
-
-        hasSuites : function() {
-          return this.suites.length  
-        },
-
-        // Check if this suite has specs
-
-        hasSpecs : function() {
-          return this.specs.length
-        },
-
-        // Check if the entire suite passed
-
-        passed : function() {
-          return !any(this.specs, function(spec){
-            return !spec.passed() 
-          })
-        }
-      })
-    },
-    
-    /**
-     * Specification block object.
-     *
-     * @param {string} description
-     * @param {function} body
-     * @api private
-     */
-
-    Spec : function(description, body) {
-      extend(this, {
-        body: body,
-        description: description,
-        assertions: [],
-        
-        // Add passing assertion
-        
-        pass : function(message) {
-          this.assertions.push({ passed: true, message: message })
-          if (JSpec.assert) ++JSpec.stats.passes
-        },
-        
-        // Add failing assertion
-        
-        fail : function(message) {
-          this.assertions.push({ passed: false, message: message })
-          if (JSpec.assert) ++JSpec.stats.failures
-        },
-                
-        // Run deferred assertions
-        
-        runDeferredAssertions : function() {
-          each(this.assertions, function(assertion){
-            if (assertion.defer) assertion.run().report(), hook('afterAssertion', assertion)
-          })
-        },
-        
-        // Find first failing assertion
-
-        failure : function() {
-          return find(this.assertions, function(assertion){
-            return !assertion.passed
-          })
-        },
-
-        // Find all failing assertions
-
-        failures : function() {
-          return select(this.assertions, function(assertion){
-            return !assertion.passed
-          })
-        },
-
-        // Weither or not the spec passed
-
-        passed : function() {
-          return !this.failure()
-        },
-
-        // Weither or not the spec requires implementation (no assertions)
-
-        requiresImplementation : function() {
-          return this.assertions.length == 0
-        },
-
-        // Sprite based assertions graph
-
-        assertionsGraph : function() {
-          return map(this.assertions, function(assertion){
-            return '<span class="assertion ' + (assertion.passed ? 'passed' : 'failed') + '"></span>'
-          }).join('')
-        }
-      })
-    },
-    
-    Module : function(methods) {
-      extend(this, methods)
-    },
-    
-    JSON : {
-      
-      /**
-       * Generic sequences.
-       */
-      
-      meta : {
-        '\b' : '\\b',
-        '\t' : '\\t',
-        '\n' : '\\n',
-        '\f' : '\\f',
-        '\r' : '\\r',
-        '"'  : '\\"',
-        '\\' : '\\\\'
-      },
-      
-      /**
-       * Escapable sequences.
-       */
-      
-      escapable : /[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-      
-      /**
-       * JSON encode _object_.
-       *
-       * @param  {mixed} object
-       * @return {string}
-       * @api private
-       */
-       
-      encode : function(object) {
-        var self = this
-        if (object == undefined || object == null) return 'null'
-        if (object === true) return 'true'
-        if (object === false) return 'false'
-        switch (typeof object) {
-          case 'number': return object
-          case 'string': return this.escapable.test(object) ?
-            '"' + object.replace(this.escapable, function (a) {
-              return typeof self.meta[a] === 'string' ? self.meta[a] :
-                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4)
-            }) + '"' :
-            '"' + object + '"'
-          case 'object':  
-            if (object.constructor == Array)
-              return '[' + map(object, function(val){
-                return self.encode(val)
-              }).join(', ') + ']'
-            else if (object)
-              return '{' + map(object, function(key, val){
-                return self.encode(key) + ':' + self.encode(val)
-              }).join(', ') + '}'
-        }
-        return 'null'
-      }
-    },
-    
-    // --- DSLs
-    
-    DSLs : {
-      snake : {
-        expect : function(actual){
-          return JSpec.expect(actual)
-        },
-
-        describe : function(description, body) {
-          return JSpec.currentSuite.addSuite(description, body)
-        },
-
-        it : function(description, body) {
-          return JSpec.currentSuite.addSpec(description, body)
-        },
-
-        before : function(body) {
-          return JSpec.currentSuite.addHook('before', body)
-        },
-
-        after : function(body) {
-          return JSpec.currentSuite.addHook('after', body)
-        },
-
-        before_each : function(body) {
-          return JSpec.currentSuite.addHook('before_each', body)
-        },
-
-        after_each : function(body) {
-          return JSpec.currentSuite.addHook('after_each', body)
-        },
-        
-        should_behave_like : function(description) {
-          return JSpec.shareBehaviorsOf(description)
-        }
-      }
-    },
-
-    // --- Methods
-    
-    /**
-     * Check if _value_ is 'stop'. For use as a
-     * utility callback function.
-     *
-     * @param  {mixed} value
-     * @return {bool}
-     * @api public
-     */
-    
-    haveStopped : function(value) {
-      return value === 'stop'
-    },
-    
-    /**
-     * Include _object_ which may be a hash or Module instance.
-     *
-     * @param  {hash, Module} object
-     * @return {JSpec}
-     * @api public
-     */
-    
-    include : function(object) {
-      var module = object.constructor == JSpec.Module ? object : new JSpec.Module(object)
-      this.modules.push(module)
-      if ('init' in module) module.init()
-      if ('utilities' in module) extend(this.defaultContext, module.utilities)
-      if ('matchers' in module) this.addMatchers(module.matchers)
-      if ('reporters' in module) extend(this.reporters, module.reporters)
-      if ('DSLs' in module)
-        each(module.DSLs, function(name, methods){
-          JSpec.DSLs[name] = JSpec.DSLs[name] || {}
-          extend(JSpec.DSLs[name], methods)
-        })
-      return this
-    },
-    
-    /**
-     * Add a module hook _name_, which is immediately
-     * called per module with the _args_ given. An array of
-     * hook return values is returned.
-     *
-     * @param  {name} string
-     * @param  {...} args
-     * @return {array}
-     * @api private
-     */
-    
-    hook : function(name, args) {
-      args = toArray(arguments, 1)
-      return inject(JSpec.modules, [], function(results, module){
-        if (typeof module[name] == 'function')
-          results.push(JSpec.evalHook(module, name, args))
-      })
-    },
-    
-    /**
-     * Eval _module_ hook _name_ with _args_. Evaluates in context
-     * to the module itself, JSpec, and JSpec.context.
-     *
-     * @param  {Module} module
-     * @param  {string} name
-     * @param  {array} args
-     * @return {mixed}
-     * @api private
-     */
-    
-    evalHook : function(module, name, args) {
-      hook('evaluatingHookBody', module, name)
-      try { return module[name].apply(module, args) }
-      catch(e) { error('Error in hook ' + module.name + '.' + name + ': ', e) }
-    },
-    
-    /**
-     * Same as hook() however accepts only one _arg_ which is
-     * considered immutable. This function passes the arg
-     * to the first module, then passes the return value of the last
-     * module called, to the following module. 
-     *
-     * @param  {string} name
-     * @param  {mixed} arg
-     * @return {mixed}
-     * @api private
-     */
-    
-    hookImmutable : function(name, arg) {
-      return inject(JSpec.modules, arg, function(result, module){
-        if (typeof module[name] == 'function')
-          return JSpec.evalHook(module, name, [result])
-      })
-    },
-    
-    /**
-     * Find a suite by its description or name.
-     *
-     * @param  {string} description
-     * @return {Suite}
-     * @api private
-     */
-    
-    findSuite : function(description) {
-      return find(this.allSuites, function(suite){
-        return suite.name == description || suite.description == description
-      })
-    },
-    
-    /**
-     * Share behaviors (specs) of the given suite with
-     * the current suite.
-     *
-     * @param  {string} description
-     * @api public
-     */
-    
-    shareBehaviorsOf : function(description) {
-      if (suite = this.findSuite(description)) this.copySpecs(suite, this.currentSuite)
-      else throw 'failed to share behaviors. ' + puts(description) + ' is not a valid Suite name'
-    },
-    
-    /**
-     * Copy specs from one suite to another. 
-     *
-     * @param  {Suite} fromSuite
-     * @param  {Suite} toSuite
-     * @api public
-     */
-    
-    copySpecs : function(fromSuite, toSuite) {
-      each(fromSuite.specs, function(spec){
-        var newSpec = new Object();
-        extend(newSpec, spec);
-        newSpec.assertions = [];
-        toSuite.specs.push(newSpec);
-      })
-    },
-    
-    /**
-     * Convert arguments to an array.
-     *
-     * @param  {object} arguments
-     * @param  {int} offset
-     * @return {array}
-     * @api public
-     */
-    
-    toArray : function(arguments, offset) {
-      return Array.prototype.slice.call(arguments, offset || 0)
-    },
-    
-    /**
-     * Return ANSI-escaped colored string.
-     *
-     * @param  {string} string
-     * @param  {string} color
-     * @return {string}
-     * @api public
-     */
-    
-    color : function(string, color) {
-      return "\u001B[" + {
-       bold    : 1,
-       black   : 30,
-       red     : 31,
-       green   : 32,
-       yellow  : 33,
-       blue    : 34,
-       magenta : 35,
-       cyan    : 36,
-       white   : 37
-      }[color] + 'm' + string + "\u001B[0m"
-    },
-    
-    /**
-     * Default matcher message callback.
-     *
-     * @api private
-     */
-    
-    defaultMatcherMessage : function(actual, expected, negate, name) {
-      return 'expected ' + puts(actual) + ' to ' + 
-               (negate ? 'not ' : '') + 
-                  name.replace(/_/g, ' ') +
-                    ' ' + (expected.length > 1 ?
-                      puts.apply(this, expected.slice(1)) :
-                        '')
-    },
-    
-    /**
-     * Normalize a matcher message.
-     *
-     * When no messge callback is present the defaultMatcherMessage
-     * will be assigned, will suffice for most matchers.
-     *
-     * @param  {hash} matcher
-     * @return {hash}
-     * @api public
-     */
-    
-    normalizeMatcherMessage : function(matcher) {
-      if (typeof matcher.message != 'function') 
-        matcher.message = this.defaultMatcherMessage
-      return matcher
-    },
-    
-    /**
-     * Normalize a matcher body
-     * 
-     * This process allows the following conversions until
-     * the matcher is in its final normalized hash state.
-     *
-     * - '==' becomes 'actual == expected'
-     * - 'actual == expected' becomes 'return actual == expected'
-     * - function(actual, expected) { return actual == expected } becomes 
-     *   { match : function(actual, expected) { return actual == expected }}
-     *
-     * @param  {mixed} body
-     * @return {hash}
-     * @api public
-     */
-    
-    normalizeMatcherBody : function(body) {
-      switch (body.constructor) {
-        case String:
-          if (captures = body.match(/^alias (\w+)/)) return JSpec.matchers[last(captures)]
-          if (body.length < 4) body = 'actual ' + body + ' expected'
-          return { match: function(actual, expected) { return eval(body) }}  
-          
-        case Function:
-          return { match: body }
-          
-        default:
-          return body
-      }
-    },
-    
-    /**
-     * Get option value. This method first checks if
-     * the option key has been set via the query string,
-     * otherwise returning the options hash value.
-     *
-     * @param  {string} key
-     * @return {mixed}
-     * @api public
-     */
-     
-     option : function(key) {
-       return (value = query(key)) !== null ? value :
-                JSpec.options[key] || null
-     },
-     
-     /**
-      * Check if object _a_, is equal to object _b_.
-      *
-      * @param  {object} a
-      * @param  {object} b
-      * @return {bool}
-      * @api private
-      */
-     
-     equal: function(a, b) {
-       if (typeof a != typeof b) return
-       if (a === b) return true
-       if (a instanceof RegExp)
-         return a.toString() === b.toString()
-       if (a instanceof Date)
-         return Number(a) === Number(b)
-       if (typeof a != 'object') return
-       if (a.length !== undefined)
-         if (a.length !== b.length) return
-         else
-           for (var i = 0, len = a.length; i < len; ++i)
-             if (!equal(a[i], b[i]))
-               return
-       for (var key in a)
-         if (!equal(a[key], b[key]))
-           return
-       return true
-     },
-
-    /**
-     * Return last element of an array.
-     *
-     * @param  {array} array
-     * @return {object}
-     * @api public
-     */
-
-    last : function(array) {
-      return array[array.length - 1]
-    },
-
-    /**
-     * Convert object(s) to a print-friend string.
-     *
-     * @param  {...} object
-     * @return {string}
-     * @api public
-     */
-
-    puts : function(object) {
-      if (arguments.length > 1)
-        return map(toArray(arguments), function(arg){
-          return puts(arg)
-        }).join(', ')
-      if (object === undefined) return 'undefined'
-      if (object === null) return 'null'
-      if (object === true) return 'true'
-      if (object === false) return 'false'
-      if (object.an_instance_of) return 'an instance of ' + object.an_instance_of.name
-      if (object.jquery && object.selector.length > 0) return 'selector ' + puts(object.selector)
-      if (object.jquery) return object.get(0).outerHTML
-      if (object.nodeName) return object.outerHTML
-      switch (object.constructor) {
-        case Function: return object.name || object 
-        case String: 
-          return '"' + object
-            .replace(/"/g,  '\\"')
-            .replace(/\n/g, '\\n')
-            .replace(/\t/g, '\\t')
-            + '"'
-        case Array: 
-          return inject(object, '[', function(b, v){
-            return b + ', ' + puts(v)
-          }).replace('[,', '[') + ' ]'
-        case Object:
-          object.__hit__ = true
-          return inject(object, '{', function(b, k, v) {
-            if (k == '__hit__') return b
-            return b + ', ' + k + ': ' + (v && v.__hit__ ? '<circular reference>' : puts(v))
-          }).replace('{,', '{') + ' }'
-        default: 
-          return object.toString()
-      }
-    },
-
-    /**
-     * Escape HTML.
-     *
-     * @param  {string} html
-     * @return {string}
-     * @api public
-     */
-
-     escape : function(html) {
-       return html.toString()
-         .replace(/&/gmi, '&amp;')
-         .replace(/"/gmi, '&quot;')
-         .replace(/>/gmi, '&gt;')
-         .replace(/</gmi, '&lt;')
-     },
-     
-     /**
-      * Perform an assertion without reporting.
-      *
-      * This method is primarily used for internal
-      * matchers in order retain DRYness. May be invoked 
-      * like below:
-      *
-      *   does('foo', 'eql', 'foo')
-      *   does([1,2], 'include', 1, 2)
-      *
-      * External hooks are not run for internal assertions
-      * performed by does().
-      *
-      * @param  {mixed} actual
-      * @param  {string} matcher
-      * @param  {...} expected
-      * @return {mixed}
-      * @api private
-      */
-     
-     does : function(actual, matcher, expected) {
-       var assertion = new JSpec.Assertion(JSpec.matchers[matcher], actual, toArray(arguments, 2))
-       return assertion.run().result
-     },
-
-    /**
-     * Perform an assertion.
-     *
-     *   expect(true).to('be', true)
-     *   expect('foo').not_to('include', 'bar')
-     *   expect([1, [2]]).to('include', 1, [2])
-     *
-     * @param  {mixed} actual
-     * @return {hash}
-     * @api public
-     */
-
-    expect : function(actual) {
-      function assert(matcher, args, negate) {
-        var expected = toArray(args, 1)
-        matcher.negate = negate  
-        assertion = new JSpec.Assertion(matcher, actual, expected, negate)
-        hook('beforeAssertion', assertion)
-        if (matcher.defer) assertion.run()
-        else JSpec.currentSpec.assertions.push(assertion.run().report()), hook('afterAssertion', assertion)
-        return assertion.result
-      }
-      
-      function to(matcher) {
-        return assert(matcher, arguments, false)
-      }
-      
-      function not_to(matcher) {
-        return assert(matcher, arguments, true)
-      }
-      
-      return {
-        to : to,
-        should : to,
-        not_to: not_to,
-        should_not : not_to
-      }
-    },
-
-    /**
-     * Strim whitespace or chars.
-     *
-     * @param  {string} string
-     * @param  {string} chars
-     * @return {string}
-     * @api public
-     */
-
-     strip : function(string, chars) {
-       return string.
-         replace(new RegExp('['  + (chars || '\\s') + ']*$'), '').
-         replace(new RegExp('^[' + (chars || '\\s') + ']*'),  '')
-     },
-     
-     /**
-      * Call an iterator callback with arguments a, or b
-      * depending on the arity of the callback.
-      *
-      * @param  {function} callback
-      * @param  {mixed} a
-      * @param  {mixed} b
-      * @return {mixed}
-      * @api private
-      */
-     
-     callIterator : function(callback, a, b) {
-       return callback.length == 1 ? callback(b) : callback(a, b)
-     },
-     
-     /**
-      * Extend an object with another.
-      *
-      * @param  {object} object
-      * @param  {object} other
-      * @api public
-      */
-     
-     extend : function(object, other) {
-       each(other, function(property, value){
-         object[property] = value
-       })
-     },
-     
-     /**
-      * Iterate an object, invoking the given callback.
-      *
-      * @param  {hash, array} object
-      * @param  {function} callback
-      * @return {JSpec}
-      * @api public
-      */
-
-     each : function(object, callback) {
-       if (object.constructor == Array)
-         for (var i = 0, len = object.length; i < len; ++i)
-           callIterator(callback, i, object[i])
-       else
-         for (var key in object) 
-           if (object.hasOwnProperty(key))
-             callIterator(callback, key, object[key])
-     },
-
-     /**
-      * Iterate with memo.
-      *
-      * @param  {hash, array} object
-      * @param  {object} memo
-      * @param  {function} callback
-      * @return {object}
-      * @api public
-      */
-
-     inject : function(object, memo, callback) {
-       each(object, function(key, value){
-         memo = (callback.length == 2 ?
-                   callback(memo, value):
-                     callback(memo, key, value)) ||
-                       memo
-       })
-       return memo
-     },
-     
-     /**
-      * Destub _object_'s _method_. When no _method_ is passed
-      * all stubbed methods are destubbed. When no arguments
-      * are passed every object found in JSpec.stubbed will be
-      * destubbed.
-      *
-      * @param  {mixed} object
-      * @param  {string} method
-      * @api public
-      */
-     
-     destub : function(object, method) {
-       if (method) {
-         if (object['__prototype__' + method])
-           delete object[method]
-         else
-           object[method] = object['__original__' + method]
-         delete object['__prototype__' + method]
-         delete object['__original____' + method]
-       }
-       else if (object) {
-         for (var key in object)
-           if (captures = key.match(/^(?:__prototype__|__original__)(.*)/))
-             destub(object, captures[1])
-       }
-       else
-         while (JSpec.stubbed.length)
-            destub(JSpec.stubbed.shift())
-     },
-     
-     /**
-      * Stub _object_'s _method_. 
-      *
-      * stub(foo, 'toString').and_return('bar')
-      *
-      * @param  {mixed} object
-      * @param  {string} method
-      * @return {hash}
-      * @api public
-      */
-     
-     stub : function(object, method) {
-       hook('stubbing', object, method)
-       JSpec.stubbed.push(object)
-       var type = object.hasOwnProperty(method) ? '__original__' : '__prototype__'
-       object[type + method] = object[method]
-       object[method] = function(){}
-       return {
-         and_return : function(value) {
-           if (typeof value == 'function') object[method] = value
-           else object[method] = function(){ return value }
-         }
-      }
-     },
-     
-    /**
-     * Map callback return values.
-     *
-     * @param  {hash, array} object
-     * @param  {function} callback
-     * @return {array}
-     * @api public
-     */
-
-    map : function(object, callback) {
-      return inject(object, [], function(memo, key, value){
-        memo.push(callIterator(callback, key, value))
-      })
-    },
-    
-    /**
-     * Returns the first matching expression or null.
-     *
-     * @param  {hash, array} object
-     * @param  {function} callback
-     * @return {mixed}
-     * @api public
-     */
-         
-    any : function(object, callback) {
-      return inject(object, null, function(state, key, value){
-        if (state == undefined)
-          return callIterator(callback, key, value) ? value : state
-      })
-    },
-    
-    /**
-     * Returns an array of values collected when the callback
-     * given evaluates to true.
-     *
-     * @param  {hash, array} object
-     * @return {function} callback
-     * @return {array}
-     * @api public
-     */
-    
-    select : function(object, callback) {
-      return inject(object, [], function(selected, key, value){
-        if (callIterator(callback, key, value))
-          selected.push(value)
-      })
-    },
-
-    /**
-     * Define matchers.
-     *
-     * @param  {hash} matchers
-     * @api public
-     */
-
-    addMatchers : function(matchers) {
-      each(matchers, function(name, body){
-        JSpec.addMatcher(name, body)  
-      })
-    },
-    
-    /**
-     * Define a matcher.
-     *
-     * @param  {string} name
-     * @param  {hash, function, string} body
-     * @api public
-     */
-    
-    addMatcher : function(name, body) {
-      hook('addingMatcher', name, body)
-      if (name.indexOf(' ') != -1) {
-        var matchers = name.split(/\s+/)
-        var prefix = matchers.shift()
-        each(matchers, function(name) {
-          JSpec.addMatcher(prefix + '_' + name, body(name))
-        })
-      }
-      this.matchers[name] = this.normalizeMatcherMessage(this.normalizeMatcherBody(body))
-      this.matchers[name].name = name
-    },
-    
-    /**
-     * Add a root suite to JSpec.
-     *
-     * @param  {string} description
-     * @param  {body} function
-     * @api public
-     */
-    
-    describe : function(description, body) {
-      var suite = new JSpec.Suite(description, body)
-      hook('addingSuite', suite)
-      this.allSuites.push(suite)
-      this.suites.push(suite)
-    },
-    
-    /**
-     * Return the contents of a function body.
-     *
-     * @param  {function} body
-     * @return {string}
-     * @api public
-     */
-    
-    contentsOf : function(body) {
-      return body.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1]
-    },
-
-    /**
-     * Evaluate a JSpec capture body.
-     *
-     * @param  {function} body
-     * @param  {string} errorMessage (optional)
-     * @return {Type}
-     * @api private
-     */
-
-    evalBody : function(body, errorMessage) {
-      var dsl = this.DSL || this.DSLs.snake
-      var matchers = this.matchers
-      var context = this.context || this.defaultContext
-      var contents = this.contentsOf(body)
-      hook('evaluatingBody', dsl, matchers, context, contents)
-      try { with (dsl){ with (context) { with (matchers) { eval(contents) }}} }
-      catch(e) { error(errorMessage, e) }
-    },
-
-    /**
-     * Pre-process a string of JSpec.
-     *
-     * @param  {string} input
-     * @return {string}
-     * @api private
-     */
-
-    preprocess : function(input) {
-      if (typeof input != 'string') return
-      input = hookImmutable('preprocessing', input)
-      return input.
-        replace(/\t/g, '  ').
-        replace(/\r\n|\n|\r/g, '\n').
-        split('__END__')[0].
-        replace(/([\w\.]+)\.(stub|destub)\((.*?)\)$/gm, '$2($1, $3)').
-        replace(/describe\s+(.*?)$/gm, 'describe($1, function(){').
-        replace(/^\s+it\s+(.*?)$/gm, ' it($1, function(){').
-        replace(/^ *(before_each|after_each|before|after)(?= |\n|$)/gm, 'JSpec.currentSuite.addHook("$1", function(){').
-        replace(/^\s*end(?=\s|$)/gm, '});').
-        replace(/-\{/g, 'function(){').
-        replace(/(\d+)\.\.(\d+)/g, function(_, a, b){ return range(a, b) }).
-        replace(/\.should([_\.]not)?[_\.](\w+)(?: |;|$)(.*)$/gm, '.should$1_$2($3)').
-        replace(/([\/\s]*)(.+?)\.(should(?:[_\.]not)?)[_\.](\w+)\((.*)\)\s*;?$/gm, '$1 expect($2).$3($4, $5)').
-        replace(/, \)/g, ')').
-        replace(/should\.not/g, 'should_not')
-    },
-
-    /**
-     * Create a range string which can be evaluated to a native array.
-     *
-     * @param  {int} start
-     * @param  {int} end
-     * @return {string}
-     * @api public
-     */
-
-    range : function(start, end) {
-      var current = parseInt(start), end = parseInt(end), values = [current]
-      if (end > current) while (++current <= end) values.push(current)
-      else               while (--current >= end) values.push(current)
-      return '[' + values + ']'
-    },
-
-    /**
-     * Report on the results. 
-     *
-     * @api public
-     */
-
-    report : function() {
-      this.duration = Number(new Date) - this.start
-      hook('reporting', JSpec.options)
-      new (JSpec.options.reporter || JSpec.reporters.DOM)(JSpec, JSpec.options)
-    },
-
-    /**
-     * Run the spec suites. Options are merged
-     * with JSpec options when present.
-     *
-     * @param  {hash} options
-     * @return {JSpec}
-     * @api public
-     */
-
-    run : function(options) {
-      if (any(hook('running'), haveStopped)) return this
-      if (options) extend(this.options, options)
-      this.start = Number(new Date)
-      each(this.suites, function(suite) { JSpec.runSuite(suite) })
-      return this
-    },
-    
-    /**
-     * Run a suite.
-     *
-     * @param  {Suite} suite
-     * @api public
-     */
-
-    runSuite : function(suite) {
-      this.currentSuite = suite
-      this.evalBody(suite.body)
-      suite.ran = true
-      hook('beforeSuite', suite), suite.hook('before')
-      each(suite.specs, function(spec) {
-        hook('beforeSpec', spec)
-        suite.hook('before_each')
-        JSpec.runSpec(spec)
-        hook('afterSpec', spec)
-        suite.hook('after_each')
-      })
-      if (suite.hasSuites()) {
-        each(suite.suites, function(suite) {
-          JSpec.runSuite(suite)
-        })
-      }
-      hook('afterSuite', suite), suite.hook('after')
-      this.stats.suitesFinished++
-    },
-         
-    /**
-     * Report a failure for the current spec.
-     *
-     * @param  {string} message
-     * @api public
-     */
-     
-     fail : function(message) {
-       JSpec.currentSpec.fail(message)
-     },
-     
-     /**
-      * Report a passing assertion for the current spec.
-      *
-      * @param  {string} message
-      * @api public
-      */
-      
-     pass : function(message) {
-       JSpec.currentSpec.pass(message)
-     },
-
-    /**
-     * Run a spec.
-     *
-     * @param  {Spec} spec
-     * @api public
-     */
-
-    runSpec : function(spec) {
-      this.currentSpec = spec
-      try { this.evalBody(spec.body) }
-      catch (e) { fail(e) }
-      spec.runDeferredAssertions()
-      destub()
-      this.stats.specsFinished++
-      this.stats.assertions += spec.assertions.length
-    },
-
-    /**
-     * Require a dependency, with optional message.
-     *
-     * @param  {string} dependency
-     * @param  {string} message (optional)
-     * @return {JSpec}
-     * @api public
-     */
-
-    requires : function(dependency, message) {
-      hook('requiring', dependency, message)
-      try { eval(dependency) }
-      catch (e) { throw 'JSpec depends on ' + dependency + ' ' + message }
-      return this
-    },
-
-    /**
-     * Query against the current query strings keys
-     * or the queryString specified.
-     *
-     * @param  {string} key
-     * @param  {string} queryString
-     * @return {string, null}
-     * @api private
-     */
-
-    query : function(key, queryString) {
-      var queryString = (queryString || (main.location ? main.location.search : null) || '').substring(1)
-      return inject(queryString.split('&'), null, function(value, pair){
-        parts = pair.split('=')
-        return parts[0] == key ? parts[1].replace(/%20|\+/gmi, ' ') : value
-      })
-    },
-
-    /**
-     * Throw a JSpec related error.
-     *
-     * @param {string} message
-     * @param {Exception} e
-     * @api public
-     */
-
-    error : function(message, e) {
-      throw (message ? message : '') + e.toString() + 
-              (e.line ? ' near line ' + e.line : '')
-    },
-    
-    /**
-     * Ad-hoc POST request for JSpec server usage.
-     *
-     * @param  {string} uri
-     * @param  {string} data
-     * @api private
-     */
-    
-    post : function(uri, data) {
-      if (any(hook('posting', uri, data), haveStopped)) return
-      var request = this.xhr()
-      request.open('POST', uri, false)
-      request.setRequestHeader('Content-Type', 'application/json')
-      request.send(JSpec.JSON.encode(data))
-    },
-
-    /**
-     * Instantiate an XMLHttpRequest.
-     *
-     * Here we utilize IE's lame ActiveXObjects first which
-     * allow IE access serve files via the file: protocol, otherwise
-     * we then default to XMLHttpRequest.
-     *
-     * @return {XMLHttpRequest, ActiveXObject}
-     * @api private
-     */
-    
-    xhr : function() {
-      return this.ieXhr() || new JSpec.request
-    },
-    
-    /**
-     * Return Microsoft piece of crap ActiveXObject.
-     *
-     * @return {ActiveXObject}
-     * @api public
-     */
-    
-    ieXhr : function() {
-      function object(str) {
-        try { return new ActiveXObject(str) } catch(e) {}
-      }
-      return object('Msxml2.XMLHTTP.6.0') ||
-        object('Msxml2.XMLHTTP.3.0') ||
-        object('Msxml2.XMLHTTP') ||
-        object('Microsoft.XMLHTTP')
-    },
-    
-    /**
-     * Check for HTTP request support.
-     *
-     * @return {bool}
-     * @api private
-     */
-    
-    hasXhr : function() {
-      return JSpec.request || 'ActiveXObject' in main
-    },
-    
-    /**
-     * Try loading _file_ returning the contents
-     * string or null. Chain to locate / read a file.
-     *
-     * @param  {string} file
-     * @return {string}
-     * @api public
-     */
-    
-    tryLoading : function(file) {
-      try { return JSpec.load(file) } catch (e) {}
-    },
-
-    /**
-     * Load a _file_'s contents.
-     *
-     * @param  {string} file
-     * @param  {function} callback
-     * @return {string}
-     * @api public
-     */
-
-    load : function(file, callback) {
-      if (any(hook('loading', file), haveStopped)) return
-      if ('readFile' in main)
-        return readFile(file)
-      else if (this.hasXhr()) {
-        var request = this.xhr()
-        request.open('GET', file, false)
-        request.send(null)
-        if (request.readyState == 4 && 
-           (request.status == 0 || 
-            request.status.toString().charAt(0) == 2)) 
-          return request.responseText
-      }
-      else
-        error("failed to load `" + file + "'")
-    },
-
-    /**
-     * Load, pre-process, and evaluate a file.
-     *
-     * @param {string} file
-     * @param {JSpec}
-     * @api public
-     */
-
-    exec : function(file) {
-      if (any(hook('executing', file), haveStopped)) return this
-      eval('with (JSpec){' + this.preprocess(this.load(file)) + '}')
-      return this
-    }
-  }
-  
-  // --- Node.js support
-  
-  if (typeof GLOBAL === 'object' && typeof exports === 'object')
-    quit = process.exit,
-    print = require('sys').puts,
-    readFile = require('fs').readFileSync
-  
-  // --- Utility functions
-
-  var main = this,
-      find = JSpec.any,
-      utils = 'haveStopped stub hookImmutable hook destub map any last pass fail range each option inject select \
-               error escape extend puts query strip color does addMatchers callIterator toArray equal'.split(/\s+/)
-  while (utils.length) eval('var ' + utils[0] + ' = JSpec.' + utils.shift())
-  if (!main.setTimeout) main.setTimeout = function(callback){ callback() }
-
-  // --- Matchers
-
-  addMatchers({
-    equal              : "===",
-    eql                : "equal(actual, expected)",
-    be                 : "alias equal",
-    be_greater_than    : ">",
-    be_less_than       : "<",
-    be_at_least        : ">=",
-    be_at_most         : "<=",
-    be_a               : "actual.constructor == expected",
-    be_an              : "alias be_a",
-    be_an_instance_of  : "actual instanceof expected",
-    be_null            : "actual == null",
-    be_true            : "actual == true",
-    be_false           : "actual == false",
-    be_undefined       : "typeof actual == 'undefined'",
-    be_type            : "typeof actual == expected",
-    match              : "typeof actual == 'string' ? actual.match(expected) : false",
-    respond_to         : "typeof actual[expected] == 'function'",
-    have_length        : "actual.length == expected",
-    be_within          : "actual >= expected[0] && actual <= last(expected)",
-    have_length_within : "actual.length >= expected[0] && actual.length <= last(expected)",
-    
-    receive : { defer : true, match : function(actual, method, times) {
-      proxy = new JSpec.ProxyAssertion(actual, method, times, this.negate)
-      JSpec.currentSpec.assertions.push(proxy)
-      return proxy
-    }},
-    
-    be_empty : function(actual) {
-      if (actual.constructor == Object && actual.length == undefined)
-        for (var key in actual)
-          return false;
-      return !actual.length
-    },
-
-    include : function(actual) {
-      for (state = true, i = 1; i < arguments.length; i++) {
-        arg = arguments[i]
-        switch (actual.constructor) {
-          case String: 
-          case Number:
-          case RegExp:
-          case Function:
-            state = actual.toString().indexOf(arg) !== -1
-            break
-         
-          case Object:
-            state = arg in actual
-            break
-          
-          case Array: 
-            state = any(actual, function(value){ return equal(value, arg) })
-            break
-        }
-        if (!state) return false
-      }
-      return true
-    },
-
-    throw_error : { match : function(actual, expected, message) {
-      try { actual() }
-      catch (e) {
-        this.e = e
-        var assert = function(arg) {
-          switch (arg.constructor) {
-            case RegExp   : return arg.test(e.message || e.toString())
-            case String   : return arg == (e.message || e.toString())
-            case Function : return e instanceof arg || e.name == arg.name
-          }
-        }
-        return message ? assert(expected) && assert(message) :
-                 expected ? assert(expected) :
-                   true
-      }
-    }, message : function(actual, expected, negate) {
-      // TODO: refactor when actual is not in expected [0]
-      var message_for = function(i) {
-        if (expected[i] == undefined) return 'exception'
-        switch (expected[i].constructor) {
-          case RegExp   : return 'exception matching ' + puts(expected[i])
-          case String   : return 'exception of ' + puts(expected[i])
-          case Function : return expected[i].name || 'Error'
-        }
-      }
-      exception = message_for(1) + (expected[2] ? ' and ' + message_for(2) : '')
-      return 'expected ' + exception + (negate ? ' not ' : '' ) +
-               ' to be thrown, but ' + (this.e ? 'got ' + puts(this.e) : 'nothing was')
-    }},
-    
-    have : function(actual, length, property) {
-      return actual[property].length == length
-    },
-    
-    have_at_least : function(actual, length, property) {
-      return actual[property].length >= length
-    },
-    
-    have_at_most :function(actual, length, property) {
-      return actual[property].length <= length
-    },
-    
-    have_within : function(actual, range, property) {
-      length = actual[property].length
-      return length >= range.shift() && length <= range.pop()
-    },
-    
-    have_prop : function(actual, property, value) {
-      return actual[property] == null || 
-               actual[property] instanceof Function ? false:
-                 value == null ? true:
-                   does(actual[property], 'eql', value)
-    },
-    
-    have_property : function(actual, property, value) {
-      return actual[property] == null ||
-               actual[property] instanceof Function ? false:
-                 value == null ? true:
-                   value === actual[property]
-    }
-  })
-  
-})()