<html>
<head>
<script type="text/javascript">
<!--

var testArray = new Array("Hello", "Hi", true, 5, 5, 9, null, undefined);
var testArray2 = new Array("Hello", "Hi", true, 5, 5, 9);
var testArray3 = new Object;
testArray3.__proto__ = testArray2.__proto__;
testArray3[0] = "Hello";
testArray3[1] = "Hi";
testArray3[2] = true;
testArray3[3] = 5;
testArray3[4] = 5;
testArray3[5] = 9;
testArray3.length = 6;
var testArray4 = [5, 5, 5, undefined];
delete testArray4[1];
var testArray5 = [5, 5, 5, undefined];
delete testArray5[3];
var testArray6 = new Array(20);
if (window.layoutTestController)
    layoutTestController.dumpAsText();

// -->
</script>
</head>
<body>

<p>1.0 Direct Testing, no starting at Parameter<br>
    * The indexOf String "Hello" is <script>document.write(testArray.indexOf("Hello"))</script><br>
    * The indexOf String "Hi" is <script>document.write(testArray.indexOf("Hi"))</script><br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf( true ))</script><br>
    * The indexOf Number '5' is <script>document.write(testArray.indexOf( 5 ))</script><br>
    * The indexOf Number '9' is <script>document.write(testArray.indexOf( 9 ))</script>
</p>

<p>2.0 A firstIndex parameter of 1 (positive offset test)<br>
    * The indexOf String "Hi" is <script>document.write(testArray.indexOf("Hi",1))</script><br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true,1))</script><br>
    * The indexOf Number 5 is <script>document.write(testArray.indexOf(5,1))</script><br>
    * The indexOf Number 9 is <script>document.write(testArray.indexOf(9,1))</script>
</p>

<p>3.0 A firstIndex parameter of -4 (negative offset test)<br>
    * The indexOf String "Hi" is <script>document.write(testArray.indexOf("Hi",-4))</script><br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true,-4))</script><br>
    * The indexOf Number 5 is <script>document.write(testArray.indexOf(5,-4))</script><br>
    * The indexOf Number 9 is <script>document.write(testArray.indexOf(9,-4))</script>
</p>

<p>4.0 A big positive firstIndex of 1000, to test the firstIndex > length<br>
    * The indexOf Number '9' is <script>document.write(testArray.indexOf(9,1000))</script>
</p>

<p>5.0 A big positive firstIndex of 4294967301, to test when firstIndex > width of int (32-bits)<br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true, 4294967301))</script>
</p>

<p>6.0 No arguments<br>
    * No arguments passed: <script>document.write(testArray.indexOf())</script><br>
    * No arguments passed: <script>document.write(testArray2.indexOf())</script>
</p>

<p>7.0 Looking for null<br>
    * The indexOf null is <script>document.write(testArray.indexOf(null))</script><br>
    * The indexOf null is <script>document.write(testArray2.indexOf(null))</script>
</p>

<p>8.0 Extra arguments<br>
    * The indexOf String "Hello" is <script>document.write(testArray.indexOf("Hello", 0, true))</script>
</p>

<p>9.0 NaN firstIndex<br>
    * The indexOf String "Hi" is <script>document.write(testArray.indexOf("Hello", "Hey"))</script>
</p>

<p>10.0 Small firstIndex<br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true, 0.45))</script>
</p>

<p>11.0 Negative firstIndex bigger than the length of the array<br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true, -1000))</script>
</p>

<p>12.0 Negative firstIndex bigger than 32-bits<br>
    * The indexOf Boolean 'true' is <script>document.write(testArray.indexOf(true, -5294967301))</script>
</p>

<p>13.0 Looking for undefined<br>
    * The indexOf undefined is <script>document.write(testArray.indexOf(undefined))</script><br>
    * The indexOf undefined is <script>document.write(testArray2.indexOf(undefined))</script><br>
    * The indexOf undefined is <script>document.write(testArray4.indexOf(undefined))</script><br>
    * The indexOf undefined is <script>document.write(testArray5.indexOf(undefined))</script><br>
    * The indexOf undefined is <script>document.write(testArray6.indexOf(undefined))</script>
</p>

<p>14.0 Object using the Array prototype<br>
    * The indexOf String "Hello" is <script>document.write(testArray3.indexOf("Hello"))</script><br>
    * The indexOf String "Hi" is <script>document.write(testArray3.indexOf("Hi"))</script><br>
    * The indexOf Boolean 'true' is <script>document.write(testArray3.indexOf(true))</script><br>
    * The indexOf Number '5' is <script>document.write(testArray3.indexOf(5))</script><br>
    * The indexOf Number '9' is <script>document.write(testArray3.indexOf(9))</script>
</p>

</body>
</html>
