18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* The contents of this file are subject to the Netscape Public
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License Version 1.1 (the "License"); you may not use this file
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * except in compliance with the License. You may obtain a copy of
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the License at http://www.mozilla.org/NPL/
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Software distributed under the License is distributed on an "AS
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * implied. See the License for the specific language governing
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * rights and limitations under the License.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The Original Code is Mozilla Communicator client code, released March
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 31, 1998.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The Initial Developer of the Original Code is Netscape Communications
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Corporation. Portions created by Netscape are
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1998 Netscape Communications Corporation. All
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Rights Reserved.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Contributor(s):
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JavaScript shared functions file for running the tests in either
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * stand-alone JavaScript engine.  To run a test, first load this file,
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then load the test script.
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	completed =	false;
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	testcases;
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar tc = 0;
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSECTION	= "";
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVERSION	= "";
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBUGNUMBER =	"";
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * constant strings
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	GLOBAL = "[object global]";
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PASSED = " PASSED!"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FAILED = " FAILED! expected: ";
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	DEBUG =	false;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* wrapper for test cas constructor that doesn't require the SECTION
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * argument.
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction AddTestCase( description, expect, actual ) {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    testcases[tc++] = new TestCase( SECTION, description, expect, actual );
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * TestCase constructor
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TestCase( n, d, e,	a )	{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.name		 = n;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.description = d;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.expect		 = e;
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.actual		 = a;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.passed		 = true;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.reason		 = "";
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.bugnumber	  =	BUGNUMBER;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	this.passed	= getTestCaseResult( this.expect, this.actual );
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( DEBUG ) {
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		writeLineToLog(	"added " + this.description	);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Set up test environment.
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction startTest() {
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( version ) {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	//	JavaScript 1.3 is supposed to be compliant ecma	version	1.0
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	    if ( VERSION ==	"ECMA_1" ) {
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		    version	( "130"	);
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	    if ( VERSION ==	"JS_1.3" ) {
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		    version	( "130"	);
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	}
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	    if ( VERSION ==	"JS_1.2" ) {
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		    version	( "120"	);
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	}
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	    if ( VERSION  == "JS_1.1" )	{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		    version	( "110"	);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	    // for ecma	version	2.0, we	will leave the javascript version to
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    	// the default ( for now ).
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // print out bugnumber
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( BUGNUMBER ) {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            writeLineToLog ("BUGNUMBER: " + BUGNUMBER );
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    testcases = new Array();
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tc = 0;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() {
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( tc=0; tc < testcases.length; tc++ ) {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].passed = writeTestCaseResult(
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].expect,
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].actual,
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].description +" = "+ testcases[tc].actual );
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    stopTest();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ( testcases );
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Compare expected result to the actual result and figure out whether
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the test case passed.
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTestCaseResult(	expect,	actual ) {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	because	( NaN == NaN ) always returns false, need to do
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	a special compare to see if	we got the right result.
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( actual	!= actual )	{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( typeof	actual == "object" ) {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				actual = "NaN object";
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			} else {
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				actual = "NaN number";
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( expect	!= expect )	{
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( typeof	expect == "object" ) {
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				expect = "NaN object";
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			} else {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				expect = "NaN number";
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		var	passed = ( expect == actual	) ?	true : false;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	if both	objects	are	numbers
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// need	to replace w/ IEEE standard	for	rounding
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if (	!passed
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				&& typeof(actual) == "number"
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				&& typeof(expect) == "number"
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			) {
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				if ( Math.abs(actual-expect) < 0.0000001 ) {
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project					passed = true;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	verify type	is the same
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( typeof(expect)	!= typeof(actual) )	{
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			passed = false;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return passed;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Begin printing functions.  These functions use the shell's
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * print function.  When running tests in the browser, these
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * functions, override these functions with functions that use
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * document.write.
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeTestCaseResult( expect, actual, string ) {
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		var	passed = getTestCaseResult(	expect,	actual );
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		writeFormattedResult( expect, actual, string, passed );
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return passed;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeFormattedResult( expect, actual, string, passed ) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var s = string ;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s += ( passed ) ? PASSED : FAILED + expect;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        writeLineToLog( s);
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeLineToLog( string	) {
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	print( string );
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeHeaderToLog( string )	{
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	print( string );
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* end of print functions */
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * When running in the shell, run the garbage collector after the
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * test has completed.
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction stopTest()	{
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 	var gc;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( gc != undefined ) {
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		gc();
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Convenience function for displaying failed test cases.  Useful
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * when running tests manually.
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getFailedCases() {
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  for (	var	i =	0; i < testcases.length; i++ ) {
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 if	( !	testcases[i].passed	) {
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		print( testcases[i].description	+" = " +testcases[i].actual	+" expected: "+	testcases[i].expect	);
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 }
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /*
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  *	Date functions used	by tests in	Date suite
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  *
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  */
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	msPerDay =			86400000;
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	HoursPerDay	=		24;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	MinutesPerHour =	60;
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	SecondsPerMinute =	60;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	msPerSecond	=		1000;
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	msPerMinute	=		60000;		//	msPerSecond	* SecondsPerMinute
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	msPerHour =			3600000;	//	msPerMinute	* MinutesPerHour
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar             TZ_DIFF	= getTimeZoneDiff();  // offset of tester's timezone from UTC
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar             TZ_PST = -8;  // offset of Pacific Standard Time from UTC
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar             PST_DIFF = TZ_DIFF - TZ_PST;  // offset of tester's timezone from PST
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	TIME_1970	 = 0;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	TIME_2000	 = 946684800000;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	TIME_1900	 = -2208988800000;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar     TIME_YEAR_0      = -62167219200000;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Originally, the test suite used a hard-coded value TZ_DIFF = -8.
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * But that was only valid for testers in the Pacific Standard Time Zone!
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * We calculate the proper number dynamically for any tester. We just
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * have to be careful not to use a date subject to Daylight Savings Time...
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTimeZoneDiff()
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  return -((new Date(2000, 1, 1)).getTimezoneOffset())/60;
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Date test "ResultArrays" are hard-coded for Pacific Standard Time.
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * We must adjust them for the tester's own timezone -
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction adjustResultArray(ResultArray, msMode)
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  // If the tester's system clock is in PST, no need to continue -
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  if (!PST_DIFF) {return;}
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  /* The date testcases instantiate Date objects in two different ways:
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *        millisecond mode: e.g.   dt = new Date(10000000);
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *        year-month-day mode:  dt = new Date(2000, 5, 1, ...);
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   * In the first case, the date is measured from Time 0 in Greenwich (i.e. UTC).
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   * In the second case, it is measured with reference to the tester's local timezone.
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   * In the first case we must correct those values expected for local measurements,
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   * like dt.getHours() etc. No correction is necessary for dt.getUTCHours() etc.
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   *
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   * In the second case, it is exactly the other way around -
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  */
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  if (msMode)
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  {
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The hard-coded UTC milliseconds from Time 0 derives from a UTC date.
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Shift to the right by the offset between UTC and the tester.
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var t = ResultArray[TIME]  +  TZ_DIFF*msPerHour;
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Use our date arithmetic functions to determine the local hour, day, etc.
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[HOURS] = HourFromTime(t);
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[DAY] = WeekDay(t);
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[DATE] = DateFromTime(t);
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[MONTH] = MonthFromTime(t);
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[YEAR] = YearFromTime(t);
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  else
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  {
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The hard-coded UTC milliseconds from Time 0 derives from a PST date.
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Shift to the left by the offset between PST and the tester.
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var t = ResultArray[TIME]  -  PST_DIFF*msPerHour;
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Use our date arithmetic functions to determine the UTC hour, day, etc.
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[TIME] = t;
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[UTC_HOURS] = HourFromTime(t);
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[UTC_DAY] = WeekDay(t);
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[UTC_DATE] = DateFromTime(t);
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[UTC_MONTH] = MonthFromTime(t);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ResultArray[UTC_YEAR] = YearFromTime(t);
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Day( t	) {
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( Math.floor(t/msPerDay ) );
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaysInYear( y ) {
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( y % 4 != 0	) {
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 365;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( (y	% 4	== 0) && (y	% 100 != 0)	) {
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 366;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( (y	% 100 == 0)	&&	(y % 400 !=	0) ) {
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 365;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( (y	% 400 == 0)	){
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 366;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return "ERROR: DaysInYear("	+ y	+ ") case not covered";
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInYear( y ) {
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( DaysInYear(y) * msPerDay );
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayNumber(	t )	{
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( Math.floor( t / msPerDay )	);
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeWithinDay(	t )	{
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( t < 0 ) {
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( (t	% msPerDay)	+ msPerDay );
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( t % msPerDay );
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearNumber( t ) {
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeFromYear( y ) {
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( msPerDay *	DayFromYear(y) );
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayFromYear( y	) {
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return (	365*(y-1970) +
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				Math.floor((y-1969)/4) -
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				Math.floor((y-1901)/100) +
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				Math.floor((y-1601)/400) );
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction InLeapYear( t ) {
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( DaysInYear(YearFromTime(t)) ==	365	) {
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 0;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( DaysInYear(YearFromTime(t)) ==	366	) {
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 1;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return "ERROR:  InLeapYear("+ t + ") case not covered";
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearFromTime( t ) {
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	t =	Number(	t );
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	sign = ( t < 0 ) ? -1 :	1;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	year = ( sign <	0 )	? 1969 : 1970;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for	(	var	timeToTimeZero = t;	;  ) {
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	subtract the current year's	time from the time that's left.
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		timeToTimeZero -= sign * TimeInYear(year)
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	if there's less	than the current year's	worth of time left,	then break.
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if ( sign <	0 )	{
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( sign *	timeToTimeZero <= 0	) {
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				break;
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			} else {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				year +=	sign;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		} else {
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if ( sign *	timeToTimeZero < 0 ) {
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				break;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			} else {
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				year +=	sign;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			}
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( year );
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MonthFromTime(	t )	{
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	//	i know i could use switch but i'd rather not until it's	part of	ECMA
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	day	= DayWithinYear( t );
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	leap = InLeapYear(t);
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( (0	<= day)	&& (day	< 31) )	{
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 0;
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( (31 <=	day) &&	(day < (59+leap)) )	{
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 1;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((59+leap)	<= day)	&& (day	< (90+leap)) ) {
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 2;
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((90+leap)	<= day)	&& (day	< (120+leap)) )	{
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 3;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((120+leap) <=	day) &&	(day < (151+leap)) ) {
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 4;
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((151+leap) <=	day) &&	(day < (181+leap)) ) {
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 5;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((181+leap) <=	day) &&	(day < (212+leap)) ) {
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 6;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((212+leap) <=	day) &&	(day < (243+leap)) ) {
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 7;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((243+leap) <=	day) &&	(day < (273+leap)) ) {
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 8;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((273+leap) <=	day) &&	(day < (304+leap)) ) {
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 9;
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((304+leap) <=	day) &&	(day < (334+leap)) ) {
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 10;
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( ((334+leap) <=	day) &&	(day < (365+leap)) ) {
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 11;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return "ERROR:	MonthFromTime("+t+") not known";
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayWithinYear(	t )	{
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return(	Day(t) - DayFromYear(YearFromTime(t)));
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DateFromTime( t ) {
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	day	= DayWithinYear(t);
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	month =	MonthFromTime(t);
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 0	) {
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day + 1 );
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 1	) {
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 30 );
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 2	) {
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 58 -	InLeapYear(t) );
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 3	) {
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 89 -	InLeapYear(t));
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 4	) {
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 119 - InLeapYear(t));
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 5	) {
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 150-	InLeapYear(t));
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 6	) {
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 180-	InLeapYear(t));
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 7	) {
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 211-	InLeapYear(t));
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 8	) {
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 242-	InLeapYear(t));
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 9	) {
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 272-	InLeapYear(t));
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 10 ) {
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 303-	InLeapYear(t));
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 11 ) {
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( day - 333-	InLeapYear(t));
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ("ERROR:	 DateFromTime("+t+") not known"	);
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction WeekDay( t	) {
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	weekday	= (Day(t)+4) % 7;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return(	weekday	< 0	? 7	+ weekday :	weekday	);
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// missing daylight	savins time	adjustment
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction HourFromTime( t ) {
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	h =	Math.floor(	t /	msPerHour )	% HoursPerDay;
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( (h<0) ? HoursPerDay + h : h  );
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MinFromTime( t	) {
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	min	= Math.floor( t	/ msPerMinute )	% MinutesPerHour;
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return(	( min <	0 )	? MinutesPerHour + min : min  );
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction SecFromTime( t	) {
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	sec	= Math.floor( t	/ msPerSecond )	% SecondsPerMinute;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( (sec <	0 )	? SecondsPerMinute + sec : sec );
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction msFromTime( t ) {
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	ms = t % msPerSecond;
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( (ms < 0 ) ? msPerSecond + ms :	ms );
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTZA()	{
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( TZ_DIFF * msPerHour );
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction UTC( t	) {
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( t - LocalTZA()	- DaylightSavingTA(t - LocalTZA()) );
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaylightSavingTA( t ) {
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	t =	t -	LocalTZA();
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	dst_start = GetSecondSundayInMarch(t) + 2*msPerHour;
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	dst_end	  = GetFirstSundayInNovember(t)+ 2*msPerHour;
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( t >= dst_start	&& t < dst_end ) {
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return msPerHour;
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return 0;
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// Daylight	Savings	Time starts	on the first Sunday	in April at	2:00AM in
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// PST.	 Other time	zones will need	to override	this function.
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	print( new Date( UTC(dst_start + LocalTZA())) );
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return UTC(dst_start  +	LocalTZA());
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInApril( t ) {
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var year = YearFromTime(t);
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var leap = InLeapYear(t);
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var april = TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap) +
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    TimeInMonth(2,leap);
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( var first_sunday = april; WeekDay(first_sunday) > 0;
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        first_sunday += msPerDay )
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ;
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return first_sunday;
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetLastSundayInOctober( t ) {
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var year = YearFromTime(t);
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var leap = InLeapYear(t);
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( var oct = TimeFromYear(year), m = 0; m < 9; m++ ) {
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        oct += TimeInMonth(m, leap);
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( var last_sunday = oct + 30*msPerDay; WeekDay(last_sunday) > 0;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        last_sunday -= msPerDay )
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ;
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return last_sunday;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Added these two functions because DST rules changed for the US.
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetSecondSundayInMarch( t ) {
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	year = YearFromTime(t);
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	leap = InLeapYear(t);
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	march =	TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var sundayCount = 0;
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var flag = true;
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( var second_sunday = march; flag; second_sunday += msPerDay )
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		if (WeekDay(second_sunday) == 0) {
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			if(++sundayCount == 2)
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project				flag = false;
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return second_sunday;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInNovember( t ) {
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var year = YearFromTime(t);
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var leap = InLeapYear(t);
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( var nov = TimeFromYear(year), m =	0; m < 10; m++ ) {
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		nov += TimeInMonth(m, leap);
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for ( var first_sunday = nov; WeekDay(first_sunday) > 0;
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		first_sunday += msPerDay	)
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	{
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		;
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return first_sunday;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTime(	t )	{
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( t + LocalTZA()	+ DaylightSavingTA(t) );
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeTime( hour, min, sec, ms )	{
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( isNaN(	hour ) || isNaN( min ) || isNaN( sec ) || isNaN( ms	) )	{
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	hour = ToInteger(hour);
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	min	 = ToInteger( min);
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	sec	 = ToInteger( sec);
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	ms	 = ToInteger( ms );
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return(	(hour*msPerHour) + (min*msPerMinute) +
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			(sec*msPerSecond) +	ms );
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDay( year,	month, date	) {
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( isNaN(year) ||	isNaN(month) ||	isNaN(date)	) {
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	year = ToInteger(year);
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	month =	ToInteger(month);
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	date = ToInteger(date );
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	sign = ( year <	1970 ) ? -1	: 1;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	t =	   ( year <	1970 ) ? 1 :  0;
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	y =	   ( year <	1970 ) ? 1969 :	1970;
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	result5	= year + Math.floor( month/12 );
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	result6	= month	% 12;
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( year <	1970 ) {
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	   for ( y = 1969; y >=	year; y	+= sign	) {
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 t += sign * TimeInYear(y);
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	   }
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	} else {
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		for	( y	= 1970 ; y < year; y +=	sign ) {
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			t += sign *	TimeInYear(y);
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		}
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	leap = InLeapYear( t );
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for	( var m	= 0; m < month;	m++	) {
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		t += TimeInMonth( m, leap );
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( YearFromTime(t) !=	result5	) {
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( MonthFromTime(t) != result6 ) {
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( DateFromTime(t) !=	1 )	{
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( (Day(t)) +	date - 1 );
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInMonth( month, leap )	{
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// september april june	november
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// jan 0  feb 1	 mar 2	apr	3	may	4  june	5  jul 6
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// aug 7  sep 8	 oct 9	nov	10	dec	11
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 3	|| month ==	5 || month == 8	|| month ==	10 ) {
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( 30*msPerDay );
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// all the rest
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( month == 0	|| month ==	2 || month == 4	|| month ==	6 ||
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 month == 7	|| month ==	9 || month == 11 ) {
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( 31*msPerDay );
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	 }
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	// save	february
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( (leap == 0) ? 28*msPerDay : 29*msPerDay );
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDate( day,	time ) {
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if (	day	== Number.POSITIVE_INFINITY	||
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			day	== Number.NEGATIVE_INFINITY	||
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			day	== Number.NaN )	{
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if (	time ==	Number.POSITIVE_INFINITY ||
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			time ==	Number.POSITIVE_INFINITY ||
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project			day	== Number.NaN) {
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return Number.NaN;
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( day * msPerDay	) +	time;
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeClip( t ) {
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( isNaN(	t )	) {
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( Number.NaN	);
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( Math.abs( t ) > 8.64e15 ) {
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( Number.NaN	);
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( ToInteger(	t )	);
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction ToInteger(	t )	{
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	t =	Number(	t );
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( isNaN(	t )	){
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return ( Number.NaN	);
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	if ( t == 0	|| t ==	-0 ||
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 t == Number.POSITIVE_INFINITY || t	== Number.NEGATIVE_INFINITY	) {
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		 return	0;
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	sign = ( t < 0 ) ? -1 :	1;
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return ( sign *	Math.floor(	Math.abs( t	) )	);
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Enumerate ( o ) {
6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	p;
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	for	( p	in o ) {
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		print( p +": " + o[p] );
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	}
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* these functions are useful for running tests manually in Rhino */
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetContext() {
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	return Packages.com.netscape.javascript.Context.getCurrentContext();
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction OptLevel( i ) {
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	i =	Number(i);
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	var	cx = GetContext();
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	cx.setOptimizationLevel(i);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* end of Rhino functions */
713