var JSUNIT_UNDEFINED_VALUE;var JSUNIT_VERSION=2.2;var isTestPageLoaded=false;function jsUnitFixTop(){var i=top;if(!i){i=window;while(i.parent){i=i.parent;if(i.top&&i.top.jsUnitTestSuite){i=i.top;break}}}try{window.top=i}catch(e){}}jsUnitFixTop();function _trueTypeOf(something){var result=typeof something;try{switch(result){case'string':case'boolean':case'number':break;case'object':case'function':switch(something.constructor){case String:result='String';break;case Boolean:result='Boolean';break;case Number:result='Number';break;case Array:result='Array';break;case RegExp:result='RegExp';break;case Function:result='Function';break;default:var m=something.constructor.toString().match(/function\s*([^( ]+)\(/);if(m)result=m[1];else break}break}}finally{result=result.substr(0,1).toUpperCase()+result.substr(1);return result}}function _displayStringForValue(i){var I='<'+i+'>';if(!(i===null||i===top.JSUNIT_UNDEFINED_VALUE)){I+=' ('+_trueTypeOf(i)+')'}return I}function fail(i){throw new JsUnitException("Call to fail()",i);}function error(i){var I=new Object();I.description=i;I.stackTrace=getStackTrace();throw I}function argumentsIncludeComments(i,I){return I.length==i+1}function commentArg(i,I){if(argumentsIncludeComments(i,I))return I[0];return null}function nonCommentArg(i,I,l){return argumentsIncludeComments(I,l)?l[i]:l[i-1]}function _validateArguments(i,I){if(!(I.length==i||(I.length==i+1&&typeof(I[0])=='string')))error('Incorrect arguments passed to assert function');}function _assert(i,I,l){if(!I)throw new JsUnitException(i,l);}function assert(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);if(typeof(i)!='boolean')error('Bad argument to assert(boolean)');_assert(commentArg(1,arguments),i===true,'Call to assert(boolean) with false');}function assertTrue(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);if(typeof(i)!='boolean')error('Bad argument to assertTrue(boolean)');_assert(commentArg(1,arguments),i===true,'Call to assertTrue(boolean) with false');}function assertFalse(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);if(typeof(i)!='boolean')error('Bad argument to assertFalse(boolean)');_assert(commentArg(1,arguments),i===false,'Call to assertFalse(boolean) with true');}function assertEquals(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);_assert(commentArg(2,arguments),i===I,'Expected '+_displayStringForValue(i)+' but was '+_displayStringForValue(I));}function assertNotEquals(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);_assert(commentArg(2,arguments),i!==I,'Expected not to be '+_displayStringForValue(I));}function assertNull(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),i===null,'Expected '+_displayStringForValue(null)+' but was '+_displayStringForValue(i));}function assertNotNull(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),i!==null,'Expected not to be '+_displayStringForValue(null));}function assertUndefined(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),i===top.JSUNIT_UNDEFINED_VALUE,'Expected '+_displayStringForValue(top.JSUNIT_UNDEFINED_VALUE)+' but was '+_displayStringForValue(i));}function assertNotUndefined(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),i!==top.JSUNIT_UNDEFINED_VALUE,'Expected not to be '+_displayStringForValue(top.JSUNIT_UNDEFINED_VALUE));}function assertNaN(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),isNaN(i),'Expected NaN');}function assertNotNaN(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);_assert(commentArg(1,arguments),!isNaN(i),'Expected not NaN');}function assertObjectEquals(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);var l;var o=commentArg(2,arguments)?commentArg(2,arguments):'';var O=(i===I);var Q=((l=_trueTypeOf(i))==_trueTypeOf(I));if(Q&&!O){switch(l){case'String':case'Number':Q=(i==I);break;case'Boolean':case'Date':Q=(i===I);break;case'RegExp':case'Function':Q=(i.toString()===I.toString());break;default:var _;if(Q=(i.length===I.length))for(_ in i)assertObjectEquals(o+' found nested '+l+'@'+_+'\n',i[_],I[_]);}_assert(o,Q,'Expected '+_displayStringForValue(i)+' but was '+_displayStringForValue(I));}}assertArrayEquals=assertObjectEquals;function assertEvaluatesToTrue(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);if(!i)fail(commentArg(1,arguments));}function assertEvaluatesToFalse(){_validateArguments(1,arguments);var i=nonCommentArg(1,1,arguments);if(i)fail(commentArg(1,arguments));}function assertHTMLEquals(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);var l=standardizeHTML(i);var o=standardizeHTML(I);_assert(commentArg(2,arguments),l===o,'Expected '+_displayStringForValue(l)+' but was '+_displayStringForValue(o));}function assertHashEquals(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);for(var l in i){assertNotUndefined("Expected hash had key "+l+" that was not found",I[l]);assertEquals("Value for key "+l+" mismatch - expected = "+i[l]+", actual = "+I[l],i[l],I[l]);}for(var l in I){assertNotUndefined("Actual hash had key "+l+" that was not expected",i[l]);}}function assertRoughlyEquals(){_validateArguments(3,arguments);var i=nonCommentArg(1,3,arguments);var I=nonCommentArg(2,3,arguments);var l=nonCommentArg(3,3,arguments);assertTrue("Expected "+i+", but got "+I+" which was more than "+l+" away",Math.abs(i-I)=2&&I[2]){return I[2]}return'anonymous'}function getStackTrace(){var i='';if(typeof(arguments.caller)!='undefined'){for(var I=arguments.caller;I!=null;I=I.caller){i+='> '+getFunctionName(I.callee)+'\n';if(I.caller==I){i+='*';break}}}else{var l;try{foo.bar}catch(l){var o=parseErrorStack(l);for(var O=1;O '+o[O]+'\n'}}}return i}function parseErrorStack(i){var I=[];var l;if(!i||!i.stack){return I}var o=i.stack.split('\n');for(var O=0;O=1){delete i[i.length-1];i.length--}}function jsUnitGetParm(i){if(typeof(top.jsUnitParmHash[i])!='undefined'){return top.jsUnitParmHash[i]}return null}if(top&&typeof(top.xbDEBUG)!='undefined'&&top.xbDEBUG.on&&top.testManager){top.xbDebugTraceObject('top.testManager.containerTestFrame','JSUnitException');top.xbDebugTraceFunction('top.testManager.containerTestFrame','_displayStringForValue');top.xbDebugTraceFunction('top.testManager.containerTestFrame','error');top.xbDebugTraceFunction('top.testManager.containerTestFrame','argumentsIncludeComments');top.xbDebugTraceFunction('top.testManager.containerTestFrame','commentArg');top.xbDebugTraceFunction('top.testManager.containerTestFrame','nonCommentArg');top.xbDebugTraceFunction('top.testManager.containerTestFrame','_validateArguments');top.xbDebugTraceFunction('top.testManager.containerTestFrame','_assert');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assert');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertTrue');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertEquals');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNotEquals');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNull');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNotNull');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertUndefined');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNotUndefined');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNaN');top.xbDebugTraceFunction('top.testManager.containerTestFrame','assertNotNaN');top.xbDebugTraceFunction('top.testManager.containerTestFrame','isLoaded');top.xbDebugTraceFunction('top.testManager.containerTestFrame','setUp');top.xbDebugTraceFunction('top.testManager.containerTestFrame','tearDown');top.xbDebugTraceFunction('top.testManager.containerTestFrame','getFunctionName');top.xbDebugTraceFunction('top.testManager.containerTestFrame','getStackTrace');top.xbDebugTraceFunction('top.testManager.containerTestFrame','warn');top.xbDebugTraceFunction('top.testManager.containerTestFrame','inform');top.xbDebugTraceFunction('top.testManager.containerTestFrame','debug');top.xbDebugTraceFunction('top.testManager.containerTestFrame','setJsUnitTracer');top.xbDebugTraceFunction('top.testManager.containerTestFrame','trim');top.xbDebugTraceFunction('top.testManager.containerTestFrame','isBlank');top.xbDebugTraceFunction('top.testManager.containerTestFrame','newOnLoadEvent');top.xbDebugTraceFunction('top.testManager.containerTestFrame','push');top.xbDebugTraceFunction('top.testManager.containerTestFrame','pop');}function newOnLoadEvent(){isTestPageLoaded=true}function jsUnitSetOnLoad(i,I){var l=navigator.userAgent.indexOf('Konqueror/')!=-1||navigator.userAgent.indexOf('Safari/')!=-1;if(typeof(i.attachEvent)!='undefined'){i.attachEvent("onload",I);}else if(typeof(i.addEventListener)!='undefined'&&!l){i.addEventListener("load",I,false);}else if(typeof(i.document.addEventListener)!='undefined'&&!l){i.document.addEventListener("load",I,false);}else if(typeof(i.onload)!='undefined'&&i.onload){i.jsunit_original_onload=i.onload;i.onload=function(){i.jsunit_original_onload();I();}}else{i.onload=I}}jsUnitSetOnLoad(window,newOnLoadEvent);top.JSUNIT_JSCORE_LOCATION=findPath('jsUnitCore.js');function findPath(i){var I=document.getElementsByTagName('script'),l=new RegExp('^(.*/|)('+i+')([#?]|$)');for(var o=0,O=I.length;o