// JT1non4.JS -- code that Nav4 can't even see 

function non4UndefExceptions() {
	var uninit;
	var trd,cgt,fly;
	cgt=false;try{ throw new Object();					}catch(e){cgt=true}finally{assert("1",cgt)} // Opera8 cannot compile this line!!!
	cgt=false;try{ ;									}catch(e){cgt=true}finally{assert("2",!cgt)}
	
	cgt=false;try{ assert(undecl == null);				}catch(e){cgt=true}finally{assert("B",cgt)} // can't compare undecl
	cgt=false;try{ assert(window.undecl == null);		}catch(e){cgt=true}finally{assert("H",!cgt)} // can compare window.undecl to null
	cgt=false;try{ assert(uninit == null);				}catch(e){cgt=true}finally{assert("C",!cgt)}
	cgt=false;try{ assert(undecl !== null);				}catch(e){cgt=true}finally{assert("F",cgt)}
	cgt=false;try{ assert(uninit !== null);				}catch(e){cgt=true}finally{assert("G",!cgt)}
	cgt=false;try{ assert(undecl == undefined);			}catch(e){cgt=true}finally{assert("Dd",cgt)}
	cgt=false;try{ assert(uninit == undefined);			}catch(e){cgt=true}finally{assert("Ed",is_ie5_0 || is_ie5_1 ? cgt : !cgt)}  // ie5.0 exception comparing with "undefined" pseudo-var
	cgt=false;try{ assert(undecl === undefined);		}catch(e){cgt=true}finally{assert("D",cgt)}
	cgt=false;try{ assert(uninit === undefined);		}catch(e){cgt=true}finally{assert("E",is_ie5_0 || is_ie5_1 ? cgt : !cgt)}  // ie5.0 exception comparing with "undefined" pseudo-var
	cgt=false;try{ assertUndefined(undecl);				}catch(e){cgt=true}finally{assert("K",cgt)}
	cgt=false;try{ assertUndefined(window.undecl);		}catch(e){cgt=true}finally{assert("L",!cgt)}
	cgt=false;try{ assertUndefined(uninit);				}catch(e){cgt=true}finally{assert("J",!cgt)}
	cgt=false;try{ assertUndefined(window.uninit);		}catch(e){cgt=true}finally{assert("O",!cgt)}
	cgt=false;try{ assert(typeof(undecl)=="undefined");	}catch(e){cgt=true}finally{assert("3",!cgt)} // can typeof() unndecl
	cgt=false;try{ assert(typeof(uninit)=="undefined"); }catch(e){cgt=true}finally{assert("4",!cgt)}
	cgt=false;try{ var x=undecl;						}catch(e){cgt=true}finally{assert("5",cgt)} // can't assign undecl
	cgt=false;try{ var x=uninit;						}catch(e){cgt=true}finally{assert("6",!cgt)}
	cgt=false;try{ (function(x){;})(undecl);			}catch(e){cgt=true}finally{assert("7",cgt)} // can't pass undecl
	cgt=false;try{ (function(x){;})(uninit);			}catch(e){cgt=true}finally{assert("8",!cgt)}
	cgt=false;try{ (function(x){var a=x;})(undecl);		}catch(e){cgt=true}finally{assert("9",cgt)}
	cgt=false;try{ (function(x){var a=x;})(uninit);		}catch(e){cgt=true}finally{assert("A",!cgt)}
	cgt=false;try{ nondecl=3;assertEquals(nondecl,3);  	}catch(e){cgt=true}finally{assert("P",!cgt)} // can assign to an undecl to declare it
	cgt=false;try{ eval("undecl");                     	}catch(e){cgt=true}finally{assert("Q",is_opera6dn ? !cgt : cgt)}	// can eval an undecl
	cgt=false;try{ typeof(eval("undecl"));             	}catch(e){cgt=true}finally{assert("R",is_opera6dn ? !cgt : cgt)}	// cannot typeof an eval of an undecl (except Opera can)
	cgt=false;try{ eval("typeof(undecl)");            	}catch(e){cgt=true}finally{assert("S",!cgt)}					// can eval typeof an undecl

	trd=cgt=fly=false;
    eval("try{trd=true;                       }catch(e){cgt=true}finally{fly=true}"); assert("E1t",trd); assert("E1c",!cgt); assert("E1f",fly);
	trd=cgt=fly=false;
    eval("try{trd=true;throw new Error('msg');}catch(e){cgt=true}finally{fly=true}"); assert("E2t",trd); assert("E2c", cgt); assert("E2f",fly);
}

function non4ErrorSection() {
	var caught=false;
	try {
		var v=nodef;
	}
	catch (e) {
	    caught=true;
	    if (!assert('e',typeof(e) == "object")) return "e";         
	    if (is_ie5_1_) {
			assertEquals("e.message","undefined",typeof(e.message));
			assert("e.message should be null",e.message == null);
			assertEquals("e.name","undefined",typeof(e.name));
			assert("e.name should be null",e.name == null);
			if (is_mac) {
				if (assertEquals("e.number","number",typeof(e.number))) {
					assertEquals(0x800A1391&0xFFFFFFFF,e.number&0xFFFFFFFF);
				}
				if (assertEquals("e.description","string",typeof(e.description))) {
					assertExamples(e.description,
						"'nodef' is undefined");
				}
			}
			else {
				assertEquals(0x800A1391&0xFFFFFFFF,e.number&0xFFFFFFFF);
				assertExamples(e.description,
					"'nodef' is undefined");
			}
	    }
		else if (is_ie5_5up) {
			assertEquals("e.number","number",typeof(e.number));
			assertEquals("e.description","string",typeof(e.description));
			assertEquals(0x800A1391&0xFFFFFFFF,e.number);
			assertExamples(e.description,
				"'nodef' is undefined");
			assertExamples(e.message,
				"'nodef' is undefined",
				"'nodef' ist undefiniert",										// IE6/98 Daniel Martens
				"nodef is not defined"
			);
			assertEquals("e.name","string",typeof(e.name));
			if (!assertDefined('e.name',e.name)) return "e.name";
			assertEquals(e.name,"TypeError");			// IE bug
	    }
		else {
			assertEquals("e.number","undefined",typeof(e.number));
			assertEquals("e.description","undefined",typeof(e.description));
			assertEquals("e.message","string",typeof(e.message));
			if (is_opera7up) {
				inform(e.message); // error message typical of 7.21 and 9.51
				// Statement on line 44: Undefined variable: nodef
				// Backtrace:
				//   Line 44 of linked script file://localhost/C:/www.visibone.com/javascript/jt1non4.js: In function non4ErrorSection
				//     		var v=nodef;
				//   Line 282 of inline#1 script in file://localhost/C:/www.visibone.com/javascript/jt3.html: In function testErrorSection
				//     		var rc=non4ErrorSection();
				//   Line 1 of eval script 
				//     try {window[p]()}catch(e) {exceptionDuringTest(e);}finally {teardown(p);progress(p+'.');}
				//   Line 329 of linked script file://localhost/C:/www.visibone.com/javascript/jsUnitNav4.js: In function dotest
				//     			eval(
				//   Line 797 of linked script file://localhost/C:/www.visibone.com/javascript/jsUnitNav4.js: In function RunTests
				//     			dotest(testFunctions[itest]);
				//   Line 1 of function script 
				//     return RunTests()
				//   ...
			} else {
				assertExamples(e.message,
					"'nodef' is undefined",
					"nodef is not defined",
					"Reference to undefined variable: No such variable 'nodef'",	// Opera
					"Can't find variable: nodef",									// Safari
					"",																// Chrome (!)
					"--"
				);
			}	
			assertEquals("e.name","string",typeof(e.name));
			if (!assertDefined('e.name',e.name)) return "e.name";
			assertEquals(e.name,"ReferenceError");
		}
	}
	finally {
		assert('finally, should have been caught',caught);
		return "finally";
	}
	assert('should have been caught',caught);
	fail("finally doesn't work");
}

function non4Exception() {
	var a=[];
	var n=0;
	try {
		try {
			n+=1;
			throw new Error("A","X");
			n+=20;
		}
		catch (e) {
			if (typeof(a.push) == "undefined") {
				a[a.length++]="["+e.message+"|"+e.description+"]";
			}
			else {
				a.push(e.message);
			}
			n+=100;
			throw new Error("B","Y");
			n+=2000;
		}
		finally {
			n+=10000;
		}
		n+=200000;
	}
	catch (e) {
		if (typeof(a.push) == "undefined") {
			a[a.length++]="["+e.message+"|"+e.description+"]";
		}
		else {
			a.push(e.message);
		}
		n+=1000000;
	}
	finally {
		n+=10000000;
	}
	assertEquals(n,11010101);
	assertEquals(a.join(), is_ie5 && is_mac ? "[undefined|'Error' is undefined],[undefined|'Error' is undefined]"
	                           : (is_ie5_0_ ? "[undefined|X],[undefined|Y]"

	                           : (is_nav4_ 
                               || is_ie5_5up ? "X,Y" 

                               : (is_gecko 
	                           || is_opera 
	                           || is_omni 
	                           || is_sfchrome ? "A,B" 
	                                          : "???"))));
}
