2 * @description {Class} wdCalendar
\r
3 * This is the main class of wdCalendar.
\r
8 var __WDAY = $.datepicker._defaults.dayNamesShort;
\r
9 //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
10 var __MonthName = $.datepicker._defaults.monthNamesShort;
\r
11 //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
14 function dateFormat(format) {
\r
16 "M+":this.getMonth() + 1,
\r
17 "d+":this.getDate(),
\r
18 "h+":this.getHours(),
\r
19 "H+":this.getHours(),
\r
20 "m+":this.getMinutes(),
\r
21 "s+":this.getSeconds(),
\r
22 "q+":Math.floor((this.getMonth() + 3) / 3),
\r
23 "w":"0123456".indexOf(this.getDay()),
\r
24 "W":__WDAY[this.getDay()],
\r
25 "L":__MonthName[this.getMonth()] //non-standard
\r
27 if (/(y+)/.test(format)) {
\r
28 format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
\r
31 if (new RegExp("(" + k + ")").test(format))
\r
32 format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
\r
37 function DateDiff(interval, d1, d2) {
\r
41 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());
\r
42 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate());
\r
45 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours());
\r
46 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours());
\r
49 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours(), d1.getMinutes());
\r
50 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes());
\r
53 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate(), d1.getHours(), d1.getMinutes(), d1.getSeconds());
\r
54 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes(), d2.getSeconds());
\r
57 var t1 = d1.getTime(), t2 = d2.getTime();
\r
61 diff = d2.getFullYear() - d1.getFullYear();
\r
64 diff = (d2.getFullYear() - d1.getFullYear()) * 12 + d2.getMonth() - d1.getMonth();
\r
67 diff = Math.floor(t2 / 86400000) - Math.floor(t1 / 86400000);
\r
70 diff = Math.floor((t2 + 345600000) / (604800000)) - Math.floor((t1 + 345600000) / (604800000));
\r
73 diff = Math.floor(t2 / 3600000) - Math.floor(t1 / 3600000);
\r
76 diff = Math.floor(t2 / 60000) - Math.floor(t1 / 60000);
\r
79 diff = Math.floor(t2 / 1000) - Math.floor(t1 / 1000);
\r
89 function DateAdd(interval, number, idate) {
\r
90 number = parseInt(number);
\r
92 if (typeof (idate) == "string") {
\r
93 date = idate.split(/\D/);
\r
94 eval("var date = new Date(" + date.join(",") + ")");
\r
97 if (typeof (idate) == "object") {
\r
98 date = new Date(idate.toString());
\r
100 switch (interval) {
\r
102 date.setFullYear(date.getFullYear() + number);
\r
105 date.setMonth(date.getMonth() + number);
\r
108 date.setDate(date.getDate() + number);
\r
111 date.setDate(date.getDate() + 7 * number);
\r
114 date.setHours(date.getHours() + number);
\r
117 date.setMinutes(date.getMinutes() + number);
\r
120 date.setSeconds(date.getSeconds() + number);
\r
123 date.setMilliseconds(date.getMilliseconds() + number);
\r
129 function ColorrCalcBrighten(col, factor) {
\r
130 return 255-Math.round((255 - col) * factor);
\r
132 function ColorCalcValues(basecol) {
\r
133 if (!basecol.match(/^#[0-9a-f]{6}$/i)) return ColorCalcValues("#f8f8ff");
\r
134 var r = parseInt(basecol.substring(1, 3), 16);
\r
135 var g = parseInt(basecol.substring(3, 5), 16);
\r
136 var b = parseInt(basecol.substring(5, 7), 16);
\r
137 var col1 = "#" + ColorrCalcBrighten(r, 0.6).toString(16) + ColorrCalcBrighten(g, 0.6).toString(16) + ColorrCalcBrighten(b, 0.6).toString(16);
\r
138 var col2 = "#" + ColorrCalcBrighten(r, 0.5).toString(16) + ColorrCalcBrighten(g, 0.5).toString(16) + ColorrCalcBrighten(b, 0.5).toString(16);
\r
139 return [basecol, col1, col2];
\r
143 if ($.fn.noSelect == undefined) {
\r
144 $.fn.noSelect = function (p) { //no select addon by me :-)
\r
151 return this.each(function () {
\r
152 if ($.browser.msie || $.browser.safari) $(this).bind('selectstart', function () {
\r
155 else if ($.browser.mozilla) {
\r
156 $(this).css('MozUserSelect', 'none');
\r
157 $('body').trigger('focus');
\r
159 else if ($.browser.opera) $(this).bind('mousedown', function () {
\r
162 else $(this).data('unselectable', 'on');
\r
166 return this.each(function () {
\r
167 if ($.browser.msie || $.browser.safari) $(this).unbind('selectstart');
\r
168 else if ($.browser.mozilla) $(this).css('MozUserSelect', 'inherit');
\r
169 else if ($.browser.opera) $(this).unbind('mousedown');
\r
170 else $(this).removeData('unselectable', 'on');
\r
176 $.fn.bcalendar = function (option) {
\r
179 * @description {Config} view
\r
180 * {String} Three calendar view provided, 'day','multi_days','week','month'. 'week' by default.
\r
184 date_format_dm1:"W, d.M",
\r
185 date_format_dm2:"d. L",
\r
186 date_format_dm3:"d L yyyy",
\r
187 date_format_full:"yy-mm-dd",
\r
190 * @description {Config} weekstartday
\r
191 * {Number} First day of week 0 for Sun, 1 for Mon, 2 for Tue.
\r
193 weekstartday:1, //start from Monday by default
\r
194 std_color: "#5858ff",
\r
196 * @description {Config} height
\r
197 * {Number} Calendar height, false for page height by default.
\r
202 * @description {Config} url
\r
203 * {String} Url to request calendar data.
\r
208 * @description {Config} eventItems
\r
209 * {Array} event items for initialization.
\r
214 * @description {Config} showday
\r
215 * {Date} Current date. today by default.
\r
217 showday:new Date(),
\r
219 * @description {Event} onBeforeRequestData:function(stage)
\r
220 * Fired before any ajax request is sent.
\r
221 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
223 onBeforeRequestData:false,
\r
225 * @description {Event} onAfterRequestData:function(stage)
\r
226 * Fired before any ajax request is finished.
\r
227 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
229 onAfterRequestData:false,
\r
231 * @description {Event} onAfterRequestData:function(stage)
\r
232 * Fired when some errors occur while any ajax request is finished.
\r
233 * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.
\r
235 onRequestDataError:false,
\r
237 onWeekOrMonthToDay:false,
\r
240 * @description {Event} quickAddHandler:function(calendar, param )
\r
241 * Fired when user quick adds an item. If this function is set, ajax request to quickAddUrl will abort.
\r
242 * @param {Object} calendar Calendar object.
\r
243 * @param {Array} param Format [{name:"name1", value:"value1"}, ...]
\r
246 quickAddHandler:false,
\r
248 quickUpdateHandler:false,
\r
250 quickDeleteHandler: false,
\r
252 * @description {Config} quickAddUrl
\r
253 * {String} Url for quick adding.
\r
257 * @description {Config} quickUpdateUrl
\r
258 * {String} Url for time span update.
\r
262 * @description {Config} quickDeleteUrl
\r
263 * {String} Url for removing an event.
\r
267 * @description {Config} autoload
\r
268 * {Boolean} If event items is empty, and this param is set to true.
\r
269 * Event will be retrieved by ajax call right after calendar is initialized.
\r
273 * @description {Config} readonly
\r
274 * {Boolean} Indicate calendar is readonly or editable
\r
278 * @description {Config} extParam
\r
279 * {Array} Extra params submitted to server.
\r
280 * Sample - [{name:"param1", value:"value1"}, {name:"param2", value:"value2"}]
\r
284 * @description {Config} enableDrag
\r
285 * {Boolean} Whether end user can drag event item by mouse.
\r
292 calendars_available:[],
\r
293 calendars_selected:[]
\r
295 var eventDiv = $("#gridEvent");
\r
296 if (eventDiv.length == 0) {
\r
297 eventDiv = $("<div id='gridEvent' style='display:none;'></div>").appendTo(document.body);
\r
299 var $gridcontainer = $(this);
\r
300 option = $.extend(def, option);
\r
302 //no quickUpdateUrl, dragging disabled.
\r
303 if (option.quickUpdateUrl == null || option.quickUpdateUrl == "") {
\r
304 option.enableDrag = false;
\r
306 //template for month and date
\r
307 var __SCOLLEVENTTEMP = "<DIV style=\"width:{width};top:{top};left:{left};\" title=\"{title}\" class=\"chip chip{i} {drag} {addclasses}\">" +
\r
308 "<DIV style=\"border-bottom-color:{bdcolor}\" class=ct> </DIV>" +
\r
309 "<DL style=\"border-color:{bdcolor}; background-color:{bgcolor1}; height: {height}px;\"><DT style=\"background-color:{bgcolor2}\">{starttime} - {endtime} {icon}</DT>" +
\r
310 "<DD><SPAN>{content}</SPAN></DD><DIV class='resizer' style='display:{redisplay}'><DIV class=rszr_icon> </DIV></DIV></DL>" +
\r
311 "<DIV style=\"BORDER-BOTTOM-COLOR:{bdcolor}; background-color:{bgcolor1}; border-color: {bdcolor};\" class=cb1> </DIV>" +
\r
312 "<DIV style=\"border-color:{bdcolor};\" class=cb2> </DIV></DIV>";
\r
313 var __ALLDAYEVENTTEMP = '<div class="rb-o {eclass}" id="{id}" title="{title}" style="color:{color};">' +
\r
314 '<div class="{extendClass} rb-m" style="background-color:{color}">{extendHTML}<div class="rb-i">{content}</div></div></div>';
\r
315 var __MonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
\r
316 var __LASSOTEMP = "<div class='drag-lasso' style=\"left:{left}px;top:{top}px;width:{width}px;height:{height}px;\"> </div>";
\r
324 //no height specified in options, we get page height.
\r
325 if (!option.height) {
\r
326 option.height = document.documentElement.clientHeight;
\r
329 $gridcontainer.css("overflow-y", "visible").height(option.height - 8);
\r
331 //populate events data for first display.
\r
332 if (option.url && option.autoload) {
\r
341 function clearcontainer() {
\r
342 $gridcontainer.empty();
\r
347 function render() {
\r
349 //viewType, showday, events, config
\r
350 var showday = new Date(option.showday.getFullYear(), option.showday.getMonth(), option.showday.getDate());
\r
351 var events = option.eventItems;
\r
352 var config = { view:option.view, weekstartday:option.weekstartday, color:option.std_color };
\r
353 if (option.view == "day" || option.view == "week" || option.view == "multi_days") {
\r
354 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
355 if ($dvtec.length > 0) {
\r
356 option.scroll = $dvtec.scrollTop(); //get scroll bar position
\r
359 switch (option.view) {
\r
361 BuildDaysAndWeekView(showday, 1, events, config);
\r
364 BuildDaysAndWeekView(showday, 7, events, config);
\r
367 BuildDaysAndWeekView(showday, option.num_days, events, config);
\r
370 BuildMonthView(showday, events, config);
\r
373 alert(i18n.xgcalendar["no_implement"]);
\r
376 initevents(option.view);
\r
381 function BuildDaysAndWeekView(startday, l, events, config) {
\r
385 show = dateFormat.call(startday, option.date_format_dm1);
\r
386 days.push({ display:show, date:startday, day:startday.getDate(), year:startday.getFullYear(), month:startday.getMonth() + 1 });
\r
387 option.datestrshow = CalDateShow(days[0].date);
\r
388 option.vstart = days[0].date;
\r
389 option.vend = days[0].date;
\r
394 w = config.weekstartday - startday.getDay();
\r
395 if (w > 0) w = w - 7;
\r
398 for (var i = w, j = 0; j < l; i = i + 1, j++) {
\r
399 ndate = DateAdd("d", i, startday);
\r
400 show = dateFormat.call(ndate, option.date_format_dm1);
\r
401 days.push({ display:show, date:ndate, day:ndate.getDate(), year:ndate.getFullYear(), month:ndate.getMonth() + 1 });
\r
403 option.vstart = days[0].date;
\r
404 option.vend = days[l - 1].date;
\r
405 option.datestrshow = CalDateShow(days[0].date, days[l - 1].date);
\r
408 var allDayEvents = [];
\r
409 var scrollDayEvents = [];
\r
410 //get number of all-day events, including more-than-one-day events.
\r
411 var dM = PrepareEvents(days, events, allDayEvents, scrollDayEvents);
\r
413 var $html = $("<div class=\"wktopcontainer\"></div>");
\r
414 $html.append(BuildWT(days, allDayEvents, dM));
\r
416 $gridcontainer.html("").append($html);
\r
418 $html = $("<div class=\"scrolltimeevent\"></div>");
\r
419 $html.append(BuildDayScollEventContainer(days, scrollDayEvents));
\r
420 $gridcontainer.append($html);
\r
422 //TODO event handlers
\r
423 //$gridcontainer.find(".weekViewAllDaywk").click(RowHandler);
\r
427 function BuildMonthView(showday, events, config) {
\r
428 $gridcontainer.find("*").remove();
\r
429 $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
432 html.push("<div id=\"mvcontainer\" class=\"mv-container\">");
\r
433 html.push("<table id=\"mvweek\" class=\"mv-daynames-table\"><tbody><tr>");
\r
434 for (var i = config.weekstartday, j = 0; j < 7; i++, j++) {
\r
436 html.push("<th class=\"mv-dayname\" title=\"", __WDAY[i], "\">", __WDAY[i], "");
\r
438 html.push("</tr></tbody></table>");
\r
439 html.push("</div>");
\r
440 $gridcontainer.append(html.join(""));
\r
442 var bH = GetMonthViewBodyHeight() - GetMonthViewHeaderHeight();
\r
443 var $container = $("<div class=\"mvEventContainer mv-event-container\" style=\"height:" + bH + "px;" + "\"></div>");
\r
444 var $body = BuilderMonthBody(showday, config.weekstartday, events, bH);
\r
445 $container.append($body);
\r
446 $gridcontainer.append($container);
\r
448 $gridcontainer.find(".cal-month-closebtn").click(closeCc);
\r
451 function closeCc() {
\r
452 $gridcontainer.find(".cal-month-cc").css("visibility", "hidden");
\r
455 //all-day event, including more-than-one-day events
\r
456 function PrepareEvents(dayarrs, events, allDayEvents, scrolLDayEvents) {
\r
457 var i, j, k, de, x, y, La, H, D, Ia,
\r
458 tmp_allday = allDayEvents,
\r
459 tmp_scrollevents = scrolLDayEvents,
\r
460 l = dayarrs.length,
\r
461 el = events.length,
\r
463 for (j = 0; j < el; j++) {
\r
464 var sD = events[j]["start"];
\r
465 var eD = events[j]["end"];
\r
467 s.event = events[j];
\r
468 s.day = sD.getDate();
\r
469 s.year = sD.getFullYear();
\r
470 s.month = sD.getMonth() + 1;
\r
471 s.allday = events[j]["is_allday"] == 1;
\r
472 s.crossday = events[j]["is_moredays"] == 1;
\r
473 s.reevent = events[j]["is_recurring"] == 1; //Recurring event
\r
474 s.daystr = [s.year, s.month, s.day].join("/");
\r
476 s.st.hour = sD.getHours();
\r
477 s.st.minute = sD.getMinutes();
\r
478 s.st.p = s.st.hour * 60 + s.st.minute; // start time
\r
480 s.et.hour = eD.getHours();
\r
481 s.et.minute = eD.getMinutes();
\r
482 s.et.p = s.et.hour * 60 + s.et.minute; // end time
\r
486 for (i = 0; i < l; i++) {
\r
487 var da = dayarrs[i];
\r
488 tmp_scrollevents[i] = [];
\r
489 tmp_allday[i] = [];
\r
490 da.daystr = da.year + "/" + da.month + "/" + da.day;
\r
491 for (j = 0; j < fE.length; j++) {
\r
492 if (!fE[j].crossday && !fE[j].allday) {
\r
493 if (da.daystr == fE[j].daystr)
\r
494 tmp_scrollevents[i].push(fE[j]);
\r
497 if (da.daystr == fE[j].daystr) {
\r
498 tmp_allday[i].push(fE[j]);
\r
502 if (i == 0 && da.date >= fE[j].event["start"] && da.date <= fE[j].event["end"])//first more-than-one-day event
\r
504 tmp_allday[i].push(fE[j]);
\r
511 var lrdate = dayarrs[l - 1].date;
\r
512 for (i = 0; i < l; i++) { //to deal with more-than-one-day event
\r
513 de = tmp_allday[i];
\r
514 if (de.length > 0) { //
\r
515 for (j = 0; j < de.length; j++) {
\r
516 var end = DateDiff("d", lrdate, de[j].event["end"]) > 0 ? lrdate : de[j].event["end"];
\r
517 de[j].colSpan = DateDiff("d", dayarrs[i].date, end) + 1
\r
522 //for all-day events
\r
523 for (i = 0; i < l; i++) {
\r
524 de = tmp_scrollevents[i];
\r
525 if (de.length > 0) {
\r
529 var dl = de.length;
\r
530 for (j = 0; j < dl; ++j) {
\r
532 for (La = ge.st.p, Ia = 0; y[Ia] > La;) Ia++;
\r
534 ge.ne = []; //PO is how many events before this one
\r
535 y[Ia] = ge.et.p || 1440;
\r
542 ge.pe = [x[Ia - 1]]; //previous event
\r
543 x[Ia - 1].ne.push(ge); //next event
\r
545 for (Ia = Ia + 1; y[Ia] <= La;) Ia++;
\r
551 ge.width = 1 / (ge.PO + 1);
\r
552 ge.left = 1 - ge.width;
\r
554 k = Array.prototype.concat.apply([], D);
\r
557 for (y = t; y--;) {
\r
561 for (D = x.ne.length; D--;) {
\r
563 La = Math.max(La, Ia.VL);
\r
564 H = Math.min(H, Ia.left)
\r
567 x.width = H / (x.PO + 1);
\r
568 x.left = H - x.width;
\r
570 for (y = 0; y < t; y++) {
\r
573 if (x.pe) for (D = x.pe.length; D--;) {
\r
575 x.left = Math.max(x.left, H.left + H.width);
\r
577 var p = (1 - x.left) / x.VL;
\r
578 x.width = Math.max(x.width, p);
\r
579 x.aQ = Math.min(1 - x.left, x.width + 0.7 * p); //width offset
\r
582 tmp_scrollevents[i] = k;
\r
589 // Week view: top row (full-day events)
\r
590 function BuildWT(dayarrs, events, dMax) {
\r
592 var i, j, h, e, el, x, l;
\r
593 var html = "<table class=\"wk-top\">";
\r
594 html += "<tr><th style='width: 60px;' rowspan=\"3\"> </th>";
\r
595 for (i = 0; i < dayarrs.length; i++) {
\r
597 if (dayarrs.length == 1) {
\r
603 ev = ""; // "onclick=\"javascript:FunProxy('week2day',event,this);\"";
\r
604 title = i18n.xgcalendar.to_date_view;
\r
607 html += "<th data-abbr='" + dayarrs[i].date.getTime() + "' class='gcweekname' scope=\"col\">";
\r
608 html += "<div title='" + title + "' " + ev + " class='wk-dayname'><span class='" + cl + "'>" + dayarrs[i].display + "</span></div></th>";
\r
611 html += "<th style='width: 16px;' rowspan=\"3\"> </th>";
\r
612 html += "</tr>"; //end tr1;
\r
615 html += "<td class=\"wk-allday\"";
\r
617 if (dayarrs.length > 1) {
\r
618 html += " colSpan='" + dayarrs.length + "'";
\r
620 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
621 html += "><div class=\"weekViewAllDaywk\" ><table class=\"st-grid\"><tbody>";
\r
625 for (i = 0; i < dayarrs.length; i++) {
\r
626 html += "<td class=\"st-c st-s\" data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "' data-axis='00:00'> </td>";
\r
634 for (j = 0; j < l; j++) {
\r
638 for (j = 0; el < dMax; j++) {
\r
639 html += "<tr class='row" + j + "'>";
\r
640 for (h = 0; h < l;) {
\r
641 e = events[h][x[h]];
\r
642 html += "<td class='st-c col" + h;
\r
643 if (e) { //if exists
\r
646 if (e.colSpan > 1) {
\r
647 html += " colSpan='" + e.colSpan + "'";
\r
653 html += " ch='show'>";
\r
657 html += " st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> ";
\r
665 for (h = 0; h < l; h++) {
\r
666 html += "<td class='st-c st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'> </td>";
\r
670 html += "</tbody></table></div></td></tr>"; // stgrid end //wvAd end //td2 end //tr2 end
\r
674 html += "<td style=\"height: 5px;\"";
\r
675 if (dayarrs.length > 1) {
\r
676 html += " colSpan='" + dayarrs.length + "'";
\r
680 html += "</table>";
\r
687 for (j = 0; j < l; j++) {
\r
690 for (j = 0; el < dMax; j++) {
\r
691 for (h = 0; h < l;) {
\r
692 e = events[h][x[h]];
\r
693 if (e) { //if exists
\r
695 var $t = BuildMonthDayEvent(e, dayarrs[h].date, l - h);
\r
696 $el.find(".row" + j + " .col" + h).append($t);
\r
697 if (e.colSpan > 1) {
\r
715 function BuildDayScollEventContainer(dayarrs, events) {
\r
719 var html = "<table style=\"table-layout: fixed;";
\r
720 html += ($.browser.msie ? "" : "width:100%");
\r
721 html += "\"><tbody><tr><td><table style=\"height: " + (option.hour_height * 24) + "px\" class=\"tg-timedevents\"><tbody>";
\r
722 html += "<tr><td style='width:60px;'></td><td";
\r
723 if (dayarrs.length > 1) {
\r
724 html += " colSpan='" + dayarrs.length + "'";
\r
726 html += "><div class=\"tg-spanningwrapper\"><div style=\"font-size: " + (Math.round(option.hour_height / 2) - 1) + "px\" class=\"tg-hourmarkers\">";
\r
727 for (i = 0; i < 24; i++) {
\r
728 html += "<div class=\"tg-dualmarker\"></div>";
\r
730 html += "</div></div></td></tr>";
\r
734 html += "<td style=\"width: 60px; \" class=\"tg-times\">";
\r
736 //get current time
\r
737 var now = new Date();
\r
738 var h = now.getHours();
\r
739 var m = now.getMinutes();
\r
740 var mHg = gP(h, m) - 4; //make middle alignment vertically
\r
741 html += "<div id=\"tgnowptr\" class=\"tg-nowptr\" style=\"left:0;top:" + mHg + "px\"></div>";
\r
742 for (i = 0; i < 24; i++) html += "<div style=\"height: " + (option.hour_height - 1) + "px\" class=\"tg-time\">" + fomartTimeShow(i) + "</div>";
\r
745 var l = dayarrs.length;
\r
746 var hh24 = option.hour_height * 24;
\r
747 for (i = 0; i < l; i++) {
\r
748 html += "<td class='tg-col' data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "'>";
\r
749 var istoday = formatDate(dayarrs[i].date) == formatDate(new Date());
\r
752 html += "<div style=\"margin-bottom: -" + hh24 + "px; height:" + hh24 + "px\" class=\"tg-today\"> </div>";
\r
754 //var eventC = $(eventWrap);
\r
755 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
756 html += "<div style=\"margin-bottom: -" + hh24 + "px; height: " + hh24 + "px\" data-col='" + i + "' class='tgCol" + i + " tg-col-eventwrapper'></div>";
\r
758 html += "<div class='tg-col-overlaywrapper tgOver" + i + "' data-col='" + i + "'>";
\r
761 html += "<div class=\"tg-hourmarker tg-nowmarker\" style=\"left:0;top:" + mhh + "px\"></div>";
\r
768 html += "</tbody></table></td></tr></tbody></table>";
\r
769 var $container = $(html);
\r
771 for (i = 0; i < l; i++) {
\r
772 var $col = $container.find(".tgCol" + i);
\r
773 for (var j = 0; j < events[i].length; j++) {
\r
774 if (events[i][j].event["color"] && events[i][j].event["color"].match(/^[0-9a-f]{6}$/i)) {
\r
775 c = "#" + events[i][j].event["color"];
\r
778 c = option.std_color;
\r
780 var $tt = BuildDayEvent(c, events[i][j], j);
\r
789 function getTitle(event) {
\r
790 var timeshow, eventshow;
\r
791 var showtime = event["is_allday"] != 1;
\r
792 eventshow = event["summary"];
\r
793 var startformat = getymformat(event["start"], null, showtime, true);
\r
794 var endformat = getymformat(event["end"], event["start"], showtime, true);
\r
795 timeshow = dateFormat.call(event["start"], startformat) + " - " + dateFormat.call(event["end"], endformat);
\r
796 //var linebreak = ($.browser.mozilla?"":"\r\n");
\r
797 var linebreak = "\r\n";
\r
799 if (event["is_allday"] == 1) {
\r
800 //ret.push("[" + i18n.xgcalendar.allday_event + "]", linebreak );
\r
803 if (event["is_recurring"] == 1) {
\r
804 ret.push("[" + i18n.xgcalendar.repeat_event + "]", linebreak);
\r
807 ret.push(i18n.xgcalendar.time + ": ", timeshow, linebreak, i18n.xgcalendar.event + ": ", eventshow);
\r
809 if (event["location"] != undefined && event["location"] != "") {
\r
810 ret.push(linebreak, i18n.xgcalendar.location + ": ", event["location"]);
\r
813 if (event["attendees"] != undefined && event["attendees"] != "") {
\r
814 ret.push(linebreak, i18n.xgcalendar.participant + ": ", event["attendees"]);
\r
816 return ret.join("");
\r
819 function BuildDayEvent(color, e, index) {
\r
820 var theme = ColorCalcValues(color);
\r
821 var p = { bdcolor:theme[0], bgcolor2:theme[0], bgcolor1:theme[2], width:"70%", icon:"", title:"", data:"" };
\r
822 p.starttime = pZero(e.st.hour) + ":" + pZero(e.st.minute);
\r
823 p.endtime = pZero(e.et.hour) + ":" + pZero(e.et.minute);
\r
824 p.content = e.event["summary"];
\r
825 p.title = getTitle(e.event);
\r
827 if (e.event["has_notification"] == 1) icons.push("<I class=\"cic cic-tmr\"> </I>");
\r
829 icons.push("<I class=\"cic cic-spcl\"> </I>");
\r
831 p.icon = icons.join("");
\r
832 var sP = gP(e.st.hour, e.st.minute);
\r
833 var eP = gP(e.et.hour, e.et.minute);
\r
835 p.left = (e.left * 100) + "%";
\r
836 p.width = (e.aQ * 100) + "%";
\r
837 p.height = (eP - sP - 4);
\r
839 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
841 p.redisplay = "block";
\r
845 p.redisplay = "none";
\r
848 p.addclasses = (e.event["is_editable_quick"] ? "editable" : "not_editable");
\r
850 var $newtemp = $(Tp(__SCOLLEVENTTEMP, p));
\r
851 $newtemp.data("eventdata", $.extend(true, {}, e.event));
\r
856 //get body height in month view
\r
857 function GetMonthViewBodyHeight() {
\r
858 return option.height;
\r
861 function GetMonthViewHeaderHeight() {
\r
865 function BuilderMonthBody(showday, startday, events, bodyHeight) {
\r
866 var i, j, k, b, day;
\r
869 var firstdate = new Date(showday.getFullYear(), showday.getMonth(), 1);
\r
870 var diffday = startday - firstdate.getDay();
\r
871 var showmonth = showday.getMonth();
\r
875 var startdate = DateAdd("d", diffday, firstdate);
\r
876 var enddate = DateAdd("d", 34, startdate);
\r
879 if (enddate.getFullYear() == showday.getFullYear() && enddate.getMonth() == showday.getMonth() && enddate.getDate() < __MonthDays[showmonth]) {
\r
880 enddate = DateAdd("d", 7, enddate);
\r
883 option.vstart = startdate;
\r
884 option.vend = enddate;
\r
885 option.datestrshow = CalDateShow(startdate, enddate);
\r
886 bodyHeight = bodyHeight - 18 * rc;
\r
887 var rowheight = bodyHeight / rc;
\r
888 var roweventcount = parseInt(rowheight / 21);
\r
889 if (rowheight % 21 > 15) {
\r
893 var formatevents = [];
\r
894 var hastdata = formartEventsInHashtable(events, startday, 7, startdate, enddate);
\r
897 for (j = 0; j < rc; j++) {
\r
899 formatevents[j] = b = [];
\r
900 for (i = 0; i < 7; i++) {
\r
901 var newkeyDate = DateAdd("d", j * 7 + i, startdate);
\r
902 C[j * 7 + i] = newkeyDate;
\r
903 var newkey = dateFormat.call(newkeyDate, i18n.xgcalendar.dateformat.fulldaykey);
\r
904 b[i] = hastdata[newkey];
\r
905 if (b[i] && b[i].length > 0) {
\r
911 eventDiv.data("mvdata", formatevents);
\r
912 for (j = 0; j < rc; j++) {
\r
913 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"
\r
914 htb.push("<div style=\"HEIGHT:", p, "%; TOP:", p * j, "%\" data-row=\"" + j + "\" class=\"month-row mvrow_" + j + "\">");
\r
915 htb.push("<table class=\"st-bg-table\"><tbody><tr>");
\r
917 for (i = 0; i < 7; i++) {
\r
918 day = C[j * 7 + i];
\r
919 htb.push("<td data-abbr='", day.getTime(), "' data-ch='qkadd' data-axis='00:00' title=''");
\r
921 if (formatDate(day) == formatDate(new Date())) {
\r
922 htb.push(" class=\"st-bg st-bg-today\">");
\r
923 } else if (day.getMonth() != showmonth) {
\r
924 htb.push(" class=\"st-bg st-bg-nonmonth\">");
\r
926 htb.push(" class=\"st-bg\">");
\r
928 htb.push(" </td>");
\r
931 htb.push("</tr></tbody></table>");
\r
934 htb.push("<table class=\"st-grid row" + j + "\"><tbody>");
\r
938 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
940 for (i = 0; i < 7; i++) {
\r
941 var o = { titleClass:"", dayshow:"" };
\r
942 day = C[j * 7 + i];
\r
943 if (formatDate(day) == formatDate(new Date())) {
\r
944 o.titleClass = " st-dtitle-today";
\r
946 if (day.getMonth() != showmonth) {
\r
947 o.titleClass = " st-dtitle-nonmonth";
\r
949 o.title = formatDate(day);
\r
950 if (day.getDate() == 1) {
\r
951 if (day.getMonth == 0) {
\r
952 o.dayshow = formatDate(day);
\r
955 o.dayshow = dateFormat.call(day, option.date_format_dm2).toString();
\r
959 o.dayshow = day.getDate();
\r
961 o.abbr = day.getTime();
\r
962 htb.push(Tp(titletemp, o));
\r
965 htb.push("</tbody></table>");
\r
967 htb.push("</div>");
\r
969 var $ret = $(htb.join(""));
\r
971 for (j = 0; j < rc; j++) {
\r
972 var sfirstday = C[j * 7];
\r
974 var obs = BuildMonthRow(formatevents[j], dMax, roweventcount, sfirstday);
\r
975 for (i = 0; i < obs.length; i++) $ret.find(".row" + j).append(obs[i]);
\r
976 //htb=htb.concat(rowHtml); rowHtml = null;
\r
982 //formate datetime
\r
983 function formartEventsInHashtable(events, startday, daylength, rbdate, redate) {
\r
985 var hast = new Object();
\r
986 var l = events.length;
\r
987 for (var i = 0; i < l; i++) {
\r
988 var sD = events[i]["start"];
\r
989 var eD = events[i]["end"];
\r
990 var diff = DateDiff("d", sD, eD);
\r
992 s.event = events[i];
\r
993 s.day = sD.getDate();
\r
994 s.year = sD.getFullYear();
\r
995 s.month = sD.getMonth() + 1;
\r
996 s.allday = events[i]["is_allday"] == 1;
\r
997 s.crossday = events[i]["is_moredays"] == 1;
\r
998 s.reevent = events[i]["is_recurring"] == 1; //Recurring event
\r
999 s.daystr = s.year + "/" + s.month + "/" + s.day;
\r
1001 s.st.hour = sD.getHours();
\r
1002 s.st.minute = sD.getMinutes();
\r
1003 s.st.p = s.st.hour * 60 + s.st.minute; // start time position
\r
1005 s.et.hour = eD.getHours();
\r
1006 s.et.minute = eD.getMinutes();
\r
1007 s.et.p = s.et.hour * 60 + s.et.minute; // end time postition
\r
1010 if (sD < rbdate) { //start date out of range
\r
1013 if (eD > redate) { //end date out of range
\r
1016 var f = startday - sD.getDay();
\r
1020 var sdtemp = DateAdd("d", f, sD);
\r
1021 for (; sdtemp <= eD; sD = sdtemp = DateAdd("d", daylength, sdtemp)) {
\r
1022 var d = $.extend(s, {});
\r
1023 key = dateFormat.call(sD, i18n.xgcalendar.dateformat.fulldaykey);
\r
1024 var x = DateDiff("d", sdtemp, eD);
\r
1025 if (hast[key] == null) {
\r
1028 d.colSpan = (x >= daylength) ? daylength - DateDiff("d", sdtemp, sD) : DateDiff("d", sD, eD) + 1;
\r
1029 hast[key].push(d);
\r
1034 key = dateFormat.call(events[i]["start"], i18n.xgcalendar.dateformat.fulldaykey);
\r
1035 if (hast[key] == null) {
\r
1039 hast[key].push(s);
\r
1046 function BuildMonthRow(events, dMax, sc, day) {
\r
1052 var l = events.length;
\r
1055 for (j = 0; j < l; j++) {
\r
1059 cday.push(DateAdd("d", j, day));
\r
1061 for (j = 0; j < l; j++) {
\r
1062 var ec = events[j] ? events[j].length : 0;
\r
1064 for (var k = 0; k < ec; k++) {
\r
1066 if (e && e.colSpan > 1) {
\r
1067 for (m = 1; m < e.colSpan; m++) {
\r
1074 var tdtemp = "<td class='{cssclass}' data-axis='{axis}' data-ch='{ch}' data-abbr='{abbr}' title='{title}' {otherAttr}>{html}</td>";
\r
1075 for (j = 0; j < sc && el < dMax; j++) {
\r
1076 var $row = $("<tr></tr>");
\r
1077 //var gridtr = $(__TRTEMP);
\r
1078 for (var h = 0; h < l;) {
\r
1079 e = events[h] ? events[h][x[h]] : undefined;
\r
1081 var tempdata = { "class":"", axis:"", ch:"", title:"", abbr:"", html:"", otherAttr:"", click:"javascript:void(0);" };
\r
1082 var tempCss = ["st-c"];
\r
1086 //last event of the day
\r
1088 if (z[h] + 1 == y[h] && e.colSpan == 1) {
\r
1091 if (!bs && j == (sc - 1) && z[h] < y[h]) {
\r
1093 $.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
1094 tempCss.push("st-more st-moreul");
\r
1098 tempdata.html = "";
\r
1099 $ev = BuildMonthDayEvent(e, cday[h], l - h);
\r
1100 tempdata.ch = "show";
\r
1101 if (e.colSpan > 1) {
\r
1102 tempdata.otherAttr = " colSpan='" + e.colSpan + "'";
\r
1103 for (m = 0; m < e.colSpan; m++) {
\r
1104 z[h + m] = z[h + m] + 1;
\r
1117 if (j == (sc - 1) && z[h] < y[h] && y[h] > 0) {
\r
1118 $.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
1119 tempCss.push("st-more st-moreul");
\r
1123 $.extend(tempdata, { html:" ", ch:"qkadd", "axis":"00:00", "abbr":cday[h].getTime(), title:"" });
\r
1124 tempCss.push("st-s");
\r
1128 tempdata.cssclass = tempCss.join(" ");
\r
1130 var $z = $(Tp(tdtemp, tempdata));
\r
1131 if ($ev != null) $z.append($ev);
\r
1140 function BuildMonthDayEvent(e, cday, length) {
\r
1142 if (e.event["color"] && e.event["color"].match(/^#[0-9a-f]{6}$/i)) {
\r
1143 theme = ColorCalcValues(e.event["color"]);
\r
1146 theme = ColorCalcValues(option.std_color);
\r
1148 var p = { color:theme[2], title:"", extendClass:"", extendHTML:"", data:"" };
\r
1150 p.title = getTitle(e.event);
\r
1151 p.id = "bbit_cal_event_" + e.event["jq_id"];
\r
1152 if (option.enableDrag && e.event["is_editable_quick"] == 1) {
\r
1153 p.eclass = "drag";
\r
1156 p.eclass = "cal_" + e.event["jq_id"];
\r
1158 p.eclass += " " + (e.event["is_editable"] ? "editable" : "not_editable");
\r
1159 var sp = "<span style=\"cursor: pointer\">{content}</span>";
\r
1160 var i = "<I class=\"cic cic-tmr\"> </I>";
\r
1161 var i2 = "<I class=\"cic cic-rcr\"> </I>";
\r
1162 var ml = "<div class=\"st-ad-ml\"></div>";
\r
1163 var mr = "<div class=\"st-ad-mr\"></div>";
\r
1165 var sf = e.event["start"] < cday;
\r
1166 var ef = DateDiff("d", cday, e.event["end"]) >= length; //e.event["end"] >= DateAdd("d", 1, cday);
\r
1170 p.extendClass = "st-ad-mpad ";
\r
1175 p.extendHTML = arrm.join("");
\r
1179 if (!e.allday && !sf) {
\r
1180 cen = pZero(e.st.hour) + ":" + pZero(e.st.minute) + " " + e.event["summary"];
\r
1183 cen = e.event["summary"];
\r
1186 if (cen.indexOf("Geburtstag:") == 0) {
\r
1187 content.push("<img src='/pics/silk/cake.png' alt='Geburtstag: ' title='Geburtstag' style='height: 12px; margin-right: 3px;'>");
\r
1188 cen = cen.replace(/Geburtstag: /, "");
\r
1190 content.push(Tp(sp, { content:cen }));
\r
1191 if (e.event["has_notification"] == 1) content.push(i);
\r
1195 p.content = content.join("");
\r
1196 var $newel = $(Tp(__ALLDAYEVENTTEMP, p));
\r
1197 $newel.data("eventdata", e.event);
\r
1201 //to populate the data
\r
1202 function populate() {
\r
1203 if (option.isloading) {
\r
1206 if (option.url && option.url != "") {
\r
1207 option.isloading = true;
\r
1208 //clearcontainer();
\r
1209 if (option.onBeforeRequestData && $.isFunction(option.onBeforeRequestData)) {
\r
1210 option.onBeforeRequestData(1);
\r
1213 { name:"showdate", value: Math.floor(option.showday.getTime() / 1000) },
\r
1214 { name:"viewtype", value:option.view },
\r
1215 { name:"weekstartday", value:option.weekstartday }
\r
1217 if (option.view == "multi_days") {
\r
1218 param.push({ name:"num_days", value:option.num_days });
\r
1220 if (option.extParam) {
\r
1221 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1222 param[param.length] = option.extParam[pi];
\r
1227 type:option.method, //
\r
1228 url:option.url + option.url_add,
\r
1231 dataFilter:function (data) {
\r
1232 //return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, "new $1");
\r
1236 success:function (data) {//function(datastr) {
\r
1237 //datastr =datastr.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1');
\r
1238 //var data = (new Function("return " + datastr))();
\r
1239 if (data != null && data.error != null) {
\r
1240 if (option.onRequestDataError) {
\r
1241 option.onRequestDataError(1, data);
\r
1245 data["start"] = parseDate(data["start"]);
\r
1246 data["end"] = parseDate(data["end"]);
\r
1247 $.each(data.events, function (index, value) {
\r
1248 value["start"] = new Date(value["start"] * 1000);
\r
1249 value["end"] = new Date(value["end"] * 1000);
\r
1251 responseData(data, data.start, data.end);
\r
1253 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1254 option.onAfterRequestData(1);
\r
1256 option.isloading = false;
\r
1258 error:function (data) {
\r
1260 if (option.onRequestDataError) {
\r
1261 option.onRequestDataError(1, data);
\r
1263 alert(i18n.xgcalendar.get_data_exception);
\r
1265 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {
\r
1266 option.onAfterRequestData(1);
\r
1268 option.isloading = false;
\r
1275 alert("url" + i18n.xgcalendar.i_undefined);
\r
1280 function responseData(data, start, end) {
\r
1281 var events = data.events;
\r
1282 ConcatEvents(events, start, end);
\r
1287 function clearrepeat(events, start) {
\r
1288 var jl = events.length;
\r
1290 var es = events[0]["start"];
\r
1291 var el = events[jl - 1]["start"];
\r
1292 for (var i = 0, l = option.eventItems.length; i < l; i++) {
\r
1294 if (option.eventItems[i]["sart"] > el || jl == 0) {
\r
1297 if (option.eventItems[i]["start"] >= es) {
\r
1298 for (var j = 0; j < jl; j++) {
\r
1299 if (option.eventItems[i]["jq_id"] == events[j]["jq_id"] && option.eventItems[i]["start"] < start) {
\r
1300 events.splice(j, 1); //for duplicated event
\r
1310 function ConcatEvents(events, start, end) {
\r
1316 if (option.eventItems.length == 0) {
\r
1317 option.eventItems = events;
\r
1320 //remove duplicated one
\r
1321 clearrepeat(events, start);
\r
1322 var sl = option.eventItems.length;
\r
1327 if (option.eventItems[0]["start"] > e) {
\r
1328 option.eventItems = events.concat(option.eventItems);
\r
1331 if (option.eventItems[sl - 1]["start"] < s) {
\r
1332 option.eventItems = option.eventItems.concat(events);
\r
1335 for (var i = 0; i < sl; i++) {
\r
1336 if (option.eventItems[i]["start"] >= s && sI < 0) {
\r
1340 if (option.eventItems[i]["start"] > e) {
\r
1346 var e1 = sI <= 0 ? [] : option.eventItems.slice(0, sI);
\r
1347 var e2 = eI == sl ? [] : option.eventItems.slice(eI);
\r
1348 option.eventItems = [].concat(e1, events, e2);
\r
1354 function weekormonthtoday(e) {
\r
1356 option.showday = new Date(parseInt(th.data("abbr")));
\r
1357 option.view = "day";
\r
1359 if (option.onWeekOrMonthToDay) {
\r
1360 option.onWeekOrMonthToDay(option);
\r
1362 e.stopPropagation();
\r
1363 e.preventDefault();
\r
1366 function parseDate(str) {
\r
1367 return new Date(Date.parse(str));
\r
1370 function gP(h, m) {
\r
1371 return h * option.hour_height + parseInt(m / 60 * option.hour_height);
\r
1374 function gW(ts1, ts2) {
\r
1375 var t1 = ts1 / option.hour_height;
\r
1376 var t2 = parseInt(t1);
\r
1377 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1378 var t4 = ts2 / option.hour_height;
\r
1379 var t5 = parseInt(t4);
\r
1380 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1381 return { sh:t2, sm:t3, eh:t5, em:t6, h:ts2 - ts1 };
\r
1384 function gH(y1, y2, pt) {
\r
1385 var sy1 = Math.min(y1, y2);
\r
1386 var sy2 = Math.max(y1, y2);
\r
1387 var t1 = (sy1 - pt) / option.hour_height;
\r
1388 var t2 = parseInt(t1);
\r
1389 var t3 = t1 - t2 >= 0.5 ? 30 : 0;
\r
1390 var t4 = (sy2 - pt) / option.hour_height;
\r
1391 var t5 = parseInt(t4);
\r
1392 var t6 = t4 - t5 >= 0.5 ? 30 : 0;
\r
1393 return { sh:t2, sm:t3, eh:t5, em:t6, h:sy2 - sy1 };
\r
1396 function pZero(n) {
\r
1397 return n < 10 ? "0" + n : "" + n;
\r
1400 function Tp(temp, dataarry) {
\r
1401 return temp.replace(/\{([\w]+)\}/g, function (s1, s2) {
\r
1402 var s = dataarry[s2];
\r
1403 if (typeof (s) != "undefined") {
\r
1411 function fomartTimeShow(h) {
\r
1412 return h < 10 ? "0" + h + ":00" : h + ":00";
\r
1415 function getymformat(date, comparedate, isshowtime, isshowweek) {
\r
1416 var showyear = isshowtime != undefined ? (date.getFullYear() != new Date().getFullYear()) : true;
\r
1417 var showmonth = true;
\r
1418 var showday = true;
\r
1419 var showtime = isshowtime || false;
\r
1420 var showweek = isshowweek || false;
\r
1421 if (comparedate) {
\r
1422 showyear = comparedate.getFullYear() != date.getFullYear();
\r
1423 //showmonth = comparedate.getFullYear() != date.getFullYear() || date.getMonth() != comparedate.getMonth();
\r
1424 if (comparedate.getFullYear() == date.getFullYear() &&
\r
1425 date.getMonth() == comparedate.getMonth() &&
\r
1426 date.getDate() == comparedate.getDate()
\r
1428 showyear = showmonth = showday = showweek = false;
\r
1434 a.push(option.date_format_dm3)
\r
1435 } else if (showmonth) {
\r
1436 a.push(option.date_format_dm2)
\r
1437 } else if (showday) {
\r
1438 a.push(i18n.xgcalendar.dateformat.day);
\r
1440 a.push(showweek ? " (W)" : "", showtime ? " HH:mm" : "");
\r
1441 return a.join("");
\r
1444 function CalDateShow(startday, endday, isshowtime, isshowweek) {
\r
1446 return dateFormat.call(startday, getymformat(startday, null, isshowtime));
\r
1448 var strstart = dateFormat.call(startday, getymformat(startday, null, isshowtime, isshowweek));
\r
1449 var strend = dateFormat.call(endday, getymformat(endday, startday, isshowtime, isshowweek));
\r
1450 var join = (strend != "" ? " - " : "");
\r
1451 return [strstart, strend].join(join);
\r
1455 function buildtempdayevent(sh, sm, eh, em, h, title, w, resize, color) {
\r
1456 if (!color.match(/^#[0-9a-f]{6}$/i)) color = option.std_color;
\r
1457 var t = ColorCalcValues(color);
\r
1458 return Tp(__SCOLLEVENTTEMP, {
\r
1463 starttime:[pZero(sh), pZero(sm)].join(":"),
\r
1464 endtime:[pZero(eh), pZero(em)].join(":"),
\r
1465 content:title ? title : i18n.xgcalendar.new_event,
\r
1466 title:title ? title : i18n.xgcalendar.new_event,
\r
1467 icon:"<I class=\"cic cic-tmr\"> </I>",
\r
1470 width:w ? w : "100%",
\r
1474 redisplay:resize ? "block" : "none"
\r
1478 function quickd(type) {
\r
1479 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1480 var calid = $("#bbit-cs-id").val();
\r
1482 { "name":"jq_id", value:calid },
\r
1483 { "name":"type", value:type}
\r
1485 var de = rebyKey(calid, true);
\r
1486 option.onBeforeRequestData && option.onBeforeRequestData(3);
\r
1487 $.post(option.quickDeleteUrl, param, function (data) {
\r
1489 $(document).trigger("wdcal:updated");
\r
1490 if (data["IsSuccess"]) {
\r
1493 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1496 option.onRequestDataError && option.onRequestDataError(3, data);
\r
1499 option.onAfterRequestData && option.onAfterRequestData(3);
\r
1505 function getbuddlepos(x, y) {
\r
1506 var tleft = x - 110;
\r
1507 var ttop = y - 217;
\r
1508 var maxLeft = document.documentElement.clientWidth;
\r
1509 var maxTop = document.documentElement.clientHeight;
\r
1510 var ishide = false;
\r
1511 if (tleft <= 0 || ttop <= 0 || tleft + 400 > maxLeft) {
\r
1512 tleft = x - 200 <= 0 ? 10 : x - 200;
\r
1513 ttop = y - 159 <= 0 ? 10 : y - 159;
\r
1514 if (tleft + 400 >= maxLeft) {
\r
1515 tleft = maxLeft - 410;
\r
1517 if (ttop + 164 >= maxTop) {
\r
1518 ttop = maxTop - 165;
\r
1522 return { left:tleft, top:ttop, hide:ishide };
\r
1525 function dayshow(e, data) {
\r
1526 var $t = $(e.target);
\r
1527 if ($t.hasClass("axx_username") || $t.parents(".axx_username").length > 0 || $t.hasClass("cal_nojs") || $t.parents(".cal_nojs").length > 0) return false;
\r
1529 if (data == undefined) {
\r
1530 if ($t.hasClass("chip") || $t.hasClass("rb-o")) data = $t.data("eventdata");
\r
1531 else data = $t.parents(".chip, .rb-o").data("eventdata");
\r
1534 if (data != null) {
\r
1535 var editable = false;
\r
1536 if (option.quickDeleteUrl != "" && data["is_editable"] == 1 && option.readonly != true) editable = true;
\r
1537 var csbuddle = '<div id="bbit-cs-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble"><table class="bubble-table"><tbody' +
\r
1538 '><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>' +
\r
1539 '<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
1540 '<tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">' +
\r
1541 '<table class="cb-table"><tbody><tr><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid">' +
\r
1542 '<a href="" title="' + i18n.xgcalendar.click_to_detail + '" class="bbit-cs-what textbox-fill-div lk"></a></div></div></td></tr>' +
\r
1543 '<tr><td class=cb-value><div id="bbit-cs-buddle-timeshow"></div></td></tr>' +
\r
1544 '</tbody></table><div class="bbit-cs-split"><input id="bbit-cs-id" type="hidden" value=""/>[ <span id="bbit-cs-delete" class="lk">'
\r
1545 + i18n.xgcalendar.i_delete + '</span> ] ' +
\r
1546 '<a href="" class="bbit-cs-editLink lk">' + i18n.xgcalendar.update_detail + ' <strong>>></strong></a>' +
\r
1547 '</div></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div>' +
\r
1548 '<td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody>' +
\r
1549 '</table><div id="bubbleClose2" class="bubble-closebutton"></div><div id="prong1" class="prong"><div class=bubble-sprite></div></div></div>';
\r
1550 var $bud = $("#bbit-cs-buddle");
\r
1551 if ($bud.length == 0) {
\r
1552 $bud = $(csbuddle).appendTo(document.body);
\r
1553 var calbutton = $("#bbit-cs-delete");
\r
1554 $("#bubbleClose2").on("click", function () {
\r
1555 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1557 calbutton.on("click", function () {
\r
1558 var data = $("#bbit-cs-buddle").data("cdata");
\r
1559 if (option.quickDeleteHandler && $.isFunction(option.quickDeleteHandler)) {
\r
1560 option.quickDeleteHandler.call(this, data, quickd);
\r
1563 if (confirm(i18n.xgcalendar.confirm_delete_event)) {
\r
1564 var s = 0; //0 single event , 1 for Recurring event
\r
1565 if (data["is_recurring"] == 1) {
\r
1566 if (confirm(i18n.xgcalendar.confrim_delete_event_or_all)) {
\r
1583 $("#bbit-cs-delete").parents(".bbit-cs-split").show();
\r
1584 $bud.find(".bbit-cs-editLink").attr("href", data["url_edit"]).show();
\r
1587 $("#bbit-cs-delete").parents(".bbit-cs-split").hide();
\r
1588 $bud.find(".bbit-cs-editLink").hide();
\r
1591 var pos = getbuddlepos(e.pageX, e.pageY);
\r
1593 $("#prong1").hide()
\r
1596 $("#prong1").show()
\r
1599 var iscos = DateDiff("d", data["start"], data["end"]) != 0;
\r
1600 ss.push(dateFormat.call(data["start"], option.date_format_dm2), " (", __WDAY[data["start"].getDay()], ")");
\r
1601 if (data["is_allday"] != 1) {
\r
1602 ss.push(",", dateFormat.call(data["start"], "HH:mm"));
\r
1606 ss.push(" - ", dateFormat.call(data["end"], option.date_format_dm2), " (", __WDAY[data["end"].getDay()], ")");
\r
1607 if (data["is_allday"] != 1) {
\r
1608 ss.push(",", dateFormat.call(data["end"], "HH:mm"));
\r
1611 var location = "";
\r
1612 if (data["location"] != "") location = data["location"] + ", ";
\r
1613 $("#bbit-cs-buddle-timeshow").html(location + ss.join(""));
\r
1614 $bud.find(".bbit-cs-what").html(data["summary"]).attr("href", data["url_detail"]);
\r
1615 $("#bbit-cs-id").val(data["jq_id"]);
\r
1616 $bud.data("cdata", data);
\r
1617 $bud.css({ "visibility":"visible", left:pos.left, top:pos.top });
\r
1619 $(document).one("click", function () {
\r
1620 $("#bbit-cs-buddle").css("visibility", "hidden");
\r
1624 alert(i18n.xgcalendar.data_format_error);
\r
1629 function moreshow(mv) {
\r
1630 var $me = $(this);
\r
1631 var $pdiv = $(mv);
\r
1632 var divIndex = parseInt($pdiv.data("row"));
\r
1633 var offsetMe = $me.position();
\r
1634 var offsetP = $pdiv.position();
\r
1635 var width = ($me.width() + 2) * 1.5;
\r
1636 var top = offsetP.top + 15;
\r
1637 var left = offsetMe.left;
\r
1639 var day = new Date(parseInt($me.data("abbr")));
\r
1640 var cc = $gridcontainer.find(".cal-month-cc");
\r
1641 var ccontent = $gridcontainer.find(".cal-month-cc-content table tbody");
\r
1642 var ctitle = $gridcontainer.find(".cal-month-cc-title");
\r
1643 ctitle.html(formatDate(day));
\r
1645 var edata = $("#gridEvent").data("mvdata");
\r
1646 var events = edata[divIndex];
\r
1647 var index = parseInt($me.data("axis"));
\r
1648 ccontent.find("*").remove();
\r
1649 for (var i = 0; i <= index; i++) {
\r
1650 var ec = events[i] ? events[i].length : 0;
\r
1651 for (var j = 0; j < ec; j++) {
\r
1652 var e = events[i][j];
\r
1654 if ((e.colSpan + i - 1) >= index) {
\r
1655 var $x = $("<tr><td class='st-c'></td></tr>");
\r
1656 var $y = BuildMonthDayEvent(e, day, 1);
\r
1657 $x.find(".st-c").append($y);
\r
1658 ccontent.append($x);
\r
1664 ccontent.find("div.rb-o").each(function () {
\r
1665 $(this).click(dayshow);
\r
1668 var height = cc.height();
\r
1669 var maxleft = document.documentElement.clientWidth;
\r
1670 var maxtop = document.documentElement.clientHeight;
\r
1671 if (left + width >= maxleft) {
\r
1672 left = offsetMe.left - ($me.width() + 2) * 0.5;
\r
1674 if (top + height >= maxtop) {
\r
1675 top = maxtop - height - 2;
\r
1677 var newOff = { left:left, top:top, "z-index":180, width:width, "visibility":"visible" };
\r
1679 $(document).on("click", closeCc);
\r
1683 function dayupdate(data, start, end) {
\r
1684 if (option.quickUpdateUrl != "" && data["is_editable_quick"] == 1 && option.readonly != true) {
\r
1685 if (option.isloading) {
\r
1688 option.isloading = true;
\r
1689 var id = data["jq_id"];
\r
1690 var os = data["start"];
\r
1691 var od = data["end"];
\r
1693 { "name":"jq_id", value:id },
\r
1694 { "name":"CalendarStartTime", value:Math.floor(start.getTime() / 1000) },
\r
1695 { "name":"CalendarEndTime", value:Math.floor(end.getTime() / 1000) }
\r
1698 if (option.quickUpdateHandler && $.isFunction(option.quickUpdateHandler)) {
\r
1699 option.quickUpdateHandler.call(this, param);
\r
1702 option.onBeforeRequestData && option.onBeforeRequestData(4);
\r
1703 $.post(option.quickUpdateUrl, param, function (data) {
\r
1705 $(document).trigger("wdcal:updated");
\r
1706 if (data["IsSuccess"] == true) {
\r
1707 option.isloading = false;
\r
1708 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1711 option.onRequestDataError && option.onRequestDataError(4, data);
\r
1712 option.isloading = false;
\r
1713 d = rebyKey(id, true);
\r
1719 option.onAfterRequestData && option.onAfterRequestData(4);
\r
1723 d = rebyKey(id, true);
\r
1725 d["start"] = start;
\r
1735 function quickadd(start, end, isallday, pos) {
\r
1736 if ((!option.quickAddHandler && option.quickAddUrl == "") || option.readonly) {
\r
1739 var buddle = $("#bbit-cal-buddle");
\r
1740 if (buddle.length == 0) {
\r
1742 temparr.push('<form id="bbit-cal-submitFORM">');
\r
1743 temparr.push('<div id="bbit-cal-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble">');
\r
1744 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
1745 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
1746 temparr.push('<table class="cb-table"><tbody><tr><th class="cb-key">');
\r
1747 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
1748 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
1749 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 value="');
\r
1750 temparr.push(i18n.xgcalendar.create_event, '" type="submit"/> <a href="" class="lk bbit-cal-editLink">');
\r
1751 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
1752 temparr.push('</form>');
\r
1753 var tempquickAddHandler = temparr.join("");
\r
1755 $(document.body).append(tempquickAddHandler);
\r
1756 buddle = $("#bbit-cal-buddle");
\r
1757 $("#bubbleClose1").on("click", function () {
\r
1758 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1759 releasedragevent();
\r
1761 $("#bbit-cal-submitFORM").on("keyup", function (e) {
\r
1762 if (e.which == 27) $("#bubbleClose1").click();
\r
1764 $("#bbit-cal-submitFORM").on("submit", function (e) {
\r
1765 e.stopPropagation();
\r
1766 e.preventDefault();
\r
1767 if (option.isloading) {
\r
1770 option.isloading = true;
\r
1771 var what = $("#bbit-cal-what").val();
\r
1772 var datestart = $("#bbit-cal-start").val();
\r
1773 var dateend = $("#bbit-cal-end").val();
\r
1774 var allday = $("#bbit-cal-allday").val();
\r
1775 var f = /^[^\$<>]+$/.test(what);
\r
1777 alert(i18n.xgcalendar.invalid_title);
\r
1778 $("#bbit-cal-what").focus();
\r
1779 option.isloading = false;
\r
1783 { "name":"CalendarTitle", value:what },
\r
1784 { "name":"CalendarStartTime", value: Math.floor(datestart / 1000)},
\r
1785 { "name":"CalendarEndTime", value: Math.floor(dateend / 1000)},
\r
1786 { "name":"IsAllDayEvent", value:allday }
\r
1789 if (option.extParam) {
\r
1790 for (var pi = 0; pi < option.extParam.length; pi++) {
\r
1791 param[param.length] = option.extParam[pi];
\r
1794 if (option.quickAddHandler && $.isFunction(option.quickAddHandler)) {
\r
1795 option.quickAddHandler.call(this, param);
\r
1796 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1797 releasedragevent();
\r
1800 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1802 option.onBeforeRequestData && option.onBeforeRequestData(2);
\r
1804 var sd = new Date(datestart),
\r
1805 ed = new Date(dateend),
\r
1806 diff = DateDiff("d", sd, ed);
\r
1813 "is_allday":(allday == "1" ? 1 : 0),
\r
1814 "is_moredays":(diff > 0 ? 1 : 0),
\r
1816 "color":option.std_color,
\r
1818 "is_editable_quick":0,
\r
1822 tId = Ind(newdata);
\r
1823 releasedragevent();
\r
1826 $.post(option.quickAddUrl, param, function (data) {
\r
1827 option.isloading = false;
\r
1829 if (data["IsSuccess"] == true) {
\r
1831 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1834 option.onRequestDataError && option.onRequestDataError(2, data);
\r
1835 option.onAfterRequestData && option.onAfterRequestData(2);
\r
1837 $(document).trigger("wdcal:updated");
\r
1844 buddle.on("mousedown", function (e) {
\r
1845 e.stopPropagation();
\r
1846 e.preventDefault();
\r
1850 var dateshow = CalDateShow(start, end, !isallday, true);
\r
1851 var off = getbuddlepos(pos.left, pos.top);
\r
1853 $("#prong2").hide()
\r
1856 $("#prong2").show()
\r
1858 $("#bbit-cal-buddle-timeshow").html(dateshow);
\r
1859 var calwhat = $("#bbit-cal-what").val("");
\r
1860 $("#bbit-cal-allday").val(isallday ? "1" : "0");
\r
1861 $("#bbit-cal-start").val(start.getTime());
\r
1862 $("#bbit-cal-end").val(end.getTime());
\r
1864 var addurl = option.baseurl + "new/?start=" + Math.floor($("#bbit-cal-start").val() / 1000) + "&end=" + Math.floor($("#bbit-cal-end").val() / 1000) +
\r
1865 "&isallday=" + (isallday ? "1" : "0") + "&title=";
\r
1866 buddle.find(".bbit-cal-editLink").attr("href", addurl);
\r
1868 buddle.css({ "visibility":"visible", left:off.left, top:off.top });
\r
1869 calwhat.blur().focus(); //add 2010-01-26 blur() fixed chrome
\r
1870 $(document).on("mousedown", function () {
\r
1871 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
1872 releasedragevent();
\r
1874 $(document).on("keyup", "#bbit-cal-what", function() {
\r
1875 buddle.find(".bbit-cal-editLink").attr("href", addurl + encodeURIComponent($("#bbit-cal-what").val()));
\r
1880 function formatDate(time, format) {
\r
1881 if (typeof(format) == "undefined") return $.datepicker.formatDate(option.date_format_full,time);
\r
1882 var time2 = $.datepicker.formatDate(format, time);
\r
1883 var h = time.getHours();
\r
1884 var i = time.getMinutes();
\r
1885 time2 = time2.replace("HH", (h > 10 ? "" : "0") + h);
\r
1886 time2 = time2.replace("ii", (i > 10 ? "" : "0") + i);
\r
1890 function rebyKey(key, remove) {
\r
1891 if (option.eventItems && option.eventItems.length > 0) {
\r
1892 var sl = option.eventItems.length;
\r
1894 for (var j = 0; j < sl; j++) {
\r
1895 if (option.eventItems[j]["jq_id"] == key) {
\r
1901 var t = option.eventItems[i];
\r
1903 option.eventItems.splice(i, 1);
\r
1911 function Ind(event, i) {
\r
1915 if (option.eventItems && option.eventItems.length > 0) {
\r
1916 var sl = option.eventItems.length;
\r
1917 var s = event["start"];
\r
1918 var d1 = s.getTime() - option.eventItems[0]["start"].getTime();
\r
1919 var d2 = option.eventItems[sl - 1]["start"].getTime() - s.getTime();
\r
1920 var diff = d1 - d2;
\r
1921 if (d1 < 0 || diff < 0) {
\r
1922 for (j = 0; j < sl; j++) {
\r
1923 if (option.eventItems[j]["start"] >= s) {
\r
1929 else if (d2 < 0) {
\r
1933 for (j = sl - 1; j >= 0; j--) {
\r
1934 if (option.eventItems[j]["start"] < s) {
\r
1948 if (option.eventItems && option.eventItems.length > 0) {
\r
1949 if (i == option.eventItems.length) {
\r
1950 option.eventItems.push(event);
\r
1953 option.eventItems.splice(i, d, event);
\r
1957 option.eventItems = [event];
\r
1963 function ResizeView() {
\r
1964 var _viewType = option.view;
\r
1965 if (_viewType == "day" || _viewType == "week" || _viewType == "multi_days") {
\r
1966 var $dvwkcontaienr = $gridcontainer.find(".wktopcontainer");
\r
1967 var $dvtec = $gridcontainer.find(".scrolltimeevent");
\r
1968 if ($dvwkcontaienr.length == 0 || $dvtec.length == 0) {
\r
1969 alert(i18n.xgcalendar.view_no_ready);
\r
1972 var dvwkH = $dvwkcontaienr.height() + 2;
\r
1973 var calH = option.height - 8 - dvwkH;
\r
1974 $dvtec.height(calH);
\r
1975 if (typeof (option.scroll) == "undefined") {
\r
1976 var currentday = new Date();
\r
1977 var h = currentday.getHours();
\r
1978 var m = currentday.getMinutes();
\r
1979 var th = gP(h, m);
\r
1980 //var ch = $dvtec.attr("clientHeight");
\r
1981 var ch = $dvtec.height();
\r
1982 var sh = th - 0.5 * ch;
\r
1983 //var ph = $dvtec.attr("scrollHeight");
\r
1984 var ph = $dvtec.children().height();
\r
1985 if (sh < 0) sh = 0;
\r
1986 if (sh > ph - ch) sh = ph - ch - 10 * (23 - h);
\r
1987 //$dvtec.attr("scrollTop", sh);
\r
1988 $dvtec.scrollTop(sh);
\r
1991 $dvtec.scrollTop(option.scroll);
\r
1994 else if (_viewType == "month") {
\r
1995 //Resize GridContainer
\r
1999 function returnfalse() {
\r
2003 function initevents(viewtype) {
\r
2004 if (viewtype == "week" || viewtype == "day" || viewtype == "multi_days") {
\r
2005 $("div.chip", $gridcontainer).each(function () {
\r
2006 var chip = $(this);
\r
2007 chip.click(dayshow);
\r
2008 if (chip.hasClass("drag")) {
\r
2009 chip.mousedown(function (e) {
\r
2010 dragStart.call(this, "std_item_move", e);
\r
2011 e.stopPropagation();
\r
2012 e.preventDefault();
\r
2015 chip.find("div.resizer").mousedown(function (e) {
\r
2016 dragStart.call($(this).parent().parent(), "std_item_resize", e);
\r
2017 e.stopPropagation();
\r
2018 e.preventDefault();
\r
2022 chip.mousedown(returnfalse)
\r
2025 $("div.rb-o", $gridcontainer).each(function () {
\r
2026 var chip = $(this);
\r
2027 chip.click(dayshow);
\r
2028 if (chip.hasClass("drag") && (viewtype == "week" || viewtype == "multi_days")) {
\r
2030 chip.mousedown(function (e) {
\r
2031 dragStart.call(this, "fullday_item_move", e);
\r
2032 e.stopPropagation();
\r
2033 e.preventDefault();
\r
2037 chip.mousedown(returnfalse)
\r
2040 if (option.readonly == false) {
\r
2041 $("td.tg-col", $gridcontainer).each(function () {
\r
2042 $(this).mousedown(function (e) {
\r
2043 dragStart.call(this, "std_empty_drag", e);
\r
2044 e.stopPropagation();
\r
2045 e.preventDefault();
\r
2048 $gridcontainer.find(".weekViewAllDaywk").mousedown(function (e) {
\r
2049 dragStart.call(this, "fullday_empty_drag", e);
\r
2050 e.stopPropagation();
\r
2051 e.preventDefault();
\r
2055 if (viewtype == "week" || viewtype == "multi_days") {
\r
2056 $gridcontainer.find(".wktopcontainer th.gcweekname").each(function () {
\r
2057 $(this).click(weekormonthtoday);
\r
2063 else if (viewtype = "month") {
\r
2064 $("div.rb-o", $gridcontainer).each(function () {
\r
2065 var chip = $(this);
\r
2066 chip.click(dayshow);
\r
2067 if (chip.hasClass("drag")) {
\r
2069 chip.mousedown(function (e) {
\r
2070 dragStart.call(this, "std_item_month_drag", e);
\r
2071 e.stopPropagation();
\r
2072 e.preventDefault();
\r
2076 chip.mousedown(returnfalse)
\r
2079 $("td.st-more", $gridcontainer).each(function () {
\r
2081 $(this).on("click", function (e) {
\r
2082 moreshow.call(this, $(this).parent().parent().parent().parent()[0]);
\r
2083 e.stopPropagation();
\r
2084 e.preventDefault();
\r
2085 }).on("mousedown", function (e) {
\r
2086 e.stopPropagation();
\r
2087 e.preventDefault();
\r
2090 if (option.readonly == false) {
\r
2091 $gridcontainer.find(".mvEventContainer").mousedown(function (e) {
\r
2092 dragStart.call(this, "empty_month_drag", e);
\r
2093 e.stopPropagation();
\r
2094 e.preventDefault();
\r
2101 function releasedragevent() {
\r
2104 _dragevent = null;
\r
2108 function dragStart(type, e) {
\r
2109 var w, h, offset, moffset, left, top, l, py, pw, xa, ya, i, data, fdi, dp, yl;
\r
2110 var $obj = $(this);
\r
2111 releasedragevent();
\r
2113 case "std_empty_drag":
\r
2114 _dragdata = { type:"std_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY };
\r
2116 case "fullday_empty_drag":
\r
2118 h = $obj.height();
\r
2119 offset = $obj.offset();
\r
2120 left = offset.left;
\r
2122 l = option.view == "day" ? 1 : 7;
\r
2124 pw = parseInt(w / l);
\r
2125 if (py > l / 2 + 1) {
\r
2130 for (i = 0; i < l; i++) {
\r
2131 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2133 ya.push({ s:top, e:top + h });
\r
2134 _dragdata = { type:"fullday_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2135 w = left = l = py = pw = xa = null;
\r
2137 case "std_item_move":
\r
2138 var evid = $obj.parent().data("col");
\r
2139 var p = $obj.parent();
\r
2140 var pos = p.offset();
\r
2141 w = p.width() + 10;
\r
2142 h = $obj.height();
\r
2143 data = $obj.data("eventdata");
\r
2144 _dragdata = { type:"std_item_move", target:$obj, sx:e.pageX, sy:e.pageY,
\r
2145 pXMin:pos.left, pXMax:pos.left + w, pw:w, h:h,
\r
2146 cdi:parseInt(evid), fdi:parseInt(evid), data:data
\r
2149 case "std_item_resize":
\r
2150 h = $obj.height();
\r
2151 data = $obj.data("eventdata");
\r
2152 _dragdata = { type:"std_item_resize", target:$obj, sx:e.pageX, sy:e.pageY, h:h, data:data };
\r
2154 case "fullday_item_move":
\r
2155 var con = $gridcontainer.find(".weekViewAllDaywk");
\r
2158 offset = con.offset();
\r
2159 moffset = $obj.offset();
\r
2160 left = offset.left;
\r
2164 pw = parseInt(w / l);
\r
2165 if (py > l / 2 + 1) {
\r
2171 for (i = 0; i < l; i++) {
\r
2172 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2173 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2177 fdi = { x:di, y:0, di:di };
\r
2178 ya.push({ s:top, e:top + h });
\r
2179 data = $obj.data("eventdata");
\r
2180 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2181 _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
2183 case "empty_month_drag":
\r
2185 offset = $obj.offset();
\r
2186 left = offset.left;
\r
2189 yl = $obj.children().length;
\r
2191 pw = parseInt(w / l);
\r
2192 if (py > l / 2 + 1) {
\r
2195 h = $gridcontainer.find(".mvrow_0").height();
\r
2198 for (i = 0; i < l; i++) {
\r
2199 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2203 for (i = 0; i < l; i++) {
\r
2204 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2206 for (i = 0; i < yl; i++) {
\r
2207 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2209 _dragdata = { type:"empty_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };
\r
2211 case "std_item_month_drag":
\r
2212 var row0 = $gridcontainer.find(".mvrow_0");
\r
2213 var row1 = $gridcontainer.find(".mvrow_1");
\r
2215 offset = row0.offset();
\r
2216 var diffset = row1.offset();
\r
2217 moffset = $obj.offset();
\r
2218 h = diffset.top - offset.top;
\r
2219 left = offset.left;
\r
2222 yl = row0.parent().children().length;
\r
2224 pw = parseInt(w / l);
\r
2225 if (py > l / 2 + 1) {
\r
2232 for (i = 0; i < l; i++) {
\r
2233 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });
\r
2234 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {
\r
2238 for (i = 0; i < yl; i++) {
\r
2239 ya.push({ s:i * h + top, e:(i + 1) * h + top });
\r
2240 if (moffset.top >= ya[i].s && moffset.top < ya[i].e) {
\r
2244 fdi = { x:xi, y:yi, di:yi * 7 + xi };
\r
2245 data = $obj.data("eventdata");
\r
2246 dp = DateDiff("d", data["start"], data["end"]) + 1;
\r
2247 _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
2250 $('body').noSelect();
\r
2253 function dragMove(e) {
\r
2254 var d, sy, sx, x, y, diffy, gh, ny, tempdata, cpwrap, ndi, evid, nh, cp, w1;
\r
2256 if (e.pageX < 0 || e.pageY < 0
\r
2257 || e.pageX > document.documentElement.clientWidth
\r
2258 || e.pageY >= document.documentElement.clientHeight) {
\r
2264 case "std_empty_drag":
\r
2268 if (diffy > (option.hour_height / 4) || diffy < (-1 * (option.hour_height / 4)) || d.cpwrap) {
\r
2270 diffy = Math.ceil(option.hour_height / 2);
\r
2272 var dy = diffy % Math.ceil(option.hour_height / 2);
\r
2274 diffy = dy > 0 ? diffy + Math.ceil(option.hour_height / 2) - dy : diffy - Math.ceil(option.hour_height / 2) - dy;
\r
2277 sy = sy + Math.ceil(option.hour_height / 2);
\r
2281 d.tp = $(d.target).offset().top;
\r
2283 gh = gH(sy, y, d.tp);
\r
2284 ny = gP(gh.sh, gh.sm);
\r
2286 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2287 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2288 $(d.target).find("div.tg-col-overlaywrapper").append(cpwrap);
\r
2289 d.cpwrap = cpwrap;
\r
2292 if (d.cgh.sh != gh.sh || d.cgh.eh != gh.eh || d.cgh.sm != gh.sm || d.cgh.em != gh.em) {
\r
2293 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2294 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2300 case "fullday_empty_drag":
\r
2304 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2306 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2307 $(document.body).append(d.lasso);
\r
2310 d.sdi = getdi(d.xa, d.ya, sx, d.sy);
\r
2312 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2313 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2314 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2319 case "empty_month_drag":
\r
2326 if (diffx > 5 || diffx < -5 || diffy < -5 || diffy > 5 || d.lasso) {
\r
2328 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2329 $(document.body).append(d.lasso);
\r
2332 d.sdi = getdi(d.xa, d.ya, sx, sy);
\r
2334 ndi = getdi(d.xa, d.ya, x, y);
\r
2335 if (!d.fdi || d.fdi.di != ndi.di) {
\r
2336 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);
\r
2341 case "std_item_move":
\r
2343 if (data != null && data["is_editable_quick"] == 1) {
\r
2350 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.cpwrap) {
\r
2352 gh = { sh:data["start"].getHours(),
\r
2353 sm:data["start"].getMinutes(),
\r
2354 eh:data["end"].getHours(),
\r
2355 em:data["end"].getMinutes(),
\r
2359 ny = gP(gh.sh, gh.sm);
\r
2361 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["summary"], false, false, data["color"]);
\r
2362 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2363 evid = ".tgOver" + d.target.parent().data("col");
\r
2364 $gridcontainer.find(evid).append(cpwrap);
\r
2365 d.cpwrap = cpwrap;
\r
2370 if (x < d.pXMin) {
\r
2373 else if (x > d.pXMax) {
\r
2378 d.cdi = d.cdi + pd;
\r
2379 var ov = $gridcontainer.find(".tgOver" + d.cdi);
\r
2380 if (ov.length == 1) {
\r
2381 d.pXMin = d.pXMin + d.pw * pd;
\r
2382 d.pXMax = d.pXMax + d.pw * pd;
\r
2383 ov.append(d.cpwrap);
\r
2386 d.cdi = d.cdi - pd;
\r
2389 ny = d.top + diffy;
\r
2390 var pny = ny % Math.ceil(option.hour_height / 2);
\r
2395 //log.info("ny=" + ny);
\r
2396 gh = gW(ny, ny + d.h);
\r
2397 //log.info("sh=" + gh.sh + ",sm=" + gh.sm);
\r
2398 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["summary"], false, false, data["color"]);
\r
2399 d.cpwrap.css("top", ny + "px").html(tempdata);
\r
2407 case "std_item_resize":
\r
2408 var data = d.data;
\r
2409 if (data != null && data["is_editable_quick"] == 1) {
\r
2413 if (diffy != 0 || d.cpwrap) {
\r
2415 gh = { sh:data["start"].getHours(),
\r
2416 sm:data["start"].getMinutes(),
\r
2417 eh:data["end"].getHours(),
\r
2418 em:data["end"].getMinutes(),
\r
2422 ny = gP(gh.sh, gh.sm);
\r
2424 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["summary"], "100%", true, data["color"]);
\r
2425 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2426 evid = ".tgOver" + d.target.parent().data("col");
\r
2427 $gridcontainer.find(evid).append(cpwrap);
\r
2428 d.cpwrap = cpwrap;
\r
2432 var pnh = nh % Math.ceil(option.hour_height / 2);
\r
2433 nh = pnh > 1 ? nh - pnh + Math.ceil(option.hour_height / 2) : nh - pnh;
\r
2435 gh = gW(d.top, d.top + nh);
\r
2436 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["summary"], "100%", true, data["color"]);
\r
2437 d.cpwrap.html(tempdata);
\r
2444 case "fullday_item_move":
\r
2449 if (diffx > 5 || diffx < -5 || d.lasso) {
\r
2451 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2452 cp = d.target.clone();
\r
2454 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2456 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2457 d.cpwrap = cpwrap;
\r
2458 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2459 $(document.body).append(d.lasso);
\r
2460 cp = cpwrap = null;
\r
2462 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2463 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2464 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2465 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2470 case "std_item_month_drag":
\r
2475 var diffx = x - sx;
\r
2477 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.lasso) {
\r
2479 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);
\r
2480 cp = d.target.clone();
\r
2482 cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ") ");
\r
2484 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);
\r
2485 d.cpwrap = cpwrap;
\r
2486 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2487 $(document.body).append(d.lasso);
\r
2488 cp = cpwrap = null;
\r
2490 fixcppostion(d.cpwrap, e, d.xa, d.ya);
\r
2491 ndi = getdi(d.xa, d.ya, x, e.pageY);
\r
2492 if (!d.cdi || d.cdi.di != ndi.di) {
\r
2493 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);
\r
2503 function dragEnd(e) {
\r
2505 var d = _dragdata;
\r
2506 var tp, start, end, gh;
\r
2508 case "std_empty_drag": //day view
\r
2509 var wrapid = new Date().getTime();
\r
2510 tp = d.target.offset().top;
\r
2512 gh = gH(d.sy, d.sy + option.hour_height, tp);
\r
2513 var ny = gP(gh.sh, gh.sm);
\r
2514 var tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);
\r
2515 d.cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);
\r
2516 $(d.target).find("div.tg-col-overlaywrapper").append(d.cpwrap);
\r
2519 var pos = d.cpwrap.offset();
\r
2520 pos.left = pos.left + 30;
\r
2521 d.cpwrap.attr("id", wrapid);
\r
2522 start = new Date(parseInt(d.target.data("abbr")) + (d.cgh.sh * 3600 + d.cgh.sm * 60) * 1000);
\r
2523 end = new Date(parseInt(d.target.data("abbr")) + (d.cgh.eh * 3600 + d.cgh.em * 60) * 1000);
\r
2524 _dragevent = function () {
\r
2525 $("#" + wrapid).remove();
\r
2526 $("#bbit-cal-buddle").css("visibility", "hidden");
\r
2528 quickadd(start, end, false, pos);
\r
2530 case "fullday_empty_drag": //week view
\r
2531 case "empty_month_drag": //month view
\r
2532 var source = e.srcElement || e.target;
\r
2533 var lassoid = new Date().getTime();
\r
2535 if ($(source).hasClass("monthdayshow")) {
\r
2536 weekormonthtoday.call($(source).parent()[0], e);
\r
2539 d.fdi = d.sdi = getdi(d.xa, d.ya, d.sx, d.sy);
\r
2540 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");
\r
2541 $(document.body).append(d.lasso);
\r
2542 addlasso(d.lasso, d.sdi, d.fdi, d.xa, d.ya, d.h);
\r
2544 d.lasso.attr("id", lassoid);
\r
2545 var si = Math.min(d.fdi.di, d.sdi.di);
\r
2546 var ei = Math.max(d.fdi.di, d.sdi.di);
\r
2547 var firstday = option.vstart;
\r
2548 start = DateAdd("d", si, firstday);
\r
2549 end = DateAdd("d", ei, firstday);
\r
2550 _dragevent = function () {
\r
2551 $("#" + lassoid).remove();
\r
2553 quickadd(start, end, true, { left:e.pageX, top:e.pageY });
\r
2555 case "std_item_move": // event moving
\r
2557 start = DateAdd("d", d.cdi, option.vstart);
\r
2558 end = DateAdd("d", d.cdi, option.vstart);
\r
2559 gh = gW(d.ny, d.ny + d.h);
\r
2560 start.setHours(gh.sh, gh.sm);
\r
2561 end.setHours(gh.eh, gh.em);
\r
2562 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2563 d.cpwrap.remove();
\r
2567 dayupdate(d.data, start, end);
\r
2571 case "std_item_resize": //Resize
\r
2573 start = new Date(d.data["start"].toString());
\r
2574 end = new Date(d.data["end"].toString());
\r
2575 gh = gW(d.top, d.top + d.nh);
\r
2576 start.setHours(gh.sh, gh.sm);
\r
2577 end.setHours(gh.eh, gh.em);
\r
2578 if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {
\r
2579 d.cpwrap.remove();
\r
2583 dayupdate(d.data, start, end);
\r
2587 case "fullday_item_move":
\r
2588 case "std_item_month_drag":
\r
2590 d.cpwrap.remove();
\r
2592 start = new Date(d.data["start"].toString());
\r
2593 end = new Date(d.data["end"].toString());
\r
2594 var currrentdate = DateAdd("d", d.cdi.di, option.vstart);
\r
2595 var diff = DateDiff("d", start, currrentdate);
\r
2596 start = DateAdd("d", diff, start);
\r
2597 end = DateAdd("d", diff, end);
\r
2598 if (start.getTime() != d.data["start"].getTime() || end.getTime() != d.data["end"].getTime()) {
\r
2599 dayupdate(d.data, start, end);
\r
2604 d = _dragdata = null;
\r
2605 $('body').noSelect(false);
\r
2611 function getdi(xa, ya, x, y) {
\r
2616 if (xa && xa.length != 0) {
\r
2618 if (x >= xa[lx - 1].e) {
\r
2622 for (var i = 0; i < lx; i++) {
\r
2623 if (x > xa[i].s && x <= xa[i].e) {
\r
2630 if (ya && ya.length != 0) {
\r
2632 if (y >= ya[ly - 1].e) {
\r
2636 for (var j = 0; j < ly; j++) {
\r
2637 if (y > ya[j].s && y <= ya[j].e) {
\r
2644 return { x:tx, y:ty, di:ty * lx + tx };
\r
2647 function addlasso(lasso, sdi, edi, xa, ya, height) {
\r
2648 var diff = sdi.di > edi.di ? sdi.di - edi.di : edi.di - sdi.di;
\r
2650 var sp = sdi.di > edi.di ? edi : sdi;
\r
2651 var l = xa.length > 0 ? xa.length : 1;
\r
2652 var h = ya.length > 0 ? ya.length : 1;
\r
2654 var width = xa[0].e - xa[0].s;
\r
2657 var max = Math.min(document.documentElement.clientWidth, xa[l - 1].e) - 2;
\r
2659 while (j < h && diff > 0) {
\r
2660 var left = xa[i].s;
\r
2661 var d = i + diff > l ? l - i : diff;
\r
2662 var wid = width * d;
\r
2663 while (left + wid >= max) {
\r
2666 play.push(Tp(__LASSOTEMP, { left:left, top:ya[j].s, height:height, width:wid }));
\r
2671 lasso.html(play.join(""));
\r
2674 function fixcppostion(cpwrap, e, xa, ya) {
\r
2675 var x = e.pageX - 6;
\r
2676 var y = e.pageY - 4;
\r
2677 var w = cpwrap.width();
\r
2679 var lmin = xa[0].s + 6;
\r
2680 var tmin = ya[0].s + 4;
\r
2681 var lmax = xa[xa.length - 1].e - w - 2;
\r
2682 var tmax = ya[ya.length - 1].e - h - 2;
\r
2695 cpwrap.css({ left:x, top:y });
\r
2699 .mousemove(dragMove)
\r
2700 .mouseup(dragEnd);
\r
2701 //.mouseout(dragEnd);
\r
2704 sv:function (view) { //switch view
\r
2705 if (view == option.view) {
\r
2709 option.view = view;
\r
2720 option.showday = d;
\r
2726 switch (option.view) {
\r
2728 option.showday = DateAdd("d", -1, option.showday);
\r
2731 option.showday = DateAdd("w", -1, option.showday);
\r
2733 case "multi_days":
\r
2734 option.showday = DateAdd("w", -1, option.showday);
\r
2737 option.showday = DateAdd("m", -1, option.showday);
\r
2744 switch (option.view) {
\r
2746 option.showday = DateAdd("d", 1, option.showday);
\r
2749 option.showday = DateAdd("w", 1, option.showday);
\r
2751 case "multi_days":
\r
2752 option.showday = DateAdd("w", 1, option.showday);
\r
2755 var od = option.showday.getDate();
\r
2756 option.showday = DateAdd("m", 1, option.showday);
\r
2757 var nd = option.showday.getDate();
\r
2758 if (od != nd) //we go to the next month
\r
2760 option.showday = DateAdd("d", 0 - nd, option.showday); //last day of last month
\r
2771 option = $.extend(option, p);
\r
2779 * @description {Method} switchView To switch to another view.
\r
2780 * @param {String} view View name, one of 'day', 'week', 'multi_days', 'month'.
\r
2782 $.fn.switchView = function (view) {
\r
2783 return this.each(function () {
\r
2785 this.bcal.sv(view);
\r
2791 * @description {Method} reload To reload event of current time range.
\r
2793 $.fn.reload = function () {
\r
2794 return this.each(function () {
\r
2802 * @description {Method} gotoDate To go to a range containing date.
\r
2803 * If view is week, it will go to a week containing date.
\r
2804 * If view is month, it will got to a month containing date.
\r
2805 * @param {Date} d. Date to go.
\r
2807 $.fn.gotoDate = function (d) {
\r
2808 return this.each(function () {
\r
2816 * @description {Method} previousRange To go to previous date range.
\r
2817 * If view is week, it will go to previous week.
\r
2818 * If view is month, it will got to previous month.
\r
2820 $.fn.previousRange = function () {
\r
2821 return this.each(function () {
\r
2829 * @description {Method} nextRange To go to next date range.
\r
2830 * If view is week, it will go to next week.
\r
2831 * If view is month, it will got to next month.
\r
2833 $.fn.nextRange = function () {
\r
2834 return this.each(function () {
\r
2842 $.fn.BcalGetOp = function () {
\r
2843 if (this[0].bcal) {
\r
2844 return this[0].bcal.go();
\r
2850 $.fn.BcalSetOp = function (p) {
\r
2851 if (this[0].bcal) {
\r
2852 return this[0].bcal.so(p);
\r