function parse_time(input)
{
    input = input.replace(/\s+/g, '');
    if (input.match(/^[012][0-9][^0-9][0-5][0-9]$/))
    {
        var h, m;
        h = input.substring(0, 2);
        if (h >= 24)
            h = "00";
        m = input.substring(3, 5);
        return (h + ":" + m);
    }
    else if (input.match(/^[012][0-9][0-5][0-9]$/))
    {
        var h, m;
        h = input.substring(0, 2);
        if (h >= 24)
            h = "00";
        m = input.substring(2, 4);
        return (h + ":" + m);
    }
    else if (input.match(/^[0-9][^0-9][0-5][0-9]$/))
    {
        var h, m;
        h = input.substring(0, 1);
        m = input.substring(2, 4);
        return ("0" + h + ":" + m);
    }
    else
        return undefined;
}

function parse_date(input)
{
    input = input.replace(/\s+/g, '');

    var parts = input.split(/[^0-9]+/);
    if (parts.length != 3)
        return undefined;

    var y, m, d;
    y = parts[0];
    m = parts[1];
    d = parts[2];

    if (m < 1 || m > 12)
        return undefined;
    if (d < 1 || d > 31)
        return undefined;

    return (y + "." + pad2d(m) + "." + pad2d(d));
}

function parse_datetime(input)
{
    var d = new Date();

    input = input.replace(/^\s+/, '');
    input = input.replace(/\s+$/, '');

    var parts = input.split(/\s+/);
    if (parts.length != 2)
        return undefined;

    var canon = parse_date(parts[0]);
    if (canon == undefined)
        return undefined;

    d.setUTCFullYear(canon.substring(0, 4));
    d.setUTCMonth(canon.substring(5, 7) - 1);
    d.setUTCDate(canon.substring(8, 10));

    var canon = parse_time(parts[1]);
    if (canon == undefined)
        return undefined;

    d.setUTCHours(canon.substring(0, 2));
    d.setUTCMinutes(canon.substring(3, 5));
    d.setUTCSeconds(0);
    d.setUTCMilliseconds(0);

    return d;
}

function format_datetime(d)
{
    if (d == undefined)
        return "";

    return (d.getUTCFullYear() + "." +
            pad2d(d.getUTCMonth() + 1) + "." +
            pad2d(d.getUTCDate()) +
            " " +
            pad2d(d.getUTCHours()) + ":" +
            pad2d(d.getUTCMinutes()));
}

function my_time(input)
{
    var canon = parse_time(input);
    if (canon != undefined)
    {
        var now = new Date();
        var off = now.getTimezoneOffset();
        if (off == 0)
            return canon;
    
        var min = (canon.substring(0, 2) * 60) + (canon.substring(3, 5) * 1);
        var min = min - off;
    
        var h = Math.floor(min / 60);
        if (h < 0)
            h += 24;
        else if (h > 24)
            h -= 24;
    
        var m = min % 60;
        if (m < 0)
            m += 60;
    
        return (canon + " (" + pad2d(h) + ":" + pad2d(m) + ")");
    }

    var d = parse_datetime(input);
    if (d != undefined)
    {
        if (d.getTimezoneOffset() == 0)
            format_datetime(d);
        else
            return (format_datetime(d) + " (" + d.toLocaleString() + ")");
    }

    return '<em>?' + input + '?</em>';
}

function display_evetime(id)
{
    var span = document.getElementById(id);
    if (span == undefined)
        return;

    span.innerHTML = format_datetime(new Date());

    setTimeout('display_evetime("' + id + '")', 20000);
}

function display_mytime(id)
{
    var span = document.getElementById(id);
    if (span == undefined)
        return;

    var d = new Date();
    d.setUTCSeconds(0);
    d.setUTCMilliseconds(0);
    if (d.getTimezoneOffset() == 0)
        span.innerHTML = format_datetime(d);
    else
        span.innerHTML = format_datetime(d)  + " (" + d.toLocaleString() + ")";

    setTimeout('display_mytime("' + id + '")', 20000);
}

function pad2d(val)
{
    if (typeof val == 'integer' || typeof val == 'number')
    {
        if (val < 10)
            return "0" + val.toString();
    }
    else if (typeof val == 'string')
    {
        if (val.length < 2)
            return "0" + val;
    }
    return val;
}
