/*
 * @(#) pwall.js
 */

var net;
if (!net)
    net = {};
else if (typeof net != 'object')
    throw new Error('net prefix exists but is not an object');
if (!net.pwall)
    net.pwall = {};
else if (typeof net.pwall != 'object')
    throw new Error('net.pwall prefix exists but is not an object');
if (net.pwall.Website)
    throw new Error('net.pwall.Website already exists');

net.pwall.Website = {

    topicClass: 'topic-all',
    hoverClass: 'std-hover',
    unhovClass: 'std-topic',
    timeZones: [
        {
            city: 'London',
            offset: 0,
            standard: 'GMT',
            daylight: 'BST',
            daylightTimes: [
                { start: '2009-03-29T01:00Z', end: '2009-10-25T01:00Z' },
                { start: '2010-03-28T01:00Z', end: '2010-10-31T01:00Z' },
                { start: '2011-03-27T01:00Z', end: '2011-10-30T01:00Z' },
                { start: '2012-03-25T01:00Z', end: '2012-10-28T01:00Z' }
            ]
        },
        {
            city: 'Sydney',
            offset: +10,
            standard: 'AEST',
            daylight: 'AEDT',
            daylightTimes: [
                { start: '2008-10-04T16:00Z', end: '2009-04-04T16:00Z' },
                { start: '2009-10-03T16:00Z', end: '2010-04-03T16:00Z' },
                { start: '2010-10-02T16:00Z', end: '2011-04-02T16:00Z' },
                { start: '2011-10-01T16:00Z', end: '2012-03-31T16:00Z' }
            ]
        },
        {
            city: 'Auckland',
            offset: +12,
            standard: 'NZST',
            daylight: 'NZDT',
            daylightTimes: [
                { start: '2008-09-27T14:00Z', end: '2009-04-04T14:00Z' },
                { start: '2009-09-26T14:00Z', end: '2010-04-03T14:00Z' },
                { start: '2010-09-25T14:00Z', end: '2011-04-02T14:00Z' },
                { start: '2011-09-24T14:00Z', end: '2012-03-31T14:00Z' }
            ]
        },
        {
            city: 'New York',
            offset: -05,
            standard: 'EST',
            daylight: 'EDT',
            daylightTimes: [
                { start: '2009-03-08T07:00Z', end: '2009-11-01T07:00Z' },
                { start: '2010-03-14T07:00Z', end: '2010-11-07T07:00Z' },
                { start: '2011-03-13T07:00Z', end: '2011-11-06T07:00Z' },
                { start: '2012-03-11T07:00Z', end: '2012-11-04T07:00Z' }
            ]
        },
        {
            city: 'Chicago',
            offset: -06,
            standard: 'CST',
            daylight: 'CDT',
            daylightTimes: [
                { start: '2009-03-08T08:00Z', end: '2009-11-01T08:00Z' },
                { start: '2010-03-14T08:00Z', end: '2010-11-07T08:00Z' },
                { start: '2011-03-13T08:00Z', end: '2011-11-06T08:00Z' },
                { start: '2012-03-11T08:00Z', end: '2012-11-04T08:00Z' }
            ]
        },
        {
            city: 'Denver',
            offset: -07,
            standard: 'MST',
            daylight: 'MDT',
            daylightTimes: [
                { start: '2009-03-08T09:00Z', end: '2009-11-01T09:00Z' },
                { start: '2010-03-14T09:00Z', end: '2010-11-07T09:00Z' },
                { start: '2011-03-13T09:00Z', end: '2011-11-06T09:00Z' },
                { start: '2012-03-11T09:00Z', end: '2012-11-04T09:00Z' }
            ]
        },
        {
            city: 'Los Angeles',
            offset: -08,
            standard: 'PST',
            daylight: 'PDT',
            daylightTimes: [
                { start: '2009-03-08T10:00Z', end: '2009-11-01T10:00Z' },
                { start: '2010-03-14T10:00Z', end: '2010-11-07T10:00Z' },
                { start: '2011-03-13T10:00Z', end: '2011-11-06T10:00Z' },
                { start: '2012-03-11T10:00Z', end: '2012-11-04T10:00Z' }
            ]
        }
    ],

    topicHover: function(e) {
        e.className = net.pwall.Website.hoverClass + ' ' + net.pwall.Website.topicClass;
        window.status = "Go to " + e.parentNode.title;
        return true;
    },

    topicUnhov: function(e) {
        e.className = net.pwall.Website.unhovClass + ' ' + net.pwall.Website.topicClass;
        window.status = "";
        return true;
    },

    topicClick: function(a) {
        window.location = a;
    },

    pageLoad: function(h) {
        var r = document.referrer;
        if (r == null || r.length == 0)
            return;
        var i = h.length + 8;
        if (r.length >= i && r.substring(0, i) == 'http://' + h + '/')
            return;
        if (r.length >= 17) {
            var r17 = r.substring(0, 17);
            if (r17 == 'http://pwall.net/' || r17 == 'http://localhost:' ||
                    r17 == 'http://127.0.0.1:')
                return;
            if (r.length >= 21 && r.substring(0, 21) == 'http://www.pwall.net/')
                return;
        }
        var a = [ '<img src="http://', h, '/SP?r=', net.pwall.StringUtil.escapeURI(r),
                '" width="1" height="1" border="0">' ];
        document.write(a.join(''));
    },

    pageInit: function(name, domain, linkClass) {
        var addr = name + '@' + domain;
        var h = [ '<a href="mailto:', addr, '" class="', linkClass, '">', addr, '</a>' ];
        document.getElementById('email-addr').innerHTML = h.join('');
        net.pwall.Website.rewriteTopics();
    },

    rewriteTopics: function() {
        var topicNodes = document.getElementById('topic-column').childNodes;
        for (var i = 0; i < topicNodes.length; i++) {
            var topicNode = topicNodes[i];
            if (topicNode.nodeType == 1 && topicNode.tagName == 'DIV' &&
                    topicNode.className != 'topic-head') {
                var aNode = topicNode.getElementsByTagName('A')[0];
                var href = aNode.href;
                var content = '';
                var contentNodes = aNode.childNodes;
                for (var j = 0; j < contentNodes.length; j++) {
                    var contentNode = contentNodes[j];
                    if (contentNode.nodeType == 3)
                        content += contentNode.data;
                }
                var h = [ '<div class="', net.pwall.Website.unhovClass, ' ',
                        net.pwall.Website.topicClass, '" ',
                        'onmouseover="net.pwall.Website.topicHover(this)" ',
                        'onmouseout="net.pwall.Website.topicUnhov(this)" ',
                        'onclick="net.pwall.Website.topicClick(\'', href,
                        '\')">', content, '</div>' ];
                topicNode.innerHTML = h.join('');
            }
        }
    },

    timeTimeoutId: 0,

    initTime: function() {
        net.pwall.Website.updateTime();
        document.getElementById('time-div').style.display = 'block';
        window.onfocus = net.pwall.Website.updateTime;
    },

    updateTime: function() {
    	var w = net.pwall.Website;
        if (w.timeTimeoutId != 0) {
            window.clearTimeout(w.timeTimeoutId);
            w.timeTimeoutId = 0;
        }
        var date = new Date();
        w.setTime('date-0', 'day-0', 'time-0', date, 0);
        w.setTimeDST('date-1', 'day-1', 'time-1', 'zone-1', date, 'Auckland');
        w.setTimeDST('date-2', 'day-2', 'time-2', 'zone-2', date, 'Sydney');
        w.setTimeDST('date-3', 'day-3', 'time-3', 'zone-3', date, 'London');
        w.setTimeDST('date-4', 'day-4', 'time-4', 'zone-4', date, 'New York');
        w.timeTimeoutId = window.setTimeout(w.updateTime,
                (60 - date.getUTCSeconds()) * 1000 - date.getUTCMilliseconds());
    },

    dayNames: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],

    setTime: function(dateId, dayId, timeId, date, offset) {
    	var w = net.pwall.Website;
        date = new Date(date.valueOf() + (offset * 60 * 60 * 1000));
        document.getElementById(timeId).innerHTML = w.twoDigit(date.getUTCHours()) + ':' +
                w.twoDigit(date.getUTCMinutes());
        document.getElementById(dayId).innerHTML = w.dayNames[date.getUTCDay()];
        document.getElementById(dateId).innerHTML = String(date.getUTCFullYear()) + '-' +
                w.twoDigit(date.getUTCMonth() + 1) + '-' + w.twoDigit(date.getUTCDate());
    },

    setTimeDST: function(dateId, dayId, timeId, zoneId, date, city) {
    	var w = net.pwall.Website;
        for (var i = 0; i < w.timeZones.length; ++i) {
            var timeZone = w.timeZones[i];
            if (timeZone.city == city) {
                var zoneName = timeZone.standard;
                var offset = timeZone.offset;
                var d = [ String(date.getUTCFullYear()), '-',
                        w.twoDigit(date.getUTCMonth() + 1), '-', w.twoDigit(date.getUTCDate()),
                        'T', w.twoDigit(date.getUTCHours()), ':',
                        w.twoDigit(date.getUTCMinutes()), 'Z' ];
                var dateISO8601 = d.join('');
                for (var j = 0; j < timeZone.daylightTimes.length; ++j) {
                    var entry = timeZone.daylightTimes[j];
                    if (dateISO8601 >= entry.start && dateISO8601 < entry.end) {
                        offset++;
                        zoneName = timeZone.daylight;
                        break;
                    }
                }
                w.setTime(dateId, dayId, timeId, date, offset);
                var zoneElem = document.getElementById(zoneId);
                if (zoneElem) {
                	d = [ zoneName, ' : UTC' ];
                	if (offset < 0) {
                		d.push('-');
                		offset = -offset;
                	}
                	else
                		d.push('+');
                	d.push(w.twoDigit(offset));
                	zoneElem.title = d.join('');
                }
                break;
            }
        }
    },

    twoDigit: function(i) {
        return i < 10 ? '0' + i : String(i);
    },

    initExpandChar: function() {
        var tds = document.getElementsByTagName('TD');
        for (var i = 0; i < tds.length; ++i) {
            var td = tds[i];
            if (td.className == 'code-entry-ch') {
                td.onmouseover = net.pwall.Website.expandChar;
            }
        }
    },

    expandTimeoutId: 0,

    expandClear: function() {
        if (net.pwall.Website.expandTimeoutId != 0) {
            window.clearTimeout(net.pwall.Website.expandTimeoutId);
            net.pwall.Website.expandTimeoutId = 0;
        }
        document.getElementById('expanded-char').style.visibility = 'hidden';
    },

    expandChar: function() {
        var td = this;
        net.pwall.Website.expandClear();
        var div = document.getElementById('expanded-char');
        div.innerHTML = td.innerHTML;
        var x = -12;
        var y = -12;
        for (;;) {
            x += td.offsetLeft;
            y += td.offsetTop;
            td = td.offsetParent;
            if (td.nodeName == 'BODY')
                break;
        }
        div.style.left = x;
        div.style.top = y;
        div.style.visibility = 'visible';
        net.pwall.Website.expandTimeoutId =
                window.setTimeout(net.pwall.Website.expandClear, 4000);
    }

};
