<!DOCTYPE html>
<html>
<head>
<!--
 Copyright (C) 2007 Apple Inc.  All rights reserved.

 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
 are met:
 1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
 2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

 THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
-->

<title>SunSpider JavaScript Benchmark (In Progress...)</title>
<link rel="stylesheet" href="sunspider.css"></link>
</head>

<body onload="next()">

<h2><span id="logo">&#x2600;</span>SunSpider JavaScript Benchmark <small>(In Progress...)</small></h2>

<script src="sunspider-test-prefix.js"></script>
<script>
var testIndex = -1;
var currentRepeat = 0;
var repeatCount = 5;

var output = [];
output.length = repeatCount;
for (var i = 0; i < output.length; i++) {
    output[i] = {};
}

function next() 
{
    window.setTimeout(reallyNext, 500);
}

function reallyNext() 
{
    testIndex++;
    if (testIndex < tests.length) {
        document.getElementById("testframe").src = tests[testIndex] + ".html";
    } else if (++currentRepeat < repeatCount) { 
        testIndex = 0;
        document.getElementById("testframe").src = tests[testIndex] + ".html";
    } else {
        finish();
    }
}

function recordResult(time)
{
    output[currentRepeat][tests[testIndex]] = time;
    next();
}

function finish()
{
    var outputString = "{";
    for (var test in output[0]) {
        outputString += '"' + test + '":[';
        for (var i = 0; i < output.length; i++) {
             outputString += output[i][test] + ",";
        }
        outputString = outputString.substring(0, outputString.length - 1);
        outputString += "],";
    }
    outputString = outputString.substring(0, outputString.length - 1);
    outputString += "}";

    location = "sunspider-results.html?" + encodeURI(outputString);
}

</script>

<iframe id="testframe">
</iframe>

</body>
</html>
