view static/js/download.js @ 360:8e3b10220bb9

Mercurial version x.y.z, z=0 is always incorrect; disregard. An erroneous latest.dat should be fixed, but this patch will prevent such errors from having a negative effect on the website. (They cause prior versions not to be displayed even when they should be, if Downloader.maxversions is nonzero.) geocommit(1.0): lat 49.0076053, long 8.4207923, hacc 82.0, src nmg; Karlsruhe DE
author David Champion <dgc@uchicago.edu>
date Wed, 02 Mar 2011 11:47:34 -0600
parents a71e03f5edde
children c65b81353b8f
line wrap: on
line source

function Download (source) {
    this.version = source[0];
    this.regex = source[1];
    this.url = source[2];
    this.desc = source[3];

    // Strip '.0' version suffix, unless it is for a minor version.
    // It is always incorrect for Mercurial releases.
    var points = this.version.split('.');
    if (points.length > 2 && points[points.length-1] == "0") {
        points.pop();
        this.version = points.join(".");
    }
}

Download.prototype = {
    matches: function (ua) {
        if (ua.match(this.regex))
            return true;
        return false;
    },

    download: function () {
        document.location.href = this.url;
        return false;
    },

    attr: function (key) {
        return this[key];
    },

    write: function (key) {
        document.write(this[key]);
    }
}


var Downloader = {
    // maximum number of versions to display (0 to display all available)
    maxversions: 2,

    downloads: [],

    init: function (sources) {
        for (i in sources) {
            var source = new Download(sources[i]);
            this.downloads.push(source);
        }
    },

    select: function () {
        var ua = navigator.userAgent;
        for (i in this.downloads) {
            if (this.downloads[i].matches(ua)) {
                return this.downloads[i];
            }
        }
        return null;
    },

    versions: function () {
        var uniq = new Object();
        for (i in this.downloads) {
            uniq[this.downloads[i].version] = 1;
        }
        var versions = new Array();
        for (key in uniq) {
            versions.push(key);
        }
        versions.sort(function (a, b) {
            a = a.toLowerCase();
            b = b.toLowerCase();
            return (a < b) - (b < a);
        });
        return versions;
    },

    listall: function (selector) {
        if (selector == null)
            selector = function (o) { return true; }

        // copy the download list, selecting only wanted nodes
        var downloads = new Array();
        for (i in this.downloads) {
            if (selector(this.downloads[i])) {
                downloads.push(this.downloads[i]);
            }
        }

        // alpha-sort it by description (case-folded)
        downloads.sort(function (a, b) {
            a = a.desc.toLowerCase();
            b = b.desc.toLowerCase();
            return (b < a) - (a < b);
        });

        var desc;
        var out = ''
        for (i in downloads) {
            var dl = downloads[i];
            var ua = navigator.userAgent;
            if (dl.matches(ua))
                desc = '<em>' + dl.desc + '</em>';
            else
                desc = dl.desc;
            out += '<tr>\n<td>' + desc + '</td>' +
                   '<td></td>' +
                   '<td><a href="' + dl.url + '">download</a></td>' +
                   '</tr>';
        }
        return out;
    },

    table: function (name, selector) {
        var out = '';
        out += '<table border="0" cellspacing="0" ' +
               'cellpadding="0" class="latest" width="100%">\n';
        out += '<thead>\n';
        out += '<tr>\n';
        out += '<th>Mercurial ';
        out += name;
        out += '</th>';
        out += '<th></th>';
        out += '<th></th>';
        out += '</tr>';
        out += '</thead>';
        out += '<tbody>';
        out += this.listall(selector);
        out += '</tbody>';
        out += '</table>';
        out += '<br/>';
        return out;
    }
};