2 * @description {Class} wdCalendar
\r
3 * This is the main class of wdCalendar.
\r
8 var __WDAY = new Array(i18n.xgcalendar.dateformat.sun, i18n.xgcalendar.dateformat.mon, i18n.xgcalendar.dateformat.tue, i18n.xgcalendar.dateformat.wed, i18n.xgcalendar.dateformat.thu, i18n.xgcalendar.dateformat.fri, i18n.xgcalendar.dateformat.sat);
\r
9 var __MonthName = new Array(i18n.xgcalendar.dateformat.jan, i18n.xgcalendar.dateformat.feb, i18n.xgcalendar.dateformat.mar, i18n.xgcalendar.dateformat.apr, i18n.xgcalendar.dateformat.may, i18n.xgcalendar.dateformat.jun, i18n.xgcalendar.dateformat.jul, i18n.xgcalendar.dateformat.aug, i18n.xgcalendar.dateformat.sep, i18n.xgcalendar.dateformat.oct, i18n.xgcalendar.dateformat.nov, i18n.xgcalendar.dateformat.dec);
\r
12 function dateFormat(format) {
\r
14 "M+":this.getMonth() + 1,
\r
15 "d+":this.getDate(),
\r
16 "h+":this.getHours(),
\r
17 "H+":this.getHours(),
\r
18 "m+":this.getMinutes(),
\r
19 "s+":this.getSeconds(),
\r
20 "q+":Math.floor((this.getMonth() + 3) / 3),
\r
21 "w":"0123456".indexOf(this.getDay()),
\r
22 "W":__WDAY[this.getDay()],
\r
23 "L":__MonthName[this.getMonth()] //non-standard
\r
25 if (/(y+)/.test(format)) {
\r
26 format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
\r
29 if (new RegExp("(" + k + ")").test(format))
\r
30 format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
\r
35 function DateDiff(interval, d1, d2) {
\r
39 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());
\r
40 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate());
\r
43 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours());
\r
44 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours());
\r
47 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours(), d1.getMinutes());
\r
48 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes());
\r
51 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours(), d1.getMinutes(), d1.getSeconds());
\r
52 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes(), d2.getSeconds());
\r
55 var t1 = d1.getTime(), t2 = d2.getTime();
\r
59 diff = d2.getFullYear() - d1.getFullYear();
\r
62 diff = (d2.getFullYear() - d1.getFullYear()) * 12 + d2.getMonth() - d1.getMonth();
\r
65 diff = Math.floor(t2 / 86400000) - Math.floor(t1 / 86400000);
\r
68 diff = Math.floor((t2 + 345600000) / (604800000)) - Math.floor((t1 + 345600000) / (604800000));
\r
71 diff = Math.floor(t2 / 3600000) - Math.floor(t1 / 3600000);
\r
74 diff = Math.floor(t2 / 60000) - Math.floor(t1 / 60000);
\r
77 diff = Math.floor(t2 / 1000) - Math.floor(t1 / 1000);
\r
87 function DateAdd(interval, number, idate) {
\r
88 number = parseInt(number);
\r
90 if (typeof (idate) == "string") {
\r
91 date = idate.split(/\D/);
\r
92 eval("var date = new Date(" + date.join(",") + ")");
\r
95 if (typeof (idate) == "object") {
\r
96 date = new Date(idate.toString());
\r
100 date.setFullYear(date.getFullYear() + number);
\r
103 date.setMonth(date.getMonth() + number);
\r
106 date.setDate(date.getDate() + number);
\r
109 date.setDate(date.getDate() + 7 * number);
\r
112 date.setHours(date.getHours() + number);
\r
115 date.setMinutes(date.getMinutes() + number);
\r
118 date.setSeconds(date.getSeconds() + number);
\r
121 date.setMilliseconds(date.getMilliseconds() + number);
\r
127 function ColorrCalcBrighten(col, factor) {
\r
128 return 255-Math.round((255 - col) * factor);
\r
130 function ColorCalcValues(basecol) {
\r
131 if (!basecol.match(/^#[0-9a-f]{6}$/i)) return ColorCalcValues("#f8f8ff");
\r
132 var r = parseInt(basecol.substring(1, 3), 16);
\r
133 var g = parseInt(basecol.substring(3, 5), 16);
\r
134 var b = parseInt(basecol.substring(5, 7), 16);
\r
135 var col1 = "#" + ColorrCalcBrighten(r, 0.6).toString(16) + ColorrCalcBrighten(g, 0.6).toString(16) + ColorrCalcBrighten(b, 0.6).toString(16);
\r
136 var col2 = "#" + ColorrCalcBrighten(r, 0.5).toString(16) + ColorrCalcBrighten(g, 0.5).toString(16) + ColorrCalcBrighten(b, 0.5).toString(16);
\r
137 return [basecol, col1, col2];
\r
141 if ($.fn.noSelect == undefined) {
\r
142 $.fn.noSelect = function (p) { //no select plugin by me :-)
\r
149 return this.each(function () {
\r
150 if ($.browser.msie || $.browser.safari) $(this).bind('selectstart', function () {
\r
153 else if ($.browser.mozilla) {
\r
154 $(this).css('MozUserSelect', 'none');
\r
155 $('body').trigger('focus');
\r
157 else if ($.browser.opera) $(this).bind('mousedown', function () {
\r
160 else $(this).data('unselectable', 'on');
\r
164 return this.each(function () {
\r
165 if ($.browser.msie || $.browser.safari) $(this).unbind('selectstart');
\r
166 else if ($.browser.mozilla) $(this).css('MozUserSelect', 'inherit');
\r
167 else if ($.browser.opera) $(this).unbind('mousedown');
\r
168 else $(this).removeData('unselectable', 'on');
\r
174 $.fn.bcalendar = function (option) {
\r
177 * @description {Config} view
\r
178 * {String} Three calendar view provided, 'day','multi_days','week','month'. 'week' by default.
\r
182 date_format_dm1:"W, d.M",
\r
183 date_format_dm2:"d. L",
\r
184 date_format_dm3:"d L yyyy",
\r
185 date_format_full:"yy-mm-dd",
\r
188 * @description {Config} weekstartday
\r
189 * {Number} First day of week 0 for Sun, 1 for Mon, 2 for Tue.
\r
191 weekstartday:1, //start from Monday by default
\r
192 std_color: "#5858ff",
\r
194 * @description {Config} height
\r
195 * {Number} Calendar height, false for page height by default.
\r
199 * @description {Config} url
\r
200 * {String} Url to request calendar data.
\r
205 * @description {Config} eventItems
\r
206 * {Array} event items for initialization.
\r
211 * @description {Config} showday
\r
212 * {Date} Current date. today by default.
\r
214 showday:new Date(),
\r
216 * @description {Event} onBeforeRequestData:function(stage)
\r
217 * Fired before any ajax request is sent.
\r
218 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
220 onBeforeRequestData:false,
\r
222 * @description {Event} onAfterRequestData:function(stage)
\r
223 * Fired before any ajax request is finished.
\r
224 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
226 onAfterRequestData:false,
\r
228 * @description {Event} onAfterRequestData:function(stage)
\r
229 * Fired when some errors occur while any ajax request is finished.
\r
230 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
232 onRequestDataError:false,
\r
234 onWeekOrMonthToDay:false,
\r
237 * @description {Event} quickAddHandler:function(calendar, param )
\r
238 * Fired when user quick adds an item. If this function is set, ajax request to quickAddUrl will abort.
\r
239 * @param {Object} calendar Calendar object.
\r
240 * @param {Array} param Format [{name:"name1", value:"value1"}, ...]
\r
243 quickAddHandler:false,
\r
245 quickUpdateHandler:false,
\r
247 quickDeleteHandler: false,
\r
249 * @description {Config} quickAddUrl
\r
250 * {String} Url for quick adding.
\r
254 * @description {Config} quickUpdateUrl
\r
255 * {String} Url for time span update.
\r
259 * @description {Config} quickDeleteUrl
\r
260 * {String} Url for removing an event.
\r
264 * @description {Config} autoload
\r
265 * {Boolean} If event items is empty, and this param is set to true.
\r
266 * Event will be retrieved by ajax call right after calendar is initialized.
\r
270 * @description {Config} readonly
\r
271 * {Boolean} Indicate calendar is readonly or editable
\r
275 * @description {Config} extParam
\r
276 * {Array} Extra params submitted to server.
\r
277 * Sample - [{name:"param1", value:"value1"}, {name:"param2", value:"value2"}]
\r
281 * @description {Config} enableDrag
\r
282 * {Boolean} Whether end user can drag event item by mouse.
\r
289 calendars_available:[],
\r
290 calendars_selected:[]
\r
292 var eventDiv = $("#gridEvent");
\r
293 if (eventDiv.length == 0) {
\r
294 eventDiv = $("<div id='gridEvent' style='display:none;'></div>").appendTo(document.body);
\r
296 var $gridcontainer = $(this);
\r
297 option = $.extend(def, option);
\r
299 //no quickUpdateUrl, dragging disabled.
\r
300 if (option.quickUpdateUrl == null || option.quickUpdateUrl == "") {
\r
301 option.enableDrag = false;
\r
303 //template for month and date
\r
304 var __SCOLLEVENTTEMP = "<DIV style=\"width:{width};top:{top};left:{left};\" title=\"{title}\" class=\"chip chip{i} {drag} {addclasses}\">" +
\r
305 "<DIV style=\"border-bottom-color:{bdcolor}\" class=ct> </DIV>" +
\r
306 "<DL style=\"border-color:{bdcolor}; background-color:{bgcolor1}; height: {height}px;\"><DT style=\"background-color:{bgcolor2}\">{starttime} - {endtime} {icon}</DT>" +
\r
307 "<DD><SPAN>{content}</SPAN></DD><DIV class='resizer' style='display:{redisplay}'><DIV class=rszr_icon> </DIV></DIV></DL>" +
\r
308 "<DIV style=\"BORDER-BOTTOM-COLOR:{bdcolor}; background-color:{bgcolor1}; border-color: {bdcolor};\" class=cb1> </DIV>" +
\r
309 "<DIV style=\"border-color:{bdcolor};\" class=cb2> </DIV></DIV>";
\r
310 var __ALLDAYEVENTTEMP = '<div class="rb-o {eclass}" id="{id}" title="{title}" style="color:{color};">' +
\r
311 '<div class="{extendClass} rb-m" style="background-color:{color}">{extendHTML}<div class="rb-i">{content}</div></div></div>';
\r
312 var __MonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
\r
313 var __LASSOTEMP = "<div class='drag-lasso' style=\"left:{left}px;top:{top}px;width:{width}px;height:{height}px;\"> </div>";
\r
321 //no height specified in options, we get page height.
\r
322 if (!option.height) {
\r
323 option.height = document.documentElement.clientHeight;
\r
326 $gridcontainer.css("overflow-y", "visible").height(option.height - 8);
\r
328 //populate events data for first display.
\r
329 if (option.url && option.autoload) {
\r
338 function clearcontainer() {
\r
339 $gridcontainer.empty();
\r
344 function render() {
\r
346 //viewType, showday, events, config
\r
347 var showday = new Date(option.showday.getFullYear(), option.showday.getMonth(), option.showday.getDate());
\r
348 var events = option.eventItems;
\r
349 var config = { view:option.view, weekstartday:option.weekstartday, color:option.std_color };
\r
350 if (option.view == "day" || option.view == "week" || option.view == "multi_days") {
\r
351 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
352 if ($dvtec.length > 0) {
\r
353 option.scroll = $dvtec.scrollTop(); //get scroll bar position
\r
356 switch (option.view) {
\r
358 BuildDaysAndWeekView(showday, 1, events, config);
\r
361 BuildDaysAndWeekView(showday, 7, events, config);
\r
364 BuildDaysAndWeekView(showday, option.num_days, events, config);
\r
367 BuildMonthView(showday, events, config);
\r
370 alert(i18n.xgcalendar["no_implement"]);
\r
373 initevents(option.view);
\r
378 function BuildDaysAndWeekView(startday, l, events, config) {
\r
382 show = dateFormat.call(startday, option.date_format_dm1);
\r
383 days.push({ display:show, date:startday, day:startday.getDate(), year:startday.getFullYear(), month:startday.getMonth() + 1 });
\r
384 option.datestrshow = CalDateShow(days[0].date);
\r
385 option.vstart = days[0].date;
\r
386 option.vend = days[0].date;
\r
391 w = config.weekstartday - startday.getDay();
\r
392 if (w > 0) w = w - 7;
\r
395 for (var i = w, j = 0; j < l; i = i + 1, j++) {
\r
396 ndate = DateAdd("d", i, startday);
\r
397 show = dateFormat.call(ndate, option.date_format_dm1);
\r
398 days.push({ display:show, date:ndate, day:ndate.getDate(), year:ndate.getFullYear(), month:ndate.getMonth() + 1 });
\r
400 option.vstart = days[0].date;
\r
401 option.vend = days[l - 1].date;
\r
402 option.datestrshow = CalDateShow(days[0].date, days[l - 1].date);
\r
405 var allDayEvents = [];
\r
406 var scrollDayEvents = [];
\r
407 //get number of all-day events, including more-than-one-day events.
\r
408 var dM = PrepareEvents(days, events, allDayEvents, scrollDayEvents);
\r
410 var $html = $("<div class=\"wktopcontainer\"></div>");
\r
411 $html.append(BuildWT(days, allDayEvents, dM));
\r
413 $gridcontainer.html("").append($html);
\r
415 $html = $("<div class=\"scrolltimeevent\"></div>");
\r
416 $html.append(BuildDayScollEventContainer(days, scrollDayEvents));
\r
417 $gridcontainer.append($html);
\r
419 //TODO event handlers
\r
420 //$gridcontainer.find(".weekViewAllDaywk").click(RowHandler);
\r
424 function BuildMonthView(showday, events, config) {
\r
425 $gridcontainer.find("*").remove();
\r
426 $gridcontainer.append("<div class='cal-month-cc cc'><div class='cal-month-cc-header'><div class='cc-close cal-month-closebtn'></div><div class='cal-month-cc-title cc-title'></div></div><div class='cal-month-cc-body cc-body'><div class='cal-month-cc-content st-contents'><table class='st-grid'><tbody></tbody></table></div></div></div>");
\r
429 html.push("<div id=\"mvcontainer\" class=\"mv-container\">");
\r
430 html.push("<table id=\"mvweek\" class=\"mv-daynames-table\"><tbody><tr>");
\r
431 for (var i = config.weekstartday, j = 0; j < 7; i++, j++) {
\r
433 html.push("<th class=\"mv-dayname\" title=\"", __WDAY[i], "\">", __WDAY[i], "");
\r
435 html.push("</tr></tbody></table>");
\r
436 html.push("</div>");
\r
437 $gridcontainer.append(html.join(""));
\r
439 var bH = GetMonthViewBodyHeight() - GetMonthViewHeaderHeight();
\r
440 var $container = $("<div class=\"mvEventContainer mv-event-container\" style=\"height:" + bH + "px;" + "\"></div>");
\r
441 var $body = BuilderMonthBody(showday, config.weekstartday, events, bH);
\r
442 $container.append($body);
\r
443 $gridcontainer.append($container);
\r
445 $gridcontainer.find(".cal-month-closebtn").click(closeCc);
\r
448 function closeCc() {
\r
449 $gridcontainer.find(".cal-month-cc").css("visibility", "hidden");
\r
452 //all-day event, including more-than-one-day events
\r
453 function PrepareEvents(dayarrs, events, allDayEvents, scrolLDayEvents) {
\r
454 var i, j, k, de, x, y, La, H, D, Ia,
\r
455 tmp_allday = allDayEvents,
\r
456 tmp_scrollevents = scrolLDayEvents,
\r
457 l = dayarrs.length,
\r
458 el = events.length,
\r
460 for (j = 0; j < el; j++) {
\r
461 var sD = events[j]["start"];
\r
462 var eD = events[j]["end"];
\r
464 s.event = events[j];
\r
465 s.day = sD.getDate();
\r
466 s.year = sD.getFullYear();
\r
467 s.month = sD.getMonth() + 1;
\r
468 s.allday = events[j]["is_allday"] == 1;
\r
469 s.crossday = events[j]["is_moredays"] == 1;
\r
470 s.reevent = events[j]["is_recurring"] == 1; //Recurring event
\r
471 s.daystr = [s.year, s.month, s.day].join("/");
\r
473 s.st.hour = sD.getHours();
\r
474 s.st.minute = sD.getMinutes();
\r
475 s.st.p = s.st.hour * 60 + s.st.minute; // start time
\r
477 s.et.hour = eD.getHours();
\r
478 s.et.minute = eD.getMinutes();
\r
479 s.et.p = s.et.hour * 60 + s.et.minute; // end time
\r
483 for (i = 0; i < l; i++) {
\r
484 var da = dayarrs[i];
\r
485 tmp_scrollevents[i] = [];
\r
486 tmp_allday[i] = [];
\r
487 da.daystr = da.year + "/" + da.month + "/" + da.day;
\r
488 for (j = 0; j < fE.length; j++) {
\r
489 if (!fE[j].crossday && !fE[j].allday) {
\r
490 if (da.daystr == fE[j].daystr)
\r
491 tmp_scrollevents[i].push(fE[j]);
\r
494 if (da.daystr == fE[j].daystr) {
\r
495 tmp_allday[i].push(fE[j]);
\r
499 if (i == 0 && da.date >= fE[j].event["start"] && da.date <= fE[j].event["end"])//first more-than-one-day event
\r
501 tmp_allday[i].push(fE[j]);
\r
508 var lrdate = dayarrs[l - 1].date;
\r
509 for (i = 0; i < l; i++) { //to deal with more-than-one-day event
\r
510 de = tmp_allday[i];
\r
511 if (de.length > 0) { //
\r
512 for (j = 0; j < de.length; j++) {
\r
513 var end = DateDiff("d", lrdate, de[j].event["end"]) > 0 ? lrdate : de[j].event["end"];
\r
514 de[j].colSpan = DateDiff("d", dayarrs[i].date, end) + 1
\r
519 //for all-day events
\r
520 for (i = 0; i < l; i++) {
\r
521 de = tmp_scrollevents[i];
\r
522 if (de.length > 0) {
\r
526 var dl = de.length;
\r
527 for (j = 0; j < dl; ++j) {
\r
529 for (La = ge.st.p, Ia = 0; y[Ia] > La;) Ia++;
\r
531 ge.ne = []; //PO is how many events before this one
\r
532 y[Ia] = ge.et.p || 1440;
\r
539 ge.pe = [x[Ia - 1]]; //previous event
\r
540 x[Ia - 1].ne.push(ge); //next event
\r
542 for (Ia = Ia + 1; y[Ia] <= La;) Ia++;
\r
548 ge.width = 1 / (ge.PO + 1);
\r
549 ge.left = 1 - ge.width;
\r
551 k = Array.prototype.concat.apply([], D);
\r
554 for (y = t; y--;) {
\r
558 for (D = x.ne.length; D--;) {
\r
560 La = Math.max(La, Ia.VL);
\r
561 H = Math.min(H, Ia.left)
\r
564 x.width = H / (x.PO + 1);
\r
565 x.left = H - x.width;
\r
567 for (y = 0; y < t; y++) {
\r
570 if (x.pe) for (D = x.pe.length; D--;) {
\r
572 x.left = Math.max(x.left, H.left + H.width);
\r
574 var p = (1 - x.left) / x.VL;
\r
575 x.width = Math.max(x.width, p);
\r
576 x.aQ = Math.min(1 - x.left, x.width + 0.7 * p); //width offset
\r
579 tmp_scrollevents[i] = k;
\r
586 // Week view: top row (full-day events)
\r
587 function BuildWT(dayarrs, events, dMax) {
\r
589 var i, j, h, e, el, x, l;
\r
590 var html = "<table class=\"wk-top\">";
\r
591 html += "<tr><th style='width: 60px;' rowspan=\"3\"> </th>";
\r
592 for (i = 0; i < dayarrs.length; i++) {
\r
594 if (dayarrs.length == 1) {
\r
600 ev = ""; // "onclick=\"javascript:FunProxy('week2day',event,this);\"";
\r
601 title = i18n.xgcalendar.to_date_view;
\r
604 html += "<th data-abbr='" + dayarrs[i].date.getTime() + "' class='gcweekname' scope=\"col\">";
\r
605 html += "<div title='" + title + "' " + ev + " class='wk-dayname'><span class='" + cl + "'>" + dayarrs[i].display + "</span></div></th>";
\r
608 html += "<th style='width: 16px;' rowspan=\"3\"> </th>";
\r
609 html += "</tr>"; //end tr1;
\r
612 html += "<td class=\"wk-allday\"";
\r
614 if (dayarrs.length > 1) {
\r
615 html += " colSpan='" + dayarrs.length + "'";
\r
617 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
618 html += "><div class=\"weekViewAllDaywk\" ><table class=\"st-grid\"><tbody>";
\r
622 for (i = 0; i < dayarrs.length; i++) {
\r
623 html += "<td class=\"st-c st-s\" data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "' data-axis='00:00'> </td>";
\r
631 for (j = 0; j < l; j++) {
\r
635 for (j = 0; el < dMax; j++) {
\r
636 html += "<tr class='row" + j + "'>";
\r
637 for (h = 0; h < l;) {
\r
638 e = events[h][x[h]];
\r
639 html += "<td class='st-c col" + h;
\r
640 if (e) { //if exists
\r
643 if (e.colSpan > 1) {
\r
644 html += " colSpan='" + e.colSpan + "'";
\r
650 html += " ch='show'>";
\r
654 html += " st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> ";
\r
662 for (h = 0; h < l; h++) {
\r
663 html += "<td class='st-c st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> </td>";
\r
667 html += "</tbody></table></div></td></tr>"; // stgrid end //wvAd end //td2 end //tr2 end
\r
671 html += "<td style=\"height: 5px;\"";
\r
672 if (dayarrs.length > 1) {
\r
673 html += " colSpan='" + dayarrs.length + "'";
\r
677 html += "</table>";
\r
684 for (j = 0; j < l; j++) {
\r
687 for (j = 0; el < dMax; j++) {
\r
688 for (h = 0; h < l;) {
\r
689 e = events[h][x[h]];
\r
690 if (e) { //if exists
\r
692 var $t = BuildMonthDayEvent(e, dayarrs[h].date, l - h);
\r
693 $el.find(".row" + j + " .col" + h).append($t);
\r
694 if (e.colSpan > 1) {
\r
712 function BuildDayScollEventContainer(dayarrs, events) {
\r
716 var html = "<table style=\"table-layout: fixed;";
\r
717 html += ($.browser.msie ? "" : "width:100%");
\r
718 html += "\"><tbody><tr><td><table style=\"height: " + (option.hour_height * 24) + "px\" class=\"tg-timedevents\"><tbody>";
\r
719 html += "<tr><td style='width:60px;'></td><td";
\r
720 if (dayarrs.length > 1) {
\r
721 html += " colSpan='" + dayarrs.length + "'";
\r
723 html += "><div class=\"tg-spanningwrapper\"><div style=\"font-size: " + (Math.round(option.hour_height / 2) - 1) + "px\" class=\"tg-hourmarkers\">";
\r
724 for (i = 0; i < 24; i++) {
\r
725 html += "<div class=\"tg-dualmarker\"></div>";
\r
727 html += "</div></div></td></tr>";
\r
731 html += "<td style=\"width: 60px; \" class=\"tg-times\">";
\r
733 //get current time
\r
734 var now = new Date();
\r
735 var h = now.getHours();
\r
736 var m = now.getMinutes();
\r
737 var mHg = gP(h, m) - 4; //make middle alignment vertically
\r
738 html += "<div id=\"tgnowptr\" class=\"tg-nowptr\" style=\"left:0;top:" + mHg + "px\"></div>";
\r
739 for (i = 0; i < 24; i++) html += "<div style=\"height: " + (option.hour_height - 1) + "px\" class=\"tg-time\">" + fomartTimeShow(i) + "</div>";
\r
742 var l = dayarrs.length;
\r
743 var hh24 = option.hour_height * 24;
\r
744 for (i = 0; i < l; i++) {
\r
745 html += "<td class='tg-col' data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "'>";
\r
746 var istoday = formatDate(dayarrs[i].date) == formatDate(new Date());
\r
749 html += "<div style=\"margin-bottom: -" + hh24 + "px; height:" + hh24 + "px\" class=\"tg-today\"> </div>";
\r
751 //var eventC = $(eventWrap);
\r
752 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
753 html += "<div style=\"margin-bottom: -" + hh24 + "px; height: " + hh24 + "px\" data-col='" + i + "' class='tgCol" + i + " tg-col-eventwrapper'></div>";
\r
755 html += "<div class='tg-col-overlaywrapper tgOver" + i + "' data-col='" + i + "'>";
\r
758 html += "<div class=\"tg-hourmarker tg-nowmarker\" style=\"left:0;top:" + mhh + "px\"></div>";
\r
765 html += "</tbody></table></td></tr></tbody></table>";
\r
766 var $container = $(html);
\r
768 for (i = 0; i < l; i++) {
\r
769 var $col = $container.find(".tgCol" + i);
\r
770 for (var j = 0; j < events[i].length; j++) {
\r
771 if (events[i][j].event["color"] && events[i][j].event["color"].match(/^#[0-9a-f]{6}$/i)) {
\r
772 c = events[i][j].event["color"];
\r
775 c = option.std_color;
\r
777 var $tt = BuildDayEvent(c, events[i][j], j);
\r
786 function getTitle(event) {
\r
787 var timeshow, eventshow;
\r
788 var showtime = event["is_allday"] != 1;
\r
789 eventshow = event["subject"];
\r
790 var startformat = getymformat(event["start"], null, showtime, true);
\r
791 var endformat = getymformat(event["end"], event["start"], showtime, true);
\r
792 timeshow = dateFormat.call(event["start"], startformat) + " - " + dateFormat.call(event["end"], endformat);
\r
793 //var linebreak = ($.browser.mozilla?"":"\r\n");
\r
794 var linebreak = "\r\n";
\r
796 if (event["is_allday"] == 1) {
\r
797 //ret.push("[" + i18n.xgcalendar.allday_event + "]", linebreak );
\r
800 if (event["is_recurring"] == 1) {
\r
801 ret.push("[" + i18n.xgcalendar.repeat_event + "]", linebreak);
\r
804 ret.push(i18n.xgcalendar.time + ": ", timeshow, linebreak, i18n.xgcalendar.event + ": ", eventshow);
\r
806 if (event["location"] != undefined && event["location"] != "") {
\r
807 ret.push(linebreak, i18n.xgcalendar.location + ": ", event["location"]);
\r
810 if (event["attendees"] != undefined && event["attendees"] != "") {
\r
811 ret.push(linebreak, i18n.xgcalendar.participant + ": ", event["attendees"]);
\r
813 return ret.join("");
\r
816 function BuildDayEvent(color, e, index) {
\r
817 var theme = ColorCalcValues(color);
\r
818 var p = { bdcolor:theme[0], bgcolor2:theme[0], bgcolor1:theme[2], width:"70%", icon:"", title:"", data:"" };
\r
819 p.starttime = pZero(e.st.hour) + ":" + pZero(e.st.minute);
\r
820 p.endtime = pZero(e.et.hour) + ":" + pZero(e.et.minute);
\r
821 p.content = e.event["subject"];
\r
822 p.title = getTitle(e.event);
\r
824 if (e.event["has_notification"] == 1) icons.push("<I class=\"cic cic-tmr\"> </I>");
\r
826 icons.push("<I class=\"cic cic-spcl\"> </I>");
\r
828 p.icon = icons.join("");
\r
829 var sP = gP(e.st.hour, e.st.minute);
\r
830 var eP = gP(e.et.hour, e.et.minute);
\r
832 p.left = (e.left * 100) + "%";
\r
833 p.width = (e.aQ * 100) + "%";
\r
834 p.height = (eP - sP - 4);
\r
836 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
838 p.redisplay = "block";
\r
842 p.redisplay = "none";
\r
845 p.addclasses = (e.event["is_editable_quick"] ? "editable" : "not_editable");
\r
847 var $newtemp = $(Tp(__SCOLLEVENTTEMP, p));
\r
848 $newtemp.data("eventdata", $.extend(true, {}, e.event));
\r
853 //get body height in month view
\r
854 function GetMonthViewBodyHeight() {
\r
855 return option.height;
\r
858 function GetMonthViewHeaderHeight() {
\r
862 function BuilderMonthBody(showday, startday, events, bodyHeight) {
\r
863 var i, j, k, b, day;
\r
866 var firstdate = new Date(showday.getFullYear(), showday.getMonth(), 1);
\r
867 var diffday = startday - firstdate.getDay();
\r
868 var showmonth = showday.getMonth();
\r
872 var startdate = DateAdd("d", diffday, firstdate);
\r
873 var enddate = DateAdd("d", 34, startdate);
\r
876 if (enddate.getFullYear() == showday.getFullYear() && enddate.getMonth() == showday.getMonth() && enddate.getDate() < __MonthDays[showmonth]) {
\r
877 enddate = DateAdd("d", 7, enddate);
\r
880 option.vstart = startdate;
\r
881 option.vend = enddate;
\r
882 option.datestrshow = CalDateShow(startdate, enddate);
\r
883 bodyHeight = bodyHeight - 18 * rc;
\r
884 var rowheight = bodyHeight / rc;
\r
885 var roweventcount = parseInt(rowheight / 21);
\r
886 if (rowheight % 21 > 15) {
\r
890 var formatevents = [];
\r
891 var hastdata = formartEventsInHashtable(events, startday, 7, startdate, enddate);
\r
894 for (j = 0; j < rc; j++) {
\r
896 formatevents[j] = b = [];
\r
897 for (i = 0; i < 7; i++) {
\r
898 var newkeyDate = DateAdd("d", j * 7 + i, startdate);
\r
899 C[j * 7 + i] = newkeyDate;
\r
900 var newkey = dateFormat.call(newkeyDate, i18n.xgcalendar.dateformat.fulldaykey);
\r
901 b[i] = hastdata[newkey];
\r
902 if (b[i] && b[i].length > 0) {
\r
908 eventDiv.data("mvdata", formatevents);
\r
909 for (j = 0; j < rc; j++) {
\r
910 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
911 htb.push("<div style=\"HEIGHT:", p, "%; TOP:", p * j, "%\" data-row=\"" + j + "\" class=\"month-row mvrow_" + j + "\">");
\r
912 htb.push("<table class=\"st-bg-table\"><tbody><tr>");
\r
914 for (i = 0; i < 7; i++) {
\r
915 day = C[j * 7 + i];
\r
916 htb.push("<td data-abbr='", day.getTime(), "' data-ch='qkadd' data-axis='00:00' title=''");
\r
918 if (formatDate(day) == formatDate(new Date())) {
\r
919 htb.push(" class=\"st-bg st-bg-today\">");
\r
920 } else if (day.getMonth() != showmonth) {
\r
921 htb.push(" class=\"st-bg st-bg-nonmonth\">");
\r
923 htb.push(" class=\"st-bg\">");
\r
925 htb.push(" </td>");
\r
928 htb.push("</tr></tbody></table>");
\r
931 htb.push("<table class=\"st-grid row" + j + "\"><tbody>");
\r
935 var titletemp = "<td class=\"st-dtitle{titleClass}\" data-ch='qkadd' data-abbr='{abbr}' data-axis='00:00' title=\"{title}\"><span class='monthdayshow'>{dayshow}</span></a></td>";
\r
937 for (i = 0; i < 7; i++) {
\r
938 var o = { titleClass:"", dayshow:"" };
\r
939 day = C[j * 7 + i];
\r
940 if (formatDate(day) == formatDate(new Date())) {
\r
941 o.titleClass = " st-dtitle-today";
\r
943 if (day.getMonth() != showmonth) {
\r
944 o.titleClass = " st-dtitle-nonmonth";
\r
946 o.title = formatDate(day);
\r
947 if (day.getDate() == 1) {
\r
948 if (day.getMonth == 0) {
\r
949 o.dayshow = formatDate(day);
\r
952 o.dayshow = dateFormat.call(day, option.date_format_dm2).toString();
\r
956 o.dayshow = day.getDate();
\r
958 o.abbr = day.getTime();
\r
959 htb.push(Tp(titletemp, o));
\r
962 htb.push("</tbody></table>");
\r
964 htb.push("</div>");
\r
966 var $ret = $(htb.join(""));
\r
968 for (j = 0; j < rc; j++) {
\r
969 var sfirstday = C[j * 7];
\r
971 var obs = BuildMonthRow(formatevents[j], dMax, roweventcount, sfirstday);
\r
972 for (i = 0; i < obs.length; i++) $ret.find(".row" + j).append(obs[i]);
\r
973 //htb=htb.concat(rowHtml); rowHtml = null;
\r
979 //formate datetime
\r
980 function formartEventsInHashtable(events, startday, daylength, rbdate, redate) {
\r
982 var hast = new Object();
\r
983 var l = events.length;
\r
984 for (var i = 0; i < l; i++) {
\r
985 var sD = events[i]["start"];
\r
986 var eD = events[i]["end"];
\r
987 var diff = DateDiff("d", sD, eD);
\r
989 s.event = events[i];
\r
990 s.day = sD.getDate();
\r
991 s.year = sD.getFullYear();
\r
992 s.month = sD.getMonth() + 1;
\r
993 s.allday = events[i]["is_allday"] == 1;
\r
994 s.crossday = events[i]["is_moredays"] == 1;
\r
995 s.reevent = events[i]["is_recurring"] == 1; //Recurring event
\r
996 s.daystr = s.year + "/" + s.month + "/" + s.day;
\r
998 s.st.hour = sD.getHours();
\r
999 s.st.minute = sD.getMinutes();
\r
1000 s.st.p = s.st.hour * 60 + s.st.minute; // start time position
\r
1002 s.et.hour = eD.getHours();
\r
1003 s.et.minute = eD.getMinutes();
\r
1004 s.et.p = s.et.hour * 60 + s.et.minute; // end time postition
\r
1007 if (sD < rbdate) { //start date out of range
\r
1010 if (eD > redate) { //end date out of range
\r
1013 var f = startday - sD.getDay();
\r
1017 var sdtemp = DateAdd("d", f, sD);
\r
1018 for (; sdtemp <= eD; sD = sdtemp = DateAdd("d", daylength, sdtemp)) {
\r
1019 var d = $.extend(s, {});
\r
1020 key = dateFormat.call(sD, i18n.xgcalendar.dateformat.fulldaykey);
\r
1021 var x = DateDiff("d", sdtemp, eD);
\r
1022 if (hast[key] == null) {
\r
1025 d.colSpan = (x >= daylength) ? daylength - DateDiff("d", sdtemp, sD) : DateDiff("d", sD, eD) + 1;
\r
1026 hast[key].push(d);
\r
1031 key = dateFormat.call(events[i]["start"], i18n.xgcalendar.dateformat.fulldaykey);
\r
1032 if (hast[key] == null) {
\r
1036 hast[key].push(s);
\r
1043 function BuildMonthRow(events, dMax, sc, day) {
\r
1049 var l = events.length;
\r
1052 for (j = 0; j < l; j++) {
\r
1056 cday.push(DateAdd("d", j, day));
\r
1058 for (j = 0; j < l; j++) {
\r
1059 var ec = events[j] ? events[j].length : 0;
\r
1061 for (var k = 0; k < ec; k++) {
\r
1063 if (e && e.colSpan > 1) {
\r
1064 for (m = 1; m < e.colSpan; m++) {
\r
1071 var tdtemp = "<td class='{cssclass}' data-axis='{axis}' data-ch='{ch}' data-abbr='{abbr}' title='{title}' {otherAttr}>{html}</td>";
\r
1072 for (j = 0; j < sc && el < dMax; j++) {
\r
1073 var $row = $("<tr></tr>");
\r
1074 //var gridtr = $(__TRTEMP);
\r
1075 for (var h = 0; h < l;) {
\r
1076 e = events[h] ? events[h][x[h]] : undefined;
\r
1078 var tempdata = { "class":"", axis:"", ch:"", title:"", abbr:"", html:"", otherAttr:"", click:"javascript:void(0);" };
\r
1079 var tempCss = ["st-c"];
\r
1083 //last event of the day
\r
1085 if (z[h] + 1 == y[h] && e.colSpan == 1) {
\r
1088 if (!bs && j == (sc - 1) && z[h] < y[h]) {
\r
1090 $.extend(tempdata, { "axis":h, ch:"more", "abbr":cday[h].getTime(), html:i18n.xgcalendar.others + (y[h] - z[h]) + i18n.xgcalendar.item, click:"javascript:alert('more event');" });
\r
1091 tempCss.push("st-more st-moreul");
\r
1095 tempdata.html = "";
\r
1096 $ev = BuildMonthDayEvent(e, cday[h], l - h);
\r
1097 tempdata.ch = "show";
\r
1098 if (e.colSpan > 1) {
\r
1099 tempdata.otherAttr = " colSpan='" + e.colSpan + "'";
\r
1100 for (m = 0; m < e.colSpan; m++) {
\r
1101 z[h + m] = z[h + m] + 1;
\r
1114 if (j == (sc - 1) && z[h] < y[h] && y[h] > 0) {
\r
1115 $.extend(tempdata, { "axis":h, ch:"more", "abbr":cday[h].getTime(), html:i18n.xgcalendar.others + (y[h] - z[h]) + i18n.xgcalendar.item, click:"javascript:alert('more event');" });
\r
1116 tempCss.push("st-more st-moreul");
\r
1120 $.extend(tempdata, { html:" ", ch:"qkadd", "axis":"00:00", "abbr":cday[h].getTime(), title:"" });
\r
1121 tempCss.push("st-s");
\r
1125 tempdata.cssclass = tempCss.join(" ");
\r
1127 var $z = $(Tp(tdtemp, tempdata));
\r
1128 if ($ev != null) $z.append($ev);
\r
1137 function BuildMonthDayEvent(e, cday, length) {
\r
1139 if (e.event["color"] && e.event["color"].match(/^#[0-9a-f]{6}$/i)) {
\r
1140 theme = ColorCalcValues(e.event["color"]);
\r
1143 theme = ColorCalcValues(option.std_color);
\r
1145 var p = { color:theme[2], title:"", extendClass:"", extendHTML:"", data:"" };
\r
1147 p.title = getTitle(e.event);
\r
1148 p.id = "bbit_cal_event_" + e.event["uri"];
\r
1149 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
1150 p.eclass = "drag";
\r
1153 p.eclass = "cal_" + e.event["uri"];
\r
1155 p.eclass += " " + (e.event["is_editable"] ? "editable" : "not_editable");
\r
1156 var sp = "<span style=\"cursor: pointer\">{content}</span>";
\r
1157 var i = "<I class=\"cic cic-tmr\"> </I>";
\r
1158 var i2 = "<I class=\"cic cic-rcr\"> </I>";
\r
1159 var ml = "<div class=\"st-ad-ml\"></div>";
\r
1160 var mr = "<div class=\"st-ad-mr\"></div>";
\r
1162 var sf = e.event["start"] < cday;
\r
1163 var ef = DateDiff("d", cday, e.event["end"]) >= length; //e.event["end"] >= DateAdd("d", 1, cday);
\r
1167 p.extendClass = "st-ad-mpad ";
\r
1172 p.extendHTML = arrm.join("");
\r
1176 if (!e.allday && !sf) {
\r
1177 cen = pZero(e.st.hour) + ":" + pZero(e.st.minute) + " " + e.event["subject"];
\r
1180 cen = e.event["subject"];
\r
1183 if (cen.indexOf("Geburtstag:") == 0) {
\r
1184 content.push("<img src='/pics/silk/cake.png' alt='Geburtstag: ' title='Geburtstag' style='height: 12px; margin-right: 3px;'>");
\r
1185 cen = cen.replace(/Geburtstag: /, "");
\r
1187 content.push(Tp(sp, { content:cen }));
\r
1188 if (e.event["has_notification"] == 1) content.push(i);
\r
1192 p.content = content.join("");
\r
1193 var $newel = $(Tp(__ALLDAYEVENTTEMP, p));
\r
1194 $newel.data("eventdata", e.event);
\r
1198 //to populate the data
\r
1199 function populate() {
\r
1200 if (option.isloading) {
\r
1203 if (option.url && option.url != "") {
\r
1204 option.isloading = true;
\r
1205 //clearcontainer();
\r
1206 if (option.onBeforeRequestData && $.isFunction(option.onBeforeRequestData)) {
\r
1207 option.onBeforeRequestData(1);
\r
1210 { name:"showdate", value: Math.floor(option.showday.getTime() / 1000) },
\r
1211 { name:"viewtype", value:option.view },
\r
1212 { name:"weekstartday", value:option.weekstartday }
\r
1214 if (option.view == "multi_days") {
\r
1215 param.push({ name:"num_days", value:option.num_days });
\r
1217 if (option.extParam) {
\r
1218 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1219 param[param.length] = option.extParam[pi];
\r
1224 type:option.method, //
\r
1225 url:option.url + option.url_add,
\r
1228 dataFilter:function (data) {
\r
1229 //return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, "new $1");
\r
1233 success:function (data) {//function(datastr) {
\r
1234 //datastr =datastr.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1');
\r
1235 //var data = (new Function("return " + datastr))();
\r
1236 if (data != null && data.error != null) {
\r
1237 if (option.onRequestDataError) {
\r
1238 option.onRequestDataError(1, data);
\r
1242 data["start"] = parseDate(data["start"]);
\r
1243 data["end"] = parseDate(data["end"]);
\r
1244 $.each(data.events, function (index, value) {
\r
1245 value["start"] = new Date(value["start"] * 1000);
\r
1246 value["end"] = new Date(value["end"] * 1000);
\r
1248 responseData(data, data.start, data.end);
\r
1250 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1251 option.onAfterRequestData(1);
\r
1253 option.isloading = false;
\r
1255 error:function (data) {
\r
1257 if (option.onRequestDataError) {
\r
1258 option.onRequestDataError(1, data);
\r
1260 alert(i18n.xgcalendar.get_data_exception);
\r
1262 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1263 option.onAfterRequestData(1);
\r
1265 option.isloading = false;
\r
1272 alert("url" + i18n.xgcalendar.i_undefined);
\r
1277 function responseData(data, start, end) {
\r
1278 var events = data.events;
\r
1279 ConcatEvents(events, start, end);
\r
1284 function clearrepeat(events, start) {
\r
1285 var jl = events.length;
\r
1287 var es = events[0]["start"];
\r
1288 var el = events[jl - 1]["start"];
\r
1289 for (var i = 0, l = option.eventItems.length; i < l; i++) {
\r
1291 if (option.eventItems[i]["sart"] > el || jl == 0) {
\r
1294 if (option.eventItems[i]["start"] >= es) {
\r
1295 for (var j = 0; j < jl; j++) {
\r
1296 if (option.eventItems[i]["uri"] == events[j]["uri"] && option.eventItems[i]["start"] < start) {
\r
1297 events.splice(j, 1); //for duplicated event
\r
1307 function ConcatEvents(events, start, end) {
\r
1313 if (option.eventItems.length == 0) {
\r
1314 option.eventItems = events;
\r
1317 //remove duplicated one
\r
1318 clearrepeat(events, start);
\r
1319 var sl = option.eventItems.length;
\r
1324 if (option.eventItems[0]["start"] > e) {
\r
1325 option.eventItems = events.concat(option.eventItems);
\r
1328 if (option.eventItems[sl - 1]["start"] < s) {
\r
1329 option.eventItems = option.eventItems.concat(events);
\r
1332 for (var i = 0; i < sl; i++) {
\r
1333 if (option.eventItems[i]["start"] >= s && sI < 0) {
\r
1337 if (option.eventItems[i]["start"] > e) {
\r
1343 var e1 = sI <= 0 ? [] : option.eventItems.slice(0, sI);
\r
1344 var e2 = eI == sl ? [] : option.eventItems.slice(eI);
\r
1345 option.eventItems = [].concat(e1, events, e2);
\r
1351 function weekormonthtoday(e) {
\r
1353 option.showday = new Date(parseInt(th.data("abbr")));
\r
1354 option.view = "day";
\r
1356 if (option.onWeekOrMonthToDay) {
\r
1357 option.onWeekOrMonthToDay(option);
\r
1359 e.stopPropagation();
\r
1360 e.preventDefault();
\r
1363 function parseDate(str) {
\r
1364 return new Date(Date.parse(str));
\r
1367 function gP(h, m) {
\r
1368 return h * option.hour_height + parseInt(m / 60 * option.hour_height);
\r
1371 function gW(ts1, ts2) {
\r
1372 var t1 = ts1 / option.hour_height;
\r
1373 var t2 = parseInt(t1);
\r
1374 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1375 var t4 = ts2 / option.hour_height;
\r
1376 var t5 = parseInt(t4);
\r
1377 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1378 return { sh:t2, sm:t3, eh:t5, em:t6, h:ts2 - ts1 };
\r
1381 function gH(y1, y2, pt) {
\r
1382 var sy1 = Math.min(y1, y2);
\r
1383 var sy2 = Math.max(y1, y2);
\r
1384 var t1 = (sy1 - pt) / option.hour_height;
\r
1385 var t2 = parseInt(t1);
\r
1386 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1387 var t4 = (sy2 - pt) / option.hour_height;
\r
1388 var t5 = parseInt(t4);
\r
1389 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1390 return { sh:t2, sm:t3, eh:t5, em:t6, h:sy2 - sy1 };
\r
1393 function pZero(n) {
\r
1394 return n < 10 ? "0" + n : "" + n;
\r
1397 function Tp(temp, dataarry) {
\r
1398 return temp.replace(/\{([\w]+)\}/g, function (s1, s2) {
\r
1399 var s = dataarry[s2];
\r
1400 if (typeof (s) != "undefined") {
\r
1408 function fomartTimeShow(h) {
\r
1409 return h < 10 ? "0" + h + ":00" : h + ":00";
\r
1412 function getymformat(date, comparedate, isshowtime, isshowweek) {
\r
1413 var showyear = isshowtime != undefined ? (date.getFullYear() != new Date().getFullYear()) : true;
\r
1414 var showmonth = true;
\r
1415 var showday = true;
\r
1416 var showtime = isshowtime || false;
\r
1417 var showweek = isshowweek || false;
\r
1418 if (comparedate) {
\r
1419 showyear = comparedate.getFullYear() != date.getFullYear();
\r
1420 //showmonth = comparedate.getFullYear() != date.getFullYear() || date.getMonth() != comparedate.getMonth();
\r
1421 if (comparedate.getFullYear() == date.getFullYear() &&
\r
1422 date.getMonth() == comparedate.getMonth() &&
\r
1423 date.getDate() == comparedate.getDate()
\r
1425 showyear = showmonth = showday = showweek = false;
\r
1431 a.push(option.date_format_dm3)
\r
1432 } else if (showmonth) {
\r
1433 a.push(option.date_format_dm2)
\r
1434 } else if (showday) {
\r
1435 a.push(i18n.xgcalendar.dateformat.day);
\r
1437 a.push(showweek ? " (W)" : "", showtime ? " HH:mm" : "");
\r
1438 return a.join("");
\r
1441 function CalDateShow(startday, endday, isshowtime, isshowweek) {
\r
1443 return dateFormat.call(startday, getymformat(startday, null, isshowtime));
\r
1445 var strstart = dateFormat.call(startday, getymformat(startday, null, isshowtime, isshowweek));
\r
1446 var strend = dateFormat.call(endday, getymformat(endday, startday, isshowtime, isshowweek));
\r
1447 var join = (strend != "" ? " - " : "");
\r
1448 return [strstart, strend].join(join);
\r
1452 function buildtempdayevent(sh, sm, eh, em, h, title, w, resize, color) {
\r
1453 if (!color.match(/^#[0-9a-f]{6}$/i)) color = option.std_color;
\r
1454 var t = ColorCalcValues(color);
\r
1455 return Tp(__SCOLLEVENTTEMP, {
\r
1460 starttime:[pZero(sh), pZero(sm)].join(":"),
\r
1461 endtime:[pZero(eh), pZero(em)].join(":"),
\r
1462 content:title ? title : i18n.xgcalendar.new_event,
\r
1463 title:title ? title : i18n.xgcalendar.new_event,
\r
1464 icon:"<I class=\"cic cic-tmr\"> </I>",
\r
1467 width:w ? w : "100%",
\r
1471 redisplay:resize ? "block" : "none"
\r
1475 function quickd(type) {
\r
1476 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1477 var calid = $("#bbit-cs-id").val();
\r
1479 { "name":"calendarId", value:calid },
\r
1480 { "name":"type", value:type}
\r
1482 var de = rebyKey(calid, true);
\r
1483 option.onBeforeRequestData && option.onBeforeRequestData(3);
\r
1484 $.post(option.quickDeleteUrl, param, function (data) {
\r
1486 $(document).trigger("wdcal:updated");
\r
1487 if (data["IsSuccess"]) {
\r
1490 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1493 option.onRequestDataError && option.onRequestDataError(3, data);
\r
1496 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1502 function getbuddlepos(x, y) {
\r
1503 var tleft = x - 110;
\r
1504 var ttop = y - 217;
\r
1505 var maxLeft = document.documentElement.clientWidth;
\r
1506 var maxTop = document.documentElement.clientHeight;
\r
1507 var ishide = false;
\r
1508 if (tleft <= 0 || ttop <= 0 || tleft + 400 > maxLeft) {
\r
1509 tleft = x - 200 <= 0 ? 10 : x - 200;
\r
1510 ttop = y - 159 <= 0 ? 10 : y - 159;
\r
1511 if (tleft + 400 >= maxLeft) {
\r
1512 tleft = maxLeft - 410;
\r
1514 if (ttop + 164 >= maxTop) {
\r
1515 ttop = maxTop - 165;
\r
1519 return { left:tleft, top:ttop, hide:ishide };
\r
1522 function dayshow(e, data) {
\r
1523 var $t = $(e.target);
\r
1524 if ($t.hasClass("axx_username") || $t.parents(".axx_username").length > 0 || $t.hasClass("cal_nojs") || $t.parents(".cal_nojs").length > 0) return false;
\r
1526 if (data == undefined) {
\r
1527 if ($t.hasClass("chip") || $t.hasClass("rb-o")) data = $t.data("eventdata");
\r
1528 else data = $t.parents(".chip, .rb-o").data("eventdata");
\r
1531 if (data != null) {
\r
1532 var editable = false;
\r
1533 if (option.quickDeleteUrl != "" && data["is_editable"] == 1 && option.readonly != true) editable = true;
\r
1534 var csbuddle = '<div id="bbit-cs-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble"><table class="bubble-table"><tbody' +
\r
1535 '><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>' +
\r
1536 '<td class="bubble-cell-main"><div class="bubble-top"></div><td class="bubble-cell-side"><div id="tr1" class="bubble-corner"><div class="bubble-sprite bubble-tr"></div></div>' +
\r
1537 '<tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">' +
\r
1538 '<table class="cb-table"><tbody><tr><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid">' +
\r
1539 '<a href="" title="' + i18n.xgcalendar.click_to_detail + '" class="bbit-cs-what textbox-fill-div lk"></a></div></div></td></tr>' +
\r
1540 '<tr><td class=cb-value><div id="bbit-cs-buddle-timeshow"></div></td></tr>' +
\r
1541 '</tbody></table><div class="bbit-cs-split"><input id="bbit-cs-id" type="hidden" value=""/>[ <span id="bbit-cs-delete" class="lk">'
\r
1542 + i18n.xgcalendar.i_delete + '</span> ] ' +
\r
1543 '<a href="" class="bbit-cs-editLink lk">' + i18n.xgcalendar.update_detail + ' <strong>>></strong></a>' +
\r
1544 '</div></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div>' +
\r
1545 '<td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody>' +
\r
1546 '</table><div id="bubbleClose2" class="bubble-closebutton"></div><div id="prong1" class="prong"><div class=bubble-sprite></div></div></div>';
\r
1547 var $bud = $("#bbit-cs-buddle");
\r
1548 if ($bud.length == 0) {
\r
1549 $bud = $(csbuddle).appendTo(document.body);
\r
1550 var calbutton = $("#bbit-cs-delete");
\r
1551 $("#bubbleClose2").on("click", function () {
\r
1552 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1554 calbutton.on("click", function () {
\r
1555 var data = $("#bbit-cs-buddle").data("cdata");
\r
1556 if (option.quickDeleteHandler && $.isFunction(option.quickDeleteHandler)) {
\r
1557 option.quickDeleteHandler.call(this, data, quickd);
\r
1560 if (confirm(i18n.xgcalendar.confirm_delete_event)) {
\r
1561 var s = 0; //0 single event , 1 for Recurring event
\r
1562 if (data["is_recurring"] == 1) {
\r
1563 if (confirm(i18n.xgcalendar.confrim_delete_event_or_all)) {
\r
1580 $("#bbit-cs-delete").parents(".bbit-cs-split").show();
\r
1581 $bud.find(".bbit-cs-editLink").attr("href", data["url_edit"]).show();
\r
1584 $("#bbit-cs-delete").parents(".bbit-cs-split").hide();
\r
1585 $bud.find(".bbit-cs-editLink").hide();
\r
1588 var pos = getbuddlepos(e.pageX, e.pageY);
\r
1590 $("#prong1").hide()
\r
1593 $("#prong1").show()
\r
1596 var iscos = DateDiff("d", data["start"], data["end"]) != 0;
\r
1597 ss.push(dateFormat.call(data["start"], option.date_format_dm2), " (", __WDAY[data["start"].getDay()], ")");
\r
1598 if (data["is_allday"] != 1) {
\r
1599 ss.push(",", dateFormat.call(data["start"], "HH:mm"));
\r
1603 ss.push(" - ", dateFormat.call(data["end"], option.date_format_dm2), " (", __WDAY[data["end"].getDay()], ")");
\r
1604 if (data["is_allday"] != 1) {
\r
1605 ss.push(",", dateFormat.call(data["end"], "HH:mm"));
\r
1608 var location = "";
\r
1609 if (data["location"] != "") location = data["location"] + ", ";
\r
1610 $("#bbit-cs-buddle-timeshow").html(location + ss.join(""));
\r
1611 $bud.find(".bbit-cs-what").html(data["subject"]).attr("href", data["url_detail"]);
\r
1612 $("#bbit-cs-id").val(data["uri"]);
\r
1613 $bud.data("cdata", data);
\r
1614 $bud.css({ "visibility":"visible", left:pos.left, top:pos.top });
\r
1616 $(document).one("click", function () {
\r
1617 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1621 alert(i18n.xgcalendar.data_format_error);
\r
1626 function moreshow(mv) {
\r
1627 var $me = $(this);
\r
1628 var $pdiv = $(mv);
\r
1629 var divIndex = parseInt($pdiv.data("row"));
\r
1630 var offsetMe = $me.position();
\r
1631 var offsetP = $pdiv.position();
\r
1632 var width = ($me.width() + 2) * 1.5;
\r
1633 var top = offsetP.top + 15;
\r
1634 var left = offsetMe.left;
\r
1636 var day = new Date(parseInt($me.data("abbr")));
\r
1637 var cc = $gridcontainer.find(".cal-month-cc");
\r
1638 var ccontent = $gridcontainer.find(".cal-month-cc-content table tbody");
\r
1639 var ctitle = $gridcontainer.find(".cal-month-cc-title");
\r
1640 ctitle.html(formatDate(day));
\r
1642 var edata = $("#gridEvent").data("mvdata");
\r
1643 var events = edata[divIndex];
\r
1644 var index = parseInt($me.data("axis"));
\r
1645 ccontent.find("*").remove();
\r
1646 for (var i = 0; i <= index; i++) {
\r
1647 var ec = events[i] ? events[i].length : 0;
\r
1648 for (var j = 0; j < ec; j++) {
\r
1649 var e = events[i][j];
\r
1651 if ((e.colSpan + i - 1) >= index) {
\r
1652 var $x = $("<tr><td class='st-c'></td></tr>");
\r
1653 var $y = BuildMonthDayEvent(e, day, 1);
\r
1654 $x.find(".st-c").append($y);
\r
1655 ccontent.append($x);
\r
1661 ccontent.find("div.rb-o").each(function () {
\r
1662 $(this).click(dayshow);
\r
1665 var height = cc.height();
\r
1666 var maxleft = document.documentElement.clientWidth;
\r
1667 var maxtop = document.documentElement.clientHeight;
\r
1668 if (left + width >= maxleft) {
\r
1669 left = offsetMe.left - ($me.width() + 2) * 0.5;
\r
1671 if (top + height >= maxtop) {
\r
1672 top = maxtop - height - 2;
\r
1674 var newOff = { left:left, top:top, "z-index":180, width:width, "visibility":"visible" };
\r
1676 $(document).on("click", closeCc);
\r
1680 function dayupdate(data, start, end) {
\r
1681 if (option.quickUpdateUrl != "" && data["is_editable_quick"] == 1 && option.readonly != true) {
\r
1682 if (option.isloading) {
\r
1685 option.isloading = true;
\r
1686 var id = data["uri"];
\r
1687 var os = data["start"];
\r
1688 var od = data["end"];
\r
1690 { "name":"calendarId", value:id },
\r
1691 { "name":"CalendarStartTime", value:Math.floor(start.getTime() / 1000) },
\r
1692 { "name":"CalendarEndTime", value:Math.floor(end.getTime() / 1000) }
\r
1695 if (option.quickUpdateHandler && $.isFunction(option.quickUpdateHandler)) {
\r
1696 option.quickUpdateHandler.call(this, param);
\r
1699 option.onBeforeRequestData && option.onBeforeRequestData(4);
\r
1700 $.post(option.quickUpdateUrl, param, function (data) {
\r
1702 $(document).trigger("wdcal:updated");
\r
1703 if (data["IsSuccess"] == true) {
\r
1704 option.isloading = false;
\r
1705 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1708 option.onRequestDataError && option.onRequestDataError(4, data);
\r
1709 option.isloading = false;
\r
1710 d = rebyKey(id, true);
\r
1716 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1720 d = rebyKey(id, true);
\r
1722 d["start"] = start;
\r
1732 function quickadd(start, end, isallday, pos) {
\r
1733 if ((!option.quickAddHandler && option.quickAddUrl == "") || option.readonly) {
\r
1736 var buddle = $("#bbit-cal-buddle");
\r
1737 if (buddle.length == 0) {
\r
1739 temparr.push('<form id="bbit-cal-submitFORM">');
\r
1740 temparr.push('<div id="bbit-cal-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble">');
\r
1741 temparr.push('<table class="bubble-table"><tbody><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>');
\r
1742 temparr.push('<td class="bubble-cell-main"><div class="bubble-top"></div><td class="bubble-cell-side"><div id="tr1" class="bubble-corner"><div class="bubble-sprite bubble-tr"></div></div> <tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">');
\r
1743 temparr.push('<table class="cb-table"><tbody><tr><th class="cb-key">');
\r
1744 temparr.push(i18n.xgcalendar.time, ':</th><td class=cb-value><div id="bbit-cal-buddle-timeshow"></div></td></tr><tr><th class="cb-key">');
\r
1745 temparr.push(i18n.xgcalendar.content, ':</th><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid"><input id="bbit-cal-what" class="textbox-fill-input"/></div></div><div class="cb-example">');
\r
1746 temparr.push(i18n.xgcalendar.example, '</div></td></tr></tbody></table><input id="bbit-cal-start" type="hidden"/><input id="bbit-cal-end" type="hidden"/><input id="bbit-cal-allday" type="hidden"/><input id="bbit-cal-quickAddBTN" value="');
\r
1747 temparr.push(i18n.xgcalendar.create_event, '" type="submit"/> <SPAN id="bbit-cal-editLink" class="lk">');
\r
1748 temparr.push(i18n.xgcalendar.update_detail, ' <StrONG>>></StrONG></SPAN></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div><td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody></table><div id="bubbleClose1" class="bubble-closebutton"></div><div id="prong2" class="prong"><div class=bubble-sprite></div></div></div>');
\r
1749 temparr.push('</form>');
\r
1750 var tempquickAddHanler = temparr.join("");
\r
1752 $(document.body).append(tempquickAddHanler);
\r
1753 buddle = $("#bbit-cal-buddle");
\r
1754 $("#bubbleClose1").click(function () {
\r
1755 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1756 releasedragevent();
\r
1758 $("#bbit-cal-submitFORM").keyup(function (e) {
\r
1759 if (e.which == 27) $("#bubbleClose1").click();
\r
1761 $("#bbit-cal-submitFORM").submit(function (e) {
\r
1762 e.stopPropagation();
\r
1763 e.preventDefault();
\r
1764 if (option.isloading) {
\r
1767 option.isloading = true;
\r
1768 var what = $("#bbit-cal-what").val();
\r
1769 var datestart = $("#bbit-cal-start").val();
\r
1770 var dateend = $("#bbit-cal-end").val();
\r
1771 var allday = $("#bbit-cal-allday").val();
\r
1772 var f = /^[^\$<>]+$/.test(what);
\r
1774 alert(i18n.xgcalendar.invalid_title);
\r
1775 $("#bbit-cal-what").focus();
\r
1776 option.isloading = false;
\r
1780 { "name":"CalendarTitle", value:what },
\r
1781 { "name":"CalendarStartTime", value: Math.floor(datestart / 1000)},
\r
1782 { "name":"CalendarEndTime", value: Math.floor(dateend / 1000)},
\r
1783 { "name":"IsAllDayEvent", value:allday }
\r
1786 if (option.extParam) {
\r
1787 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1788 param[param.length] = option.extParam[pi];
\r
1792 if (option.quickAddHandler && $.isFunction(option.quickAddHandler)) {
\r
1793 option.quickAddHandler.call(this, param);
\r
1794 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1795 releasedragevent();
\r
1798 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1800 option.onBeforeRequestData && option.onBeforeRequestData(2);
\r
1802 var sd = new Date(datestart),
\r
1803 ed = new Date(dateend),
\r
1804 diff = DateDiff("d", sd, ed);
\r
1810 "is_allday":(allday == "1" ? 1 : 0),
\r
1811 "is_moredays":(diff > 0 ? 1 : 0),
\r
1813 "color":option.std_color,
\r
1815 "is_editable_quick":0,
\r
1819 tId = Ind(newdata);
\r
1820 releasedragevent();
\r
1823 $.post(option.quickAddUrl, param, function (data) {
\r
1824 option.isloading = false;
\r
1826 if (data["IsSuccess"] == true) {
\r
1828 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1831 option.onRequestDataError && option.onRequestDataError(2, data);
\r
1832 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1834 $(document).trigger("wdcal:updated");
\r
1841 buddle.mousedown(function (e) {
\r
1842 e.stopPropagation();
\r
1843 e.preventDefault();
\r
1847 var dateshow = CalDateShow(start, end, !isallday, true);
\r
1848 var off = getbuddlepos(pos.left, pos.top);
\r
1850 $("#prong2").hide()
\r
1853 $("#prong2").show()
\r
1855 $("#bbit-cal-buddle-timeshow").html(dateshow);
\r
1856 var calwhat = $("#bbit-cal-what").val("");
\r
1857 $("#bbit-cal-allday").val(isallday ? "1" : "0");
\r
1858 $("#bbit-cal-start").val(start.getTime());
\r
1859 $("#bbit-cal-end").val(end.getTime());
\r
1860 buddle.css({ "visibility":"visible", left:off.left, top:off.top });
\r
1861 calwhat.blur().focus(); //add 2010-01-26 blur() fixed chrome
\r
1862 $(document).one("mousedown", function () {
\r
1863 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1864 releasedragevent();
\r
1869 function formatDate(time, format) {
\r
1870 if (typeof(format) == "undefined") return $.datepicker.formatDate(option.date_format_full,time);
\r
1871 var time2 = $.datepicker.formatDate(format, time);
\r
1872 var h = time.getHours();
\r
1873 var i = time.getMinutes();
\r
1874 time2 = time2.replace("HH", (h > 10 ? "" : "0") + h);
\r
1875 time2 = time2.replace("ii", (i > 10 ? "" : "0") + i);
\r
1879 function rebyKey(key, remove) {
\r
1880 if (option.eventItems && option.eventItems.length > 0) {
\r
1881 var sl = option.eventItems.length;
\r
1883 for (var j = 0; j < sl; j++) {
\r
1884 if (option.eventItems[j]["uri"] == key) {
\r
1890 var t = option.eventItems[i];
\r
1892 option.eventItems.splice(i, 1);
\r
1900 function Ind(event, i) {
\r
1904 if (option.eventItems && option.eventItems.length > 0) {
\r
1905 var sl = option.eventItems.length;
\r
1906 var s = event["start"];
\r
1907 var d1 = s.getTime() - option.eventItems[0]["start"].getTime();
\r
1908 var d2 = option.eventItems[sl - 1]["start"].getTime() - s.getTime();
\r
1909 var diff = d1 - d2;
\r
1910 if (d1 < 0 || diff < 0) {
\r
1911 for (j = 0; j < sl; j++) {
\r
1912 if (option.eventItems[j]["start"] >= s) {
\r
1918 else if (d2 < 0) {
\r
1922 for (j = sl - 1; j >= 0; j--) {
\r
1923 if (option.eventItems[j]["start"] < s) {
\r
1937 if (option.eventItems && option.eventItems.length > 0) {
\r
1938 if (i == option.eventItems.length) {
\r
1939 option.eventItems.push(event);
\r
1942 option.eventItems.splice(i, d, event);
\r
1946 option.eventItems = [event];
\r
1952 function ResizeView() {
\r
1953 var _viewType = option.view;
\r
1954 if (_viewType == "day" || _viewType == "week" || _viewType == "multi_days") {
\r
1955 var $dvwkcontaienr = $gridcontainer.find(".wktopcontainer");
\r
1956 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
1957 if ($dvwkcontaienr.length == 0 || $dvtec.length == 0) {
\r
1958 alert(i18n.xgcalendar.view_no_ready);
\r
1961 var dvwkH = $dvwkcontaienr.height() + 2;
\r
1962 var calH = option.height - 8 - dvwkH;
\r
1963 $dvtec.height(calH);
\r
1964 if (typeof (option.scroll) == "undefined") {
\r
1965 var currentday = new Date();
\r
1966 var h = currentday.getHours();
\r
1967 var m = currentday.getMinutes();
\r
1968 var th = gP(h, m);
\r
1969 //var ch = $dvtec.attr("clientHeight");
\r
1970 var ch = $dvtec.height();
\r
1971 var sh = th - 0.5 * ch;
\r
1972 //var ph = $dvtec.attr("scrollHeight");
\r
1973 var ph = $dvtec.children().height();
\r
1974 if (sh < 0) sh = 0;
\r
1975 if (sh > ph - ch) sh = ph - ch - 10 * (23 - h);
\r
1976 //$dvtec.attr("scrollTop", sh);
\r
1977 $dvtec.scrollTop(sh);
\r
1980 $dvtec.scrollTop(option.scroll);
\r
1983 else if (_viewType == "month") {
\r
1984 //Resize GridContainer
\r
1988 function returnfalse() {
\r
1992 function initevents(viewtype) {
\r
1993 if (viewtype == "week" || viewtype == "day" || viewtype == "multi_days") {
\r
1994 $("div.chip", $gridcontainer).each(function () {
\r
1995 var chip = $(this);
\r
1996 chip.click(dayshow);
\r
1997 if (chip.hasClass("drag")) {
\r
1998 chip.mousedown(function (e) {
\r
1999 dragStart.call(this, "std_item_move", e);
\r
2000 e.stopPropagation();
\r
2001 e.preventDefault();
\r
2004 chip.find("div.resizer").mousedown(function (e) {
\r
2005 dragStart.call($(this).parent().parent(), "std_item_resize", e);
\r
2006 e.stopPropagation();
\r
2007 e.preventDefault();
\r
2011 chip.mousedown(returnfalse)
\r
2014 $("div.rb-o", $gridcontainer).each(function () {
\r
2015 var chip = $(this);
\r
2016 chip.click(dayshow);
\r
2017 if (chip.hasClass("drag") && (viewtype == "week" || viewtype == "multi_days")) {
\r
2019 chip.mousedown(function (e) {
\r
2020 dragStart.call(this, "fullday_item_move", e);
\r
2021 e.stopPropagation();
\r
2022 e.preventDefault();
\r
2026 chip.mousedown(returnfalse)
\r
2029 if (option.readonly == false) {
\r
2030 $("td.tg-col", $gridcontainer).each(function () {
\r
2031 $(this).mousedown(function (e) {
\r
2032 dragStart.call(this, "std_empty_drag", e);
\r
2033 e.stopPropagation();
\r
2034 e.preventDefault();
\r
2037 $gridcontainer.find(".weekViewAllDaywk").mousedown(function (e) {
\r
2038 dragStart.call(this, "fullday_empty_drag", e);
\r
2039 e.stopPropagation();
\r
2040 e.preventDefault();
\r
2044 if (viewtype == "week" || viewtype == "multi_days") {
\r
2045 $gridcontainer.find(".wktopcontainer th.gcweekname").each(function () {
\r
2046 $(this).click(weekormonthtoday);
\r
2052 else if (viewtype = "month") {
\r
2053 $("div.rb-o", $gridcontainer).each(function () {
\r
2054 var chip = $(this);
\r
2055 chip.click(dayshow);
\r
2056 if (chip.hasClass("drag")) {
\r
2058 chip.mousedown(function (e) {
\r
2059 dragStart.call(this, "std_item_month_drag", e);
\r
2060 e.stopPropagation();
\r
2061 e.preventDefault();
\r
2065 chip.mousedown(returnfalse)
\r
2068 $("td.st-more", $gridcontainer).each(function () {
\r
2070 $(this).on("click", function (e) {
\r
2071 moreshow.call(this, $(this).parent().parent().parent().parent()[0]);
\r
2072 e.stopPropagation();
\r
2073 e.preventDefault();
\r
2074 }).on("mousedown", function (e) {
\r
2075 e.stopPropagation();
\r
2076 e.preventDefault();
\r
2079 if (option.readonly == false) {
\r
2080 $gridcontainer.find(".mvEventContainer").mousedown(function (e) {
\r
2081 dragStart.call(this, "empty_month_drag", e);
\r
2082 e.stopPropagation();
\r
2083 e.preventDefault();
\r
2090 function releasedragevent() {
\r
2093 _dragevent = null;
\r
2097 function dragStart(type, e) {
\r
2098 var w, h, offset, moffset, left, top, l, py, pw, xa, ya, i, data, fdi, dp, yl;
\r
2099 var $obj = $(this);
\r
2100 releasedragevent();
\r
2102 case "std_empty_drag":
\r
2103 _dragdata = { type:"std_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY };
\r
2105 case "fullday_empty_drag":
\r
2107 h = $obj.height();
\r
2108 offset = $obj.offset();
\r
2109 left = offset.left;
\r
2111 l = option.view == "day" ? 1 : 7;
\r
2113 pw = parseInt(w / l);
\r
2114 if (py > l / 2 + 1) {
\r
2119 for (i = 0; i < l; i++) {
\r
2120 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2122 ya.push({ s:top, e:top + h });
\r
2123 _dragdata = { type:"fullday_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2124 w = left = l = py = pw = xa = null;
\r
2126 case "std_item_move":
\r
2127 var evid = $obj.parent().data("col");
\r
2128 var p = $obj.parent();
\r
2129 var pos = p.offset();
\r
2130 w = p.width() + 10;
\r
2131 h = $obj.height();
\r
2132 data = $obj.data("eventdata");
\r
2133 _dragdata = { type:"std_item_move", target:$obj, sx:e.pageX, sy:e.pageY,
\r
2134 pXMin:pos.left, pXMax:pos.left + w, pw:w, h:h,
\r
2135 cdi:parseInt(evid), fdi:parseInt(evid), data:data
\r
2138 case "std_item_resize":
\r
2139 h = $obj.height();
\r
2140 data = $obj.data("eventdata");
\r
2141 _dragdata = { type:"std_item_resize", target:$obj, sx:e.pageX, sy:e.pageY, h:h, data:data };
\r
2143 case "fullday_item_move":
\r
2144 var con = $gridcontainer.find(".weekViewAllDaywk");
\r
2147 offset = con.offset();
\r
2148 moffset = $obj.offset();
\r
2149 left = offset.left;
\r
2153 pw = parseInt(w / l);
\r
2154 if (py > l / 2 + 1) {
\r
2160 for (i = 0; i < l; i++) {
\r
2161 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2162 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2166 fdi = { x:di, y:0, di:di };
\r
2167 ya.push({ s:top, e:top + h });
\r
2168 data = $obj.data("eventdata");
\r
2169 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2170 _dragdata = { type:"fullday_item_move", target:$obj, sx:e.pageX, sy:e.pageY, data:data, xa:xa, ya:ya, fdi:fdi, h:h, dp:dp, pw:pw };
\r
2172 case "empty_month_drag":
\r
2174 offset = $obj.offset();
\r
2175 left = offset.left;
\r
2178 yl = $obj.children().length;
\r
2180 pw = parseInt(w / l);
\r
2181 if (py > l / 2 + 1) {
\r
2184 h = $gridcontainer.find(".mvrow_0").height();
\r
2187 for (i = 0; i < l; i++) {
\r
2188 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2192 for (i = 0; i < l; i++) {
\r
2193 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2195 for (i = 0; i < yl; i++) {
\r
2196 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2198 _dragdata = { type:"empty_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2200 case "std_item_month_drag":
\r
2201 var row0 = $gridcontainer.find(".mvrow_0");
\r
2202 var row1 = $gridcontainer.find(".mvrow_1");
\r
2204 offset = row0.offset();
\r
2205 var diffset = row1.offset();
\r
2206 moffset = $obj.offset();
\r
2207 h = diffset.top - offset.top;
\r
2208 left = offset.left;
\r
2211 yl = row0.parent().children().length;
\r
2213 pw = parseInt(w / l);
\r
2214 if (py > l / 2 + 1) {
\r
2221 for (i = 0; i < l; i++) {
\r
2222 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2223 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2227 for (i = 0; i < yl; i++) {
\r
2228 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2229 if (moffset.top >= ya[i].s && moffset.top < ya[i].e) {
\r
2233 fdi = { x:xi, y:yi, di:yi * 7 + xi };
\r
2234 data = $obj.data("eventdata");
\r
2235 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2236 _dragdata = { type:"std_item_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, data:data, xa:xa, ya:ya, fdi:fdi, h:h, dp:dp, pw:pw };
\r
2239 $('body').noSelect();
\r
2242 function dragMove(e) {
\r
2243 var d, sy, sx, x, y, diffy, gh, ny, tempdata, cpwrap, ndi, evid, nh, cp, w1;
\r
2245 if (e.pageX < 0 || e.pageY < 0
\r
2246 || e.pageX > document.documentElement.clientWidth
\r
2247 || e.pageY >= document.documentElement.clientHeight) {
\r
2253 case "std_empty_drag":
\r
2257 if (diffy > (option.hour_height / 4) || diffy < (-1 * (option.hour_height / 4)) || d.cpwrap) {
\r
2259 diffy = Math.ceil(option.hour_height / 2);
\r
2261 var dy = diffy % Math.ceil(option.hour_height / 2);
\r
2263 diffy = dy > 0 ? diffy + Math.ceil(option.hour_height / 2) - dy : diffy - Math.ceil(option.hour_height / 2) - dy;
\r
2266 sy = sy + Math.ceil(option.hour_height / 2);
\r
2270 d.tp = $(d.target).offset().top;
\r
2272 gh = gH(sy, y, d.tp);
\r
2273 ny = gP(gh.sh, gh.sm);
\r
2275 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2276 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2277 $(d.target).find("div.tg-col-overlaywrapper").append(cpwrap);
\r
2278 d.cpwrap = cpwrap;
\r
2281 if (d.cgh.sh != gh.sh || d.cgh.eh != gh.eh || d.cgh.sm != gh.sm || d.cgh.em != gh.em) {
\r
2282 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2283 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2289 case "fullday_empty_drag":
\r
2293 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2295 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2296 $(document.body).append(d.lasso);
\r
2299 d.sdi = getdi(d.xa, d.ya, sx, d.sy);
\r
2301 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2302 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2303 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2308 case "empty_month_drag":
\r
2315 if (diffx > 5 || diffx < -5 || diffy < -5 || diffy > 5 || d.lasso) {
\r
2317 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2318 $(document.body).append(d.lasso);
\r
2321 d.sdi = getdi(d.xa, d.ya, sx, sy);
\r
2323 ndi = getdi(d.xa, d.ya, x, y);
\r
2324 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2325 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2330 case "std_item_move":
\r
2332 if (data != null && data["is_editable_quick"] == 1) {
\r
2339 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.cpwrap) {
\r
2341 gh = { sh:data["start"].getHours(),
\r
2342 sm:data["start"].getMinutes(),
\r
2343 eh:data["end"].getHours(),
\r
2344 em:data["end"].getMinutes(),
\r
2348 ny = gP(gh.sh, gh.sm);
\r
2350 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);
\r
2351 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2352 evid = ".tgOver" + d.target.parent().data("col");
\r
2353 $gridcontainer.find(evid).append(cpwrap);
\r
2354 d.cpwrap = cpwrap;
\r
2359 if (x < d.pXMin) {
\r
2362 else if (x > d.pXMax) {
\r
2367 d.cdi = d.cdi + pd;
\r
2368 var ov = $gridcontainer.find(".tgOver" + d.cdi);
\r
2369 if (ov.length == 1) {
\r
2370 d.pXMin = d.pXMin + d.pw * pd;
\r
2371 d.pXMax = d.pXMax + d.pw * pd;
\r
2372 ov.append(d.cpwrap);
\r
2375 d.cdi = d.cdi - pd;
\r
2378 ny = d.top + diffy;
\r
2379 var pny = ny % Math.ceil(option.hour_height / 2);
\r
2384 //log.info("ny=" + ny);
\r
2385 gh = gW(ny, ny + d.h);
\r
2386 //log.info("sh=" + gh.sh + ",sm=" + gh.sm);
\r
2387 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);
\r
2388 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2396 case "std_item_resize":
\r
2397 var data = d.data;
\r
2398 if (data != null && data["is_editable_quick"] == 1) {
\r
2402 if (diffy != 0 || d.cpwrap) {
\r
2404 gh = { sh:data["start"].getHours(),
\r
2405 sm:data["start"].getMinutes(),
\r
2406 eh:data["end"].getHours(),
\r
2407 em:data["end"].getMinutes(),
\r
2411 ny = gP(gh.sh, gh.sm);
\r
2413 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);
\r
2414 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2415 evid = ".tgOver" + d.target.parent().data("col");
\r
2416 $gridcontainer.find(evid).append(cpwrap);
\r
2417 d.cpwrap = cpwrap;
\r
2421 var pnh = nh % Math.ceil(option.hour_height / 2);
\r
2422 nh = pnh > 1 ? nh - pnh + Math.ceil(option.hour_height / 2) : nh - pnh;
\r
2424 gh = gW(d.top, d.top + nh);
\r
2425 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);
\r
2426 d.cpwrap.html(tempdata);
\r
2433 case "fullday_item_move":
\r
2438 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2440 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2441 cp = d.target.clone();
\r
2443 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2445 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2446 d.cpwrap = cpwrap;
\r
2447 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2448 $(document.body).append(d.lasso);
\r
2449 cp = cpwrap = null;
\r
2451 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2452 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2453 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2454 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2459 case "std_item_month_drag":
\r
2464 var diffx = x - sx;
\r
2466 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.lasso) {
\r
2468 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2469 cp = d.target.clone();
\r
2471 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2473 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2474 d.cpwrap = cpwrap;
\r
2475 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2476 $(document.body).append(d.lasso);
\r
2477 cp = cpwrap = null;
\r
2479 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2480 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2481 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2482 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2492 function dragEnd(e) {
\r
2494 var d = _dragdata;
\r
2495 var tp, start, end, gh;
\r
2497 case "std_empty_drag": //day view
\r
2498 var wrapid = new Date().getTime();
\r
2499 tp = d.target.offset().top;
\r
2501 gh = gH(d.sy, d.sy + option.hour_height, tp);
\r
2502 var ny = gP(gh.sh, gh.sm);
\r
2503 var tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2504 d.cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2505 $(d.target).find("div.tg-col-overlaywrapper").append(d.cpwrap);
\r
2508 var pos = d.cpwrap.offset();
\r
2509 pos.left = pos.left + 30;
\r
2510 d.cpwrap.attr("id", wrapid);
\r
2511 start = new Date(parseInt(d.target.data("abbr")) + (d.cgh.sh * 3600 + d.cgh.sm * 60) * 1000);
\r
2512 end = new Date(parseInt(d.target.data("abbr")) + (d.cgh.eh * 3600 + d.cgh.em * 60) * 1000);
\r
2513 _dragevent = function () {
\r
2514 $("#" + wrapid).remove();
\r
2515 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
2517 quickadd(start, end, false, pos);
\r
2519 case "fullday_empty_drag": //week view
\r
2520 case "empty_month_drag": //month view
\r
2521 var source = e.srcElement || e.target;
\r
2522 var lassoid = new Date().getTime();
\r
2524 if ($(source).hasClass("monthdayshow")) {
\r
2525 weekormonthtoday.call($(source).parent()[0], e);
\r
2528 d.fdi = d.sdi = getdi(d.xa, d.ya, d.sx, d.sy);
\r
2529 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2530 $(document.body).append(d.lasso);
\r
2531 addlasso(d.lasso, d.sdi, d.fdi, d.xa, d.ya, d.h);
\r
2533 d.lasso.attr("id", lassoid);
\r
2534 var si = Math.min(d.fdi.di, d.sdi.di);
\r
2535 var ei = Math.max(d.fdi.di, d.sdi.di);
\r
2536 var firstday = option.vstart;
\r
2537 start = DateAdd("d", si, firstday);
\r
2538 end = DateAdd("d", ei, firstday);
\r
2539 _dragevent = function () {
\r
2540 $("#" + lassoid).remove();
\r
2542 quickadd(start, end, true, { left:e.pageX, top:e.pageY });
\r
2544 case "std_item_move": // event moving
\r
2546 start = DateAdd("d", d.cdi, option.vstart);
\r
2547 end = DateAdd("d", d.cdi, option.vstart);
\r
2548 gh = gW(d.ny, d.ny + d.h);
\r
2549 start.setHours(gh.sh, gh.sm);
\r
2550 end.setHours(gh.eh, gh.em);
\r
2551 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2552 d.cpwrap.remove();
\r
2556 dayupdate(d.data, start, end);
\r
2560 case "std_item_resize": //Resize
\r
2562 start = new Date(d.data["start"].toString());
\r
2563 end = new Date(d.data["end"].toString());
\r
2564 gh = gW(d.top, d.top + d.nh);
\r
2565 start.setHours(gh.sh, gh.sm);
\r
2566 end.setHours(gh.eh, gh.em);
\r
2567 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2568 d.cpwrap.remove();
\r
2572 dayupdate(d.data, start, end);
\r
2576 case "fullday_item_move":
\r
2577 case "std_item_month_drag":
\r
2579 d.cpwrap.remove();
\r
2581 start = new Date(d.data["start"].toString());
\r
2582 end = new Date(d.data["end"].toString());
\r
2583 var currrentdate = DateAdd("d", d.cdi.di, option.vstart);
\r
2584 var diff = DateDiff("d", start, currrentdate);
\r
2585 start = DateAdd("d", diff, start);
\r
2586 end = DateAdd("d", diff, end);
\r
2587 if (start.getTime() != d.data["start"].getTime() || end.getTime() != d.data["end"].getTime()) {
\r
2588 dayupdate(d.data, start, end);
\r
2593 d = _dragdata = null;
\r
2594 $('body').noSelect(false);
\r
2600 function getdi(xa, ya, x, y) {
\r
2605 if (xa && xa.length != 0) {
\r
2607 if (x >= xa[lx - 1].e) {
\r
2611 for (var i = 0; i < lx; i++) {
\r
2612 if (x > xa[i].s && x <= xa[i].e) {
\r
2619 if (ya && ya.length != 0) {
\r
2621 if (y >= ya[ly - 1].e) {
\r
2625 for (var j = 0; j < ly; j++) {
\r
2626 if (y > ya[j].s && y <= ya[j].e) {
\r
2633 return { x:tx, y:ty, di:ty * lx + tx };
\r
2636 function addlasso(lasso, sdi, edi, xa, ya, height) {
\r
2637 var diff = sdi.di > edi.di ? sdi.di - edi.di : edi.di - sdi.di;
\r
2639 var sp = sdi.di > edi.di ? edi : sdi;
\r
2640 var l = xa.length > 0 ? xa.length : 1;
\r
2641 var h = ya.length > 0 ? ya.length : 1;
\r
2643 var width = xa[0].e - xa[0].s;
\r
2646 var max = Math.min(document.documentElement.clientWidth, xa[l - 1].e) - 2;
\r
2648 while (j < h && diff > 0) {
\r
2649 var left = xa[i].s;
\r
2650 var d = i + diff > l ? l - i : diff;
\r
2651 var wid = width * d;
\r
2652 while (left + wid >= max) {
\r
2655 play.push(Tp(__LASSOTEMP, { left:left, top:ya[j].s, height:height, width:wid }));
\r
2660 lasso.html(play.join(""));
\r
2663 function fixcppostion(cpwrap, e, xa, ya) {
\r
2664 var x = e.pageX - 6;
\r
2665 var y = e.pageY - 4;
\r
2666 var w = cpwrap.width();
\r
2668 var lmin = xa[0].s + 6;
\r
2669 var tmin = ya[0].s + 4;
\r
2670 var lmax = xa[xa.length - 1].e - w - 2;
\r
2671 var tmax = ya[ya.length - 1].e - h - 2;
\r
2684 cpwrap.css({ left:x, top:y });
\r
2688 .mousemove(dragMove)
\r
2689 .mouseup(dragEnd);
\r
2690 //.mouseout(dragEnd);
\r
2693 sv:function (view) { //switch view
\r
2694 if (view == option.view) {
\r
2698 option.view = view;
\r
2709 option.showday = d;
\r
2715 switch (option.view) {
\r
2717 option.showday = DateAdd("d", -1, option.showday);
\r
2720 option.showday = DateAdd("w", -1, option.showday);
\r
2722 case "multi_days":
\r
2723 option.showday = DateAdd("w", -1, option.showday);
\r
2726 option.showday = DateAdd("m", -1, option.showday);
\r
2733 switch (option.view) {
\r
2735 option.showday = DateAdd("d", 1, option.showday);
\r
2738 option.showday = DateAdd("w", 1, option.showday);
\r
2740 case "multi_days":
\r
2741 option.showday = DateAdd("w", 1, option.showday);
\r
2744 var od = option.showday.getDate();
\r
2745 option.showday = DateAdd("m", 1, option.showday);
\r
2746 var nd = option.showday.getDate();
\r
2747 if (od != nd) //we go to the next month
\r
2749 option.showday = DateAdd("d", 0 - nd, option.showday); //last day of last month
\r
2760 option = $.extend(option, p);
\r
2768 * @description {Method} switchView To switch to another view.
\r
2769 * @param {String} view View name, one of 'day', 'week', 'multi_days', 'month'.
\r
2771 $.fn.switchView = function (view) {
\r
2772 return this.each(function () {
\r
2774 this.bcal.sv(view);
\r
2780 * @description {Method} reload To reload event of current time range.
\r
2782 $.fn.reload = function () {
\r
2783 return this.each(function () {
\r
2791 * @description {Method} gotoDate To go to a range containing date.
\r
2792 * If view is week, it will go to a week containing date.
\r
2793 * If view is month, it will got to a month containing date.
\r
2794 * @param {Date} d. Date to go.
\r
2796 $.fn.gotoDate = function (d) {
\r
2797 return this.each(function () {
\r
2805 * @description {Method} previousRange To go to previous date range.
\r
2806 * If view is week, it will go to previous week.
\r
2807 * If view is month, it will got to previous month.
\r
2809 $.fn.previousRange = function () {
\r
2810 return this.each(function () {
\r
2818 * @description {Method} nextRange To go to next date range.
\r
2819 * If view is week, it will go to next week.
\r
2820 * If view is month, it will got to next month.
\r
2822 $.fn.nextRange = function () {
\r
2823 return this.each(function () {
\r
2831 $.fn.BcalGetOp = function () {
\r
2832 if (this[0].bcal) {
\r
2833 return this[0].bcal.go();
\r
2839 $.fn.BcalSetOp = function (p) {
\r
2840 if (this[0].bcal) {
\r
2841 return this[0].bcal.so(p);
\r