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
200 * @description {Config} url
\r
201 * {String} Url to request calendar data.
\r
206 * @description {Config} eventItems
\r
207 * {Array} event items for initialization.
\r
212 * @description {Config} showday
\r
213 * {Date} Current date. today by default.
\r
215 showday:new Date(),
\r
217 * @description {Event} onBeforeRequestData:function(stage)
\r
218 * Fired before any ajax request is sent.
\r
219 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
221 onBeforeRequestData:false,
\r
223 * @description {Event} onAfterRequestData:function(stage)
\r
224 * Fired before any ajax request is finished.
\r
225 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
227 onAfterRequestData:false,
\r
229 * @description {Event} onAfterRequestData:function(stage)
\r
230 * Fired when some errors occur while any ajax request is finished.
\r
231 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
233 onRequestDataError:false,
\r
235 onWeekOrMonthToDay:false,
\r
238 * @description {Event} quickAddHandler:function(calendar, param )
\r
239 * Fired when user quick adds an item. If this function is set, ajax request to quickAddUrl will abort.
\r
240 * @param {Object} calendar Calendar object.
\r
241 * @param {Array} param Format [{name:"name1", value:"value1"}, ...]
\r
244 quickAddHandler:false,
\r
246 quickUpdateHandler:false,
\r
248 quickDeleteHandler: false,
\r
250 * @description {Config} quickAddUrl
\r
251 * {String} Url for quick adding.
\r
255 * @description {Config} quickUpdateUrl
\r
256 * {String} Url for time span update.
\r
260 * @description {Config} quickDeleteUrl
\r
261 * {String} Url for removing an event.
\r
265 * @description {Config} autoload
\r
266 * {Boolean} If event items is empty, and this param is set to true.
\r
267 * Event will be retrieved by ajax call right after calendar is initialized.
\r
271 * @description {Config} readonly
\r
272 * {Boolean} Indicate calendar is readonly or editable
\r
276 * @description {Config} extParam
\r
277 * {Array} Extra params submitted to server.
\r
278 * Sample - [{name:"param1", value:"value1"}, {name:"param2", value:"value2"}]
\r
282 * @description {Config} enableDrag
\r
283 * {Boolean} Whether end user can drag event item by mouse.
\r
290 calendars_available:[],
\r
291 calendars_selected:[]
\r
293 var eventDiv = $("#gridEvent");
\r
294 if (eventDiv.length == 0) {
\r
295 eventDiv = $("<div id='gridEvent' style='display:none;'></div>").appendTo(document.body);
\r
297 var $gridcontainer = $(this);
\r
298 option = $.extend(def, option);
\r
300 //no quickUpdateUrl, dragging disabled.
\r
301 if (option.quickUpdateUrl == null || option.quickUpdateUrl == "") {
\r
302 option.enableDrag = false;
\r
304 //template for month and date
\r
305 var __SCOLLEVENTTEMP = "<DIV style=\"width:{width};top:{top};left:{left};\" title=\"{title}\" class=\"chip chip{i} {drag} {addclasses}\">" +
\r
306 "<DIV style=\"border-bottom-color:{bdcolor}\" class=ct> </DIV>" +
\r
307 "<DL style=\"border-color:{bdcolor}; background-color:{bgcolor1}; height: {height}px;\"><DT style=\"background-color:{bgcolor2}\">{starttime} - {endtime} {icon}</DT>" +
\r
308 "<DD><SPAN>{content}</SPAN></DD><DIV class='resizer' style='display:{redisplay}'><DIV class=rszr_icon> </DIV></DIV></DL>" +
\r
309 "<DIV style=\"BORDER-BOTTOM-COLOR:{bdcolor}; background-color:{bgcolor1}; border-color: {bdcolor};\" class=cb1> </DIV>" +
\r
310 "<DIV style=\"border-color:{bdcolor};\" class=cb2> </DIV></DIV>";
\r
311 var __ALLDAYEVENTTEMP = '<div class="rb-o {eclass}" id="{id}" title="{title}" style="color:{color};">' +
\r
312 '<div class="{extendClass} rb-m" style="background-color:{color}">{extendHTML}<div class="rb-i">{content}</div></div></div>';
\r
313 var __MonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
\r
314 var __LASSOTEMP = "<div class='drag-lasso' style=\"left:{left}px;top:{top}px;width:{width}px;height:{height}px;\"> </div>";
\r
322 //no height specified in options, we get page height.
\r
323 if (!option.height) {
\r
324 option.height = document.documentElement.clientHeight;
\r
327 $gridcontainer.css("overflow-y", "visible").height(option.height - 8);
\r
329 //populate events data for first display.
\r
330 if (option.url && option.autoload) {
\r
339 function clearcontainer() {
\r
340 $gridcontainer.empty();
\r
345 function render() {
\r
347 //viewType, showday, events, config
\r
348 var showday = new Date(option.showday.getFullYear(), option.showday.getMonth(), option.showday.getDate());
\r
349 var events = option.eventItems;
\r
350 var config = { view:option.view, weekstartday:option.weekstartday, color:option.std_color };
\r
351 if (option.view == "day" || option.view == "week" || option.view == "multi_days") {
\r
352 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
353 if ($dvtec.length > 0) {
\r
354 option.scroll = $dvtec.scrollTop(); //get scroll bar position
\r
357 switch (option.view) {
\r
359 BuildDaysAndWeekView(showday, 1, events, config);
\r
362 BuildDaysAndWeekView(showday, 7, events, config);
\r
365 BuildDaysAndWeekView(showday, option.num_days, events, config);
\r
368 BuildMonthView(showday, events, config);
\r
371 alert(i18n.xgcalendar["no_implement"]);
\r
374 initevents(option.view);
\r
379 function BuildDaysAndWeekView(startday, l, events, config) {
\r
383 show = dateFormat.call(startday, option.date_format_dm1);
\r
384 days.push({ display:show, date:startday, day:startday.getDate(), year:startday.getFullYear(), month:startday.getMonth() + 1 });
\r
385 option.datestrshow = CalDateShow(days[0].date);
\r
386 option.vstart = days[0].date;
\r
387 option.vend = days[0].date;
\r
392 w = config.weekstartday - startday.getDay();
\r
393 if (w > 0) w = w - 7;
\r
396 for (var i = w, j = 0; j < l; i = i + 1, j++) {
\r
397 ndate = DateAdd("d", i, startday);
\r
398 show = dateFormat.call(ndate, option.date_format_dm1);
\r
399 days.push({ display:show, date:ndate, day:ndate.getDate(), year:ndate.getFullYear(), month:ndate.getMonth() + 1 });
\r
401 option.vstart = days[0].date;
\r
402 option.vend = days[l - 1].date;
\r
403 option.datestrshow = CalDateShow(days[0].date, days[l - 1].date);
\r
406 var allDayEvents = [];
\r
407 var scrollDayEvents = [];
\r
408 //get number of all-day events, including more-than-one-day events.
\r
409 var dM = PrepareEvents(days, events, allDayEvents, scrollDayEvents);
\r
411 var $html = $("<div class=\"wktopcontainer\"></div>");
\r
412 $html.append(BuildWT(days, allDayEvents, dM));
\r
414 $gridcontainer.html("").append($html);
\r
416 $html = $("<div class=\"scrolltimeevent\"></div>");
\r
417 $html.append(BuildDayScollEventContainer(days, scrollDayEvents));
\r
418 $gridcontainer.append($html);
\r
420 //TODO event handlers
\r
421 //$gridcontainer.find(".weekViewAllDaywk").click(RowHandler);
\r
425 function BuildMonthView(showday, events, config) {
\r
426 $gridcontainer.find("*").remove();
\r
427 $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
430 html.push("<div id=\"mvcontainer\" class=\"mv-container\">");
\r
431 html.push("<table id=\"mvweek\" class=\"mv-daynames-table\"><tbody><tr>");
\r
432 for (var i = config.weekstartday, j = 0; j < 7; i++, j++) {
\r
434 html.push("<th class=\"mv-dayname\" title=\"", __WDAY[i], "\">", __WDAY[i], "");
\r
436 html.push("</tr></tbody></table>");
\r
437 html.push("</div>");
\r
438 $gridcontainer.append(html.join(""));
\r
440 var bH = GetMonthViewBodyHeight() - GetMonthViewHeaderHeight();
\r
441 var $container = $("<div class=\"mvEventContainer mv-event-container\" style=\"height:" + bH + "px;" + "\"></div>");
\r
442 var $body = BuilderMonthBody(showday, config.weekstartday, events, bH);
\r
443 $container.append($body);
\r
444 $gridcontainer.append($container);
\r
446 $gridcontainer.find(".cal-month-closebtn").click(closeCc);
\r
449 function closeCc() {
\r
450 $gridcontainer.find(".cal-month-cc").css("visibility", "hidden");
\r
453 //all-day event, including more-than-one-day events
\r
454 function PrepareEvents(dayarrs, events, allDayEvents, scrolLDayEvents) {
\r
455 var i, j, k, de, x, y, La, H, D, Ia,
\r
456 tmp_allday = allDayEvents,
\r
457 tmp_scrollevents = scrolLDayEvents,
\r
458 l = dayarrs.length,
\r
459 el = events.length,
\r
461 for (j = 0; j < el; j++) {
\r
462 var sD = events[j]["start"];
\r
463 var eD = events[j]["end"];
\r
465 s.event = events[j];
\r
466 s.day = sD.getDate();
\r
467 s.year = sD.getFullYear();
\r
468 s.month = sD.getMonth() + 1;
\r
469 s.allday = events[j]["is_allday"] == 1;
\r
470 s.crossday = events[j]["is_moredays"] == 1;
\r
471 s.reevent = events[j]["is_recurring"] == 1; //Recurring event
\r
472 s.daystr = [s.year, s.month, s.day].join("/");
\r
474 s.st.hour = sD.getHours();
\r
475 s.st.minute = sD.getMinutes();
\r
476 s.st.p = s.st.hour * 60 + s.st.minute; // start time
\r
478 s.et.hour = eD.getHours();
\r
479 s.et.minute = eD.getMinutes();
\r
480 s.et.p = s.et.hour * 60 + s.et.minute; // end time
\r
484 for (i = 0; i < l; i++) {
\r
485 var da = dayarrs[i];
\r
486 tmp_scrollevents[i] = [];
\r
487 tmp_allday[i] = [];
\r
488 da.daystr = da.year + "/" + da.month + "/" + da.day;
\r
489 for (j = 0; j < fE.length; j++) {
\r
490 if (!fE[j].crossday && !fE[j].allday) {
\r
491 if (da.daystr == fE[j].daystr)
\r
492 tmp_scrollevents[i].push(fE[j]);
\r
495 if (da.daystr == fE[j].daystr) {
\r
496 tmp_allday[i].push(fE[j]);
\r
500 if (i == 0 && da.date >= fE[j].event["start"] && da.date <= fE[j].event["end"])//first more-than-one-day event
\r
502 tmp_allday[i].push(fE[j]);
\r
509 var lrdate = dayarrs[l - 1].date;
\r
510 for (i = 0; i < l; i++) { //to deal with more-than-one-day event
\r
511 de = tmp_allday[i];
\r
512 if (de.length > 0) { //
\r
513 for (j = 0; j < de.length; j++) {
\r
514 var end = DateDiff("d", lrdate, de[j].event["end"]) > 0 ? lrdate : de[j].event["end"];
\r
515 de[j].colSpan = DateDiff("d", dayarrs[i].date, end) + 1
\r
520 //for all-day events
\r
521 for (i = 0; i < l; i++) {
\r
522 de = tmp_scrollevents[i];
\r
523 if (de.length > 0) {
\r
527 var dl = de.length;
\r
528 for (j = 0; j < dl; ++j) {
\r
530 for (La = ge.st.p, Ia = 0; y[Ia] > La;) Ia++;
\r
532 ge.ne = []; //PO is how many events before this one
\r
533 y[Ia] = ge.et.p || 1440;
\r
540 ge.pe = [x[Ia - 1]]; //previous event
\r
541 x[Ia - 1].ne.push(ge); //next event
\r
543 for (Ia = Ia + 1; y[Ia] <= La;) Ia++;
\r
549 ge.width = 1 / (ge.PO + 1);
\r
550 ge.left = 1 - ge.width;
\r
552 k = Array.prototype.concat.apply([], D);
\r
555 for (y = t; y--;) {
\r
559 for (D = x.ne.length; D--;) {
\r
561 La = Math.max(La, Ia.VL);
\r
562 H = Math.min(H, Ia.left)
\r
565 x.width = H / (x.PO + 1);
\r
566 x.left = H - x.width;
\r
568 for (y = 0; y < t; y++) {
\r
571 if (x.pe) for (D = x.pe.length; D--;) {
\r
573 x.left = Math.max(x.left, H.left + H.width);
\r
575 var p = (1 - x.left) / x.VL;
\r
576 x.width = Math.max(x.width, p);
\r
577 x.aQ = Math.min(1 - x.left, x.width + 0.7 * p); //width offset
\r
580 tmp_scrollevents[i] = k;
\r
587 // Week view: top row (full-day events)
\r
588 function BuildWT(dayarrs, events, dMax) {
\r
590 var i, j, h, e, el, x, l;
\r
591 var html = "<table class=\"wk-top\">";
\r
592 html += "<tr><th style='width: 60px;' rowspan=\"3\"> </th>";
\r
593 for (i = 0; i < dayarrs.length; i++) {
\r
595 if (dayarrs.length == 1) {
\r
601 ev = ""; // "onclick=\"javascript:FunProxy('week2day',event,this);\"";
\r
602 title = i18n.xgcalendar.to_date_view;
\r
605 html += "<th data-abbr='" + dayarrs[i].date.getTime() + "' class='gcweekname' scope=\"col\">";
\r
606 html += "<div title='" + title + "' " + ev + " class='wk-dayname'><span class='" + cl + "'>" + dayarrs[i].display + "</span></div></th>";
\r
609 html += "<th style='width: 16px;' rowspan=\"3\"> </th>";
\r
610 html += "</tr>"; //end tr1;
\r
613 html += "<td class=\"wk-allday\"";
\r
615 if (dayarrs.length > 1) {
\r
616 html += " colSpan='" + dayarrs.length + "'";
\r
618 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
619 html += "><div class=\"weekViewAllDaywk\" ><table class=\"st-grid\"><tbody>";
\r
623 for (i = 0; i < dayarrs.length; i++) {
\r
624 html += "<td class=\"st-c st-s\" data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "' data-axis='00:00'> </td>";
\r
632 for (j = 0; j < l; j++) {
\r
636 for (j = 0; el < dMax; j++) {
\r
637 html += "<tr class='row" + j + "'>";
\r
638 for (h = 0; h < l;) {
\r
639 e = events[h][x[h]];
\r
640 html += "<td class='st-c col" + h;
\r
641 if (e) { //if exists
\r
644 if (e.colSpan > 1) {
\r
645 html += " colSpan='" + e.colSpan + "'";
\r
651 html += " ch='show'>";
\r
655 html += " st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> ";
\r
663 for (h = 0; h < l; h++) {
\r
664 html += "<td class='st-c st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> </td>";
\r
668 html += "</tbody></table></div></td></tr>"; // stgrid end //wvAd end //td2 end //tr2 end
\r
672 html += "<td style=\"height: 5px;\"";
\r
673 if (dayarrs.length > 1) {
\r
674 html += " colSpan='" + dayarrs.length + "'";
\r
678 html += "</table>";
\r
685 for (j = 0; j < l; j++) {
\r
688 for (j = 0; el < dMax; j++) {
\r
689 for (h = 0; h < l;) {
\r
690 e = events[h][x[h]];
\r
691 if (e) { //if exists
\r
693 var $t = BuildMonthDayEvent(e, dayarrs[h].date, l - h);
\r
694 $el.find(".row" + j + " .col" + h).append($t);
\r
695 if (e.colSpan > 1) {
\r
713 function BuildDayScollEventContainer(dayarrs, events) {
\r
717 var html = "<table style=\"table-layout: fixed;";
\r
718 html += ($.browser.msie ? "" : "width:100%");
\r
719 html += "\"><tbody><tr><td><table style=\"height: " + (option.hour_height * 24) + "px\" class=\"tg-timedevents\"><tbody>";
\r
720 html += "<tr><td style='width:60px;'></td><td";
\r
721 if (dayarrs.length > 1) {
\r
722 html += " colSpan='" + dayarrs.length + "'";
\r
724 html += "><div class=\"tg-spanningwrapper\"><div style=\"font-size: " + (Math.round(option.hour_height / 2) - 1) + "px\" class=\"tg-hourmarkers\">";
\r
725 for (i = 0; i < 24; i++) {
\r
726 html += "<div class=\"tg-dualmarker\"></div>";
\r
728 html += "</div></div></td></tr>";
\r
732 html += "<td style=\"width: 60px; \" class=\"tg-times\">";
\r
734 //get current time
\r
735 var now = new Date();
\r
736 var h = now.getHours();
\r
737 var m = now.getMinutes();
\r
738 var mHg = gP(h, m) - 4; //make middle alignment vertically
\r
739 html += "<div id=\"tgnowptr\" class=\"tg-nowptr\" style=\"left:0;top:" + mHg + "px\"></div>";
\r
740 for (i = 0; i < 24; i++) html += "<div style=\"height: " + (option.hour_height - 1) + "px\" class=\"tg-time\">" + fomartTimeShow(i) + "</div>";
\r
743 var l = dayarrs.length;
\r
744 var hh24 = option.hour_height * 24;
\r
745 for (i = 0; i < l; i++) {
\r
746 html += "<td class='tg-col' data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "'>";
\r
747 var istoday = formatDate(dayarrs[i].date) == formatDate(new Date());
\r
750 html += "<div style=\"margin-bottom: -" + hh24 + "px; height:" + hh24 + "px\" class=\"tg-today\"> </div>";
\r
752 //var eventC = $(eventWrap);
\r
753 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
754 html += "<div style=\"margin-bottom: -" + hh24 + "px; height: " + hh24 + "px\" data-col='" + i + "' class='tgCol" + i + " tg-col-eventwrapper'></div>";
\r
756 html += "<div class='tg-col-overlaywrapper tgOver" + i + "' data-col='" + i + "'>";
\r
759 html += "<div class=\"tg-hourmarker tg-nowmarker\" style=\"left:0;top:" + mhh + "px\"></div>";
\r
766 html += "</tbody></table></td></tr></tbody></table>";
\r
767 var $container = $(html);
\r
769 for (i = 0; i < l; i++) {
\r
770 var $col = $container.find(".tgCol" + i);
\r
771 for (var j = 0; j < events[i].length; j++) {
\r
772 if (events[i][j].event["color"] && events[i][j].event["color"].match(/^#[0-9a-f]{6}$/i)) {
\r
773 c = events[i][j].event["color"];
\r
776 c = option.std_color;
\r
778 var $tt = BuildDayEvent(c, events[i][j], j);
\r
787 function getTitle(event) {
\r
788 var timeshow, eventshow;
\r
789 var showtime = event["is_allday"] != 1;
\r
790 eventshow = event["subject"];
\r
791 var startformat = getymformat(event["start"], null, showtime, true);
\r
792 var endformat = getymformat(event["end"], event["start"], showtime, true);
\r
793 timeshow = dateFormat.call(event["start"], startformat) + " - " + dateFormat.call(event["end"], endformat);
\r
794 //var linebreak = ($.browser.mozilla?"":"\r\n");
\r
795 var linebreak = "\r\n";
\r
797 if (event["is_allday"] == 1) {
\r
798 //ret.push("[" + i18n.xgcalendar.allday_event + "]", linebreak );
\r
801 if (event["is_recurring"] == 1) {
\r
802 ret.push("[" + i18n.xgcalendar.repeat_event + "]", linebreak);
\r
805 ret.push(i18n.xgcalendar.time + ": ", timeshow, linebreak, i18n.xgcalendar.event + ": ", eventshow);
\r
807 if (event["location"] != undefined && event["location"] != "") {
\r
808 ret.push(linebreak, i18n.xgcalendar.location + ": ", event["location"]);
\r
811 if (event["attendees"] != undefined && event["attendees"] != "") {
\r
812 ret.push(linebreak, i18n.xgcalendar.participant + ": ", event["attendees"]);
\r
814 return ret.join("");
\r
817 function BuildDayEvent(color, e, index) {
\r
818 var theme = ColorCalcValues(color);
\r
819 var p = { bdcolor:theme[0], bgcolor2:theme[0], bgcolor1:theme[2], width:"70%", icon:"", title:"", data:"" };
\r
820 p.starttime = pZero(e.st.hour) + ":" + pZero(e.st.minute);
\r
821 p.endtime = pZero(e.et.hour) + ":" + pZero(e.et.minute);
\r
822 p.content = e.event["subject"];
\r
823 p.title = getTitle(e.event);
\r
825 if (e.event["has_notification"] == 1) icons.push("<I class=\"cic cic-tmr\"> </I>");
\r
827 icons.push("<I class=\"cic cic-spcl\"> </I>");
\r
829 p.icon = icons.join("");
\r
830 var sP = gP(e.st.hour, e.st.minute);
\r
831 var eP = gP(e.et.hour, e.et.minute);
\r
833 p.left = (e.left * 100) + "%";
\r
834 p.width = (e.aQ * 100) + "%";
\r
835 p.height = (eP - sP - 4);
\r
837 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
839 p.redisplay = "block";
\r
843 p.redisplay = "none";
\r
846 p.addclasses = (e.event["is_editable_quick"] ? "editable" : "not_editable");
\r
848 var $newtemp = $(Tp(__SCOLLEVENTTEMP, p));
\r
849 $newtemp.data("eventdata", $.extend(true, {}, e.event));
\r
854 //get body height in month view
\r
855 function GetMonthViewBodyHeight() {
\r
856 return option.height;
\r
859 function GetMonthViewHeaderHeight() {
\r
863 function BuilderMonthBody(showday, startday, events, bodyHeight) {
\r
864 var i, j, k, b, day;
\r
867 var firstdate = new Date(showday.getFullYear(), showday.getMonth(), 1);
\r
868 var diffday = startday - firstdate.getDay();
\r
869 var showmonth = showday.getMonth();
\r
873 var startdate = DateAdd("d", diffday, firstdate);
\r
874 var enddate = DateAdd("d", 34, startdate);
\r
877 if (enddate.getFullYear() == showday.getFullYear() && enddate.getMonth() == showday.getMonth() && enddate.getDate() < __MonthDays[showmonth]) {
\r
878 enddate = DateAdd("d", 7, enddate);
\r
881 option.vstart = startdate;
\r
882 option.vend = enddate;
\r
883 option.datestrshow = CalDateShow(startdate, enddate);
\r
884 bodyHeight = bodyHeight - 18 * rc;
\r
885 var rowheight = bodyHeight / rc;
\r
886 var roweventcount = parseInt(rowheight / 21);
\r
887 if (rowheight % 21 > 15) {
\r
891 var formatevents = [];
\r
892 var hastdata = formartEventsInHashtable(events, startday, 7, startdate, enddate);
\r
895 for (j = 0; j < rc; j++) {
\r
897 formatevents[j] = b = [];
\r
898 for (i = 0; i < 7; i++) {
\r
899 var newkeyDate = DateAdd("d", j * 7 + i, startdate);
\r
900 C[j * 7 + i] = newkeyDate;
\r
901 var newkey = dateFormat.call(newkeyDate, i18n.xgcalendar.dateformat.fulldaykey);
\r
902 b[i] = hastdata[newkey];
\r
903 if (b[i] && b[i].length > 0) {
\r
909 eventDiv.data("mvdata", formatevents);
\r
910 for (j = 0; j < rc; j++) {
\r
911 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
912 htb.push("<div style=\"HEIGHT:", p, "%; TOP:", p * j, "%\" data-row=\"" + j + "\" class=\"month-row mvrow_" + j + "\">");
\r
913 htb.push("<table class=\"st-bg-table\"><tbody><tr>");
\r
915 for (i = 0; i < 7; i++) {
\r
916 day = C[j * 7 + i];
\r
917 htb.push("<td data-abbr='", day.getTime(), "' data-ch='qkadd' data-axis='00:00' title=''");
\r
919 if (formatDate(day) == formatDate(new Date())) {
\r
920 htb.push(" class=\"st-bg st-bg-today\">");
\r
921 } else if (day.getMonth() != showmonth) {
\r
922 htb.push(" class=\"st-bg st-bg-nonmonth\">");
\r
924 htb.push(" class=\"st-bg\">");
\r
926 htb.push(" </td>");
\r
929 htb.push("</tr></tbody></table>");
\r
932 htb.push("<table class=\"st-grid row" + j + "\"><tbody>");
\r
936 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
938 for (i = 0; i < 7; i++) {
\r
939 var o = { titleClass:"", dayshow:"" };
\r
940 day = C[j * 7 + i];
\r
941 if (formatDate(day) == formatDate(new Date())) {
\r
942 o.titleClass = " st-dtitle-today";
\r
944 if (day.getMonth() != showmonth) {
\r
945 o.titleClass = " st-dtitle-nonmonth";
\r
947 o.title = formatDate(day);
\r
948 if (day.getDate() == 1) {
\r
949 if (day.getMonth == 0) {
\r
950 o.dayshow = formatDate(day);
\r
953 o.dayshow = dateFormat.call(day, option.date_format_dm2).toString();
\r
957 o.dayshow = day.getDate();
\r
959 o.abbr = day.getTime();
\r
960 htb.push(Tp(titletemp, o));
\r
963 htb.push("</tbody></table>");
\r
965 htb.push("</div>");
\r
967 var $ret = $(htb.join(""));
\r
969 for (j = 0; j < rc; j++) {
\r
970 var sfirstday = C[j * 7];
\r
972 var obs = BuildMonthRow(formatevents[j], dMax, roweventcount, sfirstday);
\r
973 for (i = 0; i < obs.length; i++) $ret.find(".row" + j).append(obs[i]);
\r
974 //htb=htb.concat(rowHtml); rowHtml = null;
\r
980 //formate datetime
\r
981 function formartEventsInHashtable(events, startday, daylength, rbdate, redate) {
\r
983 var hast = new Object();
\r
984 var l = events.length;
\r
985 for (var i = 0; i < l; i++) {
\r
986 var sD = events[i]["start"];
\r
987 var eD = events[i]["end"];
\r
988 var diff = DateDiff("d", sD, eD);
\r
990 s.event = events[i];
\r
991 s.day = sD.getDate();
\r
992 s.year = sD.getFullYear();
\r
993 s.month = sD.getMonth() + 1;
\r
994 s.allday = events[i]["is_allday"] == 1;
\r
995 s.crossday = events[i]["is_moredays"] == 1;
\r
996 s.reevent = events[i]["is_recurring"] == 1; //Recurring event
\r
997 s.daystr = s.year + "/" + s.month + "/" + s.day;
\r
999 s.st.hour = sD.getHours();
\r
1000 s.st.minute = sD.getMinutes();
\r
1001 s.st.p = s.st.hour * 60 + s.st.minute; // start time position
\r
1003 s.et.hour = eD.getHours();
\r
1004 s.et.minute = eD.getMinutes();
\r
1005 s.et.p = s.et.hour * 60 + s.et.minute; // end time postition
\r
1008 if (sD < rbdate) { //start date out of range
\r
1011 if (eD > redate) { //end date out of range
\r
1014 var f = startday - sD.getDay();
\r
1018 var sdtemp = DateAdd("d", f, sD);
\r
1019 for (; sdtemp <= eD; sD = sdtemp = DateAdd("d", daylength, sdtemp)) {
\r
1020 var d = $.extend(s, {});
\r
1021 key = dateFormat.call(sD, i18n.xgcalendar.dateformat.fulldaykey);
\r
1022 var x = DateDiff("d", sdtemp, eD);
\r
1023 if (hast[key] == null) {
\r
1026 d.colSpan = (x >= daylength) ? daylength - DateDiff("d", sdtemp, sD) : DateDiff("d", sD, eD) + 1;
\r
1027 hast[key].push(d);
\r
1032 key = dateFormat.call(events[i]["start"], i18n.xgcalendar.dateformat.fulldaykey);
\r
1033 if (hast[key] == null) {
\r
1037 hast[key].push(s);
\r
1044 function BuildMonthRow(events, dMax, sc, day) {
\r
1050 var l = events.length;
\r
1053 for (j = 0; j < l; j++) {
\r
1057 cday.push(DateAdd("d", j, day));
\r
1059 for (j = 0; j < l; j++) {
\r
1060 var ec = events[j] ? events[j].length : 0;
\r
1062 for (var k = 0; k < ec; k++) {
\r
1064 if (e && e.colSpan > 1) {
\r
1065 for (m = 1; m < e.colSpan; m++) {
\r
1072 var tdtemp = "<td class='{cssclass}' data-axis='{axis}' data-ch='{ch}' data-abbr='{abbr}' title='{title}' {otherAttr}>{html}</td>";
\r
1073 for (j = 0; j < sc && el < dMax; j++) {
\r
1074 var $row = $("<tr></tr>");
\r
1075 //var gridtr = $(__TRTEMP);
\r
1076 for (var h = 0; h < l;) {
\r
1077 e = events[h] ? events[h][x[h]] : undefined;
\r
1079 var tempdata = { "class":"", axis:"", ch:"", title:"", abbr:"", html:"", otherAttr:"", click:"javascript:void(0);" };
\r
1080 var tempCss = ["st-c"];
\r
1084 //last event of the day
\r
1086 if (z[h] + 1 == y[h] && e.colSpan == 1) {
\r
1089 if (!bs && j == (sc - 1) && z[h] < y[h]) {
\r
1091 $.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
1092 tempCss.push("st-more st-moreul");
\r
1096 tempdata.html = "";
\r
1097 $ev = BuildMonthDayEvent(e, cday[h], l - h);
\r
1098 tempdata.ch = "show";
\r
1099 if (e.colSpan > 1) {
\r
1100 tempdata.otherAttr = " colSpan='" + e.colSpan + "'";
\r
1101 for (m = 0; m < e.colSpan; m++) {
\r
1102 z[h + m] = z[h + m] + 1;
\r
1115 if (j == (sc - 1) && z[h] < y[h] && y[h] > 0) {
\r
1116 $.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
1117 tempCss.push("st-more st-moreul");
\r
1121 $.extend(tempdata, { html:" ", ch:"qkadd", "axis":"00:00", "abbr":cday[h].getTime(), title:"" });
\r
1122 tempCss.push("st-s");
\r
1126 tempdata.cssclass = tempCss.join(" ");
\r
1128 var $z = $(Tp(tdtemp, tempdata));
\r
1129 if ($ev != null) $z.append($ev);
\r
1138 function BuildMonthDayEvent(e, cday, length) {
\r
1140 if (e.event["color"] && e.event["color"].match(/^#[0-9a-f]{6}$/i)) {
\r
1141 theme = ColorCalcValues(e.event["color"]);
\r
1144 theme = ColorCalcValues(option.std_color);
\r
1146 var p = { color:theme[2], title:"", extendClass:"", extendHTML:"", data:"" };
\r
1148 p.title = getTitle(e.event);
\r
1149 p.id = "bbit_cal_event_" + e.event["uri"];
\r
1150 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
1151 p.eclass = "drag";
\r
1154 p.eclass = "cal_" + e.event["uri"];
\r
1156 p.eclass += " " + (e.event["is_editable"] ? "editable" : "not_editable");
\r
1157 var sp = "<span style=\"cursor: pointer\">{content}</span>";
\r
1158 var i = "<I class=\"cic cic-tmr\"> </I>";
\r
1159 var i2 = "<I class=\"cic cic-rcr\"> </I>";
\r
1160 var ml = "<div class=\"st-ad-ml\"></div>";
\r
1161 var mr = "<div class=\"st-ad-mr\"></div>";
\r
1163 var sf = e.event["start"] < cday;
\r
1164 var ef = DateDiff("d", cday, e.event["end"]) >= length; //e.event["end"] >= DateAdd("d", 1, cday);
\r
1168 p.extendClass = "st-ad-mpad ";
\r
1173 p.extendHTML = arrm.join("");
\r
1177 if (!e.allday && !sf) {
\r
1178 cen = pZero(e.st.hour) + ":" + pZero(e.st.minute) + " " + e.event["subject"];
\r
1181 cen = e.event["subject"];
\r
1184 if (cen.indexOf("Geburtstag:") == 0) {
\r
1185 content.push("<img src='/pics/silk/cake.png' alt='Geburtstag: ' title='Geburtstag' style='height: 12px; margin-right: 3px;'>");
\r
1186 cen = cen.replace(/Geburtstag: /, "");
\r
1188 content.push(Tp(sp, { content:cen }));
\r
1189 if (e.event["has_notification"] == 1) content.push(i);
\r
1193 p.content = content.join("");
\r
1194 var $newel = $(Tp(__ALLDAYEVENTTEMP, p));
\r
1195 $newel.data("eventdata", e.event);
\r
1199 //to populate the data
\r
1200 function populate() {
\r
1201 if (option.isloading) {
\r
1204 if (option.url && option.url != "") {
\r
1205 option.isloading = true;
\r
1206 //clearcontainer();
\r
1207 if (option.onBeforeRequestData && $.isFunction(option.onBeforeRequestData)) {
\r
1208 option.onBeforeRequestData(1);
\r
1211 { name:"showdate", value: Math.floor(option.showday.getTime() / 1000) },
\r
1212 { name:"viewtype", value:option.view },
\r
1213 { name:"weekstartday", value:option.weekstartday }
\r
1215 if (option.view == "multi_days") {
\r
1216 param.push({ name:"num_days", value:option.num_days });
\r
1218 if (option.extParam) {
\r
1219 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1220 param[param.length] = option.extParam[pi];
\r
1225 type:option.method, //
\r
1226 url:option.url + option.url_add,
\r
1229 dataFilter:function (data) {
\r
1230 //return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, "new $1");
\r
1234 success:function (data) {//function(datastr) {
\r
1235 //datastr =datastr.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1');
\r
1236 //var data = (new Function("return " + datastr))();
\r
1237 if (data != null && data.error != null) {
\r
1238 if (option.onRequestDataError) {
\r
1239 option.onRequestDataError(1, data);
\r
1243 data["start"] = parseDate(data["start"]);
\r
1244 data["end"] = parseDate(data["end"]);
\r
1245 $.each(data.events, function (index, value) {
\r
1246 value["start"] = new Date(value["start"] * 1000);
\r
1247 value["end"] = new Date(value["end"] * 1000);
\r
1249 responseData(data, data.start, data.end);
\r
1251 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1252 option.onAfterRequestData(1);
\r
1254 option.isloading = false;
\r
1256 error:function (data) {
\r
1258 if (option.onRequestDataError) {
\r
1259 option.onRequestDataError(1, data);
\r
1261 alert(i18n.xgcalendar.get_data_exception);
\r
1263 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1264 option.onAfterRequestData(1);
\r
1266 option.isloading = false;
\r
1273 alert("url" + i18n.xgcalendar.i_undefined);
\r
1278 function responseData(data, start, end) {
\r
1279 var events = data.events;
\r
1280 ConcatEvents(events, start, end);
\r
1285 function clearrepeat(events, start) {
\r
1286 var jl = events.length;
\r
1288 var es = events[0]["start"];
\r
1289 var el = events[jl - 1]["start"];
\r
1290 for (var i = 0, l = option.eventItems.length; i < l; i++) {
\r
1292 if (option.eventItems[i]["sart"] > el || jl == 0) {
\r
1295 if (option.eventItems[i]["start"] >= es) {
\r
1296 for (var j = 0; j < jl; j++) {
\r
1297 if (option.eventItems[i]["uri"] == events[j]["uri"] && option.eventItems[i]["start"] < start) {
\r
1298 events.splice(j, 1); //for duplicated event
\r
1308 function ConcatEvents(events, start, end) {
\r
1314 if (option.eventItems.length == 0) {
\r
1315 option.eventItems = events;
\r
1318 //remove duplicated one
\r
1319 clearrepeat(events, start);
\r
1320 var sl = option.eventItems.length;
\r
1325 if (option.eventItems[0]["start"] > e) {
\r
1326 option.eventItems = events.concat(option.eventItems);
\r
1329 if (option.eventItems[sl - 1]["start"] < s) {
\r
1330 option.eventItems = option.eventItems.concat(events);
\r
1333 for (var i = 0; i < sl; i++) {
\r
1334 if (option.eventItems[i]["start"] >= s && sI < 0) {
\r
1338 if (option.eventItems[i]["start"] > e) {
\r
1344 var e1 = sI <= 0 ? [] : option.eventItems.slice(0, sI);
\r
1345 var e2 = eI == sl ? [] : option.eventItems.slice(eI);
\r
1346 option.eventItems = [].concat(e1, events, e2);
\r
1352 function weekormonthtoday(e) {
\r
1354 option.showday = new Date(parseInt(th.data("abbr")));
\r
1355 option.view = "day";
\r
1357 if (option.onWeekOrMonthToDay) {
\r
1358 option.onWeekOrMonthToDay(option);
\r
1360 e.stopPropagation();
\r
1361 e.preventDefault();
\r
1364 function parseDate(str) {
\r
1365 return new Date(Date.parse(str));
\r
1368 function gP(h, m) {
\r
1369 return h * option.hour_height + parseInt(m / 60 * option.hour_height);
\r
1372 function gW(ts1, ts2) {
\r
1373 var t1 = ts1 / option.hour_height;
\r
1374 var t2 = parseInt(t1);
\r
1375 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1376 var t4 = ts2 / option.hour_height;
\r
1377 var t5 = parseInt(t4);
\r
1378 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1379 return { sh:t2, sm:t3, eh:t5, em:t6, h:ts2 - ts1 };
\r
1382 function gH(y1, y2, pt) {
\r
1383 var sy1 = Math.min(y1, y2);
\r
1384 var sy2 = Math.max(y1, y2);
\r
1385 var t1 = (sy1 - pt) / option.hour_height;
\r
1386 var t2 = parseInt(t1);
\r
1387 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1388 var t4 = (sy2 - pt) / option.hour_height;
\r
1389 var t5 = parseInt(t4);
\r
1390 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1391 return { sh:t2, sm:t3, eh:t5, em:t6, h:sy2 - sy1 };
\r
1394 function pZero(n) {
\r
1395 return n < 10 ? "0" + n : "" + n;
\r
1398 function Tp(temp, dataarry) {
\r
1399 return temp.replace(/\{([\w]+)\}/g, function (s1, s2) {
\r
1400 var s = dataarry[s2];
\r
1401 if (typeof (s) != "undefined") {
\r
1409 function fomartTimeShow(h) {
\r
1410 return h < 10 ? "0" + h + ":00" : h + ":00";
\r
1413 function getymformat(date, comparedate, isshowtime, isshowweek) {
\r
1414 var showyear = isshowtime != undefined ? (date.getFullYear() != new Date().getFullYear()) : true;
\r
1415 var showmonth = true;
\r
1416 var showday = true;
\r
1417 var showtime = isshowtime || false;
\r
1418 var showweek = isshowweek || false;
\r
1419 if (comparedate) {
\r
1420 showyear = comparedate.getFullYear() != date.getFullYear();
\r
1421 //showmonth = comparedate.getFullYear() != date.getFullYear() || date.getMonth() != comparedate.getMonth();
\r
1422 if (comparedate.getFullYear() == date.getFullYear() &&
\r
1423 date.getMonth() == comparedate.getMonth() &&
\r
1424 date.getDate() == comparedate.getDate()
\r
1426 showyear = showmonth = showday = showweek = false;
\r
1432 a.push(option.date_format_dm3)
\r
1433 } else if (showmonth) {
\r
1434 a.push(option.date_format_dm2)
\r
1435 } else if (showday) {
\r
1436 a.push(i18n.xgcalendar.dateformat.day);
\r
1438 a.push(showweek ? " (W)" : "", showtime ? " HH:mm" : "");
\r
1439 return a.join("");
\r
1442 function CalDateShow(startday, endday, isshowtime, isshowweek) {
\r
1444 return dateFormat.call(startday, getymformat(startday, null, isshowtime));
\r
1446 var strstart = dateFormat.call(startday, getymformat(startday, null, isshowtime, isshowweek));
\r
1447 var strend = dateFormat.call(endday, getymformat(endday, startday, isshowtime, isshowweek));
\r
1448 var join = (strend != "" ? " - " : "");
\r
1449 return [strstart, strend].join(join);
\r
1453 function buildtempdayevent(sh, sm, eh, em, h, title, w, resize, color) {
\r
1454 if (!color.match(/^#[0-9a-f]{6}$/i)) color = option.std_color;
\r
1455 var t = ColorCalcValues(color);
\r
1456 return Tp(__SCOLLEVENTTEMP, {
\r
1461 starttime:[pZero(sh), pZero(sm)].join(":"),
\r
1462 endtime:[pZero(eh), pZero(em)].join(":"),
\r
1463 content:title ? title : i18n.xgcalendar.new_event,
\r
1464 title:title ? title : i18n.xgcalendar.new_event,
\r
1465 icon:"<I class=\"cic cic-tmr\"> </I>",
\r
1468 width:w ? w : "100%",
\r
1472 redisplay:resize ? "block" : "none"
\r
1476 function quickd(type) {
\r
1477 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1478 var calid = $("#bbit-cs-id").val();
\r
1480 { "name":"calendarId", value:calid },
\r
1481 { "name":"type", value:type}
\r
1483 var de = rebyKey(calid, true);
\r
1484 option.onBeforeRequestData && option.onBeforeRequestData(3);
\r
1485 $.post(option.quickDeleteUrl, param, function (data) {
\r
1487 $(document).trigger("wdcal:updated");
\r
1488 if (data["IsSuccess"]) {
\r
1491 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1494 option.onRequestDataError && option.onRequestDataError(3, data);
\r
1497 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1503 function getbuddlepos(x, y) {
\r
1504 var tleft = x - 110;
\r
1505 var ttop = y - 217;
\r
1506 var maxLeft = document.documentElement.clientWidth;
\r
1507 var maxTop = document.documentElement.clientHeight;
\r
1508 var ishide = false;
\r
1509 if (tleft <= 0 || ttop <= 0 || tleft + 400 > maxLeft) {
\r
1510 tleft = x - 200 <= 0 ? 10 : x - 200;
\r
1511 ttop = y - 159 <= 0 ? 10 : y - 159;
\r
1512 if (tleft + 400 >= maxLeft) {
\r
1513 tleft = maxLeft - 410;
\r
1515 if (ttop + 164 >= maxTop) {
\r
1516 ttop = maxTop - 165;
\r
1520 return { left:tleft, top:ttop, hide:ishide };
\r
1523 function dayshow(e, data) {
\r
1524 var $t = $(e.target);
\r
1525 if ($t.hasClass("axx_username") || $t.parents(".axx_username").length > 0 || $t.hasClass("cal_nojs") || $t.parents(".cal_nojs").length > 0) return false;
\r
1527 if (data == undefined) {
\r
1528 if ($t.hasClass("chip") || $t.hasClass("rb-o")) data = $t.data("eventdata");
\r
1529 else data = $t.parents(".chip, .rb-o").data("eventdata");
\r
1532 if (data != null) {
\r
1533 var editable = false;
\r
1534 if (option.quickDeleteUrl != "" && data["is_editable"] == 1 && option.readonly != true) editable = true;
\r
1535 var csbuddle = '<div id="bbit-cs-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble"><table class="bubble-table"><tbody' +
\r
1536 '><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>' +
\r
1537 '<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
1538 '<tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">' +
\r
1539 '<table class="cb-table"><tbody><tr><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid">' +
\r
1540 '<a href="" title="' + i18n.xgcalendar.click_to_detail + '" class="bbit-cs-what textbox-fill-div lk"></a></div></div></td></tr>' +
\r
1541 '<tr><td class=cb-value><div id="bbit-cs-buddle-timeshow"></div></td></tr>' +
\r
1542 '</tbody></table><div class="bbit-cs-split"><input id="bbit-cs-id" type="hidden" value=""/>[ <span id="bbit-cs-delete" class="lk">'
\r
1543 + i18n.xgcalendar.i_delete + '</span> ] ' +
\r
1544 '<a href="" class="bbit-cs-editLink lk">' + i18n.xgcalendar.update_detail + ' <strong>>></strong></a>' +
\r
1545 '</div></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div>' +
\r
1546 '<td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody>' +
\r
1547 '</table><div id="bubbleClose2" class="bubble-closebutton"></div><div id="prong1" class="prong"><div class=bubble-sprite></div></div></div>';
\r
1548 var $bud = $("#bbit-cs-buddle");
\r
1549 if ($bud.length == 0) {
\r
1550 $bud = $(csbuddle).appendTo(document.body);
\r
1551 var calbutton = $("#bbit-cs-delete");
\r
1552 $("#bubbleClose2").on("click", function () {
\r
1553 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1555 calbutton.on("click", function () {
\r
1556 var data = $("#bbit-cs-buddle").data("cdata");
\r
1557 if (option.quickDeleteHandler && $.isFunction(option.quickDeleteHandler)) {
\r
1558 option.quickDeleteHandler.call(this, data, quickd);
\r
1561 if (confirm(i18n.xgcalendar.confirm_delete_event)) {
\r
1562 var s = 0; //0 single event , 1 for Recurring event
\r
1563 if (data["is_recurring"] == 1) {
\r
1564 if (confirm(i18n.xgcalendar.confrim_delete_event_or_all)) {
\r
1581 $("#bbit-cs-delete").parents(".bbit-cs-split").show();
\r
1582 $bud.find(".bbit-cs-editLink").attr("href", data["url_edit"]).show();
\r
1585 $("#bbit-cs-delete").parents(".bbit-cs-split").hide();
\r
1586 $bud.find(".bbit-cs-editLink").hide();
\r
1589 var pos = getbuddlepos(e.pageX, e.pageY);
\r
1591 $("#prong1").hide()
\r
1594 $("#prong1").show()
\r
1597 var iscos = DateDiff("d", data["start"], data["end"]) != 0;
\r
1598 ss.push(dateFormat.call(data["start"], option.date_format_dm2), " (", __WDAY[data["start"].getDay()], ")");
\r
1599 if (data["is_allday"] != 1) {
\r
1600 ss.push(",", dateFormat.call(data["start"], "HH:mm"));
\r
1604 ss.push(" - ", dateFormat.call(data["end"], option.date_format_dm2), " (", __WDAY[data["end"].getDay()], ")");
\r
1605 if (data["is_allday"] != 1) {
\r
1606 ss.push(",", dateFormat.call(data["end"], "HH:mm"));
\r
1609 var location = "";
\r
1610 if (data["location"] != "") location = data["location"] + ", ";
\r
1611 $("#bbit-cs-buddle-timeshow").html(location + ss.join(""));
\r
1612 $bud.find(".bbit-cs-what").html(data["subject"]).attr("href", data["url_detail"]);
\r
1613 $("#bbit-cs-id").val(data["uri"]);
\r
1614 $bud.data("cdata", data);
\r
1615 $bud.css({ "visibility":"visible", left:pos.left, top:pos.top });
\r
1617 $(document).one("click", function () {
\r
1618 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1622 alert(i18n.xgcalendar.data_format_error);
\r
1627 function moreshow(mv) {
\r
1628 var $me = $(this);
\r
1629 var $pdiv = $(mv);
\r
1630 var divIndex = parseInt($pdiv.data("row"));
\r
1631 var offsetMe = $me.position();
\r
1632 var offsetP = $pdiv.position();
\r
1633 var width = ($me.width() + 2) * 1.5;
\r
1634 var top = offsetP.top + 15;
\r
1635 var left = offsetMe.left;
\r
1637 var day = new Date(parseInt($me.data("abbr")));
\r
1638 var cc = $gridcontainer.find(".cal-month-cc");
\r
1639 var ccontent = $gridcontainer.find(".cal-month-cc-content table tbody");
\r
1640 var ctitle = $gridcontainer.find(".cal-month-cc-title");
\r
1641 ctitle.html(formatDate(day));
\r
1643 var edata = $("#gridEvent").data("mvdata");
\r
1644 var events = edata[divIndex];
\r
1645 var index = parseInt($me.data("axis"));
\r
1646 ccontent.find("*").remove();
\r
1647 for (var i = 0; i <= index; i++) {
\r
1648 var ec = events[i] ? events[i].length : 0;
\r
1649 for (var j = 0; j < ec; j++) {
\r
1650 var e = events[i][j];
\r
1652 if ((e.colSpan + i - 1) >= index) {
\r
1653 var $x = $("<tr><td class='st-c'></td></tr>");
\r
1654 var $y = BuildMonthDayEvent(e, day, 1);
\r
1655 $x.find(".st-c").append($y);
\r
1656 ccontent.append($x);
\r
1662 ccontent.find("div.rb-o").each(function () {
\r
1663 $(this).click(dayshow);
\r
1666 var height = cc.height();
\r
1667 var maxleft = document.documentElement.clientWidth;
\r
1668 var maxtop = document.documentElement.clientHeight;
\r
1669 if (left + width >= maxleft) {
\r
1670 left = offsetMe.left - ($me.width() + 2) * 0.5;
\r
1672 if (top + height >= maxtop) {
\r
1673 top = maxtop - height - 2;
\r
1675 var newOff = { left:left, top:top, "z-index":180, width:width, "visibility":"visible" };
\r
1677 $(document).on("click", closeCc);
\r
1681 function dayupdate(data, start, end) {
\r
1682 if (option.quickUpdateUrl != "" && data["is_editable_quick"] == 1 && option.readonly != true) {
\r
1683 if (option.isloading) {
\r
1686 option.isloading = true;
\r
1687 var id = data["uri"];
\r
1688 var os = data["start"];
\r
1689 var od = data["end"];
\r
1691 { "name":"calendarId", value:id },
\r
1692 { "name":"CalendarStartTime", value:Math.floor(start.getTime() / 1000) },
\r
1693 { "name":"CalendarEndTime", value:Math.floor(end.getTime() / 1000) }
\r
1696 if (option.quickUpdateHandler && $.isFunction(option.quickUpdateHandler)) {
\r
1697 option.quickUpdateHandler.call(this, param);
\r
1700 option.onBeforeRequestData && option.onBeforeRequestData(4);
\r
1701 $.post(option.quickUpdateUrl, param, function (data) {
\r
1703 $(document).trigger("wdcal:updated");
\r
1704 if (data["IsSuccess"] == true) {
\r
1705 option.isloading = false;
\r
1706 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1709 option.onRequestDataError && option.onRequestDataError(4, data);
\r
1710 option.isloading = false;
\r
1711 d = rebyKey(id, true);
\r
1717 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1721 d = rebyKey(id, true);
\r
1723 d["start"] = start;
\r
1733 function quickadd(start, end, isallday, pos) {
\r
1734 if ((!option.quickAddHandler && option.quickAddUrl == "") || option.readonly) {
\r
1737 var buddle = $("#bbit-cal-buddle");
\r
1738 if (buddle.length == 0) {
\r
1740 temparr.push('<form id="bbit-cal-submitFORM">');
\r
1741 temparr.push('<div id="bbit-cal-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble">');
\r
1742 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
1743 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
1744 temparr.push('<table class="cb-table"><tbody><tr><th class="cb-key">');
\r
1745 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
1746 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
1747 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
1748 temparr.push(i18n.xgcalendar.create_event, '" type="submit"/> <a href="" class="lk bbit-cal-editLink">');
\r
1749 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
1750 temparr.push('</form>');
\r
1751 var tempquickAddHandler = temparr.join("");
\r
1753 $(document.body).append(tempquickAddHandler);
\r
1754 buddle = $("#bbit-cal-buddle");
\r
1755 $("#bubbleClose1").on("click", function () {
\r
1756 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1757 releasedragevent();
\r
1759 $("#bbit-cal-submitFORM").on("keyup", function (e) {
\r
1760 if (e.which == 27) $("#bubbleClose1").click();
\r
1762 $("#bbit-cal-submitFORM").on("submit", function (e) {
\r
1763 e.stopPropagation();
\r
1764 e.preventDefault();
\r
1765 if (option.isloading) {
\r
1768 option.isloading = true;
\r
1769 var what = $("#bbit-cal-what").val();
\r
1770 var datestart = $("#bbit-cal-start").val();
\r
1771 var dateend = $("#bbit-cal-end").val();
\r
1772 var allday = $("#bbit-cal-allday").val();
\r
1773 var f = /^[^\$<>]+$/.test(what);
\r
1775 alert(i18n.xgcalendar.invalid_title);
\r
1776 $("#bbit-cal-what").focus();
\r
1777 option.isloading = false;
\r
1781 { "name":"CalendarTitle", value:what },
\r
1782 { "name":"CalendarStartTime", value: Math.floor(datestart / 1000)},
\r
1783 { "name":"CalendarEndTime", value: Math.floor(dateend / 1000)},
\r
1784 { "name":"IsAllDayEvent", value:allday }
\r
1787 if (option.extParam) {
\r
1788 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1789 param[param.length] = option.extParam[pi];
\r
1793 if (option.quickAddHandler && $.isFunction(option.quickAddHandler)) {
\r
1794 option.quickAddHandler.call(this, param);
\r
1795 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1796 releasedragevent();
\r
1799 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1801 option.onBeforeRequestData && option.onBeforeRequestData(2);
\r
1803 var sd = new Date(datestart),
\r
1804 ed = new Date(dateend),
\r
1805 diff = DateDiff("d", sd, ed);
\r
1811 "is_allday":(allday == "1" ? 1 : 0),
\r
1812 "is_moredays":(diff > 0 ? 1 : 0),
\r
1814 "color":option.std_color,
\r
1816 "is_editable_quick":0,
\r
1820 tId = Ind(newdata);
\r
1821 releasedragevent();
\r
1824 $.post(option.quickAddUrl, param, function (data) {
\r
1825 option.isloading = false;
\r
1827 if (data["IsSuccess"] == true) {
\r
1829 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1832 option.onRequestDataError && option.onRequestDataError(2, data);
\r
1833 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1835 $(document).trigger("wdcal:updated");
\r
1842 buddle.on("mousedown", function (e) {
\r
1843 e.stopPropagation();
\r
1844 e.preventDefault();
\r
1848 var dateshow = CalDateShow(start, end, !isallday, true);
\r
1849 var off = getbuddlepos(pos.left, pos.top);
\r
1851 $("#prong2").hide()
\r
1854 $("#prong2").show()
\r
1856 $("#bbit-cal-buddle-timeshow").html(dateshow);
\r
1857 var calwhat = $("#bbit-cal-what").val("");
\r
1858 $("#bbit-cal-allday").val(isallday ? "1" : "0");
\r
1859 $("#bbit-cal-start").val(start.getTime());
\r
1860 $("#bbit-cal-end").val(end.getTime());
\r
1862 var addurl = option.baseurl + "new/?start=" + Math.floor($("#bbit-cal-start").val() / 1000) + "&end=" + Math.floor($("#bbit-cal-end").val() / 1000) + "&isallday=" + (isallday ? "1" : "0");
\r
1863 buddle.find(".bbit-cal-editLink").attr("href", addurl);
\r
1865 buddle.css({ "visibility":"visible", left:off.left, top:off.top });
\r
1866 calwhat.blur().focus(); //add 2010-01-26 blur() fixed chrome
\r
1867 $(document).one("mousedown", function () {
\r
1868 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1869 releasedragevent();
\r
1874 function formatDate(time, format) {
\r
1875 if (typeof(format) == "undefined") return $.datepicker.formatDate(option.date_format_full,time);
\r
1876 var time2 = $.datepicker.formatDate(format, time);
\r
1877 var h = time.getHours();
\r
1878 var i = time.getMinutes();
\r
1879 time2 = time2.replace("HH", (h > 10 ? "" : "0") + h);
\r
1880 time2 = time2.replace("ii", (i > 10 ? "" : "0") + i);
\r
1884 function rebyKey(key, remove) {
\r
1885 if (option.eventItems && option.eventItems.length > 0) {
\r
1886 var sl = option.eventItems.length;
\r
1888 for (var j = 0; j < sl; j++) {
\r
1889 if (option.eventItems[j]["uri"] == key) {
\r
1895 var t = option.eventItems[i];
\r
1897 option.eventItems.splice(i, 1);
\r
1905 function Ind(event, i) {
\r
1909 if (option.eventItems && option.eventItems.length > 0) {
\r
1910 var sl = option.eventItems.length;
\r
1911 var s = event["start"];
\r
1912 var d1 = s.getTime() - option.eventItems[0]["start"].getTime();
\r
1913 var d2 = option.eventItems[sl - 1]["start"].getTime() - s.getTime();
\r
1914 var diff = d1 - d2;
\r
1915 if (d1 < 0 || diff < 0) {
\r
1916 for (j = 0; j < sl; j++) {
\r
1917 if (option.eventItems[j]["start"] >= s) {
\r
1923 else if (d2 < 0) {
\r
1927 for (j = sl - 1; j >= 0; j--) {
\r
1928 if (option.eventItems[j]["start"] < s) {
\r
1942 if (option.eventItems && option.eventItems.length > 0) {
\r
1943 if (i == option.eventItems.length) {
\r
1944 option.eventItems.push(event);
\r
1947 option.eventItems.splice(i, d, event);
\r
1951 option.eventItems = [event];
\r
1957 function ResizeView() {
\r
1958 var _viewType = option.view;
\r
1959 if (_viewType == "day" || _viewType == "week" || _viewType == "multi_days") {
\r
1960 var $dvwkcontaienr = $gridcontainer.find(".wktopcontainer");
\r
1961 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
1962 if ($dvwkcontaienr.length == 0 || $dvtec.length == 0) {
\r
1963 alert(i18n.xgcalendar.view_no_ready);
\r
1966 var dvwkH = $dvwkcontaienr.height() + 2;
\r
1967 var calH = option.height - 8 - dvwkH;
\r
1968 $dvtec.height(calH);
\r
1969 if (typeof (option.scroll) == "undefined") {
\r
1970 var currentday = new Date();
\r
1971 var h = currentday.getHours();
\r
1972 var m = currentday.getMinutes();
\r
1973 var th = gP(h, m);
\r
1974 //var ch = $dvtec.attr("clientHeight");
\r
1975 var ch = $dvtec.height();
\r
1976 var sh = th - 0.5 * ch;
\r
1977 //var ph = $dvtec.attr("scrollHeight");
\r
1978 var ph = $dvtec.children().height();
\r
1979 if (sh < 0) sh = 0;
\r
1980 if (sh > ph - ch) sh = ph - ch - 10 * (23 - h);
\r
1981 //$dvtec.attr("scrollTop", sh);
\r
1982 $dvtec.scrollTop(sh);
\r
1985 $dvtec.scrollTop(option.scroll);
\r
1988 else if (_viewType == "month") {
\r
1989 //Resize GridContainer
\r
1993 function returnfalse() {
\r
1997 function initevents(viewtype) {
\r
1998 if (viewtype == "week" || viewtype == "day" || viewtype == "multi_days") {
\r
1999 $("div.chip", $gridcontainer).each(function () {
\r
2000 var chip = $(this);
\r
2001 chip.click(dayshow);
\r
2002 if (chip.hasClass("drag")) {
\r
2003 chip.mousedown(function (e) {
\r
2004 dragStart.call(this, "std_item_move", e);
\r
2005 e.stopPropagation();
\r
2006 e.preventDefault();
\r
2009 chip.find("div.resizer").mousedown(function (e) {
\r
2010 dragStart.call($(this).parent().parent(), "std_item_resize", e);
\r
2011 e.stopPropagation();
\r
2012 e.preventDefault();
\r
2016 chip.mousedown(returnfalse)
\r
2019 $("div.rb-o", $gridcontainer).each(function () {
\r
2020 var chip = $(this);
\r
2021 chip.click(dayshow);
\r
2022 if (chip.hasClass("drag") && (viewtype == "week" || viewtype == "multi_days")) {
\r
2024 chip.mousedown(function (e) {
\r
2025 dragStart.call(this, "fullday_item_move", e);
\r
2026 e.stopPropagation();
\r
2027 e.preventDefault();
\r
2031 chip.mousedown(returnfalse)
\r
2034 if (option.readonly == false) {
\r
2035 $("td.tg-col", $gridcontainer).each(function () {
\r
2036 $(this).mousedown(function (e) {
\r
2037 dragStart.call(this, "std_empty_drag", e);
\r
2038 e.stopPropagation();
\r
2039 e.preventDefault();
\r
2042 $gridcontainer.find(".weekViewAllDaywk").mousedown(function (e) {
\r
2043 dragStart.call(this, "fullday_empty_drag", e);
\r
2044 e.stopPropagation();
\r
2045 e.preventDefault();
\r
2049 if (viewtype == "week" || viewtype == "multi_days") {
\r
2050 $gridcontainer.find(".wktopcontainer th.gcweekname").each(function () {
\r
2051 $(this).click(weekormonthtoday);
\r
2057 else if (viewtype = "month") {
\r
2058 $("div.rb-o", $gridcontainer).each(function () {
\r
2059 var chip = $(this);
\r
2060 chip.click(dayshow);
\r
2061 if (chip.hasClass("drag")) {
\r
2063 chip.mousedown(function (e) {
\r
2064 dragStart.call(this, "std_item_month_drag", e);
\r
2065 e.stopPropagation();
\r
2066 e.preventDefault();
\r
2070 chip.mousedown(returnfalse)
\r
2073 $("td.st-more", $gridcontainer).each(function () {
\r
2075 $(this).on("click", function (e) {
\r
2076 moreshow.call(this, $(this).parent().parent().parent().parent()[0]);
\r
2077 e.stopPropagation();
\r
2078 e.preventDefault();
\r
2079 }).on("mousedown", function (e) {
\r
2080 e.stopPropagation();
\r
2081 e.preventDefault();
\r
2084 if (option.readonly == false) {
\r
2085 $gridcontainer.find(".mvEventContainer").mousedown(function (e) {
\r
2086 dragStart.call(this, "empty_month_drag", e);
\r
2087 e.stopPropagation();
\r
2088 e.preventDefault();
\r
2095 function releasedragevent() {
\r
2098 _dragevent = null;
\r
2102 function dragStart(type, e) {
\r
2103 var w, h, offset, moffset, left, top, l, py, pw, xa, ya, i, data, fdi, dp, yl;
\r
2104 var $obj = $(this);
\r
2105 releasedragevent();
\r
2107 case "std_empty_drag":
\r
2108 _dragdata = { type:"std_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY };
\r
2110 case "fullday_empty_drag":
\r
2112 h = $obj.height();
\r
2113 offset = $obj.offset();
\r
2114 left = offset.left;
\r
2116 l = option.view == "day" ? 1 : 7;
\r
2118 pw = parseInt(w / l);
\r
2119 if (py > l / 2 + 1) {
\r
2124 for (i = 0; i < l; i++) {
\r
2125 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2127 ya.push({ s:top, e:top + h });
\r
2128 _dragdata = { type:"fullday_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2129 w = left = l = py = pw = xa = null;
\r
2131 case "std_item_move":
\r
2132 var evid = $obj.parent().data("col");
\r
2133 var p = $obj.parent();
\r
2134 var pos = p.offset();
\r
2135 w = p.width() + 10;
\r
2136 h = $obj.height();
\r
2137 data = $obj.data("eventdata");
\r
2138 _dragdata = { type:"std_item_move", target:$obj, sx:e.pageX, sy:e.pageY,
\r
2139 pXMin:pos.left, pXMax:pos.left + w, pw:w, h:h,
\r
2140 cdi:parseInt(evid), fdi:parseInt(evid), data:data
\r
2143 case "std_item_resize":
\r
2144 h = $obj.height();
\r
2145 data = $obj.data("eventdata");
\r
2146 _dragdata = { type:"std_item_resize", target:$obj, sx:e.pageX, sy:e.pageY, h:h, data:data };
\r
2148 case "fullday_item_move":
\r
2149 var con = $gridcontainer.find(".weekViewAllDaywk");
\r
2152 offset = con.offset();
\r
2153 moffset = $obj.offset();
\r
2154 left = offset.left;
\r
2158 pw = parseInt(w / l);
\r
2159 if (py > l / 2 + 1) {
\r
2165 for (i = 0; i < l; i++) {
\r
2166 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2167 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2171 fdi = { x:di, y:0, di:di };
\r
2172 ya.push({ s:top, e:top + h });
\r
2173 data = $obj.data("eventdata");
\r
2174 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2175 _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
2177 case "empty_month_drag":
\r
2179 offset = $obj.offset();
\r
2180 left = offset.left;
\r
2183 yl = $obj.children().length;
\r
2185 pw = parseInt(w / l);
\r
2186 if (py > l / 2 + 1) {
\r
2189 h = $gridcontainer.find(".mvrow_0").height();
\r
2192 for (i = 0; i < l; i++) {
\r
2193 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2197 for (i = 0; i < l; i++) {
\r
2198 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2200 for (i = 0; i < yl; i++) {
\r
2201 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2203 _dragdata = { type:"empty_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2205 case "std_item_month_drag":
\r
2206 var row0 = $gridcontainer.find(".mvrow_0");
\r
2207 var row1 = $gridcontainer.find(".mvrow_1");
\r
2209 offset = row0.offset();
\r
2210 var diffset = row1.offset();
\r
2211 moffset = $obj.offset();
\r
2212 h = diffset.top - offset.top;
\r
2213 left = offset.left;
\r
2216 yl = row0.parent().children().length;
\r
2218 pw = parseInt(w / l);
\r
2219 if (py > l / 2 + 1) {
\r
2226 for (i = 0; i < l; i++) {
\r
2227 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2228 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2232 for (i = 0; i < yl; i++) {
\r
2233 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2234 if (moffset.top >= ya[i].s && moffset.top < ya[i].e) {
\r
2238 fdi = { x:xi, y:yi, di:yi * 7 + xi };
\r
2239 data = $obj.data("eventdata");
\r
2240 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2241 _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
2244 $('body').noSelect();
\r
2247 function dragMove(e) {
\r
2248 var d, sy, sx, x, y, diffy, gh, ny, tempdata, cpwrap, ndi, evid, nh, cp, w1;
\r
2250 if (e.pageX < 0 || e.pageY < 0
\r
2251 || e.pageX > document.documentElement.clientWidth
\r
2252 || e.pageY >= document.documentElement.clientHeight) {
\r
2258 case "std_empty_drag":
\r
2262 if (diffy > (option.hour_height / 4) || diffy < (-1 * (option.hour_height / 4)) || d.cpwrap) {
\r
2264 diffy = Math.ceil(option.hour_height / 2);
\r
2266 var dy = diffy % Math.ceil(option.hour_height / 2);
\r
2268 diffy = dy > 0 ? diffy + Math.ceil(option.hour_height / 2) - dy : diffy - Math.ceil(option.hour_height / 2) - dy;
\r
2271 sy = sy + Math.ceil(option.hour_height / 2);
\r
2275 d.tp = $(d.target).offset().top;
\r
2277 gh = gH(sy, y, d.tp);
\r
2278 ny = gP(gh.sh, gh.sm);
\r
2280 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2281 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2282 $(d.target).find("div.tg-col-overlaywrapper").append(cpwrap);
\r
2283 d.cpwrap = cpwrap;
\r
2286 if (d.cgh.sh != gh.sh || d.cgh.eh != gh.eh || d.cgh.sm != gh.sm || d.cgh.em != gh.em) {
\r
2287 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2288 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2294 case "fullday_empty_drag":
\r
2298 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2300 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2301 $(document.body).append(d.lasso);
\r
2304 d.sdi = getdi(d.xa, d.ya, sx, d.sy);
\r
2306 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2307 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2308 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2313 case "empty_month_drag":
\r
2320 if (diffx > 5 || diffx < -5 || diffy < -5 || diffy > 5 || d.lasso) {
\r
2322 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2323 $(document.body).append(d.lasso);
\r
2326 d.sdi = getdi(d.xa, d.ya, sx, sy);
\r
2328 ndi = getdi(d.xa, d.ya, x, y);
\r
2329 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2330 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2335 case "std_item_move":
\r
2337 if (data != null && data["is_editable_quick"] == 1) {
\r
2344 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.cpwrap) {
\r
2346 gh = { sh:data["start"].getHours(),
\r
2347 sm:data["start"].getMinutes(),
\r
2348 eh:data["end"].getHours(),
\r
2349 em:data["end"].getMinutes(),
\r
2353 ny = gP(gh.sh, gh.sm);
\r
2355 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);
\r
2356 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2357 evid = ".tgOver" + d.target.parent().data("col");
\r
2358 $gridcontainer.find(evid).append(cpwrap);
\r
2359 d.cpwrap = cpwrap;
\r
2364 if (x < d.pXMin) {
\r
2367 else if (x > d.pXMax) {
\r
2372 d.cdi = d.cdi + pd;
\r
2373 var ov = $gridcontainer.find(".tgOver" + d.cdi);
\r
2374 if (ov.length == 1) {
\r
2375 d.pXMin = d.pXMin + d.pw * pd;
\r
2376 d.pXMax = d.pXMax + d.pw * pd;
\r
2377 ov.append(d.cpwrap);
\r
2380 d.cdi = d.cdi - pd;
\r
2383 ny = d.top + diffy;
\r
2384 var pny = ny % Math.ceil(option.hour_height / 2);
\r
2389 //log.info("ny=" + ny);
\r
2390 gh = gW(ny, ny + d.h);
\r
2391 //log.info("sh=" + gh.sh + ",sm=" + gh.sm);
\r
2392 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);
\r
2393 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2401 case "std_item_resize":
\r
2402 var data = d.data;
\r
2403 if (data != null && data["is_editable_quick"] == 1) {
\r
2407 if (diffy != 0 || d.cpwrap) {
\r
2409 gh = { sh:data["start"].getHours(),
\r
2410 sm:data["start"].getMinutes(),
\r
2411 eh:data["end"].getHours(),
\r
2412 em:data["end"].getMinutes(),
\r
2416 ny = gP(gh.sh, gh.sm);
\r
2418 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);
\r
2419 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2420 evid = ".tgOver" + d.target.parent().data("col");
\r
2421 $gridcontainer.find(evid).append(cpwrap);
\r
2422 d.cpwrap = cpwrap;
\r
2426 var pnh = nh % Math.ceil(option.hour_height / 2);
\r
2427 nh = pnh > 1 ? nh - pnh + Math.ceil(option.hour_height / 2) : nh - pnh;
\r
2429 gh = gW(d.top, d.top + nh);
\r
2430 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);
\r
2431 d.cpwrap.html(tempdata);
\r
2438 case "fullday_item_move":
\r
2443 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2445 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2446 cp = d.target.clone();
\r
2448 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2450 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2451 d.cpwrap = cpwrap;
\r
2452 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2453 $(document.body).append(d.lasso);
\r
2454 cp = cpwrap = null;
\r
2456 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2457 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2458 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2459 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2464 case "std_item_month_drag":
\r
2469 var diffx = x - sx;
\r
2471 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.lasso) {
\r
2473 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2474 cp = d.target.clone();
\r
2476 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2478 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2479 d.cpwrap = cpwrap;
\r
2480 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2481 $(document.body).append(d.lasso);
\r
2482 cp = cpwrap = null;
\r
2484 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2485 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2486 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2487 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2497 function dragEnd(e) {
\r
2499 var d = _dragdata;
\r
2500 var tp, start, end, gh;
\r
2502 case "std_empty_drag": //day view
\r
2503 var wrapid = new Date().getTime();
\r
2504 tp = d.target.offset().top;
\r
2506 gh = gH(d.sy, d.sy + option.hour_height, tp);
\r
2507 var ny = gP(gh.sh, gh.sm);
\r
2508 var tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2509 d.cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2510 $(d.target).find("div.tg-col-overlaywrapper").append(d.cpwrap);
\r
2513 var pos = d.cpwrap.offset();
\r
2514 pos.left = pos.left + 30;
\r
2515 d.cpwrap.attr("id", wrapid);
\r
2516 start = new Date(parseInt(d.target.data("abbr")) + (d.cgh.sh * 3600 + d.cgh.sm * 60) * 1000);
\r
2517 end = new Date(parseInt(d.target.data("abbr")) + (d.cgh.eh * 3600 + d.cgh.em * 60) * 1000);
\r
2518 _dragevent = function () {
\r
2519 $("#" + wrapid).remove();
\r
2520 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
2522 quickadd(start, end, false, pos);
\r
2524 case "fullday_empty_drag": //week view
\r
2525 case "empty_month_drag": //month view
\r
2526 var source = e.srcElement || e.target;
\r
2527 var lassoid = new Date().getTime();
\r
2529 if ($(source).hasClass("monthdayshow")) {
\r
2530 weekormonthtoday.call($(source).parent()[0], e);
\r
2533 d.fdi = d.sdi = getdi(d.xa, d.ya, d.sx, d.sy);
\r
2534 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2535 $(document.body).append(d.lasso);
\r
2536 addlasso(d.lasso, d.sdi, d.fdi, d.xa, d.ya, d.h);
\r
2538 d.lasso.attr("id", lassoid);
\r
2539 var si = Math.min(d.fdi.di, d.sdi.di);
\r
2540 var ei = Math.max(d.fdi.di, d.sdi.di);
\r
2541 var firstday = option.vstart;
\r
2542 start = DateAdd("d", si, firstday);
\r
2543 end = DateAdd("d", ei, firstday);
\r
2544 _dragevent = function () {
\r
2545 $("#" + lassoid).remove();
\r
2547 quickadd(start, end, true, { left:e.pageX, top:e.pageY });
\r
2549 case "std_item_move": // event moving
\r
2551 start = DateAdd("d", d.cdi, option.vstart);
\r
2552 end = DateAdd("d", d.cdi, option.vstart);
\r
2553 gh = gW(d.ny, d.ny + d.h);
\r
2554 start.setHours(gh.sh, gh.sm);
\r
2555 end.setHours(gh.eh, gh.em);
\r
2556 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2557 d.cpwrap.remove();
\r
2561 dayupdate(d.data, start, end);
\r
2565 case "std_item_resize": //Resize
\r
2567 start = new Date(d.data["start"].toString());
\r
2568 end = new Date(d.data["end"].toString());
\r
2569 gh = gW(d.top, d.top + d.nh);
\r
2570 start.setHours(gh.sh, gh.sm);
\r
2571 end.setHours(gh.eh, gh.em);
\r
2572 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2573 d.cpwrap.remove();
\r
2577 dayupdate(d.data, start, end);
\r
2581 case "fullday_item_move":
\r
2582 case "std_item_month_drag":
\r
2584 d.cpwrap.remove();
\r
2586 start = new Date(d.data["start"].toString());
\r
2587 end = new Date(d.data["end"].toString());
\r
2588 var currrentdate = DateAdd("d", d.cdi.di, option.vstart);
\r
2589 var diff = DateDiff("d", start, currrentdate);
\r
2590 start = DateAdd("d", diff, start);
\r
2591 end = DateAdd("d", diff, end);
\r
2592 if (start.getTime() != d.data["start"].getTime() || end.getTime() != d.data["end"].getTime()) {
\r
2593 dayupdate(d.data, start, end);
\r
2598 d = _dragdata = null;
\r
2599 $('body').noSelect(false);
\r
2605 function getdi(xa, ya, x, y) {
\r
2610 if (xa && xa.length != 0) {
\r
2612 if (x >= xa[lx - 1].e) {
\r
2616 for (var i = 0; i < lx; i++) {
\r
2617 if (x > xa[i].s && x <= xa[i].e) {
\r
2624 if (ya && ya.length != 0) {
\r
2626 if (y >= ya[ly - 1].e) {
\r
2630 for (var j = 0; j < ly; j++) {
\r
2631 if (y > ya[j].s && y <= ya[j].e) {
\r
2638 return { x:tx, y:ty, di:ty * lx + tx };
\r
2641 function addlasso(lasso, sdi, edi, xa, ya, height) {
\r
2642 var diff = sdi.di > edi.di ? sdi.di - edi.di : edi.di - sdi.di;
\r
2644 var sp = sdi.di > edi.di ? edi : sdi;
\r
2645 var l = xa.length > 0 ? xa.length : 1;
\r
2646 var h = ya.length > 0 ? ya.length : 1;
\r
2648 var width = xa[0].e - xa[0].s;
\r
2651 var max = Math.min(document.documentElement.clientWidth, xa[l - 1].e) - 2;
\r
2653 while (j < h && diff > 0) {
\r
2654 var left = xa[i].s;
\r
2655 var d = i + diff > l ? l - i : diff;
\r
2656 var wid = width * d;
\r
2657 while (left + wid >= max) {
\r
2660 play.push(Tp(__LASSOTEMP, { left:left, top:ya[j].s, height:height, width:wid }));
\r
2665 lasso.html(play.join(""));
\r
2668 function fixcppostion(cpwrap, e, xa, ya) {
\r
2669 var x = e.pageX - 6;
\r
2670 var y = e.pageY - 4;
\r
2671 var w = cpwrap.width();
\r
2673 var lmin = xa[0].s + 6;
\r
2674 var tmin = ya[0].s + 4;
\r
2675 var lmax = xa[xa.length - 1].e - w - 2;
\r
2676 var tmax = ya[ya.length - 1].e - h - 2;
\r
2689 cpwrap.css({ left:x, top:y });
\r
2693 .mousemove(dragMove)
\r
2694 .mouseup(dragEnd);
\r
2695 //.mouseout(dragEnd);
\r
2698 sv:function (view) { //switch view
\r
2699 if (view == option.view) {
\r
2703 option.view = view;
\r
2714 option.showday = d;
\r
2720 switch (option.view) {
\r
2722 option.showday = DateAdd("d", -1, option.showday);
\r
2725 option.showday = DateAdd("w", -1, option.showday);
\r
2727 case "multi_days":
\r
2728 option.showday = DateAdd("w", -1, option.showday);
\r
2731 option.showday = DateAdd("m", -1, option.showday);
\r
2738 switch (option.view) {
\r
2740 option.showday = DateAdd("d", 1, option.showday);
\r
2743 option.showday = DateAdd("w", 1, option.showday);
\r
2745 case "multi_days":
\r
2746 option.showday = DateAdd("w", 1, option.showday);
\r
2749 var od = option.showday.getDate();
\r
2750 option.showday = DateAdd("m", 1, option.showday);
\r
2751 var nd = option.showday.getDate();
\r
2752 if (od != nd) //we go to the next month
\r
2754 option.showday = DateAdd("d", 0 - nd, option.showday); //last day of last month
\r
2765 option = $.extend(option, p);
\r
2773 * @description {Method} switchView To switch to another view.
\r
2774 * @param {String} view View name, one of 'day', 'week', 'multi_days', 'month'.
\r
2776 $.fn.switchView = function (view) {
\r
2777 return this.each(function () {
\r
2779 this.bcal.sv(view);
\r
2785 * @description {Method} reload To reload event of current time range.
\r
2787 $.fn.reload = function () {
\r
2788 return this.each(function () {
\r
2796 * @description {Method} gotoDate To go to a range containing date.
\r
2797 * If view is week, it will go to a week containing date.
\r
2798 * If view is month, it will got to a month containing date.
\r
2799 * @param {Date} d. Date to go.
\r
2801 $.fn.gotoDate = function (d) {
\r
2802 return this.each(function () {
\r
2810 * @description {Method} previousRange To go to previous date range.
\r
2811 * If view is week, it will go to previous week.
\r
2812 * If view is month, it will got to previous month.
\r
2814 $.fn.previousRange = function () {
\r
2815 return this.each(function () {
\r
2823 * @description {Method} nextRange To go to next date range.
\r
2824 * If view is week, it will go to next week.
\r
2825 * If view is month, it will got to next month.
\r
2827 $.fn.nextRange = function () {
\r
2828 return this.each(function () {
\r
2836 $.fn.BcalGetOp = function () {
\r
2837 if (this[0].bcal) {
\r
2838 return this[0].bcal.go();
\r
2844 $.fn.BcalSetOp = function (p) {
\r
2845 if (this[0].bcal) {
\r
2846 return this[0].bcal.so(p);
\r