<!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 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 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">
</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>
