1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfunction arrayExists(array, x) {
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (var i = 0; i < array.length; i++) {
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (array[i] == x) return true;
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return false;
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkDate.prototype.formatDate = function (input,time) {
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // formatDate :
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // a PHP date like function, for formatting date strings
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // See: http://www.php.net/date
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // input : format string
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // time : epoch time (seconds, and optional)
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // if time is not passed, formatting is based on
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // the current "this" date object's set time.
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // supported:
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // a, A, B, d, D, F, g, G, h, H, i, j, l (lowercase L), L,
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // m, M, n, O, r, s, S, t, U, w, W, y, Y, z
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    //
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // unsupported:
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // I (capital i), T, Z
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var switches =    ["a", "A", "B", "d", "D", "F", "g", "G", "h", "H",
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "i", "j", "l", "L", "m", "M", "n", "O", "r", "s",
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "S", "t", "U", "w", "W", "y", "Y", "z"];
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var daysLong =    ["Sunday", "Monday", "Tuesday", "Wednesday",
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "Thursday", "Friday", "Saturday"];
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var daysShort =   ["Sun", "Mon", "Tue", "Wed",
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "Thu", "Fri", "Sat"];
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var monthsShort = ["Jan", "Feb", "Mar", "Apr",
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "May", "Jun", "Jul", "Aug", "Sep",
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "Oct", "Nov", "Dec"];
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var monthsLong =  ["January", "February", "March", "April",
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "May", "June", "July", "August", "September",
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                       "October", "November", "December"];
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var daysSuffix = ["st", "nd", "rd", "th", "th", "th", "th", // 1st - 7th
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                      "th", "th", "th", "th", "th", "th", "th", // 8th - 14th
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                      "th", "th", "th", "th", "th", "th", "st", // 15th - 21st
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                      "nd", "rd", "th", "th", "th", "th", "th", // 22nd - 28th
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                      "th", "th", "st"];                        // 29th - 31st
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function a() {
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Lowercase Ante meridiem and Post meridiem
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getHours() > 11? "pm" : "am";
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function A() {
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Uppercase Ante meridiem and Post meridiem
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getHours() > 11? "PM" : "AM";
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function B(){
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Swatch internet time. code simply grabbed from ppk,
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // since I was feeling lazy:
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // http://www.xs4all.nl/~ppk/js/beat.html
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var off = (self.getTimezoneOffset() + 60)*60;
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var theSeconds = (self.getHours() * 3600) +
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                         (self.getMinutes() * 60) +
61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                          self.getSeconds() + off;
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var beat = Math.floor(theSeconds/86.4);
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (beat > 1000) beat -= 1000;
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (beat < 0) beat += 1000;
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if ((""+beat).length == 1) beat = "00"+beat;
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if ((""+beat).length == 2) beat = "0"+beat;
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return beat;
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function d() {
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Day of the month, 2 digits with leading zeros
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return new String(self.getDate()).length == 1?
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        "0"+self.getDate() : self.getDate();
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function D() {
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A textual representation of a day, three letters
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return daysShort[self.getDay()];
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function F() {
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A full textual representation of a month
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return monthsLong[self.getMonth()];
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function g() {
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // 12-hour format of an hour without leading zeros
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getHours() > 12? self.getHours()-12 : self.getHours();
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function G() {
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // 24-hour format of an hour without leading zeros
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getHours();
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function h() {
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // 12-hour format of an hour with leading zeros
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (self.getHours() > 12) {
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          var s = new String(self.getHours()-12);
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          return s.length == 1?
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          "0"+ (self.getHours()-12) : self.getHours()-12;
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          var s = new String(self.getHours());
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          return s.length == 1?
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark          "0"+self.getHours() : self.getHours();
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function H() {
104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // 24-hour format of an hour with leading zeros
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return new String(self.getHours()).length == 1?
106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        "0"+self.getHours() : self.getHours();
107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function i() {
109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Minutes with leading zeros
110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return new String(self.getMinutes()).length == 1?
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        "0"+self.getMinutes() : self.getMinutes();
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function j() {
114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Day of the month without leading zeros
115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getDate();
116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function l() {
118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A full textual representation of the day of the week
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return daysLong[self.getDay()];
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function L() {
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // leap year or not. 1 if leap year, 0 if not.
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // the logic should match iso's 8601 standard.
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var y_ = Y();
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            (y_ % 4 == 0 && y_ % 100 != 0) ||
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            (y_ % 4 == 0 && y_ % 100 == 0 && y_ % 400 == 0)
128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            ) {
129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 1;
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 0;
132563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
133563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
134563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function m() {
135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Numeric representation of a month, with leading zeros
136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getMonth() < 9?
137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        "0"+(self.getMonth()+1) :
138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        self.getMonth()+1;
139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function M() {
141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A short textual representation of a month, three letters
142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return monthsShort[self.getMonth()];
143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function n() {
145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Numeric representation of a month, without leading zeros
146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getMonth()+1;
147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function O() {
149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Difference to Greenwich time (GMT) in hours
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var os = Math.abs(self.getTimezoneOffset());
151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var h = ""+Math.floor(os/60);
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var m = ""+(os%60);
153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        h.length == 1? h = "0"+h:1;
154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m.length == 1? m = "0"+m:1;
155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m;
156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function r() {
158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // RFC 822 formatted date
159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var r; // result
160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        //  Thu    ,     21          Dec         2000
161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        r = D() + ", " + j() + " " + M() + " " + Y() +
162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        //        16     :    01     :    07          +0200
163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            " " + H() + ":" + i() + ":" + s() + " " + O();
164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return r;
165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function S() {
167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // English ordinal suffix for the day of the month, 2 characters
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return daysSuffix[self.getDate()-1];
169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function s() {
171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Seconds, with leading zeros
172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return new String(self.getSeconds()).length == 1?
173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        "0"+self.getSeconds() : self.getSeconds();
174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function t() {
176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
177563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // thanks to Matt Bannon for some much needed code-fixes here!
178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var daysinmonths = [null,31,28,31,30,31,30,31,31,30,31,30,31];
179563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (L()==1 && n()==2) return 29; // leap day
180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return daysinmonths[n()];
181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function U() {
183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return Math.round(self.getTime()/1000);
185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function W() {
187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Weeknumber, as per ISO specification:
188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // if the day is three days before newyears eve,
191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // there's a chance it's "week 1" of next year.
192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // here we check for that.
193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var beforeNY = 364+L() - z();
194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var afterNY  = z();
195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var weekday = w()!=0?w()-1:6; // makes sunday (0), into 6.
196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (beforeNY <= 2 && weekday <= 2-beforeNY) {
197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 1;
198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
199563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // similarly, if the day is within threedays of newyears
200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // there's a chance it belongs in the old year.
201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var ny = new Date("January 1 " + Y() + " 00:00:00");
202563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var nyDay = ny.getDay()!=0?ny.getDay()-1:6;
203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (
204563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            (afterNY <= 2) &&
205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            (nyDay >=4)  &&
206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            (afterNY >= (6-nyDay))
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            ) {
208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // Since I'm not sure we can just always return 53,
209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // i call the function here again, using the last day
210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // of the previous year, as the date, and then just
211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // return that week.
212563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            var prevNY = new Date("December 31 " + (Y()-1) + " 00:00:00");
213563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return prevNY.formatDate("W");
214563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
215563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
216563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // week 1, is the week that has the first thursday in it.
217563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // note that this value is not zero index.
218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (nyDay <= 3) {
219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // first day of the year fell on a thursday, or earlier.
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 1 + Math.floor( ( z() + nyDay ) / 7 );
221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // first day of the year fell on a friday, or later.
223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 1 + Math.floor( ( z() - ( 7 - nyDay ) ) / 7 );
224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function w() {
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // Numeric representation of the day of the week
228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self.getDay();
229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function Y() {
232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A full numeric representation of a year, 4 digits
233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
234563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // we first check, if getFullYear is supported. if it
235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // is, we just use that. ppks code is nice, but wont
236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // work with dates outside 1900-2038, or something like that
237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (self.getFullYear) {
238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            var newDate = new Date("January 1 2001 00:00:00 +0000");
239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            var x = newDate .getFullYear();
240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (x == 2001) {
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                // i trust the method now
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return self.getFullYear();
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // else, do this:
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // codes thanks to ppk:
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // http://www.xs4all.nl/~ppk/js/introdate.html
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var x = self.getYear();
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var y = x % 100;
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        y += (y < 38) ? 2000 : 1900;
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return y;
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
253563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function y() {
254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // A two-digit representation of a year
255563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var y = Y()+"";
256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return y.substring(y.length-2,y.length);
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    function z() {
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // The day of the year, zero indexed! 0 through 366
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var t = new Date("January 1 " + Y() + " 00:00:00");
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var diff = self.getTime() - t.getTime();
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return Math.floor(diff/1000/60/60/24);
263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
264563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
265563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var self = this;
266563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (time) {
267563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // save time
268563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        var prevTime = self.getTime();
269563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        self.setTime(time);
270563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
271563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var ia = input.split("");
273563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var ij = 0;
274563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    while (ia[ij]) {
275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (ia[ij] == "\\") {
276563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            // this is our way of allowing users to escape stuff
277563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            ia.splice(ij,1);
278563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        } else {
279563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (arrayExists(switches,ia[ij])) {
280563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                ia[ij] = eval(ia[ij] + "()");
281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ij++;
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
285563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // reset time, back to what it was
286563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (prevTime) {
287563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        self.setTime(prevTime);
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return ia.join("");
290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvar date = new Date("1/1/2007 1:11:11");
293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
294563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfor (i = 0; i < 500; ++i) {
295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var shortFormat = date.formatDate("Y-m-d");
296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    var longFormat = date.formatDate("l, F d, Y g:i:s A");
297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    date.setTime(date.getTime() + 84266956);
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
300