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

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

<h3>Content Version: @SUITE@</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>
