dojo.extend()

in plugins/struts2-dojo-plugin/src/main/resources/org/apache/struts2/static/dojo/src/cal/iCalendar.js [259:531]


dojo.extend(dojo.cal.iCalendar.VEvent, {getDates:function (until) {
	var dtstart = this.getDate();
	var recurranceSet = [];
	var weekdays = ["su", "mo", "tu", "we", "th", "fr", "sa"];
	var order = {"daily":1, "weekly":2, "monthly":3, "yearly":4, "byday":1, "bymonthday":1, "byweekno":2, "bymonth":3, "byyearday":4};
	for (var x = 0; x < this.rrule.length; x++) {
		var rrule = this.rrule[x];
		var freq = rrule.freq.toLowerCase();
		var interval = 1;
		if (rrule.interval > interval) {
			interval = rrule.interval;
		}
		var set = [];
		var freqInt = order[freq];
		if (rrule.until) {
			var tmpUntil = dojo.date.fromIso8601(rrule.until);
		} else {
			var tmpUntil = until;
		}
		if (tmpUntil > until) {
			tmpUntil = until;
		}
		if (dtstart < tmpUntil) {
			var expandingRules = function () {
			};
			var cullingRules = function () {
			};
			expandingRules.length = 0;
			cullingRules.length = 0;
			switch (freq) {
			  case "yearly":
				var nextDate = new Date(dtstart);
				set.push(nextDate);
				while (nextDate < tmpUntil) {
					nextDate.setYear(nextDate.getFullYear() + interval);
					tmpDate = new Date(nextDate);
					if (tmpDate < tmpUntil) {
						set.push(tmpDate);
					}
				}
				break;
			  case "monthly":
				nextDate = new Date(dtstart);
				set.push(nextDate);
				while (nextDate < tmpUntil) {
					nextDate.setMonth(nextDate.getMonth() + interval);
					var tmpDate = new Date(nextDate);
					if (tmpDate < tmpUntil) {
						set.push(tmpDate);
					}
				}
				break;
			  case "weekly":
				nextDate = new Date(dtstart);
				set.push(nextDate);
				while (nextDate < tmpUntil) {
					nextDate.setDate(nextDate.getDate() + (7 * interval));
					var tmpDate = new Date(nextDate);
					if (tmpDate < tmpUntil) {
						set.push(tmpDate);
					}
				}
				break;
			  case "daily":
				nextDate = new Date(dtstart);
				set.push(nextDate);
				while (nextDate < tmpUntil) {
					nextDate.setDate(nextDate.getDate() + interval);
					var tmpDate = new Date(nextDate);
					if (tmpDate < tmpUntil) {
						set.push(tmpDate);
					}
				}
				break;
			}
			if ((rrule["bymonth"]) && (order["bymonth"] < freqInt)) {
				for (var z = 0; z < rrule["bymonth"].length; z++) {
					if (z == 0) {
						for (var zz = 0; zz < set.length; zz++) {
							set[zz].setMonth(rrule["bymonth"][z] - 1);
						}
					} else {
						var subset = [];
						for (var zz = 0; zz < set.length; zz++) {
							var newDate = new Date(set[zz]);
							newDate.setMonth(rrule[z]);
							subset.push(newDate);
						}
						tmp = set.concat(subset);
						set = tmp;
					}
				}
			}
			if (rrule["byweekno"] && !rrule["bymonth"]) {
				dojo.debug("TODO: no support for byweekno yet");
			}
			if (rrule["byyearday"] && !rrule["bymonth"] && !rrule["byweekno"]) {
				if (rrule["byyearday"].length > 1) {
					var regex = "([+-]?)([0-9]{1,3})";
					for (var z = 1; x < rrule["byyearday"].length; z++) {
						var regexResult = rrule["byyearday"][z].match(regex);
						if (z == 1) {
							for (var zz = 0; zz < set.length; zz++) {
								if (regexResult[1] == "-") {
									dojo.date.setDayOfYear(set[zz], 366 - regexResult[2]);
								} else {
									dojo.date.setDayOfYear(set[zz], regexResult[2]);
								}
							}
						} else {
							var subset = [];
							for (var zz = 0; zz < set.length; zz++) {
								var newDate = new Date(set[zz]);
								if (regexResult[1] == "-") {
									dojo.date.setDayOfYear(newDate, 366 - regexResult[2]);
								} else {
									dojo.date.setDayOfYear(newDate, regexResult[2]);
								}
								subset.push(newDate);
							}
							tmp = set.concat(subset);
							set = tmp;
						}
					}
				}
			}
			if (rrule["bymonthday"] && (order["bymonthday"] < freqInt)) {
				if (rrule["bymonthday"].length > 0) {
					var regex = "([+-]?)([0-9]{1,3})";
					for (var z = 0; z < rrule["bymonthday"].length; z++) {
						var regexResult = rrule["bymonthday"][z].match(regex);
						if (z == 0) {
							for (var zz = 0; zz < set.length; zz++) {
								if (regexResult[1] == "-") {
									if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
										set[zz].setDate(dojo.date.getDaysInMonth(set[zz]) - regexResult[2]);
									}
								} else {
									if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
										set[zz].setDate(regexResult[2]);
									}
								}
							}
						} else {
							var subset = [];
							for (var zz = 0; zz < set.length; zz++) {
								var newDate = new Date(set[zz]);
								if (regexResult[1] == "-") {
									if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
										newDate.setDate(dojo.date.getDaysInMonth(set[zz]) - regexResult[2]);
									}
								} else {
									if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
										newDate.setDate(regexResult[2]);
									}
								}
								subset.push(newDate);
							}
							tmp = set.concat(subset);
							set = tmp;
						}
					}
				}
			}
			if (rrule["byday"] && (order["byday"] < freqInt)) {
				if (rrule["bymonth"]) {
					if (rrule["byday"].length > 0) {
						var regex = "([+-]?)([0-9]{0,1}?)([A-Za-z]{1,2})";
						for (var z = 0; z < rrule["byday"].length; z++) {
							var regexResult = rrule["byday"][z].match(regex);
							var occurance = regexResult[2];
							var day = regexResult[3].toLowerCase();
							if (z == 0) {
								for (var zz = 0; zz < set.length; zz++) {
									if (regexResult[1] == "-") {
										var numDaysFound = 0;
										var lastDayOfMonth = dojo.date.getDaysInMonth(set[zz]);
										var daysToSubtract = 1;
										set[zz].setDate(lastDayOfMonth);
										if (weekdays[set[zz].getDay()] == day) {
											numDaysFound++;
											daysToSubtract = 7;
										}
										daysToSubtract = 1;
										while (numDaysFound < occurance) {
											set[zz].setDate(set[zz].getDate() - daysToSubtract);
											if (weekdays[set[zz].getDay()] == day) {
												numDaysFound++;
												daysToSubtract = 7;
											}
										}
									} else {
										if (occurance) {
											var numDaysFound = 0;
											set[zz].setDate(1);
											var daysToAdd = 1;
											if (weekdays[set[zz].getDay()] == day) {
												numDaysFound++;
												daysToAdd = 7;
											}
											while (numDaysFound < occurance) {
												set[zz].setDate(set[zz].getDate() + daysToAdd);
												if (weekdays[set[zz].getDay()] == day) {
													numDaysFound++;
													daysToAdd = 7;
												}
											}
										} else {
											var numDaysFound = 0;
											var subset = [];
											lastDayOfMonth = new Date(set[zz]);
											var daysInMonth = dojo.date.getDaysInMonth(set[zz]);
											lastDayOfMonth.setDate(daysInMonth);
											set[zz].setDate(1);
											if (weekdays[set[zz].getDay()] == day) {
												numDaysFound++;
											}
											var tmpDate = new Date(set[zz]);
											daysToAdd = 1;
											while (tmpDate.getDate() < lastDayOfMonth) {
												if (weekdays[tmpDate.getDay()] == day) {
													numDaysFound++;
													if (numDaysFound == 1) {
														set[zz] = tmpDate;
													} else {
														subset.push(tmpDate);
														tmpDate = new Date(tmpDate);
														daysToAdd = 7;
														tmpDate.setDate(tmpDate.getDate() + daysToAdd);
													}
												} else {
													tmpDate.setDate(tmpDate.getDate() + daysToAdd);
												}
											}
											var t = set.concat(subset);
											set = t;
										}
									}
								}
							} else {
								var subset = [];
								for (var zz = 0; zz < set.length; zz++) {
									var newDate = new Date(set[zz]);
									if (regexResult[1] == "-") {
										if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
											newDate.setDate(dojo.date.getDaysInMonth(set[zz]) - regexResult[2]);
										}
									} else {
										if (regexResult[2] < dojo.date.getDaysInMonth(set[zz])) {
											newDate.setDate(regexResult[2]);
										}
									}
									subset.push(newDate);
								}
								tmp = set.concat(subset);
								set = tmp;
							}
						}
					}
				} else {
					dojo.debug("TODO: byday within a yearly rule without a bymonth");
				}
			}
			dojo.debug("TODO: Process BYrules for units larger than frequency");
			var tmp = recurranceSet.concat(set);
			recurranceSet = tmp;
		}
	}
	recurranceSet.push(dtstart);
	return recurranceSet;
}, getDate:function () {
	return dojo.date.fromIso8601(this.dtstart.value);
}});