dojo.date.parse = function()

in plugins/struts2-dojo-plugin/src/main/resources/org/apache/struts2/static/dojo/src/date/format.js [223:397]


	dojo.date.parse = function (value, options) {
		options = options || {};
		var locale = dojo.hostenv.normalizeLocale(options.locale);
		var info = dojo.date._getGregorianBundle(locale);
		var formatLength = options.formatLength || "full";
		if (!options.selector) {
			options.selector = "dateOnly";
		}
		var datePattern = options.datePattern || info["dateFormat-" + formatLength];
		var timePattern = options.timePattern || info["timeFormat-" + formatLength];
		var pattern;
		if (options.selector == "dateOnly") {
			pattern = datePattern;
		} else {
			if (options.selector == "timeOnly") {
				pattern = timePattern;
			} else {
				if (options.selector == "dateTime") {
					pattern = datePattern + " " + timePattern;
				} else {
					var msg = "dojo.date.parse: Unknown selector param passed: '" + options.selector + "'.";
					msg += " Defaulting to date pattern.";
					dojo.debug(msg);
					pattern = datePattern;
				}
			}
		}
		var groups = [];
		var dateREString = _processPattern(pattern, dojo.lang.curry(this, _buildDateTimeRE, groups, info, options));
		var dateRE = new RegExp("^" + dateREString + "$");
		var match = dateRE.exec(value);
		if (!match) {
			return null;
		}
		var widthList = ["abbr", "wide", "narrow"];
		var result = new Date(1972, 0);
		var expected = {};
		for (var i = 1; i < match.length; i++) {
			var grp = groups[i - 1];
			var l = grp.length;
			var v = match[i];
			switch (grp.charAt(0)) {
			  case "y":
				if (l != 2) {
					result.setFullYear(v);
					expected.year = v;
				} else {
					if (v < 100) {
						v = Number(v);
						var year = "" + new Date().getFullYear();
						var century = year.substring(0, 2) * 100;
						var yearPart = Number(year.substring(2, 4));
						var cutoff = Math.min(yearPart + 20, 99);
						var num = (v < cutoff) ? century + v : century - 100 + v;
						result.setFullYear(num);
						expected.year = num;
					} else {
						if (options.strict) {
							return null;
						}
						result.setFullYear(v);
						expected.year = v;
					}
				}
				break;
			  case "M":
				if (l > 2) {
					if (!options.strict) {
						v = v.replace(/\./g, "");
						v = v.toLowerCase();
					}
					var months = info["months-format-" + widthList[l - 3]].concat();
					for (var j = 0; j < months.length; j++) {
						if (!options.strict) {
							months[j] = months[j].toLowerCase();
						}
						if (v == months[j]) {
							result.setMonth(j);
							expected.month = j;
							break;
						}
					}
					if (j == months.length) {
						dojo.debug("dojo.date.parse: Could not parse month name: '" + v + "'.");
						return null;
					}
				} else {
					result.setMonth(v - 1);
					expected.month = v - 1;
				}
				break;
			  case "E":
			  case "e":
				if (!options.strict) {
					v = v.toLowerCase();
				}
				var days = info["days-format-" + widthList[l - 3]].concat();
				for (var j = 0; j < days.length; j++) {
					if (!options.strict) {
						days[j] = days[j].toLowerCase();
					}
					if (v == days[j]) {
						break;
					}
				}
				if (j == days.length) {
					dojo.debug("dojo.date.parse: Could not parse weekday name: '" + v + "'.");
					return null;
				}
				break;
			  case "d":
				result.setDate(v);
				expected.date = v;
				break;
			  case "a":
				var am = options.am || info.am;
				var pm = options.pm || info.pm;
				if (!options.strict) {
					v = v.replace(/\./g, "").toLowerCase();
					am = am.replace(/\./g, "").toLowerCase();
					pm = pm.replace(/\./g, "").toLowerCase();
				}
				if (options.strict && v != am && v != pm) {
					dojo.debug("dojo.date.parse: Could not parse am/pm part.");
					return null;
				}
				var hours = result.getHours();
				if (v == pm && hours < 12) {
					result.setHours(hours + 12);
				} else {
					if (v == am && hours == 12) {
						result.setHours(0);
					}
				}
				break;
			  case "K":
				if (v == 24) {
					v = 0;
				}
			  case "h":
			  case "H":
			  case "k":
				if (v > 23) {
					dojo.debug("dojo.date.parse: Illegal hours value");
					return null;
				}
				result.setHours(v);
				break;
			  case "m":
				result.setMinutes(v);
				break;
			  case "s":
				result.setSeconds(v);
				break;
			  case "S":
				result.setMilliseconds(v);
				break;
			  default:
				dojo.unimplemented("dojo.date.parse: unsupported pattern char=" + grp.charAt(0));
			}
		}
		if (expected.year && result.getFullYear() != expected.year) {
			dojo.debug("Parsed year: '" + result.getFullYear() + "' did not match input year: '" + expected.year + "'.");
			return null;
		}
		if (expected.month && result.getMonth() != expected.month) {
			dojo.debug("Parsed month: '" + result.getMonth() + "' did not match input month: '" + expected.month + "'.");
			return null;
		}
		if (expected.date && result.getDate() != expected.date) {
			dojo.debug("Parsed day of month: '" + result.getDate() + "' did not match input day of month: '" + expected.date + "'.");
			return null;
		}
		return result;
	};