15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This program is free software; you can redistribute it and/or modify it
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * under the terms of the GNU Lesser General Public License as published by the
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Free Software Foundation, version 2.1.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This program is distributed in the hope that it will be useful, but WITHOUT
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * details.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.parseFunctions = {count:0};
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.parseRegexes = [];
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.formatFunctions = {count:0};
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.dateFormat = function(format) {
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Date.formatFunctions[format] == null) {
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Date.createNewFormat(format);
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var func = Date.formatFunctions[format];
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this[func]();
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.createNewFormat = function(format) {
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var funcName = "format" + Date.formatFunctions.count++;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Date.formatFunctions[format] = funcName;
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var code = "Date.prototype." + funcName + " = function(){return ";
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var special = false;
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ch = '';
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < format.length; ++i) {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ch = format.charAt(i);
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!special && ch == "\\") {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            special = true;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (special) {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            special = false;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            code += "'" + String.escape(ch) + "' + ";
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            code += Date.getFormatCode(ch);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eval(code.substring(0, code.length - 3) + ";}");
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.getFormatCode = function(character) {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (character) {
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "d":
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad(this.getDate(), 2, '0') + ";
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "D":
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "Date.dayNames[this.getDay()].substring(0, 3) + ";
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "j":
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getDate() + ";
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "l":
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "Date.dayNames[this.getDay()] + ";
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "S":
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getSuffix() + ";
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "w":
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getDay() + ";
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "z":
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getDayOfYear() + ";
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "W":
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getWeekOfYear() + ";
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "F":
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "Date.monthNames[this.getMonth()] + ";
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "m":
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "M":
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "n":
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "(this.getMonth() + 1) + ";
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "t":
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getDaysInMonth() + ";
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "L":
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "(this.isLeapYear() ? 1 : 0) + ";
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "Y":
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getFullYear() + ";
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "y":
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "('' + this.getFullYear()).substring(2, 4) + ";
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "a":
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "(this.getHours() < 12 ? 'am' : 'pm') + ";
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "A":
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "g":
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "G":
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getHours() + ";
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "h":
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "H":
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad(this.getHours(), 2, '0') + ";
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "i":
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad(this.getMinutes(), 2, '0') + ";
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "s":
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "String.leftPad(this.getSeconds(), 2, '0') + ";
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "O":
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getGMTOffset() + ";
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "T":
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "this.getTimezone() + ";
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "Z":
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "(this.getTimezoneOffset() * -60) + ";
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "'" + String.escape(character) + "' + ";
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.parseDate = function(input, format) {
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Date.parseFunctions[format] == null) {
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Date.createParser(format);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var func = Date.parseFunctions[format];
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Date[func](input);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.createParser = function(format) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var funcName = "parse" + Date.parseFunctions.count++;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var regexNum = Date.parseRegexes.length;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var currentGroup = 1;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Date.parseFunctions[format] = funcName;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var code = "Date." + funcName + " = function(input){\n"
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "var d = new Date();\n"
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "y = d.getFullYear();\n"
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "m = d.getMonth();\n"
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "d = d.getDate();\n"
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "if (results && results.length > 0) {"
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var regex = "";
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var special = false;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var ch = '';
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < format.length; ++i) {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ch = format.charAt(i);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!special && ch == "\\") {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            special = true;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (special) {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            special = false;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            regex += String.escape(ch);
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else {
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            obj = Date.formatCodeToRegex(ch, currentGroup);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentGroup += obj.g;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            regex += obj.s;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (obj.g && obj.c) {
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                code += obj.c;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y, m, d, h, i, s);}\n"
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y, m, d, h, i);}\n"
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y, m, d, h);}\n"
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "else if (y > 0 && m >= 0 && d > 0)\n"
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y, m, d);}\n"
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "else if (y > 0 && m >= 0)\n"
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y, m);}\n"
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "else if (y > 0)\n"
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "{return new Date(y);}\n"
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + "}return null;}";
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eval(code);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.formatCodeToRegex = function(character, currentGroup) {
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (character) {
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "D":
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        c:null,
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "j":
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "d":
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"d = parseInt(results[" + currentGroup + "], 10);\n",
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{1,2})"};
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "l":
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(?:" + Date.dayNames.join("|") + ")"};
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "S":
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(?:st|nd|rd|th)"};
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "w":
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"\\d"};
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "z":
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(?:\\d{1,3})"};
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "W":
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(?:\\d{2})"};
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "F":
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(" + Date.monthNames.join("|") + ")"};
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "M":
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "n":
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "m":
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{1,2})"};
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "t":
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"\\d{1,2}"};
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "L":
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(?:1|0)"};
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "Y":
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"y = parseInt(results[" + currentGroup + "], 10);\n",
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{4})"};
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "y":
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{1,2})"};
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "a":
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"if (results[" + currentGroup + "] == 'am') {\n"
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                + "if (h == 12) { h = 0; }\n"
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                + "} else { if (h < 12) { h += 12; }}",
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(am|pm)"};
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "A":
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"if (results[" + currentGroup + "] == 'AM') {\n"
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                + "if (h == 12) { h = 0; }\n"
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                + "} else { if (h < 12) { h += 12; }}",
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(AM|PM)"};
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "g":
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "G":
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "h":
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "H":
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"h = parseInt(results[" + currentGroup + "], 10);\n",
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{1,2})"};
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "i":
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"i = parseInt(results[" + currentGroup + "], 10);\n",
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{2})"};
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "s":
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:1,
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:"s = parseInt(results[" + currentGroup + "], 10);\n",
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"(\\d{2})"};
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "O":
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"[+-]\\d{4}"};
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "T":
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"[A-Z]{3}"};
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case "Z":
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:"[+-]\\d{1,5}"};
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return {g:0,
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            c:null,
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s:String.escape(character)};
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getTimezone = function() {
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this.toString().replace(
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getGMTOffset = function() {
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (this.getTimezoneOffset() > 0 ? "-" : "+")
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getDayOfYear = function() {
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var num = 0;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (var i = 0; i < this.getMonth(); ++i) {
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        num += Date.daysInMonth[i];
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return num + this.getDate() - 1;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getWeekOfYear = function() {
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Skip to Thursday of this week
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var now = this.getDayOfYear() + (4 - this.getDay());
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find the first Thursday of the year
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var jan1 = new Date(this.getFullYear(), 0, 1);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var then = (7 - jan1.getDay() + 4);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    document.write(then);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String.leftPad(((now - then) / 7) + 1, 2, "0");
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.isLeapYear = function() {
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var year = this.getFullYear();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getFirstDayOfMonth = function() {
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var day = (this.getDay() - (this.getDate() - 1)) % 7;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (day < 0) ? (day + 7) : day;
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getLastDayOfMonth = function() {
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (day < 0) ? (day + 7) : day;
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getDaysInMonth = function() {
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Date.daysInMonth[this.getMonth()];
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.prototype.getSuffix = function() {
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (this.getDate()) {
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 1:
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 21:
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 31:
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return "st";
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 2:
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 22:
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return "nd";
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 3:
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case 23:
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return "rd";
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default:
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return "th";
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String.escape = function(string) {
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return string.replace(/('|\\)/g, "\\$1");
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String.leftPad = function (val, size, ch) {
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var result = new String(val);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ch == null) {
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ch = " ";
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (result.length < size) {
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = ch + result;
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.monthNames =
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ["January",
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "February",
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "March",
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "April",
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "May",
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "June",
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "July",
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "August",
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "September",
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "October",
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "November",
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "December"];
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.dayNames =
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ["Sunday",
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Monday",
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Tuesday",
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Wednesday",
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Thursday",
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Friday",
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    "Saturday"];
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.y2kYear = 50;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.monthNumbers = {
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Jan:0,
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Feb:1,
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mar:2,
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Apr:3,
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    May:4,
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Jun:5,
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Jul:6,
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Aug:7,
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Sep:8,
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Oct:9,
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Nov:10,
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Dec:11};
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Date.patterns = {
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ISO8601LongPattern:"Y-m-d H:i:s",
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ISO8601ShortPattern:"Y-m-d",
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShortDatePattern: "n/j/Y",
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LongDatePattern: "l, F d, Y",
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FullDateTimePattern: "l, F d, Y g:i:s A",
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MonthDayPattern: "F d",
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShortTimePattern: "g:i A",
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LongTimePattern: "g:i:s A",
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SortableDateTimePattern: "Y-m-d\\TH:i:s",
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    YearMonthPattern: "F, Y"};
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var date = new Date("1/1/2007 1:11:11");
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)for (i = 0; i < 4000; ++i) {
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var shortFormat = date.dateFormat("Y-m-d");
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var longFormat = date.dateFormat("l, F d, Y g:i:s A");
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    date.setTime(date.getTime() + 84266956);
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
418