15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Inc.  All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var count = output.length;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var itemTotals = {};
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)itemTotals.length = count;
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var total = 0;
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryTotals = {};
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testTotalsByCategory = {};
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var mean = 0;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryMeans = {};
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testMeansByCategory = {};
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var stdDev = 0;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryStdDevs = {};
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testStdDevsByCategory = {};
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var stdErr = 0;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryStdErrs = {};
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testStdErrsByCategory = {};
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function initialize()
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    itemTotals = {total: []};
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < categories.length; i++) {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var category = categories[i];
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemTotals[category] = [];
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryTotals[category] = 0;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testTotalsByCategory[category] = {};
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryMeans[category] = 0;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testMeansByCategory[category] = {};
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryStdDevs[category] = 0;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testStdDevsByCategory[category] = {};
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryStdErrs[category] = 0;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testStdErrsByCategory[category] = {};
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < tests.length; i++) {
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var test = tests[i];
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemTotals[test] = [];
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var category = test.replace(/-.*/, "");
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testTotalsByCategory[category][test] = 0;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testMeansByCategory[category][test] = 0;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testStdDevsByCategory[category][test] = 0;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        testStdErrsByCategory[category][test] = 0;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < count; i++) {
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemTotals["total"][i] = 0;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var category in categoryTotals) {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itemTotals[category][i] = 0;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var test in testTotalsByCategory[category]) {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                itemTotals[test][i] = 0;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeItemTotals()
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < output.length; i++) {
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var result = output[i];
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in result) {
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var time = result[test];
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var category = test.replace(/-.*/, "");
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itemTotals["total"][i] += time;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itemTotals[category][i] += time;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            itemTotals[test][i] += time;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeTotals()
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < output.length; i++) {
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var result = output[i];
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in result) {
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var time = result[test];
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var category = test.replace(/-.*/, "");
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            total += time;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            categoryTotals[category] += time;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            testTotalsByCategory[category][test] += time;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeMeans()
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mean = total / count;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryTotals) {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryMeans[category] = categoryTotals[category] / count;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in testTotalsByCategory[category]) {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function standardDeviation(mean, items)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var deltaSquaredSum = 0;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < items.length; i++) {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var delta = items[i] - mean;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        deltaSquaredSum += delta * delta;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    variance = deltaSquaredSum / (items.length - 1);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Math.sqrt(variance);
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeStdDevs()
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stdDev = standardDeviation(mean, itemTotals["total"]);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryStdDevs) {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]);
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryStdDevs) {
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in testStdDevsByCategory[category]) {
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeStdErrors()
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var sqrtCount = Math.sqrt(count);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stdErr = stdDev / sqrtCount;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryStdErrs) {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryStdDevs) {
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in testStdErrsByCategory[category]) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96];
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tMax = tDistribution.length;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tLimit = 1.96;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function tDist(n)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n > tMax)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return tLimit;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tDistribution[n];
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function formatResult(meanWidth, mean, stdErr, n)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var meanString = mean.toFixed(1).toString();
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (meanString.length < meanWidth) {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        meanString = " " + meanString;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (n == 1)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return meanString + "ms";
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return meanString + "ms +/- " + ((tDist(n) * stdErr / mean) * 100).toFixed(1) + "%";
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeLabelWidth()
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var width = "Total".length;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryMeans) {
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (category.length + 2 > width)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            width = category.length + 2;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < tests.length; i++) {
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var shortName = tests[i].replace(/^[^-]*-/, "");
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (shortName.length + 4 > width)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            width = shortName.length + 4;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return width;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeMeanWidth()
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var width = mean.toFixed(1).toString().length;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryMeans) {
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var candidate = categoryMeans[category].toFixed(2).toString().length;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (candidate > width)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            width = candidate;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in testMeansByCategory[category]) {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var candidate = testMeansByCategory[category][test].toFixed(2).toString().length;
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (candidate > width)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                width = candidate;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return width;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function resultLine(labelWidth, indent, label, meanWidth, mean, stdErr)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = "";
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < indent; i++) {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += " ";
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result += label + ": ";
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (i = 0; i < (labelWidth - (label.length + indent)); i++) {
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += " ";
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result + formatResult(meanWidth, mean, stdErr, count);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function printOutput()
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var labelWidth = computeLabelWidth();
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var meanWidth = computeMeanWidth();
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print("\n");
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print("============================================");
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (count == 1)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print("RESULTS");
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print("RESULTS (means and 95% confidence intervals)");
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print("--------------------------------------------");
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print(resultLine(labelWidth, 0, "Total", meanWidth, mean, stdErr));
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print("--------------------------------------------");
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var category in categoryMeans) {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print("");
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print(resultLine(labelWidth, 2, category, meanWidth, categoryMeans[category], categoryStdErrs[category]));
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var test in testMeansByCategory[category]) {
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var shortName = test.replace(/^[^-]*-/, "");
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            print(resultLine(labelWidth, 4, shortName, meanWidth, testMeansByCategory[category][test], testStdErrsByCategory[category][test]));
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)initialize();
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeItemTotals();
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeTotals();
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeMeans();
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeStdDevs();
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeStdErrors();
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)printOutput();
269