diff options
author | AlexKlimenkov <shurick.klimenkov@gmail.com> | 2014-06-10 20:50:30 +0300 |
---|---|---|
committer | AlexKlimenkov <shurick.klimenkov@gmail.com> | 2014-06-10 20:50:30 +0300 |
commit | b5a0589955460a44c5428c4cb5429fcfce265d23 (patch) | |
tree | 87db58400a3e036de646fb630cbb358beeac3bc1 /codebase/sources/ext/dhtmlxscheduler_recurring.js | |
parent | e2aaaef8540fabd0b5200a4959c269d6f1ae352e (diff) | |
download | scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.zip scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.gz scheduler-b5a0589955460a44c5428c4cb5429fcfce265d23.tar.bz2 |
[update] version 4.1.0
Diffstat (limited to 'codebase/sources/ext/dhtmlxscheduler_recurring.js')
-rw-r--r-- | codebase/sources/ext/dhtmlxscheduler_recurring.js | 818 |
1 files changed, 818 insertions, 0 deletions
diff --git a/codebase/sources/ext/dhtmlxscheduler_recurring.js b/codebase/sources/ext/dhtmlxscheduler_recurring.js new file mode 100644 index 0000000..ad4a7a0 --- /dev/null +++ b/codebase/sources/ext/dhtmlxscheduler_recurring.js @@ -0,0 +1,818 @@ +/* +dhtmlxScheduler v.4.1.0 Stardard + +This software is covered by GPL license. You also can obtain Commercial or Enterprise license to use it in non-GPL project - please contact sales@dhtmlx.com. Usage without proper license is prohibited. + +(c) Dinamenta, UAB. +*/ +scheduler.config.occurrence_timestamp_in_utc = false; +scheduler.config.recurring_workdays = [1,2,3,4,5]; +scheduler.form_blocks["recurring"] = { + render:function(sns) { + return scheduler.__recurring_template; + }, + _ds: {}, + _init_set_value:function(node, value, ev) { + scheduler.form_blocks["recurring"]._ds = {start:ev.start_date, end:ev._end_date}; + + var str_date_format = scheduler.date.str_to_date(scheduler.config.repeat_date); + var str_date = function(str_date) { + var date = str_date_format(str_date); + if (scheduler.config.include_end_by) + date = scheduler.date.add(date, 1, 'day'); + return date; + }; + + var date_str = scheduler.date.date_to_str(scheduler.config.repeat_date); + + var top = node.getElementsByTagName("FORM")[0]; + var els = []; + + function register_els(inps) { + for (var i = 0; i < inps.length; i++) { + var inp = inps[i]; + if (inp.type == "checkbox" || inp.type == "radio") { + if (!els[inp.name]) + els[inp.name] = []; + els[inp.name].push(inp); + } else + els[inp.name] = inp; + } + } + + register_els(top.getElementsByTagName("INPUT")); + register_els(top.getElementsByTagName("SELECT")); + + if (!scheduler.config.repeat_date_of_end) { + var formatter = scheduler.date.date_to_str(scheduler.config.repeat_date); + scheduler.config.repeat_date_of_end = formatter(scheduler.date.add(scheduler._currentDate(), 30, "day")); + } + els["date_of_end"].value = scheduler.config.repeat_date_of_end; + + var $ = function(a) { + return document.getElementById(a); + }; + + function get_radio_value(name) { + var col = els[name]; + for (var i = 0; i < col.length; i++) + if (col[i].checked) return col[i].value; + } + + function change_current_view() { + $("dhx_repeat_day").style.display = "none"; + $("dhx_repeat_week").style.display = "none"; + $("dhx_repeat_month").style.display = "none"; + $("dhx_repeat_year").style.display = "none"; + $("dhx_repeat_" + this.value).style.display = "block"; + } + + function get_repeat_code(dates) { + var code = [get_radio_value("repeat")]; + get_rcode[code[0]](code, dates); + + while (code.length < 5) code.push(""); + var repeat = ""; + if (els["end"][0].checked) { + dates.end = new Date(9999, 1, 1); + repeat = "no"; + } + else if (els["end"][2].checked) { + dates.end = str_date(els["date_of_end"].value); + } + else { + scheduler.transpose_type(code.join("_")); + repeat = Math.max(1, els["occurences_count"].value); + var transp = ((code[0] == "week" && code[4] && code[4].toString().indexOf(scheduler.config.start_on_monday ? 1 : 0) == -1) ? 1 : 0); + dates.end = scheduler.date.add(new Date(dates.start), repeat + transp, code.join("_")); + } + + return code.join("_") + "#" + repeat; + } + + scheduler.form_blocks["recurring"]._get_repeat_code = get_repeat_code; + var get_rcode = { + month:function(code, dates) { + if (get_radio_value("month_type") == "d") { + code.push(Math.max(1, els["month_count"].value)); + dates.start.setDate(els["month_day"].value); + } else { + code.push(Math.max(1, els["month_count2"].value)); + code.push(els["month_day2"].value); + code.push(Math.max(1, els["month_week2"].value)); + if (!scheduler.config.repeat_precise){ + dates.start.setDate(1); + } + } + dates._start = true; + }, + week:function(code, dates) { + code.push(Math.max(1, els["week_count"].value)); + code.push(""); + code.push(""); + var t = []; + var col = els["week_day"]; + var day = dates.start.getDay(); + var start_exists = false; + + for (var i = 0; i < col.length; i++){ + if (col[i].checked) { + t.push(col[i].value); + start_exists = start_exists || col[i].value == day; + } + } + if (!t.length){ + t.push(day); + start_exists = true; + } + t.sort(); + + + if (!scheduler.config.repeat_precise){ + dates.start = scheduler.date.week_start(dates.start); + dates._start = true; + } else if (!start_exists){ + scheduler.transpose_day_week(dates.start, t, 1, 7); + dates._start = true; + } + + code.push(t.join(",")); + }, + day:function(code) { + if (get_radio_value("day_type") == "d") { + code.push(Math.max(1, els["day_count"].value)); + } + else { + code.push("week"); + code.push(1); + code.push(""); + code.push(""); + code.push(scheduler.config.recurring_workdays.join(",")); + code.splice(0, 1); + } + }, + year:function(code, dates) { + if (get_radio_value("year_type") == "d") { + code.push("1"); + dates.start.setMonth(0); + dates.start.setDate(els["year_day"].value); + dates.start.setMonth(els["year_month"].value); + + } else { + code.push("1"); + code.push(els["year_day2"].value); + code.push(els["year_week2"].value); + dates.start.setDate(1); + dates.start.setMonth(els["year_month2"].value); + } + dates._start = true; + } + }; + var set_rcode = { + week:function(code, dates) { + els["week_count"].value = code[1]; + var col = els["week_day"]; + var t = code[4].split(","); + var d = {}; + for (var i = 0; i < t.length; i++) d[t[i]] = true; + for (var i = 0; i < col.length; i++) + col[i].checked = (!!d[col[i].value]); + }, + month:function(code, dates) { + if (code[2] === "") { + els["month_type"][0].checked = true; + els["month_count"].value = code[1]; + els["month_day"].value = dates.start.getDate(); + } else { + els["month_type"][1].checked = true; + els["month_count2"].value = code[1]; + els["month_week2"].value = code[3]; + els["month_day2"].value = code[2]; + } + }, + day:function(code, dates) { + els["day_type"][0].checked = true; + els["day_count"].value = code[1]; + }, + year:function(code, dates) { + if (code[2] === "") { + els["year_type"][0].checked = true; + els["year_day"].value = dates.start.getDate(); + els["year_month"].value = dates.start.getMonth(); + } else { + els["year_type"][1].checked = true; + els["year_week2"].value = code[3]; + els["year_day2"].value = code[2]; + els["year_month2"].value = dates.start.getMonth(); + } + } + }; + + function set_repeat_code(code, dates) { + var data = code.split("#"); + code = data[0].split("_"); + set_rcode[code[0]](code, dates); + var e = els["repeat"][({day:0, week:1, month:2, year:3})[code[0]]]; + switch (data[1]) { + case "no": + els["end"][0].checked = true; + break; + case "": + els["end"][2].checked = true; + + var end_date = dates.end; + if (scheduler.config.include_end_by){ + end_date = scheduler.date.add(end_date, -1, 'day'); + } + + els["date_of_end"].value = date_str(end_date); + break; + default: + els["end"][1].checked = true; + els["occurences_count"].value = data[1]; + break; + } + + e.checked = true; + e.onclick(); + } + + scheduler.form_blocks["recurring"]._set_repeat_code = set_repeat_code; + + for (var i = 0; i < top.elements.length; i++) { + var el = top.elements[i]; + switch (el.name) { + case "repeat": + el.onclick = change_current_view; + break; + } + } + scheduler._lightbox._rec_init_done = true; + }, + set_value:function(node, value, ev) { + var rf = scheduler.form_blocks["recurring"]; + if (!scheduler._lightbox._rec_init_done) + rf._init_set_value(node, value, ev); + node.open = !ev.rec_type; + if (this._is_modified_occurence(ev)) + node.blocked = true; + else node.blocked = false; + + var ds = rf._ds; + ds.start = ev.start_date; + ds.end = ev._end_date; + + rf.button_click(0, node.previousSibling.firstChild.firstChild, node, node); + if (value) + rf._set_repeat_code(value, ds); + }, + get_value:function(node, ev) { + if (node.open) { + var ds = scheduler.form_blocks["recurring"]._ds; + var actual_dates = {}; + this.formSection('time').getValue(actual_dates); + ds.start = actual_dates.start_date; + ev.rec_type = scheduler.form_blocks["recurring"]._get_repeat_code(ds); + if (ds._start) { + ev.start_date = new Date(ds.start); + ev._start_date = new Date(ds.start); + ds._start = false; + } else + ev._start_date = null; + + ev._end_date = ds.end; + ev.rec_pattern = ev.rec_type.split("#")[0]; + } else { + ev.rec_type = ev.rec_pattern = ""; + ev._end_date = ev.end_date; + } + return ev.rec_type; + }, + focus:function(node) { + }, + button_click:function(index, el, section, cont) { + if (!cont.open && !cont.blocked) { + cont.style.height = "115px"; + el.style.backgroundPosition = "-5px 0px"; + el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring_open; + } else { + cont.style.height = "0px"; + el.style.backgroundPosition = "-5px 20px"; + el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring; + } + cont.open = !cont.open; + + scheduler.setLightboxSize(); + } +}; + + +//problem may occur if we will have two repeating events in the same moment of time +scheduler._rec_markers = {}; +scheduler._rec_markers_pull = {}; +scheduler._add_rec_marker = function(ev, time) { + ev._pid_time = time; + this._rec_markers[ev.id] = ev; + if (!this._rec_markers_pull[ev.event_pid]) this._rec_markers_pull[ev.event_pid] = {}; + this._rec_markers_pull[ev.event_pid][time] = ev; +}; +scheduler._get_rec_marker = function(time, id) { + var ch = this._rec_markers_pull[id]; + if (ch) return ch[time]; + return null; +}; +scheduler._get_rec_markers = function(id) { + return (this._rec_markers_pull[id] || []); +}; +scheduler._rec_temp = []; +(function() { + var old_add_event = scheduler.addEvent; + scheduler.addEvent = function(start_date, end_date, text, id, extra_data) { + var ev_id = old_add_event.apply(this, arguments); + + if (ev_id) { + var ev = scheduler.getEvent(ev_id); + if (this._is_modified_occurence(ev)) + scheduler._add_rec_marker(ev, ev.event_length * 1000); + if (ev.rec_type) + ev.rec_pattern = ev.rec_type.split("#")[0]; + } + return ev_id; + }; +})(); +scheduler.attachEvent("onEventIdChange", function(id, new_id) { + if (this._ignore_call) return; + this._ignore_call = true; + + if(scheduler._rec_markers[id]){ + //important for for correct work of scheduler.getEvents(from, to) and collision detection + scheduler._rec_markers[new_id] = scheduler._rec_markers[id]; + delete scheduler._rec_markers[id]; + } + + for (var i = 0; i < this._rec_temp.length; i++) { + var tev = this._rec_temp[i]; + if (tev.event_pid == id) { + tev.event_pid = new_id; + this.changeEventId(tev.id, new_id + "#" + tev.id.split("#")[1]); + } + } + + delete this._ignore_call; +}); +scheduler.attachEvent("onConfirmedBeforeEventDelete", function(id) { + var ev = this.getEvent(id); + if (this._is_virtual_event(id) || (this._is_modified_occurence(ev) && ev.rec_type && ev.rec_type != 'none')) { + id = id.split("#"); + var nid = this.uid(); + var tid = (id[1]) ? id[1] : (ev._pid_time / 1000); + + var nev = this._copy_event(ev); + nev.id = nid; + nev.event_pid = ev.event_pid || id[0]; + var timestamp = tid; + nev.event_length = timestamp; + nev.rec_type = nev.rec_pattern = "none"; + this.addEvent(nev); + + this._add_rec_marker(nev, timestamp * 1000); + } else { + if (ev.rec_type && this._lightbox_id) + this._roll_back_dates(ev); + var sub = this._get_rec_markers(id); + for (var i in sub) { + if (sub.hasOwnProperty(i)) { + id = sub[i].id; + if (this.getEvent(id)) + this.deleteEvent(id, true); + } + } + } + return true; +}); +scheduler.attachEvent("onEventDeleted", function(id, ev){ + if(!this._is_virtual_event(id) && this._is_modified_occurence(ev)){ + if(!scheduler._events[id]){ + ev.rec_type = ev.rec_pattern = "none"; + this.setEvent(id, ev); + } + } +}); +scheduler.attachEvent("onEventChanged", function(id) { + if (this._loading) return true; + + var ev = this.getEvent(id); + + if (this._is_virtual_event(id)) { + var id = id.split("#"); + var nid = this.uid(); + this._not_render = true; + + var nev = this._copy_event(ev); + nev.id = nid; + nev.event_pid = id[0]; + var timestamp = id[1]; + nev.event_length = timestamp; + nev.rec_type = nev.rec_pattern = ""; + + this._add_rec_marker(nev, timestamp * 1000); + this.addEvent(nev); + + this._not_render = false; + + } else { + if (ev.rec_type && this._lightbox_id) + this._roll_back_dates(ev); + var sub = this._get_rec_markers(id); + for (var i in sub) { + if (sub.hasOwnProperty(i)) { + delete this._rec_markers[sub[i].id]; + this.deleteEvent(sub[i].id, true); + } + } + delete this._rec_markers_pull[id]; + + // it's possible that after editing event is no longer exists, in such case we need to remove _select_id flag + var isEventFound = false; + for (var k = 0; k < this._rendered.length; k++) { + if (this._rendered[k].getAttribute('event_id') == id) + isEventFound = true; + } + if (!isEventFound) + this._select_id = null; + } + return true; +}); +scheduler.attachEvent("onEventAdded", function(id) { + if (!this._loading) { + var ev = this.getEvent(id); + if (ev.rec_type && !ev.event_length) + this._roll_back_dates(ev); + } + return true; +}); +scheduler.attachEvent("onEventSave", function(id, data, is_new_event) { + var ev = this.getEvent(id); + if (!ev.rec_type && data.rec_type && !this._is_virtual_event(id)) + this._select_id = null; + return true; +}); +scheduler.attachEvent("onEventCreated", function(id) { + var ev = this.getEvent(id); + if (!ev.rec_type) + ev.rec_type = ev.rec_pattern = ev.event_length = ev.event_pid = ""; + return true; +}); +scheduler.attachEvent("onEventCancel", function(id) { + var ev = this.getEvent(id); + if (ev.rec_type) { + this._roll_back_dates(ev); + // a bit expensive, but we need to be sure that event re-rendered, because view can be corrupted by resize , during edit process + this.render_view_data(); + } +}); +scheduler._roll_back_dates = function(ev) { + ev.event_length = (ev.end_date.valueOf() - ev.start_date.valueOf()) / 1000; + ev.end_date = ev._end_date; + if (ev._start_date) { + ev.start_date.setMonth(0); + ev.start_date.setDate(ev._start_date.getDate()); + ev.start_date.setMonth(ev._start_date.getMonth()); + ev.start_date.setFullYear(ev._start_date.getFullYear()); + + } +}; + +scheduler._is_virtual_event = function(id){ + return id.toString().indexOf("#") != -1; +}; +scheduler._is_modified_occurence = function(ev){ + return (ev.event_pid && ev.event_pid != "0"); +}; + +scheduler._validId = function(id) { + return !this._is_virtual_event(id); +}; + +scheduler.showLightbox_rec = scheduler.showLightbox; +scheduler.showLightbox = function(id) { + var locale = this.locale; + var c = scheduler.config.lightbox_recurring; + var ev = this.getEvent(id); + var pid = ev.event_pid; + var isVirtual = this._is_virtual_event(id); + if (isVirtual) + pid = id.split("#")[0]; + + // show series + var showSeries = function(id) { + var event = scheduler.getEvent(id); + event._end_date = event.end_date; + event.end_date = new Date(event.start_date.valueOf() + event.event_length * 1000); + return scheduler.showLightbox_rec(id); // editing series + }; + + if ( (pid || pid*1 === 0) && ev.rec_type) { + // direct API call on series id + return showSeries(id); + } + if ( !pid || pid === '0' || ( (!locale.labels.confirm_recurring || c == 'instance') || (c == 'series' && !isVirtual)) ) { + // editing instance or non recurring event + return this.showLightbox_rec(id); + } + if (c == 'ask') { + var that = this; + dhtmlx.modalbox({ + text: locale.labels.confirm_recurring, + title: locale.labels.title_confirm_recurring, + width: "500px", + position: "middle", + buttons:[locale.labels.button_edit_series, locale.labels.button_edit_occurrence, locale.labels.icon_cancel], + callback: function(index) { + switch(+index) { + case 0: + return showSeries(pid); + case 1: + return that.showLightbox_rec(id); + case 2: + return; + } + } + }); + } else { + showSeries(pid); + } +}; + + +scheduler.get_visible_events_rec = scheduler.get_visible_events; +scheduler.get_visible_events = function(only_timed) { + for (var i = 0; i < this._rec_temp.length; i++) + delete this._events[this._rec_temp[i].id]; + this._rec_temp = []; + + var stack = this.get_visible_events_rec(only_timed); + var out = []; + for (var i = 0; i < stack.length; i++) { + if (stack[i].rec_type) { + //deleted element of serie + if (stack[i].rec_pattern != "none") + this.repeat_date(stack[i], out); + } + else out.push(stack[i]); + } + return out; +}; + + +(function() { + var old = scheduler.isOneDayEvent; + scheduler.isOneDayEvent = function(ev) { + if (ev.rec_type) return true; + return old.call(this, ev); + }; + var old_update_event = scheduler.updateEvent; + scheduler.updateEvent = function(id) { + var ev = scheduler.getEvent(id); + if(ev && ev.rec_type){ + //rec_type can be changed without the lightbox, + // make sure rec_pattern updated as well + ev.rec_pattern = (ev.rec_type || "").split("#")[0]; + } + if (ev && ev.rec_type && !this._is_virtual_event(id)) { + scheduler.update_view(); + } else { + old_update_event.call(this, id); + } + }; +})(); + +scheduler.transponse_size = { + day:1, week:7, month:1, year:12 +}; +scheduler.date.day_week = function(sd, day, week) { + sd.setDate(1); + week = (week - 1) * 7; + var cday = sd.getDay(); + var nday = day * 1 + week - cday + 1; + sd.setDate(nday <= week ? (nday + 7) : nday); +}; +scheduler.transpose_day_week = function(sd, list, cor, size, cor2) { + var cday = (sd.getDay() || (scheduler.config.start_on_monday ? 7 : 0)) - cor; + for (var i = 0; i < list.length; i++) { + if (list[i] > cday) + return sd.setDate(sd.getDate() + list[i] * 1 - cday - (size ? cor : cor2)); + } + this.transpose_day_week(sd, list, cor + size, null, cor); +}; +scheduler.transpose_type = function(type) { + var f = "transpose_" + type; + if (!this.date[f]) { + var str = type.split("_"); + var day = 60 * 60 * 24 * 1000; + var gf = "add_" + type; + var step = this.transponse_size[str[0]] * str[1]; + + if (str[0] == "day" || str[0] == "week") { + var days = null; + if (str[4]) { + days = str[4].split(","); + if (scheduler.config.start_on_monday) { + for (var i = 0; i < days.length; i++) + days[i] = (days[i] * 1) || 7; + days.sort(); + } + } + + this.date[f] = function(nd, td) { + var delta = Math.floor((td.valueOf() - nd.valueOf()) / (day * step)); + if (delta > 0) + nd.setDate(nd.getDate() + delta * step); + if (days) + scheduler.transpose_day_week(nd, days, 1, step); + }; + this.date[gf] = function(sd, inc) { + var nd = new Date(sd.valueOf()); + if (days) { + for (var count = 0; count < inc; count++) + scheduler.transpose_day_week(nd, days, 0, step); + } else + nd.setDate(nd.getDate() + inc * step); + + return nd; + }; + } + else if (str[0] == "month" || str[0] == "year") { + this.date[f] = function(nd, td) { + var delta = Math.ceil(((td.getFullYear() * 12 + td.getMonth() * 1) - (nd.getFullYear() * 12 + nd.getMonth() * 1)) / (step)); + if (delta >= 0) + nd.setMonth(nd.getMonth() + delta * step); + if (str[3]) + scheduler.date.day_week(nd, str[2], str[3]); + }; + this.date[gf] = function(sd, inc) { + var nd = new Date(sd.valueOf()); + nd.setMonth(nd.getMonth() + inc * step); + if (str[3]) + scheduler.date.day_week(nd, str[2], str[3]); + return nd; + }; + } + } +}; +scheduler.repeat_date = function(ev, stack, non_render, from, to) { + + from = from || this._min_date; + to = to || this._max_date; + + var td = new Date(ev.start_date.valueOf()); + + if (!ev.rec_pattern && ev.rec_type) + ev.rec_pattern = ev.rec_type.split("#")[0]; + + this.transpose_type(ev.rec_pattern); + scheduler.date["transpose_" + ev.rec_pattern](td, from); + while (td < ev.start_date || scheduler._fix_daylight_saving_date(td,from,ev,td,new Date(td.valueOf() + ev.event_length * 1000)).valueOf() <= from.valueOf() || td.valueOf() + ev.event_length * 1000 <= from.valueOf()) + td = this.date.add(td, 1, ev.rec_pattern); + while (td < to && td < ev.end_date) { + var timestamp = (scheduler.config.occurrence_timestamp_in_utc) ? Date.UTC(td.getFullYear(), td.getMonth(), td.getDate(), td.getHours(), td.getMinutes(), td.getSeconds()) : td.valueOf(); + var ch = this._get_rec_marker(timestamp, ev.id); + if (!ch) { // unmodified element of series + var ted = new Date(td.valueOf() + ev.event_length * 1000); + var copy = this._copy_event(ev); + //copy._timed = ev._timed; + copy.text = ev.text; + copy.start_date = td; + copy.event_pid = ev.id; + copy.id = ev.id + "#" + Math.ceil(timestamp / 1000); + copy.end_date = ted; + + copy.end_date = scheduler._fix_daylight_saving_date(copy.start_date, copy.end_date, ev, td, copy.end_date); + + copy._timed = this.isOneDayEvent(copy); + + if (!copy._timed && !this._table_view && !this.config.multi_day) return; + stack.push(copy); + + if (!non_render) { + this._events[copy.id] = copy; + this._rec_temp.push(copy); + } + + } else + if (non_render) stack.push(ch); + + td = this.date.add(td, 1, ev.rec_pattern); + } +}; +scheduler._fix_daylight_saving_date = function(start_date, end_date, ev, counter, default_date) { + var shift = start_date.getTimezoneOffset() - end_date.getTimezoneOffset(); + if (shift) { + if (shift > 0) { + // e.g. 24h -> 23h + return new Date(counter.valueOf() + ev.event_length * 1000 - shift * 60 * 1000); + } + else { + // e.g. 24h -> 25h + return new Date(end_date.valueOf() - shift * 60 * 1000); + } + } + return new Date(default_date.valueOf()); +}; +scheduler.getRecDates = function(id, max) { + var ev = typeof id == "object" ? id : scheduler.getEvent(id); + var count = 0; + var result = []; + max = max || 100; + + var td = new Date(ev.start_date.valueOf()); + var from = new Date(td.valueOf()); + + if (!ev.rec_type) { + return [ + { start_date: ev.start_date, end_date: ev.end_date } + ]; + } + if (ev.rec_type == "none") { + return []; + } + this.transpose_type(ev.rec_pattern); + scheduler.date["transpose_" + ev.rec_pattern](td, from); + + while (td < ev.start_date || (td.valueOf() + ev.event_length * 1000) <= from.valueOf()) + td = this.date.add(td, 1, ev.rec_pattern); + while (td < ev.end_date) { + var ch = this._get_rec_marker(td.valueOf(), ev.id); + var res = true; + if (!ch) { // unmodified element of series + var sed = new Date(td); + var ted = new Date(td.valueOf() + ev.event_length * 1000); + + ted = scheduler._fix_daylight_saving_date(sed, ted, ev, td, ted); + + result.push({start_date:sed, end_date:ted}); + } else if(ch.rec_type == "none") { + res = false; + } else { + result.push({ start_date: ch.start_date, end_date: ch.end_date }); + } + + td = this.date.add(td, 1, ev.rec_pattern); + if (res) { + count++; + if (count == max) + break; + } + } + return result; +}; +scheduler.getEvents = function(from, to) { + var result = []; + for (var a in this._events) { + var ev = this._events[a]; + if (ev && ev.start_date < to && ev.end_date > from) { + if (ev.rec_pattern) { + if (ev.rec_pattern == "none") continue; + var sev = []; + this.repeat_date(ev, sev, true, from, to); + for (var i = 0; i < sev.length; i++) { + // if event is in rec_markers then it will be checked by himself, here need to skip it + if (!sev[i].rec_pattern && sev[i].start_date < to && sev[i].end_date > from && !this._rec_markers[sev[i].id]) { + result.push(sev[i]); + } + } + } else if (!this._is_virtual_event(ev.id)) { // if it's virtual event we can skip it + result.push(ev); + } + } + } + return result; +}; + +scheduler.config.repeat_date = "%m.%d.%Y"; +scheduler.config.lightbox.sections = [ + {name:"description", height:130, map_to:"text", type:"textarea" , focus:true}, + {name:"recurring", type:"recurring", map_to:"rec_type", button:"recurring"}, + {name:"time", height:72, type:"time", map_to:"auto"} +]; + + +//drop secondary attributes +scheduler._copy_dummy = function(ev) { + var start_date = new Date(this.start_date); + var end_date = new Date(this.end_date); + this.start_date = start_date; + this.end_date = end_date; + this.event_length = this.event_pid = this.rec_pattern = this.rec_type = null; +}; + +scheduler.config.include_end_by = false; +scheduler.config.lightbox_recurring = 'ask'; // series, instance + +scheduler.attachEvent("onClearAll", function(){ + scheduler._rec_markers = {}; //clear recurring events data + scheduler._rec_markers_pull = {}; + scheduler._rec_temp = []; +}); + +scheduler.__recurring_template='<div class="dhx_form_repeat"> <form> <div class="dhx_repeat_left"> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="day" />Daily</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="week"/>Weekly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="month" checked />Monthly</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="repeat" value="year" />Yearly</label> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_center"> <div style="display:none;" id="dhx_repeat_day"> <label><input class="dhx_repeat_radio" type="radio" name="day_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="day_count" value="1" />day<br /> <label><input class="dhx_repeat_radio" type="radio" name="day_type" checked value="w"/>Every workday</label> </div> <div style="display:none;" id="dhx_repeat_week"> Repeat every<input class="dhx_repeat_text" type="text" name="week_count" value="1" />week next days:<br /> <table class="dhx_repeat_days"> <tr> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="1" />Monday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="4" />Thursday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="2" />Tuesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="5" />Friday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="3" />Wednesday</label><br /> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="6" />Saturday</label> </td> <td> <label><input class="dhx_repeat_checkbox" type="checkbox" name="week_day" value="0" />Sunday</label><br /><br /> </td> </tr> </table> </div> <div id="dhx_repeat_month"> <label><input class="dhx_repeat_radio" type="radio" name="month_type" value="d"/>Repeat</label><input class="dhx_repeat_text" type="text" name="month_day" value="1" />day every<input class="dhx_repeat_text" type="text" name="month_count" value="1" />month<br /> <label><input class="dhx_repeat_radio" type="radio" name="month_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="month_week2" value="1" /><select name="month_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="0">Sunday</select>every<input class="dhx_repeat_text" type="text" name="month_count2" value="1" />month<br /> </div> <div style="display:none;" id="dhx_repeat_year"> <label><input class="dhx_repeat_radio" type="radio" name="year_type" value="d"/>Every</label><input class="dhx_repeat_text" type="text" name="year_day" value="1" />day<select name="year_month"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select>month<br /> <label><input class="dhx_repeat_radio" type="radio" name="year_type" checked value="w"/>On</label><input class="dhx_repeat_text" type="text" name="year_week2" value="1" /><select name="year_day2"><option value="1" selected >Monday<option value="2">Tuesday<option value="3">Wednesday<option value="4">Thursday<option value="5">Friday<option value="6">Saturday<option value="7">Sunday</select>of<select name="year_month2"><option value="0" selected >January<option value="1">February<option value="2">March<option value="3">April<option value="4">May<option value="5">June<option value="6">July<option value="7">August<option value="8">September<option value="9">October<option value="10">November<option value="11">December</select><br /> </div> </div> <div class="dhx_repeat_divider"></div> <div class="dhx_repeat_right"> <label><input class="dhx_repeat_radio" type="radio" name="end" checked/>No end date</label><br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />After</label><input class="dhx_repeat_text" type="text" name="occurences_count" value="1" />occurrences<br /> <label><input class="dhx_repeat_radio" type="radio" name="end" />End by</label><input class="dhx_repeat_date" type="text" name="date_of_end" value="'+scheduler.config.repeat_date_of_end+'" /><br /> </div> </form> </div> <div style="clear:both"> </div>'; |