[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / spip-bonux / formulaires / dateur / dates.js
1 /*
2 * Date prototype extensions. Doesn't depend on any
3 * other code. Doens't overwrite existing methods.
4 *
5 * Adds dayNames, abbrDayNames, monthNames and abbrMonthNames static properties and isLeapYear,
6 * isWeekend, isWeekDay, getDaysInMonth, getDayName, getMonthName, getDayOfYear, getWeekOfYear,
7 * setDayOfYear, addYears, addMonths, addDays, addHours, addMinutes, addSeconds methods
8 *
9 * Copyright (c) 2006 J̦rn Zaefferer and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
10 *
11 * Additional methods and properties added by Kelvin Luck: firstDayOfWeek, dateFormat, zeroTime, asString, fromString -
12 * I've added my name to these methods so you know who to blame if they are broken!
13 *
14 * Dual licensed under the MIT and GPL licenses:
15 * http://www.opensource.org/licenses/mit-license.php
16 * http://www.gnu.org/licenses/gpl.html
17 *
18 */
19
20 /**
21 * An Array of day names starting with Sunday.
22 *
23 * @example dayNames[0]
24 * @result 'Sunday'
25 *
26 * @name dayNames
27 * @type Array
28 * @cat Plugins/Methods/Date
29 */
30 Date.dayNames = ['', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
31
32 /**
33 * An Array of abbreviated day names starting with Sun.
34 *
35 * @example abbrDayNames[0]
36 * @result 'Sun'
37 *
38 * @name abbrDayNames
39 * @type Array
40 * @cat Plugins/Methods/Date
41 */
42 Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
43
44 /**
45 * An Array of month names starting with Janurary.
46 *
47 * @example monthNames[0]
48 * @result 'January'
49 *
50 * @name monthNames
51 * @type Array
52 * @cat Plugins/Methods/Date
53 */
54 Date.monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
55
56 /**
57 * An Array of abbreviated month names starting with Jan.
58 *
59 * @example abbrMonthNames[0]
60 * @result 'Jan'
61 *
62 * @name monthNames
63 * @type Array
64 * @cat Plugins/Methods/Date
65 */
66 Date.abbrMonthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
67
68 /**
69 * The first day of the week for this locale.
70 *
71 * @name firstDayOfWeek
72 * @type Number
73 * @cat Plugins/Methods/Date
74 * @author Kelvin Luck
75 */
76 Date.firstDayOfWeek = 1;
77
78 /**
79 * The format that string dates should be represented as (e.g. 'dd/mm/yyyy' for UK, 'mm/dd/yyyy' for US, 'yyyy-mm-dd' for Unicode etc).
80 *
81 * @name format
82 * @type String
83 * @cat Plugins/Methods/Date
84 * @author Kelvin Luck
85 */
86 Date.format = 'dd/mm/yyyy';
87 //Date.format = 'mm/dd/yyyy';
88 //Date.format = 'yyyy-mm-dd';
89 //Date.format = 'dd mmm yy';
90
91 /**
92 * The first two numbers in the century to be used when decoding a two digit year. Since a two digit year is ambiguous (and date.setYear
93 * only works with numbers < 99 and so doesn't allow you to set years after 2000) we need to use this to disambiguate the two digit year codes.
94 *
95 * @name format
96 * @type String
97 * @cat Plugins/Methods/Date
98 * @author Kelvin Luck
99 */
100 Date.fullYearStart = '20';
101
102 (function() {
103
104 /**
105 * Adds a given method under the given name
106 * to the Date prototype if it doesn't
107 * currently exist.
108 *
109 * @private
110 */
111 function add(name, method) {
112 if( !Date.prototype[name] ) {
113 Date.prototype[name] = method;
114 }
115 };
116
117 /**
118 * Checks if the year is a leap year.
119 *
120 * @example var dtm = new Date("01/12/2008");
121 * dtm.isLeapYear();
122 * @result true
123 *
124 * @name isLeapYear
125 * @type Boolean
126 * @cat Plugins/Methods/Date
127 */
128 add("isLeapYear", function() {
129 var y = this.getFullYear();
130 return (y%4==0 && y%100!=0) || y%400==0;
131 });
132
133 /**
134 * Checks if the day is a weekend day (Sat or Sun).
135 *
136 * @example var dtm = new Date("01/12/2008");
137 * dtm.isWeekend();
138 * @result false
139 *
140 * @name isWeekend
141 * @type Boolean
142 * @cat Plugins/Methods/Date
143 */
144 add("isWeekend", function() {
145 return this.getDay()==0 || this.getDay()==6;
146 });
147
148 /**
149 * Check if the day is a day of the week (Mon-Fri)
150 *
151 * @example var dtm = new Date("01/12/2008");
152 * dtm.isWeekDay();
153 * @result false
154 *
155 * @name isWeekDay
156 * @type Boolean
157 * @cat Plugins/Methods/Date
158 */
159 add("isWeekDay", function() {
160 return !this.isWeekend();
161 });
162
163 /**
164 * Gets the number of days in the month.
165 *
166 * @example var dtm = new Date("01/12/2008");
167 * dtm.getDaysInMonth();
168 * @result 31
169 *
170 * @name getDaysInMonth
171 * @type Number
172 * @cat Plugins/Methods/Date
173 */
174 add("getDaysInMonth", function() {
175 return [31,(this.isLeapYear() ? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()];
176 });
177
178 /**
179 * Gets the name of the day.
180 *
181 * @example var dtm = new Date("01/12/2008");
182 * dtm.getDayName();
183 * @result 'Saturday'
184 *
185 * @example var dtm = new Date("01/12/2008");
186 * dtm.getDayName(true);
187 * @result 'Sat'
188 *
189 * @param abbreviated Boolean When set to true the name will be abbreviated.
190 * @name getDayName
191 * @type String
192 * @cat Plugins/Methods/Date
193 */
194 add("getDayName", function(abbreviated) {
195 return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()];
196 });
197
198 /**
199 * Gets the name of the month.
200 *
201 * @example var dtm = new Date("01/12/2008");
202 * dtm.getMonthName();
203 * @result 'Janurary'
204 *
205 * @example var dtm = new Date("01/12/2008");
206 * dtm.getMonthName(true);
207 * @result 'Jan'
208 *
209 * @param abbreviated Boolean When set to true the name will be abbreviated.
210 * @name getDayName
211 * @type String
212 * @cat Plugins/Methods/Date
213 */
214 add("getMonthName", function(abbreviated) {
215 return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()];
216 });
217
218 /**
219 * Get the number of the day of the year.
220 *
221 * @example var dtm = new Date("01/12/2008");
222 * dtm.getDayOfYear();
223 * @result 11
224 *
225 * @name getDayOfYear
226 * @type Number
227 * @cat Plugins/Methods/Date
228 */
229 add("getDayOfYear", function() {
230 var tmpdtm = new Date("1/1/" + this.getFullYear());
231 return Math.floor((this.getTime() - tmpdtm.getTime()) / 86400000);
232 });
233
234 /**
235 * Get the number of the week of the year.
236 *
237 * @example var dtm = new Date("01/12/2008");
238 * dtm.getWeekOfYear();
239 * @result 2
240 *
241 * @name getWeekOfYear
242 * @type Number
243 * @cat Plugins/Methods/Date
244 */
245 add("getWeekOfYear", function() {
246 return Math.ceil(this.getDayOfYear() / 7);
247 });
248
249 /**
250 * Set the day of the year.
251 *
252 * @example var dtm = new Date("01/12/2008");
253 * dtm.setDayOfYear(1);
254 * dtm.toString();
255 * @result 'Tue Jan 01 2008 00:00:00'
256 *
257 * @name setDayOfYear
258 * @type Date
259 * @cat Plugins/Methods/Date
260 */
261 add("setDayOfYear", function(day) {
262 this.setMonth(0);
263 this.setDate(day);
264 return this;
265 });
266
267 /**
268 * Add a number of years to the date object.
269 *
270 * @example var dtm = new Date("01/12/2008");
271 * dtm.addYears(1);
272 * dtm.toString();
273 * @result 'Mon Jan 12 2009 00:00:00'
274 *
275 * @name addYears
276 * @type Date
277 * @cat Plugins/Methods/Date
278 */
279 add("addYears", function(num) {
280 this.setFullYear(this.getFullYear() + num);
281 return this;
282 });
283
284 /**
285 * Add a number of months to the date object.
286 *
287 * @example var dtm = new Date("01/12/2008");
288 * dtm.addMonths(1);
289 * dtm.toString();
290 * @result 'Tue Feb 12 2008 00:00:00'
291 *
292 * @name addMonths
293 * @type Date
294 * @cat Plugins/Methods/Date
295 */
296 add("addMonths", function(num) {
297 var tmpdtm = this.getDate();
298
299 this.setMonth(this.getMonth() + num);
300
301 if (tmpdtm > this.getDate())
302 this.addDays(-this.getDate());
303
304 return this;
305 });
306
307 /**
308 * Add a number of days to the date object.
309 *
310 * @example var dtm = new Date("01/12/2008");
311 * dtm.addDays(1);
312 * dtm.toString();
313 * @result 'Sun Jan 13 2008 00:00:00'
314 *
315 * @name addDays
316 * @type Date
317 * @cat Plugins/Methods/Date
318 */
319 add("addDays", function(num) {
320 this.setDate(this.getDate() + num);
321 return this;
322 });
323
324 /**
325 * Add a number of hours to the date object.
326 *
327 * @example var dtm = new Date("01/12/2008");
328 * dtm.addHours(24);
329 * dtm.toString();
330 * @result 'Sun Jan 13 2008 00:00:00'
331 *
332 * @name addHours
333 * @type Date
334 * @cat Plugins/Methods/Date
335 */
336 add("addHours", function(num) {
337 this.setHours(this.getHours() + num);
338 return this;
339 });
340
341 /**
342 * Add a number of minutes to the date object.
343 *
344 * @example var dtm = new Date("01/12/2008");
345 * dtm.addMinutes(60);
346 * dtm.toString();
347 * @result 'Sat Jan 12 2008 01:00:00'
348 *
349 * @name addMinutes
350 * @type Date
351 * @cat Plugins/Methods/Date
352 */
353 add("addMinutes", function(num) {
354 this.setMinutes(this.getMinutes() + num);
355 return this;
356 });
357
358 /**
359 * Add a number of seconds to the date object.
360 *
361 * @example var dtm = new Date("01/12/2008");
362 * dtm.addSeconds(60);
363 * dtm.toString();
364 * @result 'Sat Jan 12 2008 00:01:00'
365 *
366 * @name addSeconds
367 * @type Date
368 * @cat Plugins/Methods/Date
369 */
370 add("addSeconds", function(num) {
371 this.setSeconds(this.getSeconds() + num);
372 return this;
373 });
374
375 /**
376 * Sets the time component of this Date to zero for cleaner, easier comparison of dates where time is not relevant.
377 *
378 * @example var dtm = new Date();
379 * dtm.zeroTime();
380 * dtm.toString();
381 * @result 'Sat Jan 12 2008 00:01:00'
382 *
383 * @name zeroTime
384 * @type Date
385 * @cat Plugins/Methods/Date
386 * @author Kelvin Luck
387 */
388 add("zeroTime", function() {
389 this.setMilliseconds(0);
390 this.setSeconds(0);
391 this.setMinutes(0);
392 this.setHours(0);
393 return this;
394 });
395
396 /**
397 * Returns a string representation of the date object according to Date.format.
398 * (Date.toString may be used in other places so I purposefully didn't overwrite it)
399 *
400 * @example var dtm = new Date("01/12/2008");
401 * dtm.asString();
402 * @result '12/01/2008' // (where Date.format == 'dd/mm/yyyy'
403 *
404 * @name asString
405 * @type Date
406 * @cat Plugins/Methods/Date
407 * @author Kelvin Luck
408 */
409 add("asString", function() {
410 var r = Date.format;
411 return r
412 .split('yyyy').join(this.getFullYear())
413 .split('yy').join((this.getFullYear() + '').substring(2))
414 .split('mmm').join(this.getMonthName(true))
415 .split('mm').join(_zeroPad(this.getMonth()+1))
416 .split('dd').join(_zeroPad(this.getDate()));
417 });
418
419 /**
420 * Returns a new date object created from the passed String according to Date.format or false if the attempt to do this results in an invalid date object
421 * (We can't simple use Date.parse as it's not aware of locale and I chose not to overwrite it incase it's functionality is being relied on elsewhere)
422 *
423 * @example var dtm = Date.fromString("12/01/2008");
424 * dtm.toString();
425 * @result 'Sat Jan 12 2008 00:00:00' // (where Date.format == 'dd/mm/yyyy'
426 *
427 * @name fromString
428 * @type Date
429 * @cat Plugins/Methods/Date
430 * @author Kelvin Luck
431 */
432 Date.fromString = function(s)
433 {
434 var f = Date.format;
435 var d = new Date('01/01/1977');
436 var iY = f.indexOf('yyyy');
437 if (iY > -1) {
438 d.setFullYear(Number(s.substr(iY, 4)));
439 } else {
440 // TODO - this doesn't work very well - are there any rules for what is meant by a two digit year?
441 d.setFullYear(Number(Date.fullYearStart + s.substr(f.indexOf('yy'), 2)));
442 }
443 var iM = f.indexOf('mmm');
444 if (iM > -1) {
445 var mStr = s.substr(iM, 3);
446 for (var i=0; i<Date.abbrMonthNames.length; i++) {
447 if (Date.abbrMonthNames[i] == mStr) break;
448 }
449 d.setMonth(i);
450 } else {
451 d.setMonth(Number(s.substr(f.indexOf('mm'), 2)) - 1);
452 }
453 d.setDate(Number(s.substr(f.indexOf('dd'), 2)));
454 if (isNaN(d.getTime())) {
455 return false;
456 }
457 return d;
458 };
459
460 // utility method
461 var _zeroPad = function(num) {
462 var s = '0'+num;
463 return s.substring(s.length-2)
464 //return ('0'+num).substring(-2); // doesn't work on IE :(
465 };
466
467 })();