<!DOCTYPE html>
<html>
<head>

<meta charset=utf8>

<!--
 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 0.9.1 JavaScript Benchmark (@SUITE@ test suite - In Progress...)</title>
<link rel="stylesheet" href="../sunspider.css">
</head>

<body onload="start()">

<h2><span id="logo">&#x2600;</span>SunSpider JavaScript Benchmark <small>(In Progress...)</small></h2>
<h3>Content Version: @SUITE@</h3>

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

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

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

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

function reallyNext() 
{
    document.getElementById("frameparent").innerHTML = "";
    document.getElementById("frameparent").innerHTML = "<iframe id='testframe'>";
    var testFrame = document.getElementById("testframe");
    testIndex++;
    if (testIndex < tests.length) {
        testFrame.contentDocument.open();
        testFrame.contentDocument.write(testContents[testIndex]);
        testFrame.contentDocument.close;
    } else if (++currentRepeat < repeatCount) { 
        testIndex = 0;
        testFrame.contentDocument.open();
        testFrame.contentDocument.write(testContents[testIndex]);
        testFrame.contentDocument.close;
    } else {
        finish();
    }
}

function recordResult(time)
{
    if (currentRepeat >= 0) // negative repeats are warmups
        output[currentRepeat][tests[testIndex]] = time;
    next();
}

function finish()
{
    var outputString = "{";
    outputString += '"v": "@SUITE@", ';
    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 = "results.html?" + encodeURI(outputString);
}

</script>

<div id="frameparent">
</div>

</body>
</html>
