<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>tasks/tmbundle.rake</filename>
    </added>
    <added>
      <filename>website/images/logo_bundle.png</filename>
    </added>
    <added>
      <filename>website/tmbundle/JavaScript Unit Testing.tmbundle.tar.gz</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -193,9 +193,9 @@ end
 class WEBrick::HTTPRequest
   def to_json
     headers = []
-    each { |k, v| headers.push &quot;#{k.DrNicTest.inspect}: #{v.DrNicTest.inspect}&quot; }
+    each { |k, v| headers.push &quot;#{k.inspect}: #{v.inspect}&quot; }
     headers = &quot;{&quot; &lt;&lt; headers.join(', ') &lt;&lt; &quot;}&quot;
-    %({ &quot;headers&quot;: #{headers}, &quot;body&quot;: #{body.DrNicTest.inspect}, &quot;method&quot;: #{request_method.DrNicTest.inspect} })
+    %({ &quot;headers&quot;: #{headers}, &quot;body&quot;: #{body.inspect}, &quot;method&quot;: #{request_method.inspect} })
   end
 end
 
@@ -288,7 +288,7 @@ class JavaScriptTestTask &lt; ::Rake::TaskLib
     @server.mount(&quot;/response&quot;, BasicServlet)
     @server.mount(&quot;/slow&quot;, SlowServlet)
     @server.mount(&quot;/down&quot;, DownServlet)
-    @server.mount(&quot;/DrNicTest.inspect&quot;, InspectionServlet)
+    @server.mount(&quot;/inspect&quot;, InspectionServlet)
     yield self if block_given?
     define
   end</diff>
      <filename>lib/jstest.rb</filename>
    </modified>
    <modified>
      <diff>@@ -37,7 +37,7 @@ end
 # setting up growlnotify.
 
 def growl(title, msg, img, pri=0, sticky=&quot;&quot;)
-  system &quot;growlnotify -n autotest --image ~/.autotest_images/#{img} -p #{pri} -m #{msg.DrNicTest.inspect} #{title} #{sticky}&quot;
+  system &quot;growlnotify -n autotest --image ~/.autotest_images/#{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}&quot;
 end
 
 def self.growl_fail(output)</diff>
      <filename>script/rstakeout</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 // All of which are outline in the comments, below
 // From John Resig's book Pro JavaScript Techniques
 // published by Apress, 2006-8
-DrNicTest.ajax = function( options ) {
+JsUnitTest.ajax = function( options ) {
 
     // Load the options object with defaults, if no
     // values were provided by the user</diff>
      <filename>src/ajax.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,8 @@
-DrNicTest.Unit.Assertions = {
+JsUnitTest.Unit.Assertions = {
   buildMessage: function(message, template) {
-    var args = DrNicTest.arrayfromargs(arguments).slice(2);
+    var args = JsUnitTest.arrayfromargs(arguments).slice(2);
     return (message ? message + '\n' : '') + 
-      new DrNicTest.Unit.MessageTemplate(template).evaluate(args);
+      new JsUnitTest.Unit.MessageTemplate(template).evaluate(args);
   },
   
   flunk: function(message) {
@@ -32,8 +32,8 @@ DrNicTest.Unit.Assertions = {
   
   assertEnumEqual: function(expected, actual, message) {
     message = this.buildMessage(message || 'assertEnumEqual', 'expected &lt;?&gt;, actual: &lt;?&gt;', expected, actual);
-    var expected_array = DrNicTest.flattenArray(expected);
-    var actual_array   = DrNicTest.flattenArray(actual);
+    var expected_array = JsUnitTest.flattenArray(expected);
+    var actual_array   = JsUnitTest.flattenArray(actual);
     this.assertBlock(message, function() {
       if (expected_array.length == actual_array.length) {
         for (var i=0; i &lt; expected_array.length; i++) {
@@ -47,8 +47,8 @@ DrNicTest.Unit.Assertions = {
   
   assertEnumNotEqual: function(expected, actual, message) {
     message = this.buildMessage(message || 'assertEnumNotEqual', '&lt;?&gt; was the same as &lt;?&gt;', expected, actual);
-    var expected_array = DrNicTest.flattenArray(expected);
-    var actual_array   = DrNicTest.flattenArray(actual);
+    var expected_array = JsUnitTest.flattenArray(expected);
+    var actual_array   = JsUnitTest.flattenArray(actual);
     this.assertBlock(message, function() {
       if (expected_array.length == actual_array.length) {
         for (var i=0; i &lt; expected_array.length; i++) {
@@ -62,8 +62,8 @@ DrNicTest.Unit.Assertions = {
   
   assertHashEqual: function(expected, actual, message) {
     message = this.buildMessage(message || 'assertHashEqual', 'expected &lt;?&gt;, actual: &lt;?&gt;', expected, actual);
-    var expected_array = DrNicTest.flattenArray(DrNicTest.hashToSortedArray(expected));
-    var actual_array   = DrNicTest.flattenArray(DrNicTest.hashToSortedArray(actual));
+    var expected_array = JsUnitTest.flattenArray(JsUnitTest.hashToSortedArray(expected));
+    var actual_array   = JsUnitTest.flattenArray(JsUnitTest.hashToSortedArray(actual));
     var block = function() {
       if (expected_array.length == actual_array.length) {
         for (var i=0; i &lt; expected_array.length; i++) {
@@ -78,8 +78,8 @@ DrNicTest.Unit.Assertions = {
   
   assertHashNotEqual: function(expected, actual, message) {
     message = this.buildMessage(message || 'assertHashNotEqual', '&lt;?&gt; was the same as &lt;?&gt;', expected, actual);
-    var expected_array = DrNicTest.flattenArray(DrNicTest.hashToSortedArray(expected));
-    var actual_array   = DrNicTest.flattenArray(DrNicTest.hashToSortedArray(actual));
+    var expected_array = JsUnitTest.flattenArray(JsUnitTest.hashToSortedArray(expected));
+    var actual_array   = JsUnitTest.flattenArray(JsUnitTest.hashToSortedArray(actual));
     // from now we recursively zip &amp; compare nested arrays
     var block = function() {
       if (expected_array.length == actual_array.length) {
@@ -145,7 +145,7 @@ DrNicTest.Unit.Assertions = {
   
   assertHidden: function(element, message) {
     message = this.buildMessage(message || 'assertHidden', '? isn\'t hidden.', element);
-    this.assertBlock(message, function() { return element.style.display == 'none' });
+    this.assertBlock(message, function() { return !element.style.display || element.style.display == 'none' });
   },
   
   assertInstanceOf: function(expected, actual, message) {
@@ -188,10 +188,11 @@ DrNicTest.Unit.Assertions = {
   },
   
   _isVisible: function(element) {
-    element = DrNicTest.$(element);
+    element = JsUnitTest.$(element);
     if(!element.parentNode) return true;
     this.assertNotNull(element);
-    if(element.style &amp;&amp; element.style.display == 'none')
+    // if(element.style &amp;&amp; (!element.style.display || element.style.display == 'none'))
+    if(element.style &amp;&amp; (element.style.display == 'none'))
       return false;
     
     return arguments.callee.call(this, element.parentNode);
@@ -208,7 +209,7 @@ DrNicTest.Unit.Assertions = {
   },
   
   assertElementsMatch: function() {
-    var pass = true, expressions = DrNicTest.arrayfromargs(arguments);
+    var pass = true, expressions = JsUnitTest.arrayfromargs(arguments);
     var elements = expressions.shift();
     if (elements.length != expressions.length) {
       message = this.buildMessage('assertElementsMatch', 'size mismatch: ? elements, ? expressions (?).', elements.length, expressions.length, expressions);
@@ -217,8 +218,8 @@ DrNicTest.Unit.Assertions = {
     }
     for (var i=0; i &lt; expressions.length; i++) {
       var expression = expressions[i];
-      var element    = DrNicTest.$(elements[i]);
-      if (DrNicTest.selectorMatch(expression, element)) {
+      var element    = JsUnitTest.$(elements[i]);
+      if (JsUnitTest.selectorMatch(expression, element)) {
         pass = true;
         break;
       }</diff>
      <filename>src/assertions.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-var DrNicTest = {
+var JsUnitTest = {
   Unit: {},
   inspect: function(object) {
     try {
@@ -36,7 +36,7 @@ var DrNicTest = {
     while (source.length &gt; 0) {
       if (match = source.match(pattern)) {
         result += source.slice(0, match.index);
-        result += DrNicTest.String.interpret(replacement(match));
+        result += JsUnitTest.String.interpret(replacement(match));
         source  = source.slice(match.index + match[0].length);
       } else {
         result += source, source = '';
@@ -184,7 +184,7 @@ var DrNicTest = {
   }
 };
 
-DrNicTest.gsub.prepareReplacement = function(replacement) {
+JsUnitTest.gsub.prepareReplacement = function(replacement) {
   if (typeof replacement == &quot;function&quot;) return replacement;
   var template = new Template(replacement);
   return function(match) { return template.evaluate(match) };</diff>
      <filename>src/common.js</filename>
    </modified>
    <modified>
      <diff>@@ -12,4 +12,4 @@ var JsUnitTest = {
 &lt;%= include 'assertions.js' %&gt;
 &lt;%= include 'runner.js', 'test_case.js' %&gt;
 
-Test = DrNicTest
\ No newline at end of file
+Test = JsUnitTest
\ No newline at end of file</diff>
      <filename>src/jsunittest.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,51 +1,51 @@
-DrNicTest.Unit.Logger = function(element) {
-  this.element = DrNicTest.$(element);
+JsUnitTest.Unit.Logger = function(element) {
+  this.element = JsUnitTest.$(element);
   if (this.element) this._createLogTable();
 };
   
-DrNicTest.Unit.Logger.prototype.start = function(testName) {
+JsUnitTest.Unit.Logger.prototype.start = function(testName) {
   if (!this.element) return;
   var tbody = this.element.getElementsByTagName('tbody')[0];
   tbody.innerHTML = tbody.innerHTML + '&lt;tr&gt;&lt;td&gt;' + testName + '&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;';
 };
   
-DrNicTest.Unit.Logger.prototype.setStatus = function(status) {
+JsUnitTest.Unit.Logger.prototype.setStatus = function(status) {
   var logline = this.getLastLogLine();
   logline.className = status;
   var statusCell = logline.getElementsByTagName('td')[1];
   statusCell.innerHTML = status;
 };
   
-DrNicTest.Unit.Logger.prototype.finish = function(status, summary) {
+JsUnitTest.Unit.Logger.prototype.finish = function(status, summary) {
   if (!this.element) return;
   this.setStatus(status);
   this.message(summary);
 };
   
-DrNicTest.Unit.Logger.prototype.message = function(message) {
+JsUnitTest.Unit.Logger.prototype.message = function(message) {
   if (!this.element) return;
   var cell = this.getMessageCell();
   cell.innerHTML = this._toHTML(message);
 };
   
-DrNicTest.Unit.Logger.prototype.summary = function(summary) {
+JsUnitTest.Unit.Logger.prototype.summary = function(summary) {
   if (!this.element) return;
   var div = this.element.getElementsByTagName('div')[0];
   div.innerHTML = this._toHTML(summary);
 };
   
-DrNicTest.Unit.Logger.prototype.getLastLogLine = function() {
+JsUnitTest.Unit.Logger.prototype.getLastLogLine = function() {
   var tbody = this.element.getElementsByTagName('tbody')[0];
   var loglines = tbody.getElementsByTagName('tr');
   return loglines[loglines.length - 1];
 };
   
-DrNicTest.Unit.Logger.prototype.getMessageCell = function() {
+JsUnitTest.Unit.Logger.prototype.getMessageCell = function() {
   var logline = this.getLastLogLine();
   return logline.getElementsByTagName('td')[2];
 };
   
-DrNicTest.Unit.Logger.prototype._createLogTable = function() {
+JsUnitTest.Unit.Logger.prototype._createLogTable = function() {
   var html = '&lt;div class=&quot;logsummary&quot;&gt;running...&lt;/div&gt;' +
   '&lt;table class=&quot;logtable&quot;&gt;' +
   '&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Status&lt;/th&gt;&lt;th&gt;Test&lt;/th&gt;&lt;th&gt;Message&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;' +
@@ -54,7 +54,7 @@ DrNicTest.Unit.Logger.prototype._createLogTable = function() {
   this.element.innerHTML = html;
 };
   
-DrNicTest.Unit.Logger.prototype.appendActionButtons = function(actions) {
+JsUnitTest.Unit.Logger.prototype.appendActionButtons = function(actions) {
   // actions = $H(actions);
   // if (!actions.any()) return;
   // var div = new Element(&quot;div&quot;, {className: 'action_buttons'});
@@ -66,7 +66,7 @@ DrNicTest.Unit.Logger.prototype.appendActionButtons = function(actions) {
   // this.getMessageCell().insert(div);
 };
   
-DrNicTest.Unit.Logger.prototype._toHTML = function(txt) {
-  return DrNicTest.escapeHTML(txt).replace(/\n/g,&quot;&lt;br/&gt;&quot;);
+JsUnitTest.Unit.Logger.prototype._toHTML = function(txt) {
+  return JsUnitTest.escapeHTML(txt).replace(/\n/g,&quot;&lt;br/&gt;&quot;);
 };
 </diff>
      <filename>src/logger.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,16 +1,16 @@
-DrNicTest.Unit.MessageTemplate = function(string) {
+JsUnitTest.Unit.MessageTemplate = function(string) {
   var parts = [];
-  var str = DrNicTest.scan((string || ''), /(?=[^\\])\?|(?:\\\?|[^\?])+/, function(part) {
+  var str = JsUnitTest.scan((string || ''), /(?=[^\\])\?|(?:\\\?|[^\?])+/, function(part) {
     parts.push(part[0]);
   });
   this.parts = parts;
 };
 
-DrNicTest.Unit.MessageTemplate.prototype.evaluate = function(params) {
+JsUnitTest.Unit.MessageTemplate.prototype.evaluate = function(params) {
   var results = [];
   for (var i=0; i &lt; this.parts.length; i++) {
     var part = this.parts[i];
-    var result = (part == '?') ? DrNicTest.inspect(params.shift()) : part.replace(/\\\?/, '?');
+    var result = (part == '?') ? JsUnitTest.inspect(params.shift()) : part.replace(/\\\?/, '?');
     results.push(result);
   };
   return results.join('');</diff>
      <filename>src/message_template.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,11 @@
-DrNicTest.Event = {};
+JsUnitTest.Event = {};
 // written by Dean Edwards, 2005
 // with input from Tino Zijdel, Matthias Miller, Diego Perini
 // namespaced by Dr Nic Williams 2008
 
 // http://dean.edwards.name/weblog/2005/10/add-event/
 // http://dean.edwards.name/weblog/2005/10/add-event2/
-DrNicTest.Event.addEvent = function(element, type, handler) {
+JsUnitTest.Event.addEvent = function(element, type, handler) {
 	if (element.addEventListener) {
 		element.addEventListener(type, handler, false);
 	} else {
@@ -29,9 +29,9 @@ DrNicTest.Event.addEvent = function(element, type, handler) {
 	}
 };
 // a counter used to create unique IDs
-DrNicTest.Event.addEvent.guid = 1;
+JsUnitTest.Event.addEvent.guid = 1;
 
-DrNicTest.Event.removeEvent = function(element, type, handler) {
+JsUnitTest.Event.removeEvent = function(element, type, handler) {
 	if (element.removeEventListener) {
 		element.removeEventListener(type, handler, false);
 	} else {
@@ -42,7 +42,7 @@ DrNicTest.Event.removeEvent = function(element, type, handler) {
 	}
 };
 
-DrNicTest.Event.handleEvent = function(event) {
+JsUnitTest.Event.handleEvent = function(event) {
 	var returnValue = true;
 	// grab the event object (IE uses a global event object)
 	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
@@ -58,15 +58,15 @@ DrNicTest.Event.handleEvent = function(event) {
 	return returnValue;
 };
 
-DrNicTest.Event.fixEvent = function(event) {
+JsUnitTest.Event.fixEvent = function(event) {
 	// add W3C standard event methods
 	event.preventDefault = fixEvent.preventDefault;
 	event.stopPropagation = fixEvent.stopPropagation;
 	return event;
 };
-DrNicTest.Event.fixEvent.preventDefault = function() {
+JsUnitTest.Event.fixEvent.preventDefault = function() {
 	this.returnValue = false;
 };
-DrNicTest.Event.fixEvent.stopPropagation = function() {
+JsUnitTest.Event.fixEvent.stopPropagation = function() {
 	this.cancelBubble = true;
 };</diff>
      <filename>src/prototype/event.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
-DrNicTest.Template = function(template, pattern) {
+JsUnitTest.Template = function(template, pattern) {
   this.template = template; //template.toString();
-  this.pattern = pattern || DrNicTest.Template.Pattern;
+  this.pattern = pattern || JsUnitTest.Template.Pattern;
 };
 
-DrNicTest.Template.prototype.evaluate = function(object) {
+JsUnitTest.Template.prototype.evaluate = function(object) {
   if (typeof object.toTemplateReplacements == &quot;function&quot;)
     object = object.toTemplateReplacements();
 
-  return DrNicTest.gsub(this.template, this.pattern, function(match) {
+  return JsUnitTest.gsub(this.template, this.pattern, function(match) {
     if (object == null) return '';
 
     var before = match[1] || '';
@@ -26,8 +26,8 @@ DrNicTest.Template.prototype.evaluate = function(object) {
       match = pattern.exec(expr);
     }
 
-    return before + DrNicTest.String.interpret(ctx);
+    return before + JsUnitTest.String.interpret(ctx);
   });
 }
 
-DrNicTest.Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+JsUnitTest.Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;</diff>
      <filename>src/prototype/template.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,25 +1,25 @@
-DrNicTest.Unit.Runner = function(testcases) {
+JsUnitTest.Unit.Runner = function(testcases) {
   var argumentOptions = arguments[1] || {};
   var options = this.options = {};
   options.testLog = ('testLog' in argumentOptions) ? argumentOptions.testLog : 'testlog';
   options.resultsURL = this.queryParams.resultsURL;
-  options.testLog = DrNicTest.$(options.testLog);
+  options.testLog = JsUnitTest.$(options.testLog);
   
   this.tests = this.getTests(testcases);
   this.currentTest = 0;
-  this.logger = new DrNicTest.Unit.Logger(options.testLog);
+  this.logger = new JsUnitTest.Unit.Logger(options.testLog);
   
   var self = this;
-  DrNicTest.Event.addEvent(window, &quot;load&quot;, function() {
+  JsUnitTest.Event.addEvent(window, &quot;load&quot;, function() {
     setTimeout(function() {
       self.runTests();
     }, 0.1);
   });
 };
 
-DrNicTest.Unit.Runner.prototype.queryParams = DrNicTest.toQueryParams();
+JsUnitTest.Unit.Runner.prototype.queryParams = JsUnitTest.toQueryParams();
 
-DrNicTest.Unit.Runner.prototype.portNumber = function() {
+JsUnitTest.Unit.Runner.prototype.portNumber = function() {
   if (window.location.search.length &gt; 0) {
     var matches = window.location.search.match(/\:(\d{3,5})\//);
     if (matches) {
@@ -29,7 +29,7 @@ DrNicTest.Unit.Runner.prototype.portNumber = function() {
   return null;
 };
 
-DrNicTest.Unit.Runner.prototype.getTests = function(testcases) {
+JsUnitTest.Unit.Runner.prototype.getTests = function(testcases) {
   var tests = [], options = this.options;
   if (this.queryParams.tests) tests = this.queryParams.tests.split(',');
   else if (options.tests) tests = options.tests;
@@ -44,13 +44,13 @@ DrNicTest.Unit.Runner.prototype.getTests = function(testcases) {
     var test = tests[i];
     if (testcases[test])
       results.push(
-        new DrNicTest.Unit.Testcase(test, testcases[test], testcases.setup, testcases.teardown)
+        new JsUnitTest.Unit.Testcase(test, testcases[test], testcases.setup, testcases.teardown)
       );
   };
   return results;
 };
 
-DrNicTest.Unit.Runner.prototype.getResult = function() {
+JsUnitTest.Unit.Runner.prototype.getResult = function() {
   var results = {
     tests: this.tests.length,
     assertions: 0,
@@ -67,7 +67,7 @@ DrNicTest.Unit.Runner.prototype.getResult = function() {
   return results;
 };
 
-DrNicTest.Unit.Runner.prototype.postResults = function() {
+JsUnitTest.Unit.Runner.prototype.postResults = function() {
   if (this.options.resultsURL) {
     // new Ajax.Request(this.options.resultsURL, 
     //   { method: 'get', parameters: this.getResult(), asynchronous: false });
@@ -76,14 +76,14 @@ DrNicTest.Unit.Runner.prototype.postResults = function() {
     url += &quot;assertions=&quot;+ results.assertions + &quot;&amp;&quot;;
     url += &quot;failures=&quot;  + results.failures + &quot;&amp;&quot;;
     url += &quot;errors=&quot;    + results.errors;
-    DrNicTest.ajax({
+    JsUnitTest.ajax({
       url: url,
       type: 'GET'      
     })
   }
 };
 
-DrNicTest.Unit.Runner.prototype.runTests = function() {
+JsUnitTest.Unit.Runner.prototype.runTests = function() {
   var test = this.tests[this.currentTest], actions;
   
   if (!test) return this.finish();
@@ -106,11 +106,11 @@ DrNicTest.Unit.Runner.prototype.runTests = function() {
   this.runTests();
 };
 
-DrNicTest.Unit.Runner.prototype.finish = function() {
+JsUnitTest.Unit.Runner.prototype.finish = function() {
   this.postResults();
   this.logger.summary(this.summary());
 };
 
-DrNicTest.Unit.Runner.prototype.summary = function() {
-  return new DrNicTest.Template('#{tests} tests, #{assertions} assertions, #{failures} failures, #{errors} errors').evaluate(this.getResult());
+JsUnitTest.Unit.Runner.prototype.summary = function() {
+  return new JsUnitTest.Template('#{tests} tests, #{assertions} assertions, #{failures} failures, #{errors} errors').evaluate(this.getResult());
 };</diff>
      <filename>src/runner.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-DrNicTest.Unit.Testcase = function(name, test, setup, teardown) {
+JsUnitTest.Unit.Testcase = function(name, test, setup, teardown) {
   this.name           = name;
   this.test           = test     || function() {};
   this.setup          = setup    || function() {};
@@ -6,27 +6,27 @@ DrNicTest.Unit.Testcase = function(name, test, setup, teardown) {
   this.messages       = [];
   this.actions        = {};
 };
-// import DrNicTest.Unit.Assertions
+// import JsUnitTest.Unit.Assertions
 
-for (method in DrNicTest.Unit.Assertions) {
-  DrNicTest.Unit.Testcase.prototype[method] = DrNicTest.Unit.Assertions[method];
+for (method in JsUnitTest.Unit.Assertions) {
+  JsUnitTest.Unit.Testcase.prototype[method] = JsUnitTest.Unit.Assertions[method];
 }
 
-DrNicTest.Unit.Testcase.prototype.isWaiting  = false;
-DrNicTest.Unit.Testcase.prototype.timeToWait = 1000;
-DrNicTest.Unit.Testcase.prototype.assertions = 0;
-DrNicTest.Unit.Testcase.prototype.failures   = 0;
-DrNicTest.Unit.Testcase.prototype.errors     = 0;
-// DrNicTest.Unit.Testcase.prototype.isRunningFromRake = window.location.port == 4711;
-DrNicTest.Unit.Testcase.prototype.isRunningFromRake = window.location.port;
+JsUnitTest.Unit.Testcase.prototype.isWaiting  = false;
+JsUnitTest.Unit.Testcase.prototype.timeToWait = 1000;
+JsUnitTest.Unit.Testcase.prototype.assertions = 0;
+JsUnitTest.Unit.Testcase.prototype.failures   = 0;
+JsUnitTest.Unit.Testcase.prototype.errors     = 0;
+// JsUnitTest.Unit.Testcase.prototype.isRunningFromRake = window.location.port == 4711;
+JsUnitTest.Unit.Testcase.prototype.isRunningFromRake = window.location.port;
 
-DrNicTest.Unit.Testcase.prototype.wait = function(time, nextPart) {
+JsUnitTest.Unit.Testcase.prototype.wait = function(time, nextPart) {
   this.isWaiting = true;
   this.test = nextPart;
   this.timeToWait = time;
 };
 
-DrNicTest.Unit.Testcase.prototype.run = function(rethrow) {
+JsUnitTest.Unit.Testcase.prototype.run = function(rethrow) {
   try {
     try {
       if (!this.isWaiting) this.setup();
@@ -44,17 +44,17 @@ DrNicTest.Unit.Testcase.prototype.run = function(rethrow) {
   }
 };
 
-DrNicTest.Unit.Testcase.prototype.summary = function() {
+JsUnitTest.Unit.Testcase.prototype.summary = function() {
   var msg = '#{assertions} assertions, #{failures} failures, #{errors} errors\n';
-  return new DrNicTest.Template(msg).evaluate(this) + 
+  return new JsUnitTest.Template(msg).evaluate(this) + 
     this.messages.join(&quot;\n&quot;);
 };
 
-DrNicTest.Unit.Testcase.prototype.pass = function() {
+JsUnitTest.Unit.Testcase.prototype.pass = function() {
   this.assertions++;
 };
 
-DrNicTest.Unit.Testcase.prototype.fail = function(message) {
+JsUnitTest.Unit.Testcase.prototype.fail = function(message) {
   this.failures++;
   var line = &quot;&quot;;
   try {
@@ -65,23 +65,23 @@ DrNicTest.Unit.Testcase.prototype.fail = function(message) {
   this.messages.push(&quot;Failure: &quot; + message + (line ? &quot; Line #&quot; + line : &quot;&quot;));
 };
 
-DrNicTest.Unit.Testcase.prototype.info = function(message) {
+JsUnitTest.Unit.Testcase.prototype.info = function(message) {
   this.messages.push(&quot;Info: &quot; + message);
 };
 
-DrNicTest.Unit.Testcase.prototype.error = function(error, test) {
+JsUnitTest.Unit.Testcase.prototype.error = function(error, test) {
   this.errors++;
   this.actions['retry with throw'] = function() { test.run(true) };
-  this.messages.push(error.name + &quot;: &quot;+ error.message + &quot;(&quot; + DrNicTest.inspect(error) + &quot;)&quot;);
+  this.messages.push(error.name + &quot;: &quot;+ error.message + &quot;(&quot; + JsUnitTest.inspect(error) + &quot;)&quot;);
 };
 
-DrNicTest.Unit.Testcase.prototype.status = function() {
+JsUnitTest.Unit.Testcase.prototype.status = function() {
   if (this.failures &gt; 0) return 'failed';
   if (this.errors &gt; 0) return 'error';
   return 'passed';
 };
 
-DrNicTest.Unit.Testcase.prototype.benchmark = function(operation, iterations) {
+JsUnitTest.Unit.Testcase.prototype.benchmark = function(operation, iterations) {
   var startAt = new Date();
   (iterations || 1).times(operation);
   var timeTaken = ((new Date())-startAt);</diff>
      <filename>src/test_case.js</filename>
    </modified>
    <modified>
      <diff>@@ -9,8 +9,8 @@ task :release =&gt; [:clean, :dist, :package] do |t|
   pkg = &quot;pkg/#{name}-#{version}&quot;
 
   if $DEBUG then
-    puts &quot;release_id = rf.add_release #{rubyforge_name.DrNicTest.inspect}, #{name.DrNicTest.inspect}, #{version.DrNicTest.inspect}, \&quot;#{pkg}.tgz\&quot;&quot;
-    puts &quot;rf.add_file #{rubyforge_name.DrNicTest.inspect}, #{name.DrNicTest.inspect}, release_id, \&quot;#{pkg}.gem\&quot;&quot;
+    puts &quot;release_id = rf.add_release #{rubyforge_name.inspect}, #{name.inspect}, #{version.inspect}, \&quot;#{pkg}.tgz\&quot;&quot;
+    puts &quot;rf.add_file #{rubyforge_name.inspect}, #{name.inspect}, release_id, \&quot;#{pkg}.gem\&quot;&quot;
   end
 
   rf = RubyForge.new</diff>
      <filename>tasks/deploy.rake</filename>
    </modified>
    <modified>
      <diff>@@ -16,8 +16,10 @@ EOS
   @website_config
 end
 
-desc 'Generate website files'
-task :website_generate =&gt; [:ruby_env, :dist, :website_package] do
+desc 'Generate website files + associated packages + bundles'
+task :website_build =&gt; [:ruby_env, :dist, :website_package, &quot;bundle:import&quot;, :website_generate]
+
+task :website_generate =&gt; :ruby_env do
   (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
     sh %{ #{RUBY_APP} script/txt2html #{txt} &gt; #{txt.gsub(/txt$/,'html')} }
   end
@@ -48,4 +50,4 @@ task :website_upload do
 end
 
 desc 'Generate and upload website files'
-task :website =&gt; [:website_generate, :website_upload]
+task :website =&gt; [:website_build, :website_upload]</diff>
      <filename>tasks/website.rake</filename>
    </modified>
    <modified>
      <diff>@@ -45,7 +45,7 @@ Event.simulateMouse = function(element, eventName) {
   document.body.appendChild(this.mark);
   
   if(this.step)
-    alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.DrNicTest.inspect(options));
+    alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
   
   $(element).dispatchEvent(oEvent);
 };
@@ -78,7 +78,7 @@ Event.simulateKeys = function(element, command) {
 
 var Test = {
   Unit: {
-    DrNicTest.inspect: Object.DrNicTest.inspect // security exception workaround
+    inspect: Object.inspect // security exception workaround
   }
 };
 
@@ -244,7 +244,7 @@ Test.Unit.MessageTemplate = Class.create({
   
   evaluate: function(params) {
     return this.parts.map(function(part) {
-      return part == '?' ? Test.Unit.DrNicTest.inspect(params.shift()) : part.replace(/\\\?/, '?');
+      return part == '?' ? Test.Unit.inspect(params.shift()) : part.replace(/\\\?/, '?');
     }).join('');
   }
 });
@@ -535,7 +535,7 @@ Test.Unit.Testcase = Class.create(Test.Unit.Assertions, {
   error: function(error, test) {
     this.errors++;
     this.actions['retry with throw'] = function() { test.run(true) };
-    this.messages.push(error.name + &quot;: &quot;+ error.message + &quot;(&quot; + Test.Unit.DrNicTest.inspect(error) + &quot;)&quot;);
+    this.messages.push(error.name + &quot;: &quot;+ error.message + &quot;(&quot; + Test.Unit.inspect(error) + &quot;)&quot;);
   },
   
   status: function() {</diff>
      <filename>test/assets/unittest.js</filename>
    </modified>
    <modified>
      <diff>@@ -53,11 +53,11 @@
     }
   }
 
-  new DrNicTest.Unit.Runner({
+  new JsUnitTest.Unit.Runner({
     setup: function() {
-      this.testcss1      = DrNicTest.$('testcss1');
-      this.testcss1_span = DrNicTest.$('testcss1_span');
-      this.tlist         = DrNicTest.$('tlist');
+      this.testcss1      = JsUnitTest.$('testcss1');
+      this.testcss1_span = JsUnitTest.$('testcss1_span');
+      this.tlist         = JsUnitTest.$('tlist');
     },
     
     testIsRunningFromRake:  function() { with(this) {
@@ -193,7 +193,7 @@
       
   });
   
-  new DrNicTest.Unit.Runner({
+  new JsUnitTest.Unit.Runner({
     testDummy: function() { with(this) {
       assert(true);
     }},</diff>
      <filename>test/functional/jsunittest_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script src=&quot;../../src/assertions.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   
   &lt;link rel=&quot;stylesheet&quot; href=&quot;../assets/unittest.css&quot; type=&quot;text/css&quot; /&gt;</diff>
      <filename>test/unit/assertions_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;  
   &lt;link rel=&quot;stylesheet&quot; href=&quot;../assets/unittest.css&quot; type=&quot;text/css&quot; /&gt;
 &lt;/head&gt;
@@ -34,17 +34,17 @@
   new Test.Unit.Runner({
     testScan: function() {with(this) {
       var source = 'foo boo boz', results = [];
-      var str = DrNicTest.scan(source, /[o]+/, function(match) {
+      var str = JsUnitTest.scan(source, /[o]+/, function(match) {
         results.push(match[0].length);
       });
       assertEnumEqual([2, 2, 1], results);
-      assertEqual(source, DrNicTest.scan(source, /x/, fail));
+      assertEqual(source, JsUnitTest.scan(source, /x/, fail));
       assert(typeof str == 'string');
     }},
     // hash to sorted array
     testHashToSortedArray: function() { with(this) {
       var expected = [ ['a', 1], ['b', 2], ['zzz', 0]];
-      var actual = DrNicTest.hashToSortedArray({zzz:0, b:2, a:1});
+      var actual = JsUnitTest.hashToSortedArray({zzz:0, b:2, a:1});
       assertEnumEqual(expected, actual);
     }},
 
@@ -52,7 +52,7 @@
     testFlatten: function() { with(this) {
       var original = [ ['a', 1], ['b', 2], ['zzz', [1,2,3]]];
       var expected = [ 'a', 1, 'b', 2, 'zzz', 1, 2, 3];
-      var actual   = DrNicTest.flattenArray(original);
+      var actual   = JsUnitTest.flattenArray(original);
       assertEnumEqual(expected, actual);
     }},
 </diff>
      <filename>test/unit/common_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   &lt;script src=&quot;../../src/logger.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   
@@ -38,8 +38,8 @@
   new Test.Unit.Runner({
     // replace this with your real tests
     setup: function() {
-      this.logger = new DrNicTest.Unit.Logger('testlog_test');
-      this.testlog_test = DrNicTest.$('testlog_test');
+      this.logger = new JsUnitTest.Unit.Logger('testlog_test');
+      this.testlog_test = JsUnitTest.$('testlog_test');
       this.tbody = this.testlog_test.getElementsByTagName('tbody')[0];
     },
     </diff>
      <filename>test/unit/logger_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   &lt;script src=&quot;../../src/message_template.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   </diff>
      <filename>test/unit/message_template_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   &lt;script src=&quot;../../src/prototype/template.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
   &lt;script src=&quot;../../src/prototype/event.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
@@ -38,18 +38,18 @@
   new Test.Unit.Runner({
     // replace this with your real tests
     setup: function() {
-      DrNicTest.Unit.Testcase = function() {};
-      DrNicTest.Unit.Testcase.prototype.run = function() {};
-      DrNicTest.Unit.Testcase.prototype.status = function() { return &quot;passed&quot; };
-      DrNicTest.Unit.Testcase.prototype.summary = function() { return &quot;summary&quot; };
-      DrNicTest.Unit.Testcase.prototype.assertions = 1;
-      DrNicTest.Unit.Testcase.prototype.failures = 0;
-      DrNicTest.Unit.Testcase.prototype.errors = 0;
-      DrNicTest.Unit.Logger = function() {};
-      DrNicTest.Unit.Logger.prototype.start = function() {};
-      DrNicTest.Unit.Logger.prototype.finish = function() {};
-      DrNicTest.Unit.Logger.prototype.summary = function() {};
-      this.runner = new DrNicTest.Unit.Runner({
+      JsUnitTest.Unit.Testcase = function() {};
+      JsUnitTest.Unit.Testcase.prototype.run = function() {};
+      JsUnitTest.Unit.Testcase.prototype.status = function() { return &quot;passed&quot; };
+      JsUnitTest.Unit.Testcase.prototype.summary = function() { return &quot;summary&quot; };
+      JsUnitTest.Unit.Testcase.prototype.assertions = 1;
+      JsUnitTest.Unit.Testcase.prototype.failures = 0;
+      JsUnitTest.Unit.Testcase.prototype.errors = 0;
+      JsUnitTest.Unit.Logger = function() {};
+      JsUnitTest.Unit.Logger.prototype.start = function() {};
+      JsUnitTest.Unit.Logger.prototype.finish = function() {};
+      JsUnitTest.Unit.Logger.prototype.summary = function() {};
+      this.runner = new JsUnitTest.Unit.Runner({
         testDoNothing : function() {},
         testDoNothing2 : function() {}
       });</diff>
      <filename>test/unit/runner_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   &lt;script src=&quot;../../src/prototype/template.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   
@@ -36,20 +36,20 @@
   new Test.Unit.Runner({
     // Library
     testLibrary: function() { with(this) {
-      assert(DrNicTest.Template);
-      assert(new DrNicTest.Template(&quot;&quot;));
+      assert(JsUnitTest.Template);
+      assert(new JsUnitTest.Template(&quot;&quot;));
     }},
 
     // Empty string
     testEmptyString: function() { with(this) {
-      assertEqual('', new DrNicTest.Template(&quot;&quot;).evaluate(&quot;asd&quot;));
+      assertEqual('', new JsUnitTest.Template(&quot;&quot;).evaluate(&quot;asd&quot;));
     }},
 
     testInterpolate: function() {with(this) {
       var subject = { name: 'Stephan' };
       var pattern = /(^|.|\r|\n)(#\((.*?)\))/;
-      assertEqual('#{name}: Stephan', new DrNicTest.Template('\\#{name}: #{name}').evaluate(subject));
-      assertEqual('#(name): Stephan', new DrNicTest.Template('\\#(name): #(name)', pattern).evaluate(subject));
+      assertEqual('#{name}: Stephan', new JsUnitTest.Template('\\#{name}: #{name}').evaluate(subject));
+      assertEqual('#(name): Stephan', new JsUnitTest.Template('\\#(name): #(name)', pattern).evaluate(subject));
     }},
     
       </diff>
      <filename>test/unit/template_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
   &lt;script src=&quot;../assets/jsunittest.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
   &lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
-    var Test = DrNicTest;
+    var Test = JsUnitTest;
   &lt;/script&gt;
   &lt;script src=&quot;../../src/assertions.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
   &lt;script src=&quot;../../src/test_case.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
@@ -37,7 +37,7 @@
   new Test.Unit.Runner({
     // replace this with your real tests
     setup: function() {
-      this.testcase = new DrNicTest.Unit.Testcase(&quot;name&quot;);
+      this.testcase = new JsUnitTest.Unit.Testcase(&quot;name&quot;);
     },
     
     // Initial</diff>
      <filename>test/unit/test_case_test.html</filename>
    </modified>
    <modified>
      <diff>@@ -42,6 +42,12 @@
 	&lt;p&gt;This is based off unittest.js from &lt;a href=&quot;http://prototypejs.org&quot;&gt;prototypejs&lt;/a&gt;, except this library has no dependency on prototype.js so there is no chance your code-under-test can conflict with prototype.js or that you might accidently use a prototype.js helper for a library that will be deployed independently off prototypejs.&lt;/p&gt;
 
 
+	&lt;p&gt;There is also a TextMate bundle with snippets for creating the runner and assertions.&lt;/p&gt;
+
+
+	&lt;p&gt;&lt;a href=&quot;tmbundle/JavaScript Unit Testing.tmbundle.tar.gz&quot;&gt;&lt;img src=&quot;images/logo_bundle.png&quot; width=&quot;50&quot; height=&quot;51&quot; alt=&quot;Logo Bundle&quot; border=0&gt;&lt;/a&gt; &amp;#8211; click to download. More information below.&lt;/p&gt;
+
+
 	&lt;h2&gt;Downloading&lt;/h2&gt;
 
 
@@ -80,11 +86,27 @@ example_test.html
 	&lt;p&gt;&lt;img src=&quot;images/passing_prototypejs_unittest_tests.jpg&quot; width=&quot;709&quot; height=&quot;573&quot; alt=&quot;Passing Prototypejs Unittest Tests&quot;&gt;&lt;/p&gt;
 
 
+	&lt;h2&gt;TextMate bundle&lt;/h2&gt;
+
+
+	&lt;p&gt;&lt;a href=&quot;tmbundle/JavaScript Unit Testing.tmbundle.tar.gz&quot;&gt;&lt;img src=&quot;images/logo_bundle.png&quot; width=&quot;50&quot; height=&quot;51&quot; alt=&quot;Logo Bundle&quot; border=0&gt;&lt;/a&gt; &amp;#8211; click to download&lt;/p&gt;
+
+
+	&lt;ul&gt;
+	&lt;li&gt;Mac &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt;: Download, unarchive and open with Finder to install into TextMate&lt;/li&gt;
+		&lt;li&gt;Windows (E Text Editor): Don&amp;#8217;t know. Can someone let me know what the installation instructions are for new/update bundles?&lt;/li&gt;
+	&lt;/ul&gt;
+
+
+	&lt;p&gt;The source for the bundle is available via git: &lt;a href=&quot;http://github.com/drnic/javascript-unittest-tmbundle/tree/master&quot;&gt;http://github.com/drnic/javascript-unittest-tmbundle/tree/master&lt;/a&gt;&lt;/p&gt;
+
+
 	&lt;h2&gt;How to do JavaScript unit testing&lt;/h2&gt;
 
 
 	&lt;ul&gt;
-	&lt;li&gt;&lt;a href=&quot;http://newjs.rubyforge.org&quot;&gt;newjs&lt;/a&gt; &amp;#8211; started new JavaScript projects with in-built test suite&lt;/li&gt;
+	&lt;li&gt;&lt;a href=&quot;http://peepcode.com&quot;&gt;PeepCode: JavaScript Unit Testing&lt;/a&gt; &amp;#8211; coming soon from Dr Nic&lt;/li&gt;
+		&lt;li&gt;&lt;a href=&quot;http://newjs.rubyforge.org&quot;&gt;newjs&lt;/a&gt; &amp;#8211; started new JavaScript projects with in-built test suite&lt;/li&gt;
 		&lt;li&gt;&lt;a href=&quot;http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/&quot;&gt;Autotest for Javascript&lt;/a&gt; &amp;#8211; ideas on a script/js_autotest script (built-in to newjs)&lt;/li&gt;
 	&lt;/ul&gt;
 
@@ -125,7 +147,7 @@ example_test.html
 
 	&lt;p&gt;Comments are welcome. Send an email to &lt;a href=&quot;mailto:drnicwilliams@gmail.com&quot;&gt;Dr Nic Williams&lt;/a&gt; via the &lt;a href=&quot;http://groups.google.com/group/drnic-javascript-projects&quot;&gt;forum&lt;/a&gt;&lt;/p&gt;
     &lt;p class=&quot;coda&quot;&gt;
-      &lt;a href=&quot;drnicwilliams@gmail.com&quot;&gt;Dr Nic Williams&lt;/a&gt;, 20th February 2008&lt;br&gt;
+      &lt;a href=&quot;drnicwilliams@gmail.com&quot;&gt;Dr Nic Williams&lt;/a&gt;, 21st February 2008&lt;br&gt;
       Theme extended from &lt;a href=&quot;http://rb2js.rubyforge.org/&quot;&gt;Paul Battley&lt;/a&gt;
     &lt;/p&gt;
 &lt;/div&gt;</diff>
      <filename>website/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,10 @@ This JavaScript project provides a one-file JavaScript test suite.
 
 This is based off unittest.js from &quot;prototypejs&quot;:http://prototypejs.org, except this library has no dependency on prototype.js so there is no chance your code-under-test can conflict with prototype.js or that you might accidently use a prototype.js helper for a library that will be deployed independently off prototypejs.
 
+There is also a TextMate bundle with snippets for creating the runner and assertions.
+
+&lt;a href=&quot;tmbundle/JavaScript Unit Testing.tmbundle.tar.gz&quot;&gt;&lt;img src=&quot;images/logo_bundle.png&quot; width=&quot;50&quot; height=&quot;51&quot; alt=&quot;Logo Bundle&quot; border=0&gt;&lt;/a&gt; - click to download. More information below.
+
 h2. Downloading
 
 Get the latest here: &lt;a href=&quot;dist/jsunittest.js&quot;&gt;jsunittest.js&lt;/a&gt;
@@ -33,8 +37,18 @@ h2. Same API as unittest.js
 
 &lt;img src=&quot;images/passing_prototypejs_unittest_tests.jpg&quot; width=&quot;709&quot; height=&quot;573&quot; alt=&quot;Passing Prototypejs Unittest Tests&quot;&gt;
 
+h2. TextMate bundle
+
+&lt;a href=&quot;tmbundle/JavaScript Unit Testing.tmbundle.tar.gz&quot;&gt;&lt;img src=&quot;images/logo_bundle.png&quot; width=&quot;50&quot; height=&quot;51&quot; alt=&quot;Logo Bundle&quot; border=0&gt;&lt;/a&gt; - click to download
+
+* Mac OSX: Download, unarchive and open with Finder to install into TextMate
+* Windows (E Text Editor): Don't know. Can someone let me know what the installation instructions are for new/update bundles?
+
+The source for the bundle is available via git: &lt;a href=&quot;http://github.com/drnic/javascript-unittest-tmbundle/tree/master&quot;&gt;http://github.com/drnic/javascript-unittest-tmbundle/tree/master&lt;/a&gt;
+
 h2. How to do JavaScript unit testing
 
+* &quot;PeepCode: JavaScript Unit Testing&quot;:http://peepcode.com - coming soon from Dr Nic
 * &quot;newjs&quot;:http://newjs.rubyforge.org - started new JavaScript projects with in-built test suite
 * &quot;Autotest for Javascript&quot;:http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/ - ideas on a script/js_autotest script (built-in to newjs)
 </diff>
      <filename>website/index.txt</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4cf3b6bce9016471fec3aab43d7815a9bd4d751d</id>
    </parent>
  </parents>
  <author>
    <name>Dr Nic</name>
    <email>drnicwilliams@gmail.com</email>
  </author>
  <url>http://github.com/drnic/jsunittest/commit/d0457eda676ba6ddf821bd583120a54522465da0</url>
  <id>d0457eda676ba6ddf821bd583120a54522465da0</id>
  <committed-date>2008-02-23T17:39:47-08:00</committed-date>
  <authored-date>2008-02-23T17:39:47-08:00</authored-date>
  <message>Added tmbundle link+archive to website</message>
  <tree>5e0bd7cf47347a1dacea0a1bc496668a436b3a4d</tree>
  <committer>
    <name>Dr Nic</name>
    <email>drnicwilliams@gmail.com</email>
  </committer>
</commit>
