Subversion Repositories Applications.papyrus

Rev

Rev 1318 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1318 Rev 1422
1
/*
1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
3
	All Rights Reserved.
4
 
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
9
*/
-
 
10
 
-
 
11
 
10
 
12
 
11
dojo.provide("dojo.date.format");
13
dojo.provide("dojo.date.format");
12
dojo.require("dojo.date.common");
14
dojo.require("dojo.date.common");
13
dojo.require("dojo.date.supplemental");
15
dojo.require("dojo.date.supplemental");
14
dojo.require("dojo.lang.array");
16
dojo.require("dojo.lang.array");
15
dojo.require("dojo.lang.common");
17
dojo.require("dojo.lang.common");
16
dojo.require("dojo.lang.func");
18
dojo.require("dojo.lang.func");
17
dojo.require("dojo.string.common");
19
dojo.require("dojo.string.common");
18
dojo.require("dojo.i18n.common");
20
dojo.require("dojo.i18n.common");
19
dojo.requireLocalization("dojo.i18n.calendar", "gregorian", null, "de,en,es,fi,fr,hu,ja,it,ko,nl,pt,sv,zh,pt-br,zh-cn,zh-hk,zh-tw,ROOT");
21
dojo.requireLocalization("dojo.i18n.calendar", "gregorian", null, "ko,zh-cn,zh,sv,ja,en,zh-tw,it,hu,nl,fi,zh-hk,fr,pt,ROOT,es,de,pt-br");
20
dojo.requireLocalization("dojo.i18n.calendar", "gregorianExtras", null, "ja,zh,ROOT");
22
dojo.requireLocalization("dojo.i18n.calendar", "gregorianExtras", null, "zh,ROOT,ja");
21
(function () {
23
(function () {
22
	dojo.date.format = function (dateObject, options) {
24
	dojo.date.format = function (dateObject, options) {
23
		if (typeof options == "string") {
25
		if (typeof options == "string") {
24
			dojo.deprecated("dojo.date.format", "To format dates with POSIX-style strings, please use dojo.date.strftime instead", "0.5");
26
			dojo.deprecated("dojo.date.format", "To format dates with POSIX-style strings, please use dojo.date.strftime instead", "0.5");
25
			return dojo.date.strftime(dateObject, options);
27
			return dojo.date.strftime(dateObject, options);
26
		}
28
		}
27
		function formatPattern(dateObject, pattern) {
29
		function formatPattern(dateObject, pattern) {
28
			return pattern.replace(/([a-z])\1*/ig, function (match) {
30
			return pattern.replace(/([a-z])\1*/ig, function (match) {
29
				var s;
31
				var s;
30
				var c = match.charAt(0);
32
				var c = match.charAt(0);
31
				var l = match.length;
33
				var l = match.length;
32
				var pad;
34
				var pad;
33
				var widthList = ["abbr", "wide", "narrow"];
35
				var widthList = ["abbr", "wide", "narrow"];
34
				switch (c) {
36
				switch (c) {
35
				  case "G":
37
				  case "G":
36
					if (l > 3) {
38
					if (l > 3) {
37
						dojo.unimplemented("Era format not implemented");
39
						dojo.unimplemented("Era format not implemented");
38
					}
40
					}
39
					s = info.eras[dateObject.getFullYear() < 0 ? 1 : 0];
41
					s = info.eras[dateObject.getFullYear() < 0 ? 1 : 0];
40
					break;
42
					break;
41
				  case "y":
43
				  case "y":
42
					s = dateObject.getFullYear();
44
					s = dateObject.getFullYear();
43
					switch (l) {
45
					switch (l) {
44
					  case 1:
46
					  case 1:
45
						break;
47
						break;
46
					  case 2:
48
					  case 2:
47
						s = String(s).substr(-2);
49
						s = String(s).substr(-2);
48
						break;
50
						break;
49
					  default:
51
					  default:
50
						pad = true;
52
						pad = true;
51
					}
53
					}
52
					break;
54
					break;
53
				  case "Q":
55
				  case "Q":
54
				  case "q":
56
				  case "q":
55
					s = Math.ceil((dateObject.getMonth() + 1) / 3);
57
					s = Math.ceil((dateObject.getMonth() + 1) / 3);
56
					switch (l) {
58
					switch (l) {
57
					  case 1:
59
					  case 1:
58
					  case 2:
60
					  case 2:
59
						pad = true;
61
						pad = true;
60
						break;
62
						break;
61
					  case 3:
63
					  case 3:
62
					  case 4:
64
					  case 4:
63
						dojo.unimplemented("Quarter format not implemented");
65
						dojo.unimplemented("Quarter format not implemented");
64
					}
66
					}
65
					break;
67
					break;
66
				  case "M":
68
				  case "M":
67
				  case "L":
69
				  case "L":
68
					var m = dateObject.getMonth();
70
					var m = dateObject.getMonth();
69
					var width;
71
					var width;
70
					switch (l) {
72
					switch (l) {
71
					  case 1:
73
					  case 1:
72
					  case 2:
74
					  case 2:
73
						s = m + 1;
75
						s = m + 1;
74
						pad = true;
76
						pad = true;
75
						break;
77
						break;
76
					  case 3:
78
					  case 3:
77
					  case 4:
79
					  case 4:
78
					  case 5:
80
					  case 5:
79
						width = widthList[l - 3];
81
						width = widthList[l - 3];
80
						break;
82
						break;
81
					}
83
					}
82
					if (width) {
84
					if (width) {
83
						var type = (c == "L") ? "standalone" : "format";
85
						var type = (c == "L") ? "standalone" : "format";
84
						var prop = ["months", type, width].join("-");
86
						var prop = ["months", type, width].join("-");
85
						s = info[prop][m];
87
						s = info[prop][m];
86
					}
88
					}
87
					break;
89
					break;
88
				  case "w":
90
				  case "w":
89
					var firstDay = 0;
91
					var firstDay = 0;
90
					s = dojo.date.getWeekOfYear(dateObject, firstDay);
92
					s = dojo.date.getWeekOfYear(dateObject, firstDay);
91
					pad = true;
93
					pad = true;
92
					break;
94
					break;
93
				  case "d":
95
				  case "d":
94
					s = dateObject.getDate();
96
					s = dateObject.getDate();
95
					pad = true;
97
					pad = true;
96
					break;
98
					break;
97
				  case "D":
99
				  case "D":
98
					s = dojo.date.getDayOfYear(dateObject);
100
					s = dojo.date.getDayOfYear(dateObject);
99
					pad = true;
101
					pad = true;
100
					break;
102
					break;
101
				  case "E":
103
				  case "E":
102
				  case "e":
104
				  case "e":
103
				  case "c":
105
				  case "c":
104
					var d = dateObject.getDay();
106
					var d = dateObject.getDay();
105
					var width;
107
					var width;
106
					switch (l) {
108
					switch (l) {
107
					  case 1:
109
					  case 1:
108
					  case 2:
110
					  case 2:
109
						if (c == "e") {
111
						if (c == "e") {
110
							var first = dojo.date.getFirstDayOfWeek(options.locale);
112
							var first = dojo.date.getFirstDayOfWeek(options.locale);
111
							d = (d - first + 7) % 7;
113
							d = (d - first + 7) % 7;
112
						}
114
						}
113
						if (c != "c") {
115
						if (c != "c") {
114
							s = d + 1;
116
							s = d + 1;
115
							pad = true;
117
							pad = true;
116
							break;
118
							break;
117
						}
119
						}
118
					  case 3:
120
					  case 3:
119
					  case 4:
121
					  case 4:
120
					  case 5:
122
					  case 5:
121
						width = widthList[l - 3];
123
						width = widthList[l - 3];
122
						break;
124
						break;
123
					}
125
					}
124
					if (width) {
126
					if (width) {
125
						var type = (c == "c") ? "standalone" : "format";
127
						var type = (c == "c") ? "standalone" : "format";
126
						var prop = ["days", type, width].join("-");
128
						var prop = ["days", type, width].join("-");
127
						s = info[prop][d];
129
						s = info[prop][d];
128
					}
130
					}
129
					break;
131
					break;
130
				  case "a":
132
				  case "a":
131
					var timePeriod = (dateObject.getHours() < 12) ? "am" : "pm";
133
					var timePeriod = (dateObject.getHours() < 12) ? "am" : "pm";
132
					s = info[timePeriod];
134
					s = info[timePeriod];
133
					break;
135
					break;
134
				  case "h":
136
				  case "h":
135
				  case "H":
137
				  case "H":
136
				  case "K":
138
				  case "K":
137
				  case "k":
139
				  case "k":
138
					var h = dateObject.getHours();
140
					var h = dateObject.getHours();
139
					switch (c) {
141
					switch (c) {
140
					  case "h":
142
					  case "h":
141
						s = (h % 12) || 12;
143
						s = (h % 12) || 12;
142
						break;
144
						break;
143
					  case "H":
145
					  case "H":
144
						s = h;
146
						s = h;
145
						break;
147
						break;
146
					  case "K":
148
					  case "K":
147
						s = (h % 12);
149
						s = (h % 12);
148
						break;
150
						break;
149
					  case "k":
151
					  case "k":
150
						s = h || 24;
152
						s = h || 24;
151
						break;
153
						break;
152
					}
154
					}
153
					pad = true;
155
					pad = true;
154
					break;
156
					break;
155
				  case "m":
157
				  case "m":
156
					s = dateObject.getMinutes();
158
					s = dateObject.getMinutes();
157
					pad = true;
159
					pad = true;
158
					break;
160
					break;
159
				  case "s":
161
				  case "s":
160
					s = dateObject.getSeconds();
162
					s = dateObject.getSeconds();
161
					pad = true;
163
					pad = true;
162
					break;
164
					break;
163
				  case "S":
165
				  case "S":
164
					s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l - 3));
166
					s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l - 3));
165
					break;
167
					break;
166
				  case "v":
168
				  case "v":
167
				  case "z":
169
				  case "z":
168
					s = dojo.date.getTimezoneName(dateObject);
170
					s = dojo.date.getTimezoneName(dateObject);
169
					if (s) {
171
					if (s) {
170
						break;
172
						break;
171
					}
173
					}
172
					l = 4;
174
					l = 4;
173
				  case "Z":
175
				  case "Z":
174
					var offset = dateObject.getTimezoneOffset();
176
					var offset = dateObject.getTimezoneOffset();
175
					var tz = [(offset <= 0 ? "+" : "-"), dojo.string.pad(Math.floor(Math.abs(offset) / 60), 2), dojo.string.pad(Math.abs(offset) % 60, 2)];
177
					var tz = [(offset <= 0 ? "+" : "-"), dojo.string.pad(Math.floor(Math.abs(offset) / 60), 2), dojo.string.pad(Math.abs(offset) % 60, 2)];
176
					if (l == 4) {
178
					if (l == 4) {
177
						tz.splice(0, 0, "GMT");
179
						tz.splice(0, 0, "GMT");
178
						tz.splice(3, 0, ":");
180
						tz.splice(3, 0, ":");
179
					}
181
					}
180
					s = tz.join("");
182
					s = tz.join("");
181
					break;
183
					break;
182
				  case "Y":
184
				  case "Y":
183
				  case "u":
185
				  case "u":
184
				  case "W":
186
				  case "W":
185
				  case "F":
187
				  case "F":
186
				  case "g":
188
				  case "g":
187
				  case "A":
189
				  case "A":
188
					dojo.debug(match + " modifier not yet implemented");
190
					dojo.debug(match + " modifier not yet implemented");
189
					s = "?";
191
					s = "?";
190
					break;
192
					break;
191
				  default:
193
				  default:
192
					dojo.raise("dojo.date.format: invalid pattern char: " + pattern);
194
					dojo.raise("dojo.date.format: invalid pattern char: " + pattern);
193
				}
195
				}
194
				if (pad) {
196
				if (pad) {
195
					s = dojo.string.pad(s, l);
197
					s = dojo.string.pad(s, l);
196
				}
198
				}
197
				return s;
199
				return s;
198
			});
200
			});
199
		}
201
		}
200
		options = options || {};
202
		options = options || {};
201
		var locale = dojo.hostenv.normalizeLocale(options.locale);
203
		var locale = dojo.hostenv.normalizeLocale(options.locale);
202
		var formatLength = options.formatLength || "full";
204
		var formatLength = options.formatLength || "full";
203
		var info = dojo.date._getGregorianBundle(locale);
205
		var info = dojo.date._getGregorianBundle(locale);
204
		var str = [];
206
		var str = [];
205
		var sauce = dojo.lang.curry(this, formatPattern, dateObject);
207
		var sauce = dojo.lang.curry(this, formatPattern, dateObject);
206
		if (options.selector != "timeOnly") {
208
		if (options.selector != "timeOnly") {
207
			var datePattern = options.datePattern || info["dateFormat-" + formatLength];
209
			var datePattern = options.datePattern || info["dateFormat-" + formatLength];
208
			if (datePattern) {
210
			if (datePattern) {
209
				str.push(_processPattern(datePattern, sauce));
211
				str.push(_processPattern(datePattern, sauce));
210
			}
212
			}
211
		}
213
		}
212
		if (options.selector != "dateOnly") {
214
		if (options.selector != "dateOnly") {
213
			var timePattern = options.timePattern || info["timeFormat-" + formatLength];
215
			var timePattern = options.timePattern || info["timeFormat-" + formatLength];
214
			if (timePattern) {
216
			if (timePattern) {
215
				str.push(_processPattern(timePattern, sauce));
217
				str.push(_processPattern(timePattern, sauce));
216
			}
218
			}
217
		}
219
		}
218
		var result = str.join(" ");
220
		var result = str.join(" ");
219
		return result;
221
		return result;
220
	};
222
	};
221
	dojo.date.parse = function (value, options) {
223
	dojo.date.parse = function (value, options) {
222
		options = options || {};
224
		options = options || {};
223
		var locale = dojo.hostenv.normalizeLocale(options.locale);
225
		var locale = dojo.hostenv.normalizeLocale(options.locale);
224
		var info = dojo.date._getGregorianBundle(locale);
226
		var info = dojo.date._getGregorianBundle(locale);
225
		var formatLength = options.formatLength || "full";
227
		var formatLength = options.formatLength || "full";
226
		if (!options.selector) {
228
		if (!options.selector) {
227
			options.selector = "dateOnly";
229
			options.selector = "dateOnly";
228
		}
230
		}
229
		var datePattern = options.datePattern || info["dateFormat-" + formatLength];
231
		var datePattern = options.datePattern || info["dateFormat-" + formatLength];
230
		var timePattern = options.timePattern || info["timeFormat-" + formatLength];
232
		var timePattern = options.timePattern || info["timeFormat-" + formatLength];
231
		var pattern;
233
		var pattern;
232
		if (options.selector == "dateOnly") {
234
		if (options.selector == "dateOnly") {
233
			pattern = datePattern;
235
			pattern = datePattern;
234
		} else {
236
		} else {
235
			if (options.selector == "timeOnly") {
237
			if (options.selector == "timeOnly") {
236
				pattern = timePattern;
238
				pattern = timePattern;
237
			} else {
239
			} else {
238
				if (options.selector == "dateTime") {
240
				if (options.selector == "dateTime") {
239
					pattern = datePattern + " " + timePattern;
241
					pattern = datePattern + " " + timePattern;
240
				} else {
242
				} else {
241
					var msg = "dojo.date.parse: Unknown selector param passed: '" + options.selector + "'.";
243
					var msg = "dojo.date.parse: Unknown selector param passed: '" + options.selector + "'.";
242
					msg += " Defaulting to date pattern.";
244
					msg += " Defaulting to date pattern.";
243
					dojo.debug(msg);
245
					dojo.debug(msg);
244
					pattern = datePattern;
246
					pattern = datePattern;
245
				}
247
				}
246
			}
248
			}
247
		}
249
		}
248
		var groups = [];
250
		var groups = [];
249
		var dateREString = _processPattern(pattern, dojo.lang.curry(this, _buildDateTimeRE, groups, info, options));
251
		var dateREString = _processPattern(pattern, dojo.lang.curry(this, _buildDateTimeRE, groups, info, options));
250
		var dateRE = new RegExp("^" + dateREString + "$");
252
		var dateRE = new RegExp("^" + dateREString + "$");
251
		var match = dateRE.exec(value);
253
		var match = dateRE.exec(value);
252
		if (!match) {
254
		if (!match) {
253
			return null;
255
			return null;
254
		}
256
		}
255
		var widthList = ["abbr", "wide", "narrow"];
257
		var widthList = ["abbr", "wide", "narrow"];
256
		var result = new Date(1972, 0);
258
		var result = new Date(1972, 0);
257
		var expected = {};
259
		var expected = {};
258
		for (var i = 1; i < match.length; i++) {
260
		for (var i = 1; i < match.length; i++) {
259
			var grp = groups[i - 1];
261
			var grp = groups[i - 1];
260
			var l = grp.length;
262
			var l = grp.length;
261
			var v = match[i];
263
			var v = match[i];
262
			switch (grp.charAt(0)) {
264
			switch (grp.charAt(0)) {
263
			  case "y":
265
			  case "y":
264
				if (l != 2) {
266
				if (l != 2) {
265
					result.setFullYear(v);
267
					result.setFullYear(v);
266
					expected.year = v;
268
					expected.year = v;
267
				} else {
269
				} else {
268
					if (v < 100) {
270
					if (v < 100) {
269
						v = Number(v);
271
						v = Number(v);
270
						var year = "" + new Date().getFullYear();
272
						var year = "" + new Date().getFullYear();
271
						var century = year.substring(0, 2) * 100;
273
						var century = year.substring(0, 2) * 100;
272
						var yearPart = Number(year.substring(2, 4));
274
						var yearPart = Number(year.substring(2, 4));
273
						var cutoff = Math.min(yearPart + 20, 99);
275
						var cutoff = Math.min(yearPart + 20, 99);
274
						var num = (v < cutoff) ? century + v : century - 100 + v;
276
						var num = (v < cutoff) ? century + v : century - 100 + v;
275
						result.setFullYear(num);
277
						result.setFullYear(num);
276
						expected.year = num;
278
						expected.year = num;
277
					} else {
279
					} else {
278
						if (options.strict) {
280
						if (options.strict) {
279
							return null;
281
							return null;
280
						}
282
						}
281
						result.setFullYear(v);
283
						result.setFullYear(v);
282
						expected.year = v;
284
						expected.year = v;
283
					}
285
					}
284
				}
286
				}
285
				break;
287
				break;
286
			  case "M":
288
			  case "M":
287
				if (l > 2) {
289
				if (l > 2) {
288
					if (!options.strict) {
290
					if (!options.strict) {
289
						v = v.replace(/\./g, "");
291
						v = v.replace(/\./g, "");
290
						v = v.toLowerCase();
292
						v = v.toLowerCase();
291
					}
293
					}
292
					var months = info["months-format-" + widthList[l - 3]].concat();
294
					var months = info["months-format-" + widthList[l - 3]].concat();
293
					for (var j = 0; j < months.length; j++) {
295
					for (var j = 0; j < months.length; j++) {
294
						if (!options.strict) {
296
						if (!options.strict) {
295
							months[j] = months[j].toLowerCase();
297
							months[j] = months[j].toLowerCase();
296
						}
298
						}
297
						if (v == months[j]) {
299
						if (v == months[j]) {
298
							result.setMonth(j);
300
							result.setMonth(j);
299
							expected.month = j;
301
							expected.month = j;
300
							break;
302
							break;
301
						}
303
						}
302
					}
304
					}
303
					if (j == months.length) {
305
					if (j == months.length) {
304
						dojo.debug("dojo.date.parse: Could not parse month name: '" + v + "'.");
306
						dojo.debug("dojo.date.parse: Could not parse month name: '" + v + "'.");
305
						return null;
307
						return null;
306
					}
308
					}
307
				} else {
309
				} else {
308
					result.setMonth(v - 1);
310
					result.setMonth(v - 1);
309
					expected.month = v - 1;
311
					expected.month = v - 1;
310
				}
312
				}
311
				break;
313
				break;
312
			  case "E":
314
			  case "E":
313
			  case "e":
315
			  case "e":
314
				if (!options.strict) {
316
				if (!options.strict) {
315
					v = v.toLowerCase();
317
					v = v.toLowerCase();
316
				}
318
				}
317
				var days = info["days-format-" + widthList[l - 3]].concat();
319
				var days = info["days-format-" + widthList[l - 3]].concat();
318
				for (var j = 0; j < days.length; j++) {
320
				for (var j = 0; j < days.length; j++) {
319
					if (!options.strict) {
321
					if (!options.strict) {
320
						days[j] = days[j].toLowerCase();
322
						days[j] = days[j].toLowerCase();
321
					}
323
					}
322
					if (v == days[j]) {
324
					if (v == days[j]) {
323
						break;
325
						break;
324
					}
326
					}
325
				}
327
				}
326
				if (j == days.length) {
328
				if (j == days.length) {
327
					dojo.debug("dojo.date.parse: Could not parse weekday name: '" + v + "'.");
329
					dojo.debug("dojo.date.parse: Could not parse weekday name: '" + v + "'.");
328
					return null;
330
					return null;
329
				}
331
				}
330
				break;
332
				break;
331
			  case "d":
333
			  case "d":
332
				result.setDate(v);
334
				result.setDate(v);
333
				expected.date = v;
335
				expected.date = v;
334
				break;
336
				break;
335
			  case "a":
337
			  case "a":
336
				var am = options.am || info.am;
338
				var am = options.am || info.am;
337
				var pm = options.pm || info.pm;
339
				var pm = options.pm || info.pm;
338
				if (!options.strict) {
340
				if (!options.strict) {
339
					v = v.replace(/\./g, "").toLowerCase();
341
					v = v.replace(/\./g, "").toLowerCase();
340
					am = am.replace(/\./g, "").toLowerCase();
342
					am = am.replace(/\./g, "").toLowerCase();
341
					pm = pm.replace(/\./g, "").toLowerCase();
343
					pm = pm.replace(/\./g, "").toLowerCase();
342
				}
344
				}
343
				if (options.strict && v != am && v != pm) {
345
				if (options.strict && v != am && v != pm) {
344
					dojo.debug("dojo.date.parse: Could not parse am/pm part.");
346
					dojo.debug("dojo.date.parse: Could not parse am/pm part.");
345
					return null;
347
					return null;
346
				}
348
				}
347
				var hours = result.getHours();
349
				var hours = result.getHours();
348
				if (v == pm && hours < 12) {
350
				if (v == pm && hours < 12) {
349
					result.setHours(hours + 12);
351
					result.setHours(hours + 12);
350
				} else {
352
				} else {
351
					if (v == am && hours == 12) {
353
					if (v == am && hours == 12) {
352
						result.setHours(0);
354
						result.setHours(0);
353
					}
355
					}
354
				}
356
				}
355
				break;
357
				break;
356
			  case "K":
358
			  case "K":
357
				if (v == 24) {
359
				if (v == 24) {
358
					v = 0;
360
					v = 0;
359
				}
361
				}
360
			  case "h":
362
			  case "h":
361
			  case "H":
363
			  case "H":
362
			  case "k":
364
			  case "k":
363
				if (v > 23) {
365
				if (v > 23) {
364
					dojo.debug("dojo.date.parse: Illegal hours value");
366
					dojo.debug("dojo.date.parse: Illegal hours value");
365
					return null;
367
					return null;
366
				}
368
				}
367
				result.setHours(v);
369
				result.setHours(v);
368
				break;
370
				break;
369
			  case "m":
371
			  case "m":
370
				result.setMinutes(v);
372
				result.setMinutes(v);
371
				break;
373
				break;
372
			  case "s":
374
			  case "s":
373
				result.setSeconds(v);
375
				result.setSeconds(v);
374
				break;
376
				break;
375
			  case "S":
377
			  case "S":
376
				result.setMilliseconds(v);
378
				result.setMilliseconds(v);
377
				break;
379
				break;
378
			  default:
380
			  default:
379
				dojo.unimplemented("dojo.date.parse: unsupported pattern char=" + grp.charAt(0));
381
				dojo.unimplemented("dojo.date.parse: unsupported pattern char=" + grp.charAt(0));
380
			}
382
			}
381
		}
383
		}
382
		if (expected.year && result.getFullYear() != expected.year) {
384
		if (expected.year && result.getFullYear() != expected.year) {
383
			dojo.debug("Parsed year: '" + result.getFullYear() + "' did not match input year: '" + expected.year + "'.");
385
			dojo.debug("Parsed year: '" + result.getFullYear() + "' did not match input year: '" + expected.year + "'.");
384
			return null;
386
			return null;
385
		}
387
		}
386
		if (expected.month && result.getMonth() != expected.month) {
388
		if (expected.month && result.getMonth() != expected.month) {
387
			dojo.debug("Parsed month: '" + result.getMonth() + "' did not match input month: '" + expected.month + "'.");
389
			dojo.debug("Parsed month: '" + result.getMonth() + "' did not match input month: '" + expected.month + "'.");
388
			return null;
390
			return null;
389
		}
391
		}
390
		if (expected.date && result.getDate() != expected.date) {
392
		if (expected.date && result.getDate() != expected.date) {
391
			dojo.debug("Parsed day of month: '" + result.getDate() + "' did not match input day of month: '" + expected.date + "'.");
393
			dojo.debug("Parsed day of month: '" + result.getDate() + "' did not match input day of month: '" + expected.date + "'.");
392
			return null;
394
			return null;
393
		}
395
		}
394
		return result;
396
		return result;
395
	};
397
	};
396
	function _processPattern(pattern, applyPattern, applyLiteral, applyAll) {
398
	function _processPattern(pattern, applyPattern, applyLiteral, applyAll) {
397
		var identity = function (x) {
399
		var identity = function (x) {
398
			return x;
400
			return x;
399
		};
401
		};
400
		applyPattern = applyPattern || identity;
402
		applyPattern = applyPattern || identity;
401
		applyLiteral = applyLiteral || identity;
403
		applyLiteral = applyLiteral || identity;
402
		applyAll = applyAll || identity;
404
		applyAll = applyAll || identity;
403
		var chunks = pattern.match(/(''|[^'])+/g);
405
		var chunks = pattern.match(/(''|[^'])+/g);
404
		var literal = false;
406
		var literal = false;
405
		for (var i = 0; i < chunks.length; i++) {
407
		for (var i = 0; i < chunks.length; i++) {
406
			if (!chunks[i]) {
408
			if (!chunks[i]) {
407
				chunks[i] = "";
409
				chunks[i] = "";
408
			} else {
410
			} else {
409
				chunks[i] = (literal ? applyLiteral : applyPattern)(chunks[i]);
411
				chunks[i] = (literal ? applyLiteral : applyPattern)(chunks[i]);
410
				literal = !literal;
412
				literal = !literal;
411
			}
413
			}
412
		}
414
		}
413
		return applyAll(chunks.join(""));
415
		return applyAll(chunks.join(""));
414
	}
416
	}
415
	function _buildDateTimeRE(groups, info, options, pattern) {
417
	function _buildDateTimeRE(groups, info, options, pattern) {
416
		return pattern.replace(/([a-z])\1*/ig, function (match) {
418
		return pattern.replace(/([a-z])\1*/ig, function (match) {
417
			var s;
419
			var s;
418
			var c = match.charAt(0);
420
			var c = match.charAt(0);
419
			var l = match.length;
421
			var l = match.length;
420
			switch (c) {
422
			switch (c) {
421
			  case "y":
423
			  case "y":
422
				s = "\\d" + ((l == 2) ? "{2,4}" : "+");
424
				s = "\\d" + ((l == 2) ? "{2,4}" : "+");
423
				break;
425
				break;
424
			  case "M":
426
			  case "M":
425
				s = (l > 2) ? "\\S+" : "\\d{1,2}";
427
				s = (l > 2) ? "\\S+" : "\\d{1,2}";
426
				break;
428
				break;
427
			  case "d":
429
			  case "d":
428
				s = "\\d{1,2}";
430
				s = "\\d{1,2}";
429
				break;
431
				break;
430
			  case "E":
432
			  case "E":
431
				s = "\\S+";
433
				s = "\\S+";
432
				break;
434
				break;
433
			  case "h":
435
			  case "h":
434
			  case "H":
436
			  case "H":
435
			  case "K":
437
			  case "K":
436
			  case "k":
438
			  case "k":
437
				s = "\\d{1,2}";
439
				s = "\\d{1,2}";
438
				break;
440
				break;
439
			  case "m":
441
			  case "m":
440
			  case "s":
442
			  case "s":
441
				s = "[0-5]\\d";
443
				s = "[0-5]\\d";
442
				break;
444
				break;
443
			  case "S":
445
			  case "S":
444
				s = "\\d{1,3}";
446
				s = "\\d{1,3}";
445
				break;
447
				break;
446
			  case "a":
448
			  case "a":
447
				var am = options.am || info.am || "AM";
449
				var am = options.am || info.am || "AM";
448
				var pm = options.pm || info.pm || "PM";
450
				var pm = options.pm || info.pm || "PM";
449
				if (options.strict) {
451
				if (options.strict) {
450
					s = am + "|" + pm;
452
					s = am + "|" + pm;
451
				} else {
453
				} else {
452
					s = am;
454
					s = am;
453
					s += (am != am.toLowerCase()) ? "|" + am.toLowerCase() : "";
455
					s += (am != am.toLowerCase()) ? "|" + am.toLowerCase() : "";
454
					s += "|";
456
					s += "|";
455
					s += (pm != pm.toLowerCase()) ? pm + "|" + pm.toLowerCase() : pm;
457
					s += (pm != pm.toLowerCase()) ? pm + "|" + pm.toLowerCase() : pm;
456
				}
458
				}
457
				break;
459
				break;
458
			  default:
460
			  default:
459
				dojo.unimplemented("parse of date format, pattern=" + pattern);
461
				dojo.unimplemented("parse of date format, pattern=" + pattern);
460
			}
462
			}
461
			if (groups) {
463
			if (groups) {
462
				groups.push(match);
464
				groups.push(match);
463
			}
465
			}
464
			return "\\s*(" + s + ")\\s*";
466
			return "\\s*(" + s + ")\\s*";
465
		});
467
		});
466
	}
468
	}
467
})();
469
})();
468
dojo.date.strftime = function (dateObject, format, locale) {
470
dojo.date.strftime = function (dateObject, format, locale) {
469
	var padChar = null;
471
	var padChar = null;
470
	function _(s, n) {
472
	function _(s, n) {
471
		return dojo.string.pad(s, n || 2, padChar || "0");
473
		return dojo.string.pad(s, n || 2, padChar || "0");
472
	}
474
	}
473
	var info = dojo.date._getGregorianBundle(locale);
475
	var info = dojo.date._getGregorianBundle(locale);
474
	function $(property) {
476
	function $(property) {
475
		switch (property) {
477
		switch (property) {
476
		  case "a":
478
		  case "a":
477
			return dojo.date.getDayShortName(dateObject, locale);
479
			return dojo.date.getDayShortName(dateObject, locale);
478
		  case "A":
480
		  case "A":
479
			return dojo.date.getDayName(dateObject, locale);
481
			return dojo.date.getDayName(dateObject, locale);
480
		  case "b":
482
		  case "b":
481
		  case "h":
483
		  case "h":
482
			return dojo.date.getMonthShortName(dateObject, locale);
484
			return dojo.date.getMonthShortName(dateObject, locale);
483
		  case "B":
485
		  case "B":
484
			return dojo.date.getMonthName(dateObject, locale);
486
			return dojo.date.getMonthName(dateObject, locale);
485
		  case "c":
487
		  case "c":
486
			return dojo.date.format(dateObject, {locale:locale});
488
			return dojo.date.format(dateObject, {locale:locale});
487
		  case "C":
489
		  case "C":
488
			return _(Math.floor(dateObject.getFullYear() / 100));
490
			return _(Math.floor(dateObject.getFullYear() / 100));
489
		  case "d":
491
		  case "d":
490
			return _(dateObject.getDate());
492
			return _(dateObject.getDate());
491
		  case "D":
493
		  case "D":
492
			return $("m") + "/" + $("d") + "/" + $("y");
494
			return $("m") + "/" + $("d") + "/" + $("y");
493
		  case "e":
495
		  case "e":
494
			if (padChar == null) {
496
			if (padChar == null) {
495
				padChar = " ";
497
				padChar = " ";
496
			}
498
			}
497
			return _(dateObject.getDate());
499
			return _(dateObject.getDate());
498
		  case "f":
500
		  case "f":
499
			if (padChar == null) {
501
			if (padChar == null) {
500
				padChar = " ";
502
				padChar = " ";
501
			}
503
			}
502
			return _(dateObject.getMonth() + 1);
504
			return _(dateObject.getMonth() + 1);
503
		  case "g":
505
		  case "g":
504
			break;
506
			break;
505
		  case "G":
507
		  case "G":
506
			dojo.unimplemented("unimplemented modifier 'G'");
508
			dojo.unimplemented("unimplemented modifier 'G'");
507
			break;
509
			break;
508
		  case "F":
510
		  case "F":
509
			return $("Y") + "-" + $("m") + "-" + $("d");
511
			return $("Y") + "-" + $("m") + "-" + $("d");
510
		  case "H":
512
		  case "H":
511
			return _(dateObject.getHours());
513
			return _(dateObject.getHours());
512
		  case "I":
514
		  case "I":
513
			return _(dateObject.getHours() % 12 || 12);
515
			return _(dateObject.getHours() % 12 || 12);
514
		  case "j":
516
		  case "j":
515
			return _(dojo.date.getDayOfYear(dateObject), 3);
517
			return _(dojo.date.getDayOfYear(dateObject), 3);
516
		  case "k":
518
		  case "k":
517
			if (padChar == null) {
519
			if (padChar == null) {
518
				padChar = " ";
520
				padChar = " ";
519
			}
521
			}
520
			return _(dateObject.getHours());
522
			return _(dateObject.getHours());
521
		  case "l":
523
		  case "l":
522
			if (padChar == null) {
524
			if (padChar == null) {
523
				padChar = " ";
525
				padChar = " ";
524
			}
526
			}
525
			return _(dateObject.getHours() % 12 || 12);
527
			return _(dateObject.getHours() % 12 || 12);
526
		  case "m":
528
		  case "m":
527
			return _(dateObject.getMonth() + 1);
529
			return _(dateObject.getMonth() + 1);
528
		  case "M":
530
		  case "M":
529
			return _(dateObject.getMinutes());
531
			return _(dateObject.getMinutes());
530
		  case "n":
532
		  case "n":
531
			return "\n";
533
			return "\n";
532
		  case "p":
534
		  case "p":
533
			return info[dateObject.getHours() < 12 ? "am" : "pm"];
535
			return info[dateObject.getHours() < 12 ? "am" : "pm"];
534
		  case "r":
536
		  case "r":
535
			return $("I") + ":" + $("M") + ":" + $("S") + " " + $("p");
537
			return $("I") + ":" + $("M") + ":" + $("S") + " " + $("p");
536
		  case "R":
538
		  case "R":
537
			return $("H") + ":" + $("M");
539
			return $("H") + ":" + $("M");
538
		  case "S":
540
		  case "S":
539
			return _(dateObject.getSeconds());
541
			return _(dateObject.getSeconds());
540
		  case "t":
542
		  case "t":
541
			return "\t";
543
			return "\t";
542
		  case "T":
544
		  case "T":
543
			return $("H") + ":" + $("M") + ":" + $("S");
545
			return $("H") + ":" + $("M") + ":" + $("S");
544
		  case "u":
546
		  case "u":
545
			return String(dateObject.getDay() || 7);
547
			return String(dateObject.getDay() || 7);
546
		  case "U":
548
		  case "U":
547
			return _(dojo.date.getWeekOfYear(dateObject));
549
			return _(dojo.date.getWeekOfYear(dateObject));
548
		  case "V":
550
		  case "V":
549
			return _(dojo.date.getIsoWeekOfYear(dateObject));
551
			return _(dojo.date.getIsoWeekOfYear(dateObject));
550
		  case "W":
552
		  case "W":
551
			return _(dojo.date.getWeekOfYear(dateObject, 1));
553
			return _(dojo.date.getWeekOfYear(dateObject, 1));
552
		  case "w":
554
		  case "w":
553
			return String(dateObject.getDay());
555
			return String(dateObject.getDay());
554
		  case "x":
556
		  case "x":
555
			return dojo.date.format(dateObject, {selector:"dateOnly", locale:locale});
557
			return dojo.date.format(dateObject, {selector:"dateOnly", locale:locale});
556
		  case "X":
558
		  case "X":
557
			return dojo.date.format(dateObject, {selector:"timeOnly", locale:locale});
559
			return dojo.date.format(dateObject, {selector:"timeOnly", locale:locale});
558
		  case "y":
560
		  case "y":
559
			return _(dateObject.getFullYear() % 100);
561
			return _(dateObject.getFullYear() % 100);
560
		  case "Y":
562
		  case "Y":
561
			return String(dateObject.getFullYear());
563
			return String(dateObject.getFullYear());
562
		  case "z":
564
		  case "z":
563
			var timezoneOffset = dateObject.getTimezoneOffset();
565
			var timezoneOffset = dateObject.getTimezoneOffset();
564
			return (timezoneOffset > 0 ? "-" : "+") + _(Math.floor(Math.abs(timezoneOffset) / 60)) + ":" + _(Math.abs(timezoneOffset) % 60);
566
			return (timezoneOffset > 0 ? "-" : "+") + _(Math.floor(Math.abs(timezoneOffset) / 60)) + ":" + _(Math.abs(timezoneOffset) % 60);
565
		  case "Z":
567
		  case "Z":
566
			return dojo.date.getTimezoneName(dateObject);
568
			return dojo.date.getTimezoneName(dateObject);
567
		  case "%":
569
		  case "%":
568
			return "%";
570
			return "%";
569
		}
571
		}
570
	}
572
	}
571
	var string = "";
573
	var string = "";
572
	var i = 0;
574
	var i = 0;
573
	var index = 0;
575
	var index = 0;
574
	var switchCase = null;
576
	var switchCase = null;
575
	while ((index = format.indexOf("%", i)) != -1) {
577
	while ((index = format.indexOf("%", i)) != -1) {
576
		string += format.substring(i, index++);
578
		string += format.substring(i, index++);
577
		switch (format.charAt(index++)) {
579
		switch (format.charAt(index++)) {
578
		  case "_":
580
		  case "_":
579
			padChar = " ";
581
			padChar = " ";
580
			break;
582
			break;
581
		  case "-":
583
		  case "-":
582
			padChar = "";
584
			padChar = "";
583
			break;
585
			break;
584
		  case "0":
586
		  case "0":
585
			padChar = "0";
587
			padChar = "0";
586
			break;
588
			break;
587
		  case "^":
589
		  case "^":
588
			switchCase = "upper";
590
			switchCase = "upper";
589
			break;
591
			break;
590
		  case "*":
592
		  case "*":
591
			switchCase = "lower";
593
			switchCase = "lower";
592
			break;
594
			break;
593
		  case "#":
595
		  case "#":
594
			switchCase = "swap";
596
			switchCase = "swap";
595
			break;
597
			break;
596
		  default:
598
		  default:
597
			padChar = null;
599
			padChar = null;
598
			index--;
600
			index--;
599
			break;
601
			break;
600
		}
602
		}
601
		var property = $(format.charAt(index++));
603
		var property = $(format.charAt(index++));
602
		switch (switchCase) {
604
		switch (switchCase) {
603
		  case "upper":
605
		  case "upper":
604
			property = property.toUpperCase();
606
			property = property.toUpperCase();
605
			break;
607
			break;
606
		  case "lower":
608
		  case "lower":
607
			property = property.toLowerCase();
609
			property = property.toLowerCase();
608
			break;
610
			break;
609
		  case "swap":
611
		  case "swap":
610
			var compareString = property.toLowerCase();
612
			var compareString = property.toLowerCase();
611
			var swapString = "";
613
			var swapString = "";
612
			var j = 0;
614
			var j = 0;
613
			var ch = "";
615
			var ch = "";
614
			while (j < property.length) {
616
			while (j < property.length) {
615
				ch = property.charAt(j);
617
				ch = property.charAt(j);
616
				swapString += (ch == compareString.charAt(j)) ? ch.toUpperCase() : ch.toLowerCase();
618
				swapString += (ch == compareString.charAt(j)) ? ch.toUpperCase() : ch.toLowerCase();
617
				j++;
619
				j++;
618
			}
620
			}
619
			property = swapString;
621
			property = swapString;
620
			break;
622
			break;
621
		  default:
623
		  default:
622
			break;
624
			break;
623
		}
625
		}
624
		switchCase = null;
626
		switchCase = null;
625
		string += property;
627
		string += property;
626
		i = index;
628
		i = index;
627
	}
629
	}
628
	string += format.substring(i);
630
	string += format.substring(i);
629
	return string;
631
	return string;
630
};
632
};
631
(function () {
633
(function () {
632
	var _customFormats = [];
634
	var _customFormats = [];
633
	dojo.date.addCustomFormats = function (packageName, bundleName) {
635
	dojo.date.addCustomFormats = function (packageName, bundleName) {
634
		_customFormats.push({pkg:packageName, name:bundleName});
636
		_customFormats.push({pkg:packageName, name:bundleName});
635
	};
637
	};
636
	dojo.date._getGregorianBundle = function (locale) {
638
	dojo.date._getGregorianBundle = function (locale) {
637
		var gregorian = {};
639
		var gregorian = {};
638
		dojo.lang.forEach(_customFormats, function (desc) {
640
		dojo.lang.forEach(_customFormats, function (desc) {
639
			var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
641
			var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
640
			gregorian = dojo.lang.mixin(gregorian, bundle);
642
			gregorian = dojo.lang.mixin(gregorian, bundle);
641
		}, this);
643
		}, this);
642
		return gregorian;
644
		return gregorian;
643
	};
645
	};
644
})();
646
})();
645
dojo.date.addCustomFormats("dojo.i18n.calendar", "gregorian");
647
dojo.date.addCustomFormats("dojo.i18n.calendar", "gregorian");
646
dojo.date.addCustomFormats("dojo.i18n.calendar", "gregorianExtras");
648
dojo.date.addCustomFormats("dojo.i18n.calendar", "gregorianExtras");
647
dojo.date.getNames = function (item, type, use, locale) {
649
dojo.date.getNames = function (item, type, use, locale) {
648
	var label;
650
	var label;
649
	var lookup = dojo.date._getGregorianBundle(locale);
651
	var lookup = dojo.date._getGregorianBundle(locale);
650
	var props = [item, use, type];
652
	var props = [item, use, type];
651
	if (use == "standAlone") {
653
	if (use == "standAlone") {
652
		label = lookup[props.join("-")];
654
		label = lookup[props.join("-")];
653
	}
655
	}
654
	props[1] = "format";
656
	props[1] = "format";
655
	return (label || lookup[props.join("-")]).concat();
657
	return (label || lookup[props.join("-")]).concat();
656
};
658
};
657
dojo.date.getDayName = function (dateObject, locale) {
659
dojo.date.getDayName = function (dateObject, locale) {
658
	return dojo.date.getNames("days", "wide", "format", locale)[dateObject.getDay()];
660
	return dojo.date.getNames("days", "wide", "format", locale)[dateObject.getDay()];
659
};
661
};
660
dojo.date.getDayShortName = function (dateObject, locale) {
662
dojo.date.getDayShortName = function (dateObject, locale) {
661
	return dojo.date.getNames("days", "abbr", "format", locale)[dateObject.getDay()];
663
	return dojo.date.getNames("days", "abbr", "format", locale)[dateObject.getDay()];
662
};
664
};
663
dojo.date.getMonthName = function (dateObject, locale) {
665
dojo.date.getMonthName = function (dateObject, locale) {
664
	return dojo.date.getNames("months", "wide", "format", locale)[dateObject.getMonth()];
666
	return dojo.date.getNames("months", "wide", "format", locale)[dateObject.getMonth()];
665
};
667
};
666
dojo.date.getMonthShortName = function (dateObject, locale) {
668
dojo.date.getMonthShortName = function (dateObject, locale) {
667
	return dojo.date.getNames("months", "abbr", "format", locale)[dateObject.getMonth()];
669
	return dojo.date.getNames("months", "abbr", "format", locale)[dateObject.getMonth()];
668
};
670
};
669
dojo.date.toRelativeString = function (dateObject) {
671
dojo.date.toRelativeString = function (dateObject) {
670
	var now = new Date();
672
	var now = new Date();
671
	var diff = (now - dateObject) / 1000;
673
	var diff = (now - dateObject) / 1000;
672
	var end = " ago";
674
	var end = " ago";
673
	var future = false;
675
	var future = false;
674
	if (diff < 0) {
676
	if (diff < 0) {
675
		future = true;
677
		future = true;
676
		end = " from now";
678
		end = " from now";
677
		diff = -diff;
679
		diff = -diff;
678
	}
680
	}
679
	if (diff < 60) {
681
	if (diff < 60) {
680
		diff = Math.round(diff);
682
		diff = Math.round(diff);
681
		return diff + " second" + (diff == 1 ? "" : "s") + end;
683
		return diff + " second" + (diff == 1 ? "" : "s") + end;
682
	}
684
	}
683
	if (diff < 60 * 60) {
685
	if (diff < 60 * 60) {
684
		diff = Math.round(diff / 60);
686
		diff = Math.round(diff / 60);
685
		return diff + " minute" + (diff == 1 ? "" : "s") + end;
687
		return diff + " minute" + (diff == 1 ? "" : "s") + end;
686
	}
688
	}
687
	if (diff < 60 * 60 * 24) {
689
	if (diff < 60 * 60 * 24) {
688
		diff = Math.round(diff / 3600);
690
		diff = Math.round(diff / 3600);
689
		return diff + " hour" + (diff == 1 ? "" : "s") + end;
691
		return diff + " hour" + (diff == 1 ? "" : "s") + end;
690
	}
692
	}
691
	if (diff < 60 * 60 * 24 * 7) {
693
	if (diff < 60 * 60 * 24 * 7) {
692
		diff = Math.round(diff / (3600 * 24));
694
		diff = Math.round(diff / (3600 * 24));
693
		if (diff == 1) {
695
		if (diff == 1) {
694
			return future ? "Tomorrow" : "Yesterday";
696
			return future ? "Tomorrow" : "Yesterday";
695
		} else {
697
		} else {
696
			return diff + " days" + end;
698
			return diff + " days" + end;
697
		}
699
		}
698
	}
700
	}
699
	return dojo.date.format(dateObject);
701
	return dojo.date.format(dateObject);
700
};
702
};
701
dojo.date.toSql = function (dateObject, noTime) {
703
dojo.date.toSql = function (dateObject, noTime) {
702
	return dojo.date.strftime(dateObject, "%F" + !noTime ? " %T" : "");
704
	return dojo.date.strftime(dateObject, "%F" + !noTime ? " %T" : "");
703
};
705
};
704
dojo.date.fromSql = function (sqlDate) {
706
dojo.date.fromSql = function (sqlDate) {
705
	var parts = sqlDate.split(/[\- :]/g);
707
	var parts = sqlDate.split(/[\- :]/g);
706
	while (parts.length < 6) {
708
	while (parts.length < 6) {
707
		parts.push(0);
709
		parts.push(0);
708
	}
710
	}
709
	return new Date(parts[0], (parseInt(parts[1], 10) - 1), parts[2], parts[3], parts[4], parts[5]);
711
	return new Date(parts[0], (parseInt(parts[1], 10) - 1), parts[2], parts[3], parts[4], parts[5]);
710
};
712
};
711
 
713