<!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 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 1.0.1 JavaScript Benchmark Results (sunspider-1.0.1 test suite)</title>
<link rel="stylesheet" href="../sunspider.css">
</head>

<body>
<h2><span id="logo">&#x2600;</span>SunSpider 1.0.1 JavaScript Benchmark Results</h2>

<h3>Content Version: sunspider-1.0.1</h3>

<p><a href="driver.html">Run Again</a></p>

<p><input style="width: 90%;" id="selfUrl" type="text" readonly="readonly"><br>
<small>(You can bookmark this results URL for later comparison.)</small></p>

<form onsubmit="event.preventDefault(); compare(other.value);">To compare to another run, paste a saved result URL in the text field below and press enter:<br>
<input style="width: 90%;" name="other" type="text"><br>
</form>

<pre id="console">
</pre>

<script src="../json2.js"></script>
<script>
var selfUrlInput = document.getElementById("selfUrl");
selfUrlInput.value = location;

var outputJSON = JSON.parse(decodeURI(location.search.substring(1)));
var version = outputJSON["v"];
delete outputJSON["v"];
var output = pivot(outputJSON);

function pivot(input) {
    var output = [];
    for (var test in input) {
        for (var i = 0; i < input[test].length; i++) {
             if (!output[i])
                 output[i] = {};
             output[i][test] =  input[test][i];
        }
    }
    return output;
}

function print(str) {
    var console = document.getElementById("console");
    console.appendChild(document.createTextNode(str));
    console.appendChild(document.createElement("br"));
}
</script>

<script src="sunspider-test-prefix.js"></script>
<script src="../sunspider-analyze-results.js"></script>
<script src="../sunspider-compare-results.js"></script>

<script>
var output2 = output;
var version2 = version;

function compare(other)
{
    document.getElementById("console").innerHTML = "";

    var output1JSON = JSON.parse(decodeURI(other.split("?")[1]));
    var version1 = output1JSON["v"];
    delete output1JSON["v"];
    if (version1 != version2) {
        print("ERROR: cannot compare version " + version1 + ' with version ' + version2);
    } else {
        var output1 = pivot(output1JSON);
        sunspiderCompareResults(output1, output2);
    }
}
</script>


</body>
</html>
