1var 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)<l);}function assertContains(){_validateArguments(2,arguments);var i=nonCommentArg(1,2,arguments);var I=nonCommentArg(2,2,arguments);assertTrue("Expected '"+I+"' to contain '"+i+"'",I.indexOf(i)!=-1);}function standardizeHTML(i){var I=document.createElement("DIV");I.innerHTML=i;return I.innerHTML}function isLoaded(){return isTestPageLoaded}function setUp(){};function tearDown(){};function getFunctionName(i){var I=i.toString().match(/function(\s*)(\w*)/);if(I&&I.length>=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.length;O++){i+='> '+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<o.length-1;O++){var Q=o[O];l=Q.match(/^(\w*)/)[1];if(!l){l='anonymous'}I[I.length]=l}while(I.length&&I[I.length-1]=='anonymous'){I.length=I.length-1}return I}function JsUnitException(i,I){this.isJsUnitException=true;this.comment=i;this.jsUnitMessage=I;this.stackTrace=getStackTrace();}function warn(){if(top.tracer!=null)top.tracer.warn(arguments[0],arguments[1]);}function inform(){if(top.tracer!=null)top.tracer.inform(arguments[0],arguments[1]);}function info(){inform(arguments[0],arguments[1]);}function debug(){if(top.tracer!=null)top.tracer.debug(arguments[0],arguments[1]);}function setJsUnitTracer(i){top.tracer=i}function trim(i){if(i==null)return null;var I=0;var l=i.length-1;while(i.substring(I,I+1)==' ')I++;while(i.substring(l,l+1)==' ')l--;if(l<I)return'';return i.substring(I,l+1);}function isBlank(i){return trim(i)==''}function push(i,I){i[i.length]=I}function pop(i){if(i.length>=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<O;o++){var Q=String(I[o].src).match(l);if(Q){if(Q[1].match(/^((https?|file)\:\/{2,}|\w:[\\])/))return Q[1];if(Q[1].indexOf("/")==0)return Q[1];b=document.getElementsByTagName('base');if(b[0]&&b[0].href)return b[0].href+Q[1];return(document.location.pathname.match(/(.*[\/\\])/)[0]+Q[1]).replace(/^\/+(?=\w:)/,"");}}return null}
2