00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00063
00064 Date.ext = {};
00065
00067 Date.ext.util = {};
00068
00079 Date.ext.util.xPad=function(x, pad, r)
00080 {
00081 if(typeof(r) == 'undefined')
00082 {
00083 r=10;
00084 }
00085 for( ; parseInt(x, 10)<r && r>1; r/=10)
00086 x = pad.toString() + x;
00087 return x.toString();
00088 };
00089
00096 Date.prototype.locale = 'en-GB';
00098 if(document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang)
00099 {
00100 Date.prototype.locale = document.getElementsByTagName('html')[0].lang;
00101 }
00103
00128 Date.ext.locales = { };
00129
00136 Date.ext.locales.en = {
00137 a: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
00138 A: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
00139 b: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
00140 B: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
00141 c: '%a %d %b %Y %T %Z',
00142 p: ['AM', 'PM'],
00143 P: ['am', 'pm'],
00144 x: '%d/%m/%y',
00145 X: '%T'
00146 };
00147
00149
00150 Date.ext.locales['en-US'] = Date.ext.locales.en;
00151 Date.ext.locales['en-US'].c = '%a %d %b %Y %r %Z';
00152 Date.ext.locales['en-US'].x = '%D';
00153 Date.ext.locales['en-US'].X = '%r';
00154
00155
00156 Date.ext.locales['en-GB'] = Date.ext.locales.en;
00157
00158
00159 Date.ext.locales['en-AU'] = Date.ext.locales['en-GB'];
00161
00163
00207 Date.ext.formats = {
00208 a: function(d) { return Date.ext.locales[d.locale].a[d.getDay()]; },
00209 A: function(d) { return Date.ext.locales[d.locale].A[d.getDay()]; },
00210 b: function(d) { return Date.ext.locales[d.locale].b[d.getMonth()]; },
00211 B: function(d) { return Date.ext.locales[d.locale].B[d.getMonth()]; },
00212 c: 'toLocaleString',
00213 C: function(d) { return Date.ext.util.xPad(parseInt(d.getFullYear()/100, 10), 0); },
00214 d: ['getDate', '0'],
00215 e: ['getDate', ' '],
00216 g: function(d) { return Date.ext.util.xPad(parseInt(Date.ext.util.G(d)/100, 10), 0); },
00217 G: function(d) {
00218 var y = d.getFullYear();
00219 var V = parseInt(Date.ext.formats.V(d), 10);
00220 var W = parseInt(Date.ext.formats.W(d), 10);
00221
00222 if(W > V) {
00223 y++;
00224 } else if(W===0 && V>=52) {
00225 y--;
00226 }
00227
00228 return y;
00229 },
00230 H: ['getHours', '0'],
00231 I: function(d) { var I=d.getHours()%12; return Date.ext.util.xPad(I===0?12:I, 0); },
00232 j: function(d) {
00233 var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');
00234 ms += d.getTimezoneOffset()*60000;
00235 var doy = parseInt(ms/60000/60/24, 10)+1;
00236 return Date.ext.util.xPad(doy, 0, 100);
00237 },
00238 m: function(d) { return Date.ext.util.xPad(d.getMonth()+1, 0); },
00239 M: ['getMinutes', '0'],
00240 p: function(d) { return Date.ext.locales[d.locale].p[d.getHours() >= 12 ? 1 : 0 ]; },
00241 P: function(d) { return Date.ext.locales[d.locale].P[d.getHours() >= 12 ? 1 : 0 ]; },
00242 S: ['getSeconds', '0'],
00243 u: function(d) { var dow = d.getDay(); return dow===0?7:dow; },
00244 U: function(d) {
00245 var doy = parseInt(Date.ext.formats.j(d), 10);
00246 var rdow = 6-d.getDay();
00247 var woy = parseInt((doy+rdow)/7, 10);
00248 return Date.ext.util.xPad(woy, 0);
00249 },
00250 V: function(d) {
00251 var woy = parseInt(Date.ext.formats.W(d), 10);
00252 var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();
00253
00254
00255
00256
00257
00258 var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);
00259 if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)
00260 {
00261 idow = 1;
00262 }
00263 else if(idow === 0)
00264 {
00265 idow = Date.ext.formats.V(new Date('' + (d.getFullYear()-1) + '/12/31'));
00266 }
00267
00268 return Date.ext.util.xPad(idow, 0);
00269 },
00270 w: 'getDay',
00271 W: function(d) {
00272 var doy = parseInt(Date.ext.formats.j(d), 10);
00273 var rdow = 7-Date.ext.formats.u(d);
00274 var woy = parseInt((doy+rdow)/7, 10);
00275 return Date.ext.util.xPad(woy, 0, 10);
00276 },
00277 y: function(d) { return Date.ext.util.xPad(d.getFullYear()%100, 0); },
00278 Y: 'getFullYear',
00279 z: function(d) {
00280 var o = d.getTimezoneOffset();
00281 var H = Date.ext.util.xPad(parseInt(Math.abs(o/60), 10), 0);
00282 var M = Date.ext.util.xPad(o%60, 0);
00283 return (o>0?'-':'+') + H + M;
00284 },
00285 Z: function(d) { return d.toString().replace(/^.*\(([^)]+)\)$/, '$1'); },
00286 '%': function(d) { return '%'; }
00287 };
00288
00299 Date.ext.aggregates = {
00300 c: 'locale',
00301 D: '%m/%d/%y',
00302 h: '%b',
00303 n: '\n',
00304 r: '%I:%M:%S %p',
00305 R: '%H:%M',
00306 t: '\t',
00307 T: '%H:%M:%S',
00308 x: 'locale',
00309 X: 'locale'
00310 };
00311
00313
00314 Date.ext.aggregates.z = Date.ext.formats.z(new Date());
00315 Date.ext.aggregates.Z = Date.ext.formats.Z(new Date());
00317
00319
00324 Date.ext.unsupported = { };
00325
00326
00335 Date.prototype.strftime=function(fmt)
00336 {
00337
00338
00339 if(!(this.locale in Date.ext.locales))
00340 {
00341 if(this.locale.replace(/-[a-zA-Z]+$/, '') in Date.ext.locales)
00342 {
00343 this.locale = this.locale.replace(/-[a-zA-Z]+$/, '');
00344 }
00345 else
00346 {
00347 this.locale = 'en-GB';
00348 }
00349 }
00350
00351 var d = this;
00352
00353 while(fmt.match(/%[cDhnrRtTxXzZ]/))
00354 {
00355 fmt = fmt.replace(/%([cDhnrRtTxXzZ])/g, function(m0, m1)
00356 {
00357 var f = Date.ext.aggregates[m1];
00358 return (f == 'locale' ? Date.ext.locales[d.locale][m1] : f);
00359 });
00360 }
00361
00362
00363
00364 var str = fmt.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g, function(m0, m1)
00365 {
00366 var f = Date.ext.formats[m1];
00367 if(typeof(f) == 'string') {
00368 return d[f]();
00369 } else if(typeof(f) == 'function') {
00370 return f.call(d, d);
00371 } else if(typeof(f) == 'object' && typeof(f[0]) == 'string') {
00372 return Date.ext.util.xPad(d[f[0]](), f[1]);
00373 } else {
00374 return m1;
00375 }
00376 });
00377 d=null;
00378 return str;
00379 };
00380