15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function(){
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Populated from: http://www.medcalc.be/manual/t-distribution.php
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 95% confidence for N - 1 = 4
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var tDistribution = 2.776;
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The number of individual test iterations to do
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var numTests = 5;
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The type of run that we're doing (options are "runs/s" or "ms")
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var runStyle = "runs/s";
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // A rough estimate, in seconds, of how long it'll take each test
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // iteration to run
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var timePerTest = runStyle === "runs/s" ? 1 : 0.5;
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Initialize a batch of tests
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //  name = The name of the test collection
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.startTest = function(name, version){
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                numloaded++;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( numloaded == totalTests )
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setTimeout( init, 100 );
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testName = name;
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !queues[testName] ) return;
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testID = testName;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testNames[testID] = testName;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testVersions[testID] = version || 0;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testSummary[testID] = testSummaryNum[testID] = testDone[testID] = testNum[testID] = 0;
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                queues[testID].push(function(){
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        summary = 0;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        dequeue();
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                });
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Anything that you want to have run in order, but not actually test
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.prep = function(fn){
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !queues[testName] ) return;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                queues[testID].push(function(){
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        fn();
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        dequeue();
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                });
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // End the tests and finalize the report
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.endTest = function(){
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !queues[testName] ) return;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Save the summary output until all the test are complete
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                queues[testID].push(function(){
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        dequeue();
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                });
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Run a new test
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //  name = The unique name of the test
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //  num = The 'length' of the test (length of string, # of tests, etc.)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //  fn = A function holding the test to run
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.test = function(name, num, fn){
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !queues[testName] ) return;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Save the summary output until all the test are complete
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var curTest = testName, curID = testID;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( arguments.length === 3 ) {
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( !nameDone[name] )
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                nameDone[name] = 0;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        nameDone[name]++;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( nameDone[name] != 3 )
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        fn = num;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        num = 1;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                time += timePerTest * numTests;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testNum[curID]++;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Don't execute the test immediately
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                queues[testID].push(function(){
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        title = name;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var times = [], start, pos = 0, cur;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        setTimeout(function(){
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // run tests
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                try {
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( doShark(name) ) {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                connectShark();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                startShark();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        start = (new Date()).getTime();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( runStyle === "runs/s" ) {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var runs = 0;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                cur = (new Date()).getTime();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                while ( (cur - start) < 1000 ) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        fn();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        cur = (new Date()).getTime();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        runs++;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                fn();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                cur = (new Date()).getTime();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( doShark(name) ) {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                stopShark();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                disconnectShark();
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        // For making Median and Variance
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( runStyle === "runs/s" ) {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                times.push( (runs * 1000) / (cur - start) );
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                times.push( cur - start );
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } catch( e ) {
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        alert("FAIL " + name + " " + num + e);
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        return;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( pos < numTests ) {
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        updateTime();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        updateTestPos({curID: curID, collection: testNames[curID], version: testVersions[curID]});
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( ++pos < numTests ) {
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        setTimeout( arguments.callee, 1 );
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } else {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var data = compute( times, numTests );
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data.curID = curID;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data.collection = testNames[curID];
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data.version = testVersions[curID];
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data.name = title;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data.scale = num;
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                        data.times = times;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        logTest(data);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        dequeue();
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }, 1);
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                });
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                function compute(times, runs){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var results = {runs: runs}, num = times.length;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        times = times.sort(function(a,b){
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return a - b;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        });
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Sum
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.sum = 0;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; i < num; i++ )
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                results.sum += times[i];
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Min
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.min = times[0];
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Max
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.max = times[ num - 1 ];
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Mean
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.mean = results.sum / num;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Median
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.median = num % 2 == 0 ?
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                (times[Math.floor(num/2)] + times[Math.ceil(num/2)]) / 2 :
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                times[Math.round(num/2)];
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Variance
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.variance = 0;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; i < num; i++ )
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                results.variance += Math.pow(times[i] - results.mean, 2);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.variance /= num - 1;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Make Standard Deviation
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.deviation = Math.sqrt( results.variance );
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Compute Standard Errors Mean
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.sem = (results.deviation / Math.sqrt(results.runs)) * tDistribution;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Error
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        results.error = ((results.sem / results.mean) * 100) || 0;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return results;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // All the test data
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var tests;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The number of test files to load
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var totalTests = 0;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var totalTestItems = 0;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The number of test files loaded
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var numloaded = 0;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Queue of functions to run
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var queue = [];
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var queues = {};
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var catnames = {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dromaeo: "Dromaeo JavaScript Tests",
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                sunspider: "SunSpider JavaScript Tests",
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                "v8": "V8 JavaScript Tests",
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dom: "DOM Core Tests",
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                jslib: "JavaScript Library Tests",
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                cssquery: "CSS Selector Tests"
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var testElems = {};
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var testNum = {};
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var testDone = {};
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var testNames = {};
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var testVersions = {};
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var dataStore = [];
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var names = [];
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var interval;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var totalTime = 0;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var time = 0;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var title, testName, testID, testSummary = {} , testSummaryNum = {}, maxTotal = 0, maxTotalNum = 0;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nameDone = {};
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Query String Parsing
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var search = window.limitSearch || (window.location.search || "?").substr(1);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        search = search.replace(/&runStyle=([^&]+)/, function(all, type){
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                runStyle = type;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return "";
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        });
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var parts = search.split("&");
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ( parts[0] === "recommended" ) {
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                parts[0] = "dromaeo|sunspider|v8|dom|jslib";
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var none = !parts[0] || parts[0].match(/=/);
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var filter = parts.length && !parts[0].match(/=/) && parts[0] !== "all" ?
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                new RegExp(parts.shift(), "i") :
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                /./;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // To enable shark debugging add &shark to the end of the URL
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var doShark = function(name) { return false; };
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for ( var i = 0; i < parts.length; i++ ) {
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var m = /^shark(?:=(.*))?$/.exec(parts[i]);
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m) {
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (m[1] === undefined) {
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                doShark = function(name) { return true; };
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        else {
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var sharkMatch = new RegExp(m[1]);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                doShark = function(name) {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        return sharkMatch.test(name);
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                };
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m = /^numTests=(\d+)$/.exec(parts[i]);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (m)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        numTests = Number(m[1]);
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        jQuery(function(){
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var id = search.match(/id=([\d,]+)/);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( none && !id ) {
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#overview").hide();
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        return;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var cat = filter.toString().slice(1,-2);
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( catnames[cat] ) {
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#overview span:first").html( catnames[cat] );
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( catnames[cat].length > 22 ) {
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                $("#overview span:first").css("font-size", 22);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#tests").hide();
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                jQuery.getJSON("tests/MANIFEST.json", function(json){
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        tests = json;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        names = [];
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var name in tests )
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // Don't load tests that we aren't looking for
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( filter.test( name ) )
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        names.push( name );
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        names = names.sort(function(a, b){
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                return tests[a].name < tests[b].name ?  -1 :
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        tests[a].name == tests[b].name ?  0 : 1;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        });
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Check if we're loading a specific result set
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // ?id=NUM
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( id ) {
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                jQuery.ajax({
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        url: "store.php?id=" + id[1],
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        dataType: "json",
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        success: function(data){
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                resultsLoaded(id[1], data);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                });
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Otherwise we're loading a normal set of tests
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                $("#wrapper").append("<br style='clear:both;'/><center><a href='?" + names.join("|") + "'>Re-run tests</a></center>");
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0; i < names.length; i++ ) (function(name){
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var test = tests[name];
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        queues[name] = [];
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        makeElem(name);
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        initTest(name);
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        totalTests++;
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        // Check if we're loading an HTML file
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( test.file.match(/html$/) ) {
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var iframe = document.createElement("iframe");
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                iframe.style.height = "1px";
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                iframe.style.width = "1px";
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                iframe.src = "tests/" + test.file;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                document.body.appendChild( iframe );
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        // Otherwise we're loading a pure-JS test
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        } else {
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                jQuery.getScript("tests/" + test.file);
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                })(names[i]);
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                });
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        });
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Remove the next test from the queue and execute it
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function dequeue(){
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( interval && queue.length ) {
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (window.parent) {
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                window.parent.postMessage({ name: "dromaeo:progress",
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                            status: { current: totalTestItems - queue.length,
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                      score: dataStore[dataStore.length - 1],
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                                      total: totalTestItems } }, "*");
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        queue.shift()();
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else if ( queue.length == 0 ) {
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        interval = false;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        time = 0;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#overview input").remove();
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        updateTimebar();
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( window.limitSearch ) {
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var summary = (runStyle === "runs/s" ? Math.pow(Math.E, maxTotal / maxTotalNum) : maxTotal).toFixed(2);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( typeof tpRecordTime !== "undefined" ) {
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        tpRecordTime( summary );
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } else {
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var pre = document.createElement("pre");
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        pre.style.display = "none";
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        pre.innerHTML = "__start_report" + summary + "__end_report";
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        document.body.appendChild( pre );
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( typeof goQuitApplication !== "undefined" ) {
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        goQuitApplication();
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else if ( dataStore && dataStore.length ) {
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                $("body").addClass("alldone");
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var div = jQuery("<div class='results'>Saving...</div>").insertBefore("#overview");
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                jQuery.ajax({
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        type: "POST",
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        url: "store.php",
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        data: "data=" + encodeURIComponent(JSON.stringify(dataStore)) + "&style=" + runStyle,
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        success: function(id){
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var url = window.location.href.replace(/\?.*$/, "") + "?id=" + id;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                div.html("Results saved. You can access them at a later time at the following URL:<br/><strong><a href='" + url + "'>" + url + "</a></strong></div>");
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                });
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if (window.parent)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        window.parent.postMessage({ name: "dromaeo:alldone", result: dataStore }, "*");
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function updateTimebar(){
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#timebar").html("<span><strong>" + (runStyle === "runs/s" ? Math.pow(Math.E, maxTotal / maxTotalNum) : maxTotal).toFixed(2) + "</strong>" + runStyle + " (Total)</span>");
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Run once all the test files are fully loaded
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function init(){
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for ( var n = 0; n < names.length; n++ ) {
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        queue = queue.concat( queues[ names[n] ] );
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                totalTestItems = queue.length;
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                totalTime = time;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                time += timePerTest;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                updateTime();
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#pause")
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .val("Run")
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .click(function(){
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( interval ) {
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        interval = null;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        this.value = "Run";
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                } else {
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !interval ) {
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                interval = true;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                dequeue();
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        this.value = "Pause";
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        });
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( window.limitSearch ) {
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#pause").click();
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (window.parent)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        window.parent.postMessage({ name: "dromaeo:ready" }, "*");
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function initTest(curID){
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("<div class='result-item'></div>")
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .append( testElems[ curID ] )
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .append( "<p>" + (tests[curID] ? tests[ curID ].desc : "") + "<br/><a href='" +
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                (tests[curID] && tests[curID].origin ? tests[ curID ].origin[1] : "") + "'>Origin</a>, <a href='tests/" +
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                (tests[curID] ? tests[ curID ].file : "") + "'>Source</a>, <b>Tests:</b> " +
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                (tests[curID] && tests[curID].tags ? tests[ curID ].tags.join(", ") : "") + "</p>" )
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .append( "<ol class='results'></ol>" )
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .appendTo("#main");
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function resultsLoaded(id, datas){
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var results = {};
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var runs = {};
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var output = "";
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var excluded = [];
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var overview = document.getElementById("overview");
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for ( var d = 0; d < datas.length; d++ ) {
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var data = datas[d];
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runStyle = data.style;
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( datas.length == 1 ) {
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                $("#overview").before("<div class='results'>Viewing test run #" + id +
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        ", run on: " + data.created_at + " by:<br>" + data.useragent + "</div>");
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runs[data.id] = data;
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runs[data.id].mean = 0;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runs[data.id].error = 0;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runs[data.id].num = 0;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        runs[data.id].name = (data.useragent.match(/(MSIE [\d.]+)/) ||
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                data.useragent.match(/((?:WebKit|Firefox|Shiretoko|Opera)\/[\w.]+)/) || [0,data.id])[1];
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; i < data.results.length; i++ ) {
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var result = data.results[i];
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var curID = result.collection;
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var run = result.run_id;
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                result.version += data.style;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( !results[curID] )
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        results[curID] = {tests:{}, total:{}, version: result.version};
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( results[curID].version == result.version ) {
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( !results[curID].total[run] ) {
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                results[curID].total[run] = {max:0, mean:0, median:0, min:0, deviation:0, error:0, num:0};
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                results[curID].tests[run] = [];
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        result.error = ((((result.deviation / Math.sqrt(result.runs)) * tDistribution) / result.mean) * 100) || 0;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        results[curID].tests[run].push( result );
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var error = (parseFloat(result.error) / 100) * parseFloat(result.mean);
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        error = (runStyle === "ms" ? error : error == 0 ? 0 : Math.log(error));
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var total = results[curID].total[run];
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        total.num++;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        for ( var type in total ) {
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                if ( type == "error" ) {
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        total.error += error;
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                } else if ( type == "mean" ) {
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        total.mean += (runStyle === "ms" ? parseFloat(result.mean) : Math.log(parseFloat(result.mean)));
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                } else if ( type !== "num" ) {
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                        total[type] += parseFloat(result[type]);
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                }
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runs[run].num++;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runs[run].mean += runStyle === "ms" ? parseFloat(result.mean) : Math.log(parseFloat(result.mean));
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runs[run].error += error;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var runTests = [];
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( datas.length == 1 ) {
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("body").addClass("alldone");
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var i = 0; i < data.results.length; i++ ) {
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var item = data.results[i];
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var result = item.curID = item.collection;
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( !filter.test(result) )
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        continue;
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( !testElems[result] ) {
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runTests.push(result);
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        makeElem( result );
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        initTest( result );
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // Compute Standard Errors Mean
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                item.sem = (item.deviation / Math.sqrt(item.runs)) * tDistribution;
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // Error
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                item.error = ((item.sem / item.mean) * 100) || 0;
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                logTest( item );
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // testDone, testNum, testSummary
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                testDone[ result ] = numTests - 1;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                testNum[ result ] = 1;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                updateTestPos( item );
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("div.result-item").addClass("done");
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        totalTime = time = timePerTest;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        updateTime();
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#overview input").remove();
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        updateTimebar();
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        // Remove results where there is only one comparison set
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var id in results ) {
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var num = 0;
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var ntest in results[id].tests ) {
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        num++;
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        if ( num > 1 )
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                break;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( num <= 1 ) {
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        excluded.push( id );
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        delete results[id];
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var preoutput = "<tr><td></td>";
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var run in runs )
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                preoutput += "<th><a href='?id=" + run + "'>" + runs[run].name + "</a></th>";
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        //preoutput += "<th>Winning %</th></tr>";
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        preoutput += "</tr>";
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var result in results ) {
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                // Skip results that we're filtering out
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( !filter.test(result) )
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        continue;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                runTests.push(result);
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( runStyle === "runs/s" ) {
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        for ( var run in runs ) {
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var mean = results[result].total[run].mean - 0;
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                var error = results[result].total[run].error - 0;
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                mean = Math.pow(Math.E, mean / results[result].total[run].num);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                error = Math.pow(Math.E, error / results[result].total[run].num);
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                results[result].total[run].mean = mean;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                results[result].total[run].error = error;
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var name = tests[result] ? tests[result].name : result;
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var tmp = processWinner(results[result].total);
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                output += "<tr><th class='name'><span onclick='toggleResults(this.nextSibling);'>&#9654; </span>" +
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        "<a href='' onclick='return toggleResults(this);'>" + name + "</a></th>";
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var run in runs ) {
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var mean = results[result].total[run].mean - 0;
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        var error = results[result].total[run].error - 0;
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        output += "<td class='" + (tmp[run] || '') + "'>" + mean.toFixed(2) + "<small>" + runStyle + " &#177;" + ((error / mean) * 100).toFixed(2) + "%</small></td>";
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                //showWinner(tmp);
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                output += "</tr>";
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var _tests = results[result].tests, _data = _tests[run], _num = _data.length;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var i = 0; i < _num; i++ ) {
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        output += "<tr class='onetest hidden'><td><small>" + _data[i].name + "</small></td>";
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        for ( var run in runs ) {
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                output += "<td>" + (_tests[run][i].mean - 0).toFixed(2) + "<small>" + runStyle + " &#177;" + (_tests[run][i].error - 0).toFixed(2) + "%</small></td>";
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        }
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        output += "<td></td></tr>";
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( runStyle === "runs/s" ) {
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                for ( var run in runs ) {
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runs[run].mean = Math.pow(Math.E, runs[run].mean / runs[run].num);
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        runs[run].error = Math.pow(Math.E, runs[run].error / runs[run].num);
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                }
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var tmp = processWinner(runs);
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var totaloutput = "";
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( runStyle === "ms" ) {
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                totaloutput += "<tr><th class='name'>Total:</th>";
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else {
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                totaloutput += "<tr><th class='name'>Total Score:</th>";
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        for ( var run in runs ) {
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                totaloutput += "<th class='name " + (tmp[run] || '') + "' title='" + (tmp[run + "title"] || '') + "'>" + runs[run].mean.toFixed(2) + "<small>" + runStyle + " &#177;" + ((runs[run].error / runs[run].mean) * 100).toFixed(2) + "%</small></th>";
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        //showWinner(tmp);
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        totaloutput += "</tr>";
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        overview.className = "";
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        overview.innerHTML = "<div class='resultwrap'><table class='results'>" + preoutput + totaloutput + output + totaloutput + "</table>" + (excluded.length ? "<div style='text-align:left;'><small><b>Excluded Tests:</b> " + excluded.sort().join(", ") + "</small></div>" : "") + "</div>";
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#wrapper").append("<center><a href='?" + runTests.join("|") + "'>Re-run tests</a></center>");
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                function showWinner(tmp){
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( datas.length > 1 ) {
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( tmp.tie )
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        output += "<th>Tie</th>";
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                else
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        output += "<th>" + tmp.diff + "%</th>";
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.toggleResults = function(elem){
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var span = elem.previousSibling;
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                elem.blur();
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                elem = elem.parentNode.parentNode.nextSibling;
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                span.innerHTML = elem.className.indexOf("hidden") < 0 ? "&#9654; " : "&#9660; ";
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                while ( elem && elem.className.indexOf("onetest") >= 0 ) {
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        elem.className = "onetest" + (elem.className.indexOf("hidden") >= 0 ? " " : " hidden");
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        elem = elem.nextSibling;
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function updateTime(){
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                time -= timePerTest;
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#left").html(Math.floor(time / 60) + ":" + (time % 60 < 10 ? "0" : "" ) + Math.floor(time % 60));
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var w = ((totalTime - time) / totalTime) * 100;
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                $("#timebar").width((w < 1 ? 1 : w) + "%");
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function logTest(data){
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Keep a running summary going
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                data.mean = parseFloat(data.mean);
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var mean = (runStyle === "runs/s" ? Math.log(data.mean) : data.mean);
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testSummary[data.curID] = (testSummary[data.curID] || 0) + mean;
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testSummaryNum[data.curID] = (testSummaryNum[data.curID] || 0) + 1;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                maxTotal += mean;
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                maxTotalNum++;
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testDone[data.curID]--;
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                updateTestPos(data);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testElems[data.curID].next().next().append("<li><b>" + data.name +
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ":</b> " + data.mean.toFixed(2) + "<small>" + runStyle + " &#177;" + data.error.toFixed(2) + "%</small></li>");
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                dataStore.push(data);
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function updateTestPos(data, update){
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( !update )
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        testDone[data.curID]++;
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var per = (testDone[data.curID] / (testNum[data.curID] * numTests)) * 100;
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( update )
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        per = 1;
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var mean = (runStyle === "runs/s" ?
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        Math.pow(Math.E, testSummary[data.curID] / testSummaryNum[data.curID]) :
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        testSummary[data.curID]);
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testElems[data.curID].html("<b>" + (tests[data.curID] ? tests[data.curID].name : data.curID) +
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ":</b> <div class='bar'><div style='width:" +
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        per + "%;'>" + (per >= 100 ? "<span>" + mean.toFixed(2) + runStyle + "</span>" : "") + "</div></div>");
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( per >= 100 && testSummary[data.curID] > 0 ) {
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        testElems[data.curID].parent().addClass("done");
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function processWinner(data){
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var minVal = -1, min2Val = -1, min, min2;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for ( var i in data ) {
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var total = data[i].mean;
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( minVal == -1 || (runStyle === "ms" && total <= minVal || runStyle === "runs/s" && total >= minVal) ) {
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                min2Val = minVal;
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                min2 = min;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                minVal = total;
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                min = i;
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        } else if ( min2Val == -1 || (runStyle === "ms" && total <= minVal || runStyle === "runs/s" && total >= min2Val) ) {
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                min2Val = total;
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                min2 = i;
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var tieVal = (runStyle === "ms" ? minVal : min2Val) + data[min].error + data[min2].error;
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var ret = {
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        winner: min,
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        diff: runStyle === "ms" ?
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                -1 * Math.round((1 - (min2Val / minVal)) * 100) :
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                Math.round(((minVal / min2Val) - 1) * 100),
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        tie: minVal == min2Val || (runStyle === "ms" ? tieVal >= min2Val : tieVal >= minVal)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                };
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ret.tie = ret.tie || ret.diff == 0;
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( ret.tie ) {
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ret[ min ] = 'tie';
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ret[ min2 ] = 'tie';
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ret[ min + 'title' ] = "Tied with another run.";
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ret[ min2 + 'title' ] = "Tied with another run.";
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ret[ min ] = 'winner';
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( min2Val > -1 ) {
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                ret[ min + 'title' ] = "Won by " + ret.diff + "%.";
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return ret;
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function makeElem(testID){
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if ( tests[testID] ) {
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        var cat = tests[testID].category, catsm = cat.replace(/[^\w]/g, "-");
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if ( !$("#" + catsm).length ) {
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                $("#main").append("<h2 id='" + catsm + "' class='test'><a href='?cat=" + cat +"'>" + cat + '</a><div class="bar"><div id="timebar" style="width:25%;"><span class="left">Est.&nbsp;Time:&nbsp;<strong id="left">0:00</strong></span></div></div>');
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        }
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                testElems[testID] = $("<div class='test'></div>")
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        .click(function(){
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var next = jQuery(this).next().next();
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                if ( next.children().length == 0 ) return;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                var display = next.css("display");
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                next.css("display", display == 'none' ? 'block' : 'none');
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        });
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                updateTestPos({curID: testID, collection: tests[testID] ? tests[testID].name : testID, version: testVersions[testID]}, true);
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        window.addEventListener("message", function(event) {
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                switch (event.data.name) {
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                case "dromaeo:start":
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        $("#pause").click();
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        break;
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                default:
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        console.log("Unknwon message:" + JSON.stringify(event.data));
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        break;
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)});
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})();
807