<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -3,400 +3,408 @@
  * http://license.appcelerator.com for full copy of the License.
  **/
 
-
-$(document).ready(function()
+(function($)
 {
-	var testCount = 0;
-	var suiteCount = 0;
-	var cellWidth = 0;
-	
-	// processing vars
-	var currentAssertion = 0;
-	var currentSuite = 1;
-	
-	// counts
-	var failureCount = 0;
-	var passedCount = 0;
-	var errorCount = 0;
-	
-	function resetStats()
-	{
-		testCount = 0;
-		suiteCount = 0;
-		failureCount = 0;
-		passedCount = 0;
-		errorCount = 0;
-		
-		$('#status_bar').empty();
-		$(&quot;#results&quot;).empty();
-	}
-	
-	// keyboard shortcuts
-	$(document).bind('keydown',function(e)
+
+	$(document).ready(function()
 	{
-		if (e.keyCode == 37 || e.keyCode==39)
+		var testCount = 0;
+		var suiteCount = 0;
+		var cellWidth = 0;
+
+		// processing vars
+		var currentAssertion = 0;
+		var currentSuite = 1;
+
+		// counts
+		var failureCount = 0;
+		var passedCount = 0;
+		var errorCount = 0;
+
+		function resetStats()
 		{
-			// left
-			var select = $(&quot;#selector select&quot;).get(0);
-			var idx = select.selectedIndex;
-			switch(e.keyCode)
+			testCount = 0;
+			suiteCount = 0;
+			failureCount = 0;
+			passedCount = 0;
+			errorCount = 0;
+
+			$('#status_bar').empty();
+			$(&quot;#results&quot;).empty();
+		}
+
+		// keyboard shortcuts
+		swiss(document).on('keydown',function(e)
+		{
+			if (e.keyCode == 37 || e.keyCode==39)
 			{
-				case 37:
-				{
-					idx-=1;
-					break;
-				}
-				case 39:
+				// left
+				var select = $(&quot;#selector select&quot;).get(0);
+				var idx = select.selectedIndex;
+				switch(e.keyCode)
 				{
-					idx+=1;
-					break;
+					case 37:
+					{
+						idx-=1;
+						break;
+					}
+					case 39:
+					{
+						idx+=1;
+						break;
+					}
 				}
+				if (idx &lt; 0) idx = select.options.length-1;
+				if (idx &gt; select.options.length-1) idx = 0;
+				select.selectedIndex = idx;
+				return false;
 			}
-			if (idx &lt; 0) idx = select.options.length-1;
-			if (idx &gt; select.options.length-1) idx = 0;
-			select.selectedIndex = idx;
-			return false;
-		}
-		else if (e.keyCode == 82)
+			else if (e.keyCode == 82)
+			{
+				if (e.metaKey || e.ctrlKey) return; // command+r is reload, ignore these
+				// run is 'r' or runall is 'shift+r'
+				var id = &quot;#run&quot; + (e.shiftKey ? &quot;all&quot;:&quot;&quot;);
+				$(id).click();
+				return false;
+			}
+		});
+
+		$.getJSON(App.docRoot + 'tests/manifest.js',function(json)
 		{
-			if (e.metaKey || e.ctrlKey) return; // command+r is reload, ignore these
-			// run is 'r' or runall is 'shift+r'
-			var id = &quot;#run&quot; + (e.shiftKey ? &quot;all&quot;:&quot;&quot;);
-			$(id).click();
-			return false;
-		}
-	});
-	
-	var lastSuite = null;
-	$.getJSON(AppC.docRoot+'tests/manifest.js',function(json)
-	{
-		$.each(json.suites,function(i)
-		{	
-			$.getScript(AppC.docRoot+'tests/'+this, function() {
-					if (i == json.suites.length - 1) {
-						TestMonkey.fireEventAsync('manifestLoaded');
-					}
+			$.each(json.suites,function()
+			{
+				$.getScript(App.docRoot + 'tests/'+this);
 			});
 		});
-	});
-	
-	$(&quot;#run&quot;).on(&quot;click&quot;,function()
-	{
-		var test = $(&quot;#selector select&quot;).val();
-		$.cookie('testmonkey.test',test); // remember the last test we ran
-		testRunner(test);
-	});
 
-	$(&quot;#runall&quot;).on(&quot;click&quot;,function()
-	{
-		var select = $(&quot;#selector select&quot;).get(0);
-		var tests = [];
-		for (var c=0;c&lt;select.length;c++)
+		$(&quot;#run&quot;).click(function()
 		{
-			tests.push(select.options[c].text);
-		}
-		testRunner(tests);
-	});
-	
-	function leadingWhitepsace(code)
-	{
-		var count = 0;
-		var spacing = '';
-		while (true)
+			resetStats();
+			$('#test_summary_title').show();
+			var test = $(&quot;#selector select&quot;).val();
+			//$.cookie('testmonkey.test',test); // remember the last test we ran
+			testRunner(test);
+		});
+
+		$(&quot;#runall&quot;).click(function()
 		{
-			var ch = code.charAt(count);
-			if (ch != ' ')
+			resetStats();
+			$('#test_summary_title').show();
+			var select = $(&quot;#selector select&quot;).get(0);
+			var tests = [];
+			for (var c=0;c&lt;select.length;c++)
 			{
-				break;
+				tests.push(select.options[c].text);
 			}
-			count++;
-			spacing+=' ';
-		}
-		return spacing;
-	}
-	
-	var idCounter = 1;
-	TestMonkey.installTestRunnerPlugin({
-		onEvent: function(name,result)
+			testRunner(tests);
+		});
+
+		function leadingWhitepsace(code)
 		{
-			switch(name)
+			var count = 0;
+			var spacing = '';
+			while (true)
 			{
-				case 'addTestSuite':
+				var ch = code.charAt(count);
+				if (ch != ' ')
 				{
-					var lastTest = $.cookie('testmonkey.test');
-					var sel = '';
-					if (lastTest == result) sel = 'selected';
-					
-					$(&quot;#selector select&quot;).append(&quot;&lt;option &quot;+sel+&quot;&gt;&quot;+result+&quot;&lt;/option&gt;&quot;);
-					
 					break;
 				}
-				case 'beforeTestSuite':
-				{
-					break;
-				}
-				case 'afterAssertionCount':
-				{
-					// set assertion count total
-					$('#assert_count').html(result)
-					
-					// display
-					$('#summary').css('display','block')
-					
-					// reset 
-					$('#status_bar').empty();
-					currentAssertion = 0;
-					currentSuite  = 1;
-					
-					// calculate cell width and pre-populate
-					var width = $('#status_bar').width();
-					var totalCellWidth = (width -20) /result;
-					cellWidth = totalCellWidth - 5;
+				count++;
+				spacing+=' ';
+			}
+			return spacing;
+		}
 
-					for (var i=0;i&lt;result;i++)
+		var idCounter = 1;
+		TestMonkey.installTestRunnerPlugin({
+			onEvent: function(name,result)
+			{
+				switch(name)
+				{
+					case 'addTestSuite':
 					{
-						$('#status_bar').append('&lt;div id=&quot;assert_bar_'+i+'&quot; style=&quot;float:left;background-color:#ccc;margin-left:5px;height:15px;width:'+cellWidth+'px&quot;&gt;&lt;/div&gt;');
+					//	var lastTest = $.cookie('testmonkey.test');
+						var sel = '';
+				//		if (lastTest == result) sel = 'selected';
+						$(&quot;#selector select&quot;).append(&quot;&lt;option &quot;+sel+&quot;&gt;&quot;+result+&quot;&lt;/option&gt;&quot;);
+						break;
 					}
-					break;
-				}
-				case 'afterTestRunner':
-				{
-					$(&quot;.testdetail&quot;).click(function()
+					case 'beforeTestSuite':
 					{
-						var child = $(this).children('.result');
-						$(child).css('display') == 'none' ? $(child).slideDown() : $(child).slideUp();
-					});
-					break;
-				}
-				case 'beforeTestRunner':
-				{
-					resetStats();
-					$('#test_summary_title').show();
-						
-					suiteCount = result.length;					
-					$('#suite_count').html(suiteCount);
-					for (var i=0;i&lt;suiteCount;i++)
+						break;
+					}
+					case 'afterAssertionCount':
 					{
-						$(&quot;#results&quot;).append(&quot;&lt;div id='testsuite_&quot;+ (i+1) +&quot;' class='testsuite'&gt;&lt;div class='test_count' id='passed_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='test_count' id='failed_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='test_count' id='error_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='testsuite_name'&gt;&lt;a href='#' id='testsuite_detail_link_&quot;+(i+1)+&quot;'&gt;&quot;+result[i][0]+&quot;&lt;/a&gt;&lt;/div&gt;&lt;div style='clear:both;padding-top:20px;' id='testsuite_detail_&quot;+(i+1)+&quot;'&gt;&lt;div id='testsuite_detail_error_&quot;+(i+1)+&quot;' style='display:none'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_failed_&quot;+(i+1)+&quot;' style='display:none'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_passed_&quot;+(i+1)+&quot;' style='display:none;'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_all_&quot;+(i+1)+&quot;' style='display:none;'&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;);						
+						// set assertion count total
+						$('#assert_count').html(result)
+
+						// display
+						$('#summary').css('display','block')
+
+						// reset 
+						$('#status_bar').empty();
+						currentAssertion = 0;
+						currentSuite  = 1;
 
-						$('#testsuite_detail_link_' + (i+1)).click(function()
+						// calculate cell width and pre-populate
+						var width = $('#status_bar').width();
+						var totalCellWidth = (width -20) /result;
+						cellWidth = totalCellWidth - 5;
+						if (result &lt; 100)
 						{
-							var suite = this.id.substring(this.id.length-1)
-							var el = $('#testsuite_detail_all_' + suite);
-							var errorDiv = $('#testsuite_detail_error_' + suite);
-							var failedDiv = $('#testsuite_detail_failed_' + suite);
-							var passedDiv = $('#testsuite_detail_passed_' + suite);
-							if (el.css('display') == 'block') 
+							$('#status_bar').show();
+							$('#status_bar_title').show();
+							for (var i=0;i&lt;result;i++)
 							{
-								el.slideUp() 
+								$('#status_bar').append('&lt;div id=&quot;assert_bar_'+i+'&quot; style=&quot;float:left;background-color:#ccc;margin-left:5px;height:15px;width:'+cellWidth+'px&quot;&gt;&lt;/div&gt;');
 							}
-							else
-							{
-								el.slideDown();
-								errorDiv.slideUp();
-								failedDiv.slideUp();
-								passedDiv.slideUp();
-							} 
+							
+						}
+						else
+						{
+							$('#status_bar').hide();
+							$('#status_bar_title').hide();
+						}
+						break;
+					}
+					case 'afterTestRunner':
+					{
+						$(&quot;.testdetail&quot;).click(function()
+						{
+							var child = $(this).children('.result');
+							$(child).css('display') == 'none' ? $(child).slideDown() : $(child).slideUp();
 						});
-
-						$('#passed_count_' + (i+1)).click(function()
+						break;
+					}
+					case 'beforeTestRunner':
+					{
+						suiteCount = result.length;					
+						$('#suite_count').html(suiteCount);
+						for (var i=0;i&lt;suiteCount;i++)
 						{
-							var suite = this.id.substring(this.id.length-1)
-							var el = $('#testsuite_detail_passed_' + suite);
-							var errorDiv = $('#testsuite_detail_error_' + suite);
-							var failedDiv = $('#testsuite_detail_failed_' + suite);
-							var all = $('#testsuite_detail_all_' + suite);
-							if (el.css('display') == 'block') 
+							$(&quot;#results&quot;).append(&quot;&lt;div id='testsuite_&quot;+ (i+1) +&quot;' class='testsuite'&gt;&lt;div class='test_count' id='passed_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='test_count' id='failed_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='test_count' id='error_count_&quot; + (i+1) + &quot;'&gt;0&lt;/div&gt;&lt;div class='testsuite_name'&gt;&lt;a href='#' id='testsuite_detail_link_&quot;+(i+1)+&quot;'&gt;&quot;+result[i][0]+&quot;&lt;/a&gt;&lt;/div&gt;&lt;div style='clear:both;padding-top:20px;' id='testsuite_detail_&quot;+(i+1)+&quot;'&gt;&lt;div id='testsuite_detail_error_&quot;+(i+1)+&quot;' style='display:none'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_failed_&quot;+(i+1)+&quot;' style='display:none'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_passed_&quot;+(i+1)+&quot;' style='display:none;'&gt;&lt;/div&gt;&lt;div id='testsuite_detail_all_&quot;+(i+1)+&quot;' style='display:none;'&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&quot;);						
+
+							$('#testsuite_detail_link_' + (i+1)).click(function()
 							{
-								el.slideUp(); 
-							}
-							else
+								var suite = this.id.substring(this.id.length-1)
+								var el = $('#testsuite_detail_all_' + suite);
+								var errorDiv = $('#testsuite_detail_error_' + suite);
+								var failedDiv = $('#testsuite_detail_failed_' + suite);
+								var passedDiv = $('#testsuite_detail_passed_' + suite);
+								if (el.css('display') == 'block') 
+								{
+									el.slideUp() 
+								}
+								else
+								{
+									el.slideDown();
+									errorDiv.slideUp();
+									failedDiv.slideUp();
+									passedDiv.slideUp();
+								} 
+							});
+
+							$('#passed_count_' + (i+1)).click(function()
 							{
-								el.slideDown();
-								errorDiv.slideUp();
-								failedDiv.slideUp();
-								all.slideUp();
-							} 
-						});
-						$('#failed_count_' + (i+1)).click(function()
-						{
-							var suite = this.id.substring(this.id.length-1)
-							var el = $('#testsuite_detail_failed_' + suite);
-							var errorDiv = $('#testsuite_detail_error_' + suite);
-							var passedDiv = $('#testsuite_detail_passed_' + suite);
-							var all = $('#testsuite_detail_all_' + suite);
-							if (el.css('display') == 'block') 
+								var suite = this.id.substring(this.id.length-1)
+								var el = $('#testsuite_detail_passed_' + suite);
+								var errorDiv = $('#testsuite_detail_error_' + suite);
+								var failedDiv = $('#testsuite_detail_failed_' + suite);
+								var all = $('#testsuite_detail_all_' + suite);
+								if (el.css('display') == 'block') 
+								{
+									el.slideUp(); 
+								}
+								else
+								{
+									el.slideDown();
+									errorDiv.slideUp();
+									failedDiv.slideUp();
+									all.slideUp();
+								} 
+							});
+							$('#failed_count_' + (i+1)).click(function()
 							{
-								el.slideUp(); 
-							}
-							else
+								var suite = this.id.substring(this.id.length-1)
+								var el = $('#testsuite_detail_failed_' + suite);
+								var errorDiv = $('#testsuite_detail_error_' + suite);
+								var passedDiv = $('#testsuite_detail_passed_' + suite);
+								var all = $('#testsuite_detail_all_' + suite);
+								if (el.css('display') == 'block') 
+								{
+									el.slideUp(); 
+								}
+								else
+								{
+									el.slideDown();
+									errorDiv.slideUp();
+									passedDiv.slideUp();
+									all.slideUp();
+								} 
+
+							});
+							$('#error_count_' + (i+1)).click(function()
 							{
-								el.slideDown();
-								errorDiv.slideUp();
-								passedDiv.slideUp();
-								all.slideUp();
-							} 
+								var suite = this.id.substring(this.id.length-1)
+								var el = $('#testsuite_detail_error_' + suite);
+								var passedDiv = $('#testsuite_detail_passed_' + suite);
+								var failedDiv = $('#testsuite_detail_failed_' + suite);
+								var all = $('#testsuite_detail_all_' + suite);				
+								if (el.css('display') == 'block') 
+								{
+									el.slideUp() 
+								}
+								else
+								{
+									el.slideDown();
+									failedDiv.slideUp();
+									passedDiv.slideUp();
+									all.slideUp();
+								} 
 
-						});
-						$('#error_count_' + (i+1)).click(function()
+							});
+						}
+						break;
+					}
+					case 'beforeTestCases':
+					{
+						testCount = result.length;
+						$('#test_count').html(result.length);
+						break;
+					}
+					case 'afterTestSuite':
+					{
+						currentSuite++;
+						failureCount = 0;
+						passedCount = 0;
+						errorCount = 0;
+
+						break;
+					}
+					case 'afterTestCase':
+					{
+						try
 						{
-							var suite = this.id.substring(this.id.length-1)
-							var el = $('#testsuite_detail_error_' + suite);
-							var passedDiv = $('#testsuite_detail_passed_' + suite);
-							var failedDiv = $('#testsuite_detail_failed_' + suite);
-							var all = $('#testsuite_detail_all_' + suite);				
-							if (el.css('display') == 'block') 
+							var errorMessage = result.testcase;
+							var failedCount = 0;
+							$.each(result.results,function()
+							{							
+								failedCount +=this.result ? 0 : 1;
+								var cls = this.result ? 'passed' : 'failed';
+								var idx = errorMessage.indexOf(this.assert);
+								if (this.error)
+								{
+									errorCount++;
+									$('#error_count_'+currentSuite).html(errorCount).addClass('error_count');				
+									$('#assert_bar_' + currentAssertion).css('background-color','red');
+								}
+								else if (cls=='passed')
+								{
+									passedCount++
+									$('#passed_count_'+currentSuite).html(passedCount).addClass('passed_count');
+									$('#assert_bar_' + currentAssertion).css('background-color','green');
+								}
+								else 
+								{
+									failureCount++
+									$('#failed_count_'+currentSuite).html(failureCount).addClass('failed_count');
+									$('#assert_bar_' + currentAssertion).css('background-color','orange');
+								}
+								currentAssertion++;
+								if (idx != -1)
+								{
+									var newMessage = errorMessage.substring(0,idx);
+									var line = errorMessage.substring(idx,idx+this.assert.length);
+									newMessage+=leadingWhitepsace(line);
+									newMessage+='&lt;span class=&quot;'+cls+'&quot;&gt;';
+									newMessage+=$.trim(line);
+									newMessage+='&lt;/span&gt;';
+									if (this.error)
+									{
+										newMessage+='&lt;span class=&quot;error&quot;&gt;'+this.error+'&lt;/span&gt;';	
+									}
+									else if (!this.result &amp;&amp; this.message)
+									{
+										newMessage+='&lt;span class=&quot;error&quot;&gt;'+this.message+'&lt;/span&gt;';	
+									}
+									newMessage+=errorMessage.substring(idx+this.assert.length);
+									errorMessage = newMessage;
+								}
+							});
+							if (result.explicitFailure)
 							{
-								el.slideUp() 
+								if (failedCount==0) failedCount=1;
+								var re = /fail[\s]?\((.*)?\)/;
+								var matches = [];
+								errorMessage=$.gsub(errorMessage,re,function(m)
+								{
+									if (m[0].indexOf(result.message) &gt; 0)
+									{
+										matches.push(extractCodeLine(errorMessage,m[0]));
+									}
+									return m[0];
+								});
+								$.each(matches,function()
+								{
+									var idx = errorMessage.indexOf(this);
+									var newMessage = errorMessage.substring(0,idx);
+									var line = errorMessage.substring(idx,idx+this.length);
+									newMessage+=leadingWhitepsace(line);
+									newMessage+='&lt;span class=&quot;failed&quot;&gt;';
+									newMessage+=$.trim(line);
+									newMessage+='&lt;/span&gt;';
+									newMessage+=errorMessage.substring(idx+this.length);
+									errorMessage=newMessage;
+								});
 							}
-							else
+							if (typeof(result.timeout)!='undefined')
 							{
-								el.slideDown();
-								failedDiv.slideUp();
-								passedDiv.slideUp();
-								all.slideUp();
-							} 
-
-						});
-					}
-					break;
-				}
-				case 'beforeTestCases':
-				{
-					testCount = result.length;
-					$('#test_count').html(result.length);
-					break;
-				}
-				case 'afterTestSuite':
-				{
-					currentSuite++;
-					failureCount = 0;
-					passedCount = 0;
-					errorCount = 0;
-					
-					break;
-				}
-				case 'afterTestCase':
-				{
-					try
-					{
-						var errorMessage = result.testcase;
-						var failedCount = 0;
-						$.each(result.results,function()
-						{							
-							failedCount +=this.result ? 0 : 1;
-							var cls = this.result ? 'passed' : 'failed';
-							var idx = errorMessage.indexOf(this.assert);
-							if (this.error)
+								errorMessage = 'testAsync(&quot;' + result.name + '&quot;,'+result.timeout+',&lt;span class=&quot;fn&quot;&gt;'+errorMessage+'&lt;/span&gt;);'
+							}
+							else
 							{
-								errorCount++;
-								$('#error_count_'+currentSuite).html(errorCount).addClass('error_count');				
-								$('#assert_bar_' + currentAssertion).css('background-color','red');
+								errorMessage = 'test(&quot;' + result.name + '&quot;,&lt;span class=&quot;fn&quot;&gt;'+errorMessage+'&lt;/span&gt;);'
 							}
-							else if (cls=='passed')
+							var id = idCounter++;
+							var html = &quot;&lt;div class='testdetail'&gt;&lt;div class='testresult &quot;+(result.failed?'failed':'passed')+&quot;'&gt;&quot;+(result.error ? 'Error' : result.failed?('Failed &lt;span class=&quot;count&quot;&gt;('+failedCount+')&lt;/span&gt;'):'Passed')+&quot;&lt;/div&gt;&lt;div&gt;&quot;+result.name+&quot;&lt;/div&gt;&lt;div class='clear'&gt;&lt;/div&gt;&quot;; 
+							html+=&quot;&lt;div  style='display:none' class='result &quot;+(result.error?'error':'')+&quot;'&gt;&quot;;
+							html+=errorMessage;
+							if (result.error)
 							{
-								passedCount++
-								$('#passed_count_'+currentSuite).html(passedCount).addClass('passed_count');
-								$('#assert_bar_' + currentAssertion).css('background-color','green');
+								html+=&quot;&lt;div class='error_msg'&gt;&quot; + result.error + &quot;&lt;/div&gt;&quot;;
 							}
-							else 
+							if (result.logs)
 							{
-								failureCount++
-								$('#failed_count_'+currentSuite).html(failureCount).addClass('failed_count');
-								$('#assert_bar_' + currentAssertion).css('background-color','orange');
+								html+=&quot;&lt;div class='logs'&gt;&lt;h1&gt;Test log results:&lt;/h1&gt;&quot; + result.logs.join(&quot;\n&quot;) + &quot;&lt;/div&gt;&quot;;
 							}
-							currentAssertion++;
-							if (idx != -1)
+							html+='&lt;div class=&quot;html&quot;&gt;&lt;h1&gt;HTML page (after test):&lt;/h1&gt;&lt;pre&gt;&lt;code&gt;'+result.after_dom+'&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;';
+							html+=&quot;&lt;/div&gt;&lt;/div&gt;&quot;;
+
+							$('#testsuite_detail_all_'+currentSuite).append(html)
+							if (result.error)
 							{
-								var newMessage = errorMessage.substring(0,idx);
-								var line = errorMessage.substring(idx,idx+this.assert.length);
-								newMessage+=leadingWhitepsace(line);
-								newMessage+='&lt;span class=&quot;'+cls+'&quot;&gt;';
-								newMessage+=$.trim(line);
-								newMessage+='&lt;/span&gt;';
-								if (this.error)
-								{
-									newMessage+='&lt;span class=&quot;error&quot;&gt;'+this.error+'&lt;/span&gt;';	
-								}
-								else if (!this.result &amp;&amp; this.message)
-								{
-									newMessage+='&lt;span class=&quot;error&quot;&gt;'+this.message+'&lt;/span&gt;';	
-								}
-								newMessage+=errorMessage.substring(idx+this.assert.length);
-								errorMessage = newMessage;
+								$('#testsuite_detail_error_' + currentSuite).append(html)
 							}
-						});
-						if (result.explicitFailure)
-						{
-							if (failedCount==0) failedCount=1;
-							var re = /fail[\s]?\((.*)?\)/;
-							var matches = [];
-							errorMessage=$.gsub(errorMessage,re,function(m)
+							else if (result.failed)
 							{
-								if (m[0].indexOf(result.message) &gt; 0)
-								{
-									matches.push(extractCodeLine(errorMessage,m[0]));
-								}
-								return m[0];
-							});
-							$.each(matches,function()
+								$('#testsuite_detail_failed_' + currentSuite).append(html)
+							}
+							else
 							{
-								var idx = errorMessage.indexOf(this);
-								var newMessage = errorMessage.substring(0,idx);
-								var line = errorMessage.substring(idx,idx+this.length);
-								newMessage+=leadingWhitepsace(line);
-								newMessage+='&lt;span class=&quot;failed&quot;&gt;';
-								newMessage+=$.trim(line);
-								newMessage+='&lt;/span&gt;';
-								newMessage+=errorMessage.substring(idx+this.length);
-								errorMessage=newMessage;
-							});
-						}
-						if (typeof(result.timeout)!='undefined')
-						{
-							errorMessage = 'testAsync(&quot;' + result.name + '&quot;,'+result.timeout+',&lt;span class=&quot;fn&quot;&gt;'+errorMessage+'&lt;/span&gt;);'
-						}
-						else
-						{
-							errorMessage = 'test(&quot;' + result.name + '&quot;,&lt;span class=&quot;fn&quot;&gt;'+errorMessage+'&lt;/span&gt;);'
-						}
-						var id = idCounter++;
-						var html = &quot;&lt;div class='testdetail'&gt;&lt;div class='testresult &quot;+(result.failed?'failed':'passed')+&quot;'&gt;&quot;+(result.error ? 'Error' : result.failed?('Failed &lt;span class=&quot;count&quot;&gt;('+failedCount+')&lt;/span&gt;'):'Passed')+&quot;&lt;/div&gt;&lt;div&gt;&quot;+result.name+&quot;&lt;/div&gt;&lt;div class='clear'&gt;&lt;/div&gt;&quot;; 
-						html+=&quot;&lt;div  style='display:none' class='result &quot;+(result.error?'error':'')+&quot;'&gt;&quot;;
-						html+=errorMessage;
-						if (result.error)
-						{
-							html+=&quot;&lt;div class='error_msg'&gt;&quot; + result.error + &quot;&lt;/div&gt;&quot;;
-						}
-						if (result.logs)
-						{
-							html+=&quot;&lt;div class='logs'&gt;&lt;h1&gt;Test log results:&lt;/h1&gt;&quot; + result.logs.join(&quot;\n&quot;) + &quot;&lt;/div&gt;&quot;;
-						}
-						html+='&lt;div class=&quot;html&quot;&gt;&lt;h1&gt;HTML page (after test):&lt;/h1&gt;&lt;pre&gt;&lt;code&gt;'+$.escapeHTML(result.after_dom)+'&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;';
-						html+=&quot;&lt;/div&gt;&lt;/div&gt;&quot;;
-
-						$('#testsuite_detail_all_'+currentSuite).append(html)
-						if (result.error)
-						{
-							$('#testsuite_detail_error_' + currentSuite).append(html)
-						}
-						else if (result.failed)
-						{
-							$('#testsuite_detail_failed_' + currentSuite).append(html)
+								$('#testsuite_detail_passed_' + currentSuite).append(html)							
+							}
 						}
-						else
+						catch (E)
 						{
-							$('#testsuite_detail_passed_' + currentSuite).append(html)							
+							App.Util.Logger.error(E);
 						}
+						break;
 					}
-					catch (E)
-					{
-						$.error(E);
-					}
-					break;
 				}
 			}
-		}
+		});
 	});
-});
 
+	
+})(jQuery)</diff>
      <filename>public/javascripts/driver.js</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@ window.TestMonkey = {};
 		AppC.config.report_stats=false;
 	}
 		
-	var testRunnerPlugins = [];
+	var testRunnerPlugin = null;
 	
 	/**
 	 * the plugin is responsible for driving the UI and doing
@@ -24,7 +24,7 @@ window.TestMonkey = {};
 	 */
 	TestMonkey.installTestRunnerPlugin = function(callback)
 	{
-		testRunnerPlugins.push(callback);
+		testRunnerPlugin = callback;
 	};
 	
 	var assertions = {};
@@ -45,6 +45,10 @@ window.TestMonkey = {};
 	{
 		return runAssertion(args[0]);
 	});
+	TestMonkey.installAssertionType('After',function(win,frame,testcase,assertion,args)
+	{		
+		return runAssertion(args[0]);
+	});
 	
 	TestMonkey.installAssertionType('Visible',function(win,frame,testcase,assertion,args)
 	{
@@ -142,7 +146,7 @@ window.TestMonkey = {};
 		}
 		if (!lastPubData)
 		{
-			return [false,name+&quot; missing data payload: &quot;+$.toJSON(data)];
+			return [false,name+&quot; missing data payload: &quot;+swiss.toJSON(data)];
 		}
 		if (data)
 		{
@@ -159,15 +163,14 @@ window.TestMonkey = {};
 				}
 			}
 		}
-		return [true,name+'=&gt;'+$.toJSON(data)];
+		return [true,name+'=&gt;'+swiss.toJSON(data)];
 	});
 
-	TestMonkey.fireEvent = function()
+	function fireEvent()
 	{
-		var name = arguments[0], args = arguments.length &gt; 1 ? $.makeArray(arguments).slice(1) : [];
-		$.each(testRunnerPlugins, function()
+		if (testRunnerPlugin)
 		{
-			var testRunnerPlugin = this;
+			var name = arguments[0], args = arguments.length &gt; 1 ? $.makeArray(arguments).slice(1) : [];
 			var fn = testRunnerPlugin[name];
 			if (fn)
 			{
@@ -180,32 +183,7 @@ window.TestMonkey = {};
 				args.unshift(name);
 				fn.apply(testRunnerPlugin,args);
 			}
-			else
-			{
-				fn = testRunnerPlugin['on' + name.substring(0,1).toUpperCase() + name.substring(1)];
-				if (fn) {
-					fn.apply(testRunnerPlugin, args);
-				}
-			}
-		});
-	}
-	
-	TestMonkey.fireEventAsync = function()
-	{
-		var timeout = 1000;
-		var args = [];
-		if (arguments.length &gt; 0) {
-			if (typeof(arguments[0]) == 'number') {
-				timeout = arguments[0];
-				args = $.makeArray(arguments).slice(1);
-			} else {
-				args = $.makeArray(arguments);
-			}
 		}
-		
-		setTimeout(function () {
-			TestMonkey.fireEvent.apply(null, args);
-		}, timeout);
 	}
 
 	var currentDescriptor = null, currentSuite = null;
@@ -224,14 +202,14 @@ window.TestMonkey = {};
 		var it = typeof(arguments[0].push)=='function' ? arguments[0] : arguments;
 		$.each(it,function()
 		{
-			var descriptor = scope.testSuites[this];
+			var descriptor = testSuites[this];
 			if (descriptor)
 			{
 				suites.push([this,descriptor]);
 			}
 		});
 
-		TestMonkey.fireEvent('beforeTestRunner',suites);
+		fireEvent('beforeTestRunner',suites);
 		
 		
 		// we first have to run through them so all the tests can be recorded
@@ -254,13 +232,14 @@ window.TestMonkey = {};
 
 		// set it to the first one in the list
 		currentSuite = null;
-		if (currentSuite) TestMonkey.fireEvent('beforeTestSuite',suites[0][0]);
+		if (currentSuite) fireEvent('beforeTestSuite',suites[0][0]);
 
-		TestMonkey.fireEvent('beforeTestCases',testCases);
+		fireEvent('beforeTestCases',testCases);
 
-		TestMonkey.fireEvent('beforeAssertionCount');
+		fireEvent('beforeAssertionCount');
 		var assertCount = 0;
 		
+		
 		$.each(testCases,function()
 		{
 			var testcase = this;
@@ -269,7 +248,7 @@ window.TestMonkey = {};
 			testcase.ready = true;
 		});
 		
-		TestMonkey.fireEvent('afterAssertionCount',assertCount);
+		fireEvent('afterAssertionCount',assertCount);
 		
 		var total = 0, loaded = 0;
 
@@ -326,15 +305,15 @@ window.TestMonkey = {};
 			{
 				if (currentSuite)
 				{
-					TestMonkey.fireEvent('afterTestSuite',currentSuite);
-					var currentD = scope.testSuites[currentSuite];
+					fireEvent('afterTestSuite',currentSuite);
+					var currentD = testSuites[currentSuite];
 				}
 				currentSuite = nextTestCase.suite;
-				TestMonkey.fireEvent('beforeTestSuite',currentSuite);
+				fireEvent('beforeTestSuite',currentSuite);
 			}
 			nextTestCase.ready = false;
 			var testcase = nextTestCase;
-			TestMonkey.fireEvent('beforeTestCase',testcase);
+			fireEvent('beforeTestCase',testcase);
 			var descriptor = testcase.descriptor;
 			var error = false;
 			try
@@ -353,11 +332,11 @@ window.TestMonkey = {};
 		{
 			if (currentSuite)
 			{
-				TestMonkey.fireEvent('afterTestSuite',currentSuite);
-				var currentD = scope.testSuites[currentSuite];
+				fireEvent('afterTestSuite',currentSuite);
+				var currentD = testSuites[currentSuite];
 			}
-			TestMonkey.fireEvent('afterTestCases',testCases);
-			TestMonkey.fireEvent('afterTestRunner');
+			fireEvent('afterTestCases',testCases);
+			fireEvent('afterTestRunner');
 		}
 	}
 
@@ -379,14 +358,24 @@ window.TestMonkey = {};
 	{
 		var win = arguments[0], frame = arguments[1];
 		var idx = arguments[2], type = arguments[3]||'';
-		var args = $.makeArray(arguments).splice(4);
+		
+		// NWW: IE HAD A PROBLEM  WITH SINGLE ARG SPLICE, ADDED 2nd ARG
+		var args = null;
+		if (App.Browser.isIE)
+		{
+			args = $.makeArray(arguments).splice(4,4);
+		}
+		else
+		{
+			args = $.makeArray(arguments).splice(4);
+		}
 		var result = false;
 		var testcase = currentTestCase;
 		var assert = testcase.asserts[idx];
-//		alert('internalAssert='+win+',frame='+frame+',idx='+idx+',type='+type);
+
+		var handler = assertions[type];
 		try
 		{
-			var handler = assertions[type];
 			if (handler)
 			{
 				result = handler.apply(this,[win,frame,testcase,assert,args]);
@@ -398,19 +387,34 @@ window.TestMonkey = {};
 		{
 			testcase.results.push({assert:assert,result:false,error:E,message:String(E),idx:idx});
 		}
+		
+		// call end if assetion type is After
+		// and the 'end' argument is true
+		if (type == 'After' &amp;&amp; args[2] == true)
+		{
+			testMonkeyScope.end(!result,false);
+		}
 	}
 	
 	function getHtml(f)
 	{
-		var n = $(f.get(0).cloneNode(true));
-		// pull out the firebug injected HTML since we don't really want to see that
-		n.find('#_firebugConsoleInjector,#_firebugConsole').remove();
-		return '&lt;html&gt;\n'+jQuery(n).html()+'\n&lt;/html&gt;';
+		// var n = $(f.get(0).cloneNode(true));
+		// // pull out the firebug injected HTML since we don't really want to see that
+		// n.find('#_firebugConsoleInjector,#_firebugConsole').remove();
+		// return '&lt;html&gt;\n'+jQuery(n).html()+'\n&lt;/html&gt;';
+		return '';
 	}
 	
 	var currentTestCase = null;
 	var currentTestCaseId = 1;
 
+	// //TODO: needed anymore?
+	// $.fn.assertTestCase = function()
+	// {
+	// 	internalAssert.apply(this,arguments);
+	// 	return this;
+	// };
+	// 
 	function executeTest(testcase,descriptor)
 	{
 		currentTestCase = testcase;
@@ -465,6 +469,7 @@ window.TestMonkey = {};
 			}
 			this.error = function(E)
 			{
+				
 				testcase.failed = true;
 				testcase.error = E;
 				testcase.message = &quot;Exception running testcase: &quot;+E;
@@ -473,6 +478,9 @@ window.TestMonkey = {};
 			}
 			this.fail=function(msg)
 			{
+				App.Util.Logger.info('failed')
+				
+
 				testcase.message = msg;
 				testcase.explicitFailure = true;
 				testcase.results.push({'result':false,'message':testcase.message});
@@ -502,14 +510,17 @@ window.TestMonkey = {};
 					}
 				}
 				self.teardown();
+				
 				var f = getFrame();
-				f.find('#__testMonkeySDK,#__testMonkeyJS').remove();
+				//f.find('#__testMonkeySDK,#__testMonkeyJS').remove();
+				f.find('.testmonkey_libs').remove();
+				
 				testcase.after_dom = getHtml(f);
 				try
 				{
 					if (!testcase.running) return;
 					testcase.running = false;
-					if (failed)
+					if (failed == true)
 					{
 						testcase.failed = true;
 					}
@@ -538,9 +549,10 @@ window.TestMonkey = {};
 						testcase.message = &quot;Timed out&quot;;
 						testcase.results.push({'result':false,'message':testcase.message});
 					}
-					TestMonkey.fireEvent('afterTestCase',testcase,descriptor);
+					fireEvent('afterTestCase',testcase,descriptor);
 					removeTestFrame(id);
 					executeNextTestCase();
+					
 				}
 				catch (E)
 				{
@@ -552,67 +564,89 @@ window.TestMonkey = {};
 		// we keep it at global scope so the execution environment can
 		// easily use the running scope instance
 		window.testMonkeyScope = new window.testScope;
-		
-		try
+	
+		$.getJSON(App.docRoot + 'tests/manifest.js',function(json)
 		{
-			jQuery(&quot;&lt;iframe style='position:absolute;left:-10px;top:-10px;height:1px;width:1px;' id='&quot; + (id)+&quot;'&gt;&lt;/iframe&gt;&quot;).appendTo(&quot;body&quot;);
-			var body = jQuery(&quot;#&quot;+id).contents().find(&quot;body&quot;).get(0);
+			var code = '\n';
 			
-			if (!body) body = jQuery(&quot;#&quot;+id).contents().find(&quot;html&quot;).get(0);
-			
-			var doc = body.ownerDocument;
-			
-			var setupCode = &quot;&quot; + 
-			&quot;(function($,scope){\n&quot;+
-			&quot; $.noConflict();\n&quot;+
-			&quot; $(function(){\n &quot;+	
-			&quot;    $.fn.assertTestCase = function(){ return scope.assertTestCase.apply(this,arguments) }\n&quot; + 
-			&quot;    function log() { return scope.log.apply(this,arguments) }\n&quot; + 
-			&quot;    function end() { return scope.end.apply(this,arguments) }\n&quot; + 
-			&quot;    function fail() { return scope.fail.apply(this,arguments) }\n&quot; + 
-			&quot;    function error() { return scope.error.apply(this,arguments) }\n&quot; + 
-			&quot;    function assertTestCase() { return scope.assertTestCase.apply(this,arguments) }\n&quot; + 
-			&quot;    scope.setup.call(scope.descriptor,window);\n&quot; + 
-			&quot;    try{\n&quot; + 
-			'      ('+testcase.code+').call(scope.descriptor);\n' + 
-			&quot;    }catch(E){\n&quot; + 
-			&quot;      scope.error(E);\n&quot; + 
-			&quot;    }\n&quot; + 
-			&quot;    scope.completed();\n&quot; + 
-			&quot; });\n &quot; + 
-			&quot;})(window.jQuery,parent.window.testMonkeyScope);\n&quot;;
-
-			// inject our library
-			var code = &quot;&lt;script id=\&quot;__testMonkeySDK\&quot; type=\&quot;text/javascript\&quot; src=\&quot;&quot; + AppC.sdkJS + &quot;\&quot;&gt;&lt;/script&gt;\n&quot;;
-
-			// now inject our test execution environment
-			code += &quot;&lt;script id=\&quot;__testMonkeyJS\&quot; type=\&quot;text/javascript\&quot;&gt;&quot; + setupCode + &quot;&lt;/script&gt;\n&quot;;
-
-			var jscode = descriptor.content.replace('####MARKER####',code);
-
-			$.info(jscode);
-
-			if (typeof(testcase.timeout)!='undefined')
+			// load third-party libs needed for tests
+			$.each(json.libs,function()
+			{
+				code += &quot;&lt;script type=\&quot;text/javascript\&quot; class=\&quot;testmonkey_libs\&quot;  src=\&quot;&quot;+this+&quot;\&quot;&gt;&lt;/script&gt;\n&quot;;
+			});
+			try
 			{
-				// run the timer here in case we have problems loading the test HTML code itself
-				timer=setTimeout(function(){
-					testMonkeyScope.end(true,true)
-				},testcase.timeout);
+				//jQuery(&quot;&lt;iframe style='position:absolute;left:-10px;top:-10px;height:1px;width:1px;' id='&quot; + (id)+&quot;'&gt;&lt;/iframe&gt;&quot;).appendTo(&quot;body&quot;);
+				var body = jQuery('iframe').contents().find(&quot;body&quot;).get(0);
+
+				if (!body) body = jQuery('iframe').contents().find(&quot;html&quot;).get(0);
+
+				var doc = body.ownerDocument;
+				var setupCode = &quot;&quot; + 
+				&quot;(function($,scope){\n&quot;+
+				&quot; $.noConflict();\n&quot;+
+				&quot; $(function(){\n &quot;+
+				&quot;    $.fn.assertTestCase = function(){ return scope.assertTestCase.apply(this,arguments) }\n&quot; + 
+				&quot;    function log() { return scope.log.apply(this,arguments) }\n&quot; + 
+				&quot;    function end() { return scope.end.apply(this,arguments) }\n&quot; + 
+				&quot;    function fail() { return scope.fail.apply(this,arguments) }\n&quot; + 
+				&quot;    function error() { return scope.error.apply(this,arguments) }\n&quot; + 
+				&quot;    function assertTestCase() {return scope.assertTestCase.apply(this,arguments) }\n&quot; + 
+				&quot;    scope.setup.call(scope.descriptor,window);\n &quot;;
+				
+				// IE 'ISMS
+				if (App.Browser.isIE)
+				{
+					setupCode += &quot;setTimeout(function(){try{\n&quot; + 
+					'   ('+testcase.code+').call(scope.descriptor);\n' + 
+					&quot;    }catch(E){\n&quot; + 
+					&quot;      scope.error(E);\n&quot; + 
+					&quot;    }scope.completed();},500);\n&quot; + 
+					&quot; });\n })(parent.window.jQuery,parent.window.testMonkeyScope);\n&quot;;
+				}
+				else
+				{
+					setupCode += &quot;try{\n&quot; + 
+					'   ('+testcase.code+').call(scope.descriptor);\n' + 
+					&quot;    }catch(E){\n&quot; + 
+					&quot;      scope.error(E);\n&quot; + 
+					&quot;    }\n&quot; + 
+					&quot;    scope.completed();\n&quot; + 
+					&quot; });\n })(window.jQuery,parent.window.testMonkeyScope);\n &quot;;
+				}
+
+
+				// now inject our test execution environment
+				code+= &quot;&lt;script  class=\&quot;testmonkey_libs\&quot; type=\&quot;text/javascript\&quot;&gt;&quot; + setupCode + &quot;&lt;/script&gt;\n&quot;;
+				var jscode = descriptor.content.replace('####MARKER####',code);
+				
+				// REMOVED TIMEOUT FEATURE - THERE WAS A TIMING ISSUE
+				// WHERE TESTS WOULD TIMEOUT WHEN THE SHOULD NOT HAVE
+				// if (typeof(testcase.timeout)!='undefined')
+				// {
+				// 	// run the timer here in case we have problems loading the test HTML code itself
+				// 	//timer=setTimeout(function(){
+				// 	//	testMonkeyScope.end(true,true)
+				// 	//},testcase.timeout);
+				// }
+
+				// write the test + our bootstrap code
+				doc.open(&quot;text/html&quot;,&quot;replace&quot;);
+				doc.writeln(jscode);
+				doc.close();
+			}
+			catch(E)
+			{
+				testcase.failed = true;
+				testcase.error = E;
+				testcase.message = &quot;Exception running testcase: &quot;+E;
+				testcase.results.push({'result':false,'error':E,'message':testcase.message});
+				testMonkeyScope.end(true,false);
 			}
 
-			// write the test + our bootstrap code
-			doc.open(&quot;text/html&quot;,&quot;replace&quot;);
-			doc.writeln(jscode);
-			doc.close();
-		}
-		catch(E)
-		{
-			testcase.failed = true;
-			testcase.error = E;
-			testcase.message = &quot;Exception running testcase: &quot;+E;
-			testcase.results.push({'result':false,'error':E,'message':testcase.message});
-			testMonkeyScope.end(true,false);
-		}
+		});
+	
+	
 	}
 	
 	scope.extractCodeLine = function (code,expr)
@@ -650,12 +684,10 @@ window.TestMonkey = {};
 	}
 	
 	var testFrameId = 1;
-	
 	function loadTestFrame(url,fn)
 	{
 		var id = '__testdriver_content_'+(testFrameId++);
-		url = URI.absolutizeURI(url,AppC.docRoot+'tests/');
-		
+		url = App.URI.absolutizeURI(url,App.docRoot+'tests/');
 		return jQuery.ajax({
 			type: &quot;GET&quot;,
 			url: url,
@@ -667,7 +699,7 @@ window.TestMonkey = {};
 				var begin = html.indexOf('&lt;head');
 				if (begin &gt; 0)
 				{
-					begin = html.indexOf('&gt;',begin+1);
+					begin = html.indexOf('&gt;',begin);
 				}
 				else
 				{
@@ -694,6 +726,7 @@ window.TestMonkey = {};
 				if (begin&gt;0) start = html.substring(0,begin);
 				var end = html.substring(begin);
 				// we later use marker to indicate where we need to replace content
+				
 				fn(start + '####MARKER####' + end);
 			}
 		});
@@ -716,19 +749,31 @@ window.TestMonkey = {};
 	
 	function escapeString(str)
 	{
-		return $.gsub(str,'&quot;',&quot;\\\&quot;&quot;);
+		return str.gsub('&quot;',&quot;\\\&quot;&quot;);
 	}
 	
 	function preProcessCode(code)
 	{
 		var re = /assert(.*?)[\s]?\((.*)?\)/;
 		var _asserts = [];
-		var newcode = $.gsub(code,re,function(m)
+		var newcode = code.gsub(re,function(m)
 		{
 			_asserts.push(m[0]); 
 			var prefix = m[1] ? '&quot;' + escapeString(m[1]) + '&quot;' : 'null';
 			var params = m[2] || 'null';
-			return 'assertTestCase(' + (_asserts.length-1) + ','+prefix+','+params+')';
+			
+			// if assertion type is after
+			// setup timeout
+			if (prefix == '&quot;After&quot;')
+			{
+				var args = params.split(&quot;,&quot;);
+				var funcString = 'setTimeout(function(){assertTestCase(' + (_asserts.length-1) + ','+prefix+','+params+')},'+args[1]+')';
+				return funcString;
+			}
+			else
+			{
+				return 'assertTestCase(' + (_asserts.length-1) + ','+prefix+','+params+')';				
+			}
 		});
 		var asserts = [];
 		$.each(_asserts,function()
@@ -778,8 +823,7 @@ window.TestMonkey = {};
 		});
 	};
 	
-	scope.testSuites = {};
-	scope.testSuiteNames = [];
+	var testSuites = {};
 	
 	scope.testSuite = function(name,html,descriptor)
 	{
@@ -790,10 +834,9 @@ window.TestMonkey = {};
 		}
 		
 		descriptor.html=html;
-		scope.testSuiteNames.push(name);
-		scope.testSuites[name]=descriptor;
+		testSuites[name]=descriptor;
 		
-		TestMonkey.fireEvent(&quot;addTestSuite&quot;,name,descriptor,html);
+		fireEvent(&quot;addTestSuite&quot;,name,descriptor,html);
 		
 		this.run = function()
 		{</diff>
      <filename>public/javascripts/testmonkey.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b3f3f53f62c0c808b59d18c91575b0a583ff51c0</id>
    </parent>
  </parents>
  <author>
    <name>Jason Stahl</name>
    <email>jason@jason-stahls-macbook-pro.local</email>
  </author>
  <url>http://github.com/jhaynie/testmonkey/commit/dc6ecb3cc9c1ac9e5647760677827f93da719912</url>
  <id>dc6ecb3cc9c1ac9e5647760677827f93da719912</id>
  <committed-date>2009-01-29T22:19:42-08:00</committed-date>
  <authored-date>2009-01-29T22:19:42-08:00</authored-date>
  <message>pushing over IE fixes and other changes</message>
  <tree>3667b77f5f46c8a14f14ea2295883dc86aa97abb</tree>
  <committer>
    <name>Jason Stahl</name>
    <email>jason@jason-stahls-macbook-pro.local</email>
  </committer>
</commit>
