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);
}});