]> git.mxchange.org Git - friendica-addons.git/blob - dav/common/wdcal/js/jquery.calendar.js
Initial Release of the calendar plugin
[friendica-addons.git] / dav / common / wdcal / js / jquery.calendar.js
1 /**\r
2  * @description {Class} wdCalendar\r
3  * This is the main class of wdCalendar.\r
4  */\r
5 (function ($) {\r
6         "use strict";\r
7 \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
10 \r
11 \r
12         function dateFormat(format) {\r
13                 var o = {\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
24                 };\r
25                 if (/(y+)/.test(format)) {\r
26                         format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));\r
27                 }\r
28                 for (var k in o) {\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
31                 }\r
32                 return format;\r
33         }\r
34 \r
35         function DateDiff(interval, d1, d2) {\r
36                 switch (interval) {\r
37                         case "d": //date\r
38                         case "w":\r
39                                 d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());\r
40                                 d2 = new Date(d2.getFullYear(), d2.getMonth(), d2.getDate());\r
41                                 break;  //w\r
42                         case "h":\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
45                                 break; //h\r
46                         case "n":\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
49                                 break;\r
50                         case "s":\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
53                                 break;\r
54                 }\r
55                 var t1 = d1.getTime(), t2 = d2.getTime();\r
56                 var diff = NaN;\r
57                 switch (interval) {\r
58                         case "y":\r
59                                 diff = d2.getFullYear() - d1.getFullYear();\r
60                                 break; //y\r
61                         case "m":\r
62                                 diff = (d2.getFullYear() - d1.getFullYear()) * 12 + d2.getMonth() - d1.getMonth();\r
63                                 break;    //m\r
64                         case "d":\r
65                                 diff = Math.floor(t2 / 86400000) - Math.floor(t1 / 86400000);\r
66                                 break;\r
67                         case "w":\r
68                                 diff = Math.floor((t2 + 345600000) / (604800000)) - Math.floor((t1 + 345600000) / (604800000));\r
69                                 break; //w\r
70                         case "h":\r
71                                 diff = Math.floor(t2 / 3600000) - Math.floor(t1 / 3600000);\r
72                                 break; //h\r
73                         case "n":\r
74                                 diff = Math.floor(t2 / 60000) - Math.floor(t1 / 60000);\r
75                                 break; //\r
76                         case "s":\r
77                                 diff = Math.floor(t2 / 1000) - Math.floor(t1 / 1000);\r
78                                 break; //s\r
79                         case "l":\r
80                                 diff = t2 - t1;\r
81                                 break;\r
82                 }\r
83                 return diff;\r
84 \r
85         }\r
86 \r
87         function DateAdd(interval, number, idate) {\r
88                 number = parseInt(number);\r
89                 var date;\r
90                 if (typeof (idate) == "string") {\r
91                         date = idate.split(/\D/);\r
92                         eval("var date = new Date(" + date.join(",") + ")");\r
93                 }\r
94 \r
95                 if (typeof (idate) == "object") {\r
96                         date = new Date(idate.toString());\r
97                 }\r
98                 switch (interval) {\r
99                         case "y":\r
100                                 date.setFullYear(date.getFullYear() + number);\r
101                                 break;\r
102                         case "m":\r
103                                 date.setMonth(date.getMonth() + number);\r
104                                 break;\r
105                         case "d":\r
106                                 date.setDate(date.getDate() + number);\r
107                                 break;\r
108                         case "w":\r
109                                 date.setDate(date.getDate() + 7 * number);\r
110                                 break;\r
111                         case "h":\r
112                                 date.setHours(date.getHours() + number);\r
113                                 break;\r
114                         case "n":\r
115                                 date.setMinutes(date.getMinutes() + number);\r
116                                 break;\r
117                         case "s":\r
118                                 date.setSeconds(date.getSeconds() + number);\r
119                                 break;\r
120                         case "l":\r
121                                 date.setMilliseconds(date.getMilliseconds() + number);\r
122                                 break;\r
123                 }\r
124                 return date;\r
125         }\r
126 \r
127         function ColorrCalcBrighten(col, factor) {\r
128                 return 255-Math.round((255 - col) * factor);\r
129         }\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
138         }\r
139 \r
140 \r
141         if ($.fn.noSelect == undefined) {\r
142                 $.fn.noSelect = function (p) { //no select plugin by me :-)\r
143                         var prevent;\r
144                         if (p == null)\r
145                                 prevent = true;\r
146                         else\r
147                                 prevent = p;\r
148                         if (prevent) {\r
149                                 return this.each(function () {\r
150                                         if ($.browser.msie || $.browser.safari) $(this).bind('selectstart', function () {\r
151                                                 return false;\r
152                                         });\r
153                                         else if ($.browser.mozilla) {\r
154                                                 $(this).css('MozUserSelect', 'none');\r
155                                                 $('body').trigger('focus');\r
156                                         }\r
157                                         else if ($.browser.opera) $(this).bind('mousedown', function () {\r
158                                                 return false;\r
159                                         });\r
160                                         else $(this).data('unselectable', 'on');\r
161                                 });\r
162 \r
163                         } else {\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
169                                 });\r
170 \r
171                         }\r
172                 }; //end noSelect\r
173         }\r
174         $.fn.bcalendar = function (option) {\r
175                 var def = {\r
176                         /**\r
177                          * @description {Config} view\r
178                          * {String} Three calendar view provided, 'day','multi_days','week','month'. 'week' by default.\r
179                          */\r
180                         view:"week",\r
181 \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
186 \r
187                         /**\r
188                          * @description {Config} weekstartday\r
189                          * {Number} First day of week 0 for Sun, 1 for Mon, 2 for Tue.\r
190                          */\r
191                         weekstartday:1, //start from Monday by default\r
192                         std_color: "#5858ff",\r
193                         /**\r
194                          * @description {Config} height\r
195                          * {Number} Calendar height, false for page height by default.\r
196                          */\r
197                         height:false,\r
198                         /**\r
199                          * @description {Config} url\r
200                          * {String} Url to request calendar data.\r
201                          */\r
202                         url:"",\r
203 \r
204                         /**\r
205                          * @description {Config} eventItems\r
206                          * {Array} event items for initialization.\r
207                          */\r
208                         eventItems:[],\r
209                         method:"POST",\r
210                         /**\r
211                          * @description {Config} showday\r
212                          * {Date} Current date. today by default.\r
213                          */\r
214                         showday:new Date(),\r
215                         /**\r
216                          * @description {Event} onBeforeRequestData:function(stage)\r
217                          * Fired before any ajax request is sent.\r
218                          * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.\r
219                          */\r
220                         onBeforeRequestData:false,\r
221                         /**\r
222                          * @description {Event} onAfterRequestData:function(stage)\r
223                          * Fired before any ajax request is finished.\r
224                          * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.\r
225                          */\r
226                         onAfterRequestData:false,\r
227                         /**\r
228                          * @description {Event} onAfterRequestData:function(stage)\r
229                          * Fired when some errors occur while any ajax request is finished.\r
230                          * @param {Number} stage. 1 for retrieving events, 2 - adding event, 3 - removiing event, 4 - update event.\r
231                          */\r
232                         onRequestDataError:false,\r
233 \r
234                         onWeekOrMonthToDay:false,\r
235 \r
236                         /**\r
237                          * @description {Event} quickAddHandler:function(calendar, param )\r
238                          * Fired when user quick adds an item. If this function is set, ajax request to quickAddUrl will abort.\r
239                          * @param {Object} calendar Calendar object.\r
240                          * @param {Array} param Format [{name:"name1", value:"value1"}, ...]\r
241                          *\r
242                          */\r
243                         quickAddHandler:false,\r
244 \r
245                         quickUpdateHandler:false,\r
246 \r
247                         quickDeleteHandler: false,\r
248                         /**\r
249                          * @description {Config} quickAddUrl\r
250                          * {String} Url for quick adding.\r
251                          */\r
252                         quickAddUrl:"",\r
253                         /**\r
254                          * @description {Config} quickUpdateUrl\r
255                          * {String} Url for time span update.\r
256                          */\r
257                         quickUpdateUrl:"",\r
258                         /**\r
259                          * @description {Config} quickDeleteUrl\r
260                          * {String} Url for removing an event.\r
261                          */\r
262                         quickDeleteUrl:"",\r
263                         /**\r
264                          * @description {Config} autoload\r
265                          * {Boolean} If event items is empty, and this param is set to true.\r
266                          * Event will be retrieved by ajax call right after calendar is initialized.\r
267                          */\r
268                         autoload:false,\r
269                         /**\r
270                          * @description {Config} readonly\r
271                          * {Boolean} Indicate calendar is readonly or editable\r
272                          */\r
273                         readonly:false,\r
274                         /**\r
275                          * @description {Config} extParam\r
276                          * {Array} Extra params submitted to server.\r
277                          * Sample - [{name:"param1", value:"value1"}, {name:"param2", value:"value2"}]\r
278                          */\r
279                         extParam:[],\r
280                         /**\r
281                          * @description {Config} enableDrag\r
282                          * {Boolean} Whether end user can drag event item by mouse.\r
283                          */\r
284                         enableDrag:true,\r
285                         url_add:"",\r
286                         num_days:7,\r
287                         hour_height:42,\r
288 \r
289                         calendars_available:[],\r
290                         calendars_selected:[]\r
291                 };\r
292                 var eventDiv = $("#gridEvent");\r
293                 if (eventDiv.length == 0) {\r
294                         eventDiv = $("<div id='gridEvent' style='display:none;'></div>").appendTo(document.body);\r
295                 }\r
296                 var $gridcontainer = $(this);\r
297                 option = $.extend(def, option);\r
298 \r
299                 //no quickUpdateUrl, dragging disabled.\r
300                 if (option.quickUpdateUrl == null || option.quickUpdateUrl == "") {\r
301                         option.enableDrag = false;\r
302                 }\r
303                 //template for month and date\r
304                 var __SCOLLEVENTTEMP = "<DIV style=\"width:{width};top:{top};left:{left};\" title=\"{title}\" class=\"chip chip{i} {drag} {addclasses}\">" +\r
305                         "<DIV style=\"border-bottom-color:{bdcolor}\" class=ct>&nbsp;</DIV>" +\r
306                         "<DL style=\"border-color:{bdcolor}; background-color:{bgcolor1}; height: {height}px;\"><DT style=\"background-color:{bgcolor2}\">{starttime} - {endtime} {icon}</DT>" +\r
307                         "<DD><SPAN>{content}</SPAN></DD><DIV class='resizer' style='display:{redisplay}'><DIV class=rszr_icon>&nbsp;</DIV></DIV></DL>" +\r
308                         "<DIV style=\"BORDER-BOTTOM-COLOR:{bdcolor}; background-color:{bgcolor1}; border-color: {bdcolor};\" class=cb1>&nbsp;</DIV>" +\r
309                         "<DIV style=\"border-color:{bdcolor};\" class=cb2>&nbsp;</DIV></DIV>";\r
310                 var __ALLDAYEVENTTEMP = '<div class="rb-o {eclass}" id="{id}" title="{title}" style="color:{color};">' +\r
311                         '<div class="{extendClass} rb-m" style="background-color:{color}">{extendHTML}<div class="rb-i">{content}</div></div></div>';\r
312                 var __MonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r
313                 var __LASSOTEMP = "<div class='drag-lasso' style=\"left:{left}px;top:{top}px;width:{width}px;height:{height}px;\">&nbsp;</div>";\r
314                 //for dragging var\r
315                 var _dragdata;\r
316                 var _dragevent;\r
317 \r
318                 //clear DOM\r
319                 clearcontainer();\r
320 \r
321                 //no height specified in options, we get page height.\r
322                 if (!option.height) {\r
323                         option.height = document.documentElement.clientHeight;\r
324                 }\r
325                 //\r
326                 $gridcontainer.css("overflow-y", "visible").height(option.height - 8);\r
327 \r
328                 //populate events data for first display.\r
329                 if (option.url && option.autoload) {\r
330                         populate();\r
331                 }\r
332                 else {\r
333                         //contruct HTML          \r
334                         render();\r
335                 }\r
336 \r
337                 //clear DOM\r
338                 function clearcontainer() {\r
339                         $gridcontainer.empty();\r
340                 }\r
341 \r
342 \r
343                 //contruct DOM \r
344                 function render() {\r
345                         //params needed\r
346                         //viewType, showday, events, config                     \r
347                         var showday = new Date(option.showday.getFullYear(), option.showday.getMonth(), option.showday.getDate());\r
348                         var events = option.eventItems;\r
349                         var config = { view:option.view, weekstartday:option.weekstartday, color:option.std_color };\r
350                         if (option.view == "day" || option.view == "week" || option.view == "multi_days") {\r
351                                 var $dvtec = $gridcontainer.find(".scrolltimeevent");\r
352                                 if ($dvtec.length > 0) {\r
353                                         option.scroll = $dvtec.scrollTop(); //get scroll bar position\r
354                                 }\r
355                         }\r
356                         switch (option.view) {\r
357                                 case "day":\r
358                                         BuildDaysAndWeekView(showday, 1, events, config);\r
359                                         break;\r
360                                 case "week":\r
361                                         BuildDaysAndWeekView(showday, 7, events, config);\r
362                                         break;\r
363                                 case "multi_days":\r
364                                         BuildDaysAndWeekView(showday, option.num_days, events, config);\r
365                                         break;\r
366                                 case "month":\r
367                                         BuildMonthView(showday, events, config);\r
368                                         break;\r
369                                 default:\r
370                                         alert(i18n.xgcalendar["no_implement"]);\r
371                                         break;\r
372                         }\r
373                         initevents(option.view);\r
374                         ResizeView();\r
375                 }\r
376 \r
377                 //build day view\r
378                 function BuildDaysAndWeekView(startday, l, events, config) {\r
379                         var days = [],\r
380                                 show;\r
381                         if (l == 1) {\r
382                                 show = dateFormat.call(startday, option.date_format_dm1);\r
383                                 days.push({ display:show, date:startday, day:startday.getDate(), year:startday.getFullYear(), month:startday.getMonth() + 1 });\r
384                                 option.datestrshow = CalDateShow(days[0].date);\r
385                                 option.vstart = days[0].date;\r
386                                 option.vend = days[0].date;\r
387                         }\r
388                         else {\r
389                                 var w = 0;\r
390                                 if (l == 7) {\r
391                                         w = config.weekstartday - startday.getDay();\r
392                                         if (w > 0) w = w - 7;\r
393                                 }\r
394                                 var ndate;\r
395                                 for (var i = w, j = 0; j < l; i = i + 1, j++) {\r
396                                         ndate = DateAdd("d", i, startday);\r
397                                         show = dateFormat.call(ndate, option.date_format_dm1);\r
398                                         days.push({ display:show, date:ndate, day:ndate.getDate(), year:ndate.getFullYear(), month:ndate.getMonth() + 1 });\r
399                                 }\r
400                                 option.vstart = days[0].date;\r
401                                 option.vend = days[l - 1].date;\r
402                                 option.datestrshow = CalDateShow(days[0].date, days[l - 1].date);\r
403                         }\r
404 \r
405                         var allDayEvents = [];\r
406                         var scrollDayEvents = [];\r
407                         //get number of all-day events, including more-than-one-day events.\r
408                         var dM = PrepareEvents(days, events, allDayEvents, scrollDayEvents);\r
409 \r
410                         var $html = $("<div class=\"wktopcontainer\"></div>");\r
411                         $html.append(BuildWT(days, allDayEvents, dM));\r
412 \r
413                         $gridcontainer.html("").append($html);\r
414 \r
415                         $html = $("<div class=\"scrolltimeevent\"></div>");\r
416                         $html.append(BuildDayScollEventContainer(days, scrollDayEvents));\r
417                         $gridcontainer.append($html);\r
418 \r
419                         //TODO event handlers\r
420                         //$gridcontainer.find(".weekViewAllDaywk").click(RowHandler);\r
421                 }\r
422 \r
423                 //build month view\r
424                 function BuildMonthView(showday, events, config) {\r
425                         $gridcontainer.find("*").remove();\r
426                         $gridcontainer.append("<div class='cal-month-cc cc'><div class='cal-month-cc-header'><div class='cc-close cal-month-closebtn'></div><div class='cal-month-cc-title cc-title'></div></div><div class='cal-month-cc-body cc-body'><div class='cal-month-cc-content st-contents'><table class='st-grid'><tbody></tbody></table></div></div></div>");\r
427                         var html = [];\r
428                         //build header\r
429                         html.push("<div id=\"mvcontainer\" class=\"mv-container\">");\r
430                         html.push("<table id=\"mvweek\" class=\"mv-daynames-table\"><tbody><tr>");\r
431                         for (var i = config.weekstartday, j = 0; j < 7; i++, j++) {\r
432                                 if (i > 6) i = 0;\r
433                                 html.push("<th class=\"mv-dayname\" title=\"", __WDAY[i], "\">", __WDAY[i], "");\r
434                         }\r
435                         html.push("</tr></tbody></table>");\r
436                         html.push("</div>");\r
437                         $gridcontainer.append(html.join(""));\r
438 \r
439                         var bH = GetMonthViewBodyHeight() - GetMonthViewHeaderHeight();\r
440                         var $container = $("<div class=\"mvEventContainer mv-event-container\" style=\"height:" + bH + "px;" + "\"></div>");\r
441                         var $body = BuilderMonthBody(showday, config.weekstartday, events, bH);\r
442                         $container.append($body);\r
443                         $gridcontainer.append($container);\r
444 \r
445                         $gridcontainer.find(".cal-month-closebtn").click(closeCc);\r
446                 }\r
447 \r
448                 function closeCc() {\r
449                         $gridcontainer.find(".cal-month-cc").css("visibility", "hidden");\r
450                 }\r
451 \r
452                 //all-day event, including more-than-one-day events \r
453                 function PrepareEvents(dayarrs, events, allDayEvents, scrolLDayEvents) {\r
454                         var i, j, k, de, x, y, La, H, D, Ia,\r
455                                 tmp_allday = allDayEvents,\r
456                                 tmp_scrollevents = scrolLDayEvents,\r
457                                 l = dayarrs.length,\r
458                                 el = events.length,\r
459                                 fE = [];\r
460                         for (j = 0; j < el; j++) {\r
461                                 var sD = events[j]["start"];\r
462                                 var eD = events[j]["end"];\r
463                                 var s = {};\r
464                                 s.event = events[j];\r
465                                 s.day = sD.getDate();\r
466                                 s.year = sD.getFullYear();\r
467                                 s.month = sD.getMonth() + 1;\r
468                                 s.allday = events[j]["is_allday"] == 1;\r
469                                 s.crossday = events[j]["is_moredays"] == 1;\r
470                                 s.reevent = events[j]["is_recurring"] == 1; //Recurring event\r
471                                 s.daystr = [s.year, s.month, s.day].join("/");\r
472                                 s.st = {};\r
473                                 s.st.hour = sD.getHours();\r
474                                 s.st.minute = sD.getMinutes();\r
475                                 s.st.p = s.st.hour * 60 + s.st.minute; // start time\r
476                                 s.et = {};\r
477                                 s.et.hour = eD.getHours();\r
478                                 s.et.minute = eD.getMinutes();\r
479                                 s.et.p = s.et.hour * 60 + s.et.minute; // end time\r
480                                 fE.push(s);\r
481                         }\r
482                         var dMax = 0;\r
483                         for (i = 0; i < l; i++) {\r
484                                 var da = dayarrs[i];\r
485                                 tmp_scrollevents[i] = [];\r
486                                 tmp_allday[i] = [];\r
487                                 da.daystr = da.year + "/" + da.month + "/" + da.day;\r
488                                 for (j = 0; j < fE.length; j++) {\r
489                                         if (!fE[j].crossday && !fE[j].allday) {\r
490                                                 if (da.daystr == fE[j].daystr)\r
491                                                         tmp_scrollevents[i].push(fE[j]);\r
492                                         }\r
493                                         else {\r
494                                                 if (da.daystr == fE[j].daystr) {\r
495                                                         tmp_allday[i].push(fE[j]);\r
496                                                         dMax++;\r
497                                                 }\r
498                                                 else {\r
499                                                         if (i == 0 && da.date >= fE[j].event["start"] && da.date <= fE[j].event["end"])//first more-than-one-day event\r
500                                                         {\r
501                                                                 tmp_allday[i].push(fE[j]);\r
502                                                                 dMax++;\r
503                                                         }\r
504                                                 }\r
505                                         }\r
506                                 }\r
507                         }\r
508                         var lrdate = dayarrs[l - 1].date;\r
509                         for (i = 0; i < l; i++) { //to deal with more-than-one-day event\r
510                                 de = tmp_allday[i];\r
511                                 if (de.length > 0) { //           \r
512                                         for (j = 0; j < de.length; j++) {\r
513                                                 var end = DateDiff("d", lrdate, de[j].event["end"]) > 0 ? lrdate : de[j].event["end"];\r
514                                                 de[j].colSpan = DateDiff("d", dayarrs[i].date, end) + 1\r
515                                         }\r
516                                 }\r
517                                 de = null;\r
518                         }\r
519                         //for all-day events\r
520                         for (i = 0; i < l; i++) {\r
521                                 de = tmp_scrollevents[i];\r
522                                 if (de.length > 0) {\r
523                                         x = [];\r
524                                         y = [];\r
525                                         D = [];\r
526                                         var dl = de.length;\r
527                                         for (j = 0; j < dl; ++j) {\r
528                                                 var ge = de[j];\r
529                                                 for (La = ge.st.p, Ia = 0; y[Ia] > La;) Ia++;\r
530                                                 ge.PO = Ia;\r
531                                                 ge.ne = []; //PO is how many events before this one\r
532                                                 y[Ia] = ge.et.p || 1440;\r
533                                                 x[Ia] = ge;\r
534                                                 if (!D[Ia]) {\r
535                                                         D[Ia] = [];\r
536                                                 }\r
537                                                 D[Ia].push(ge);\r
538                                                 if (Ia != 0) {\r
539                                                         ge.pe = [x[Ia - 1]]; //previous event\r
540                                                         x[Ia - 1].ne.push(ge); //next event\r
541                                                 }\r
542                                                 for (Ia = Ia + 1; y[Ia] <= La;) Ia++;\r
543                                                 if (x[Ia]) {\r
544                                                         k = x[Ia];\r
545                                                         ge.ne.push(k);\r
546                                                         k.pe.push(ge);\r
547                                                 }\r
548                                                 ge.width = 1 / (ge.PO + 1);\r
549                                                 ge.left = 1 - ge.width;\r
550                                         }\r
551                                         k = Array.prototype.concat.apply([], D);\r
552                                         x = y = D = null;\r
553                                         var t = k.length;\r
554                                         for (y = t; y--;) {\r
555                                                 H = 1;\r
556                                                 La = 0;\r
557                                                 x = k[y];\r
558                                                 for (D = x.ne.length; D--;) {\r
559                                                         Ia = x.ne[D];\r
560                                                         La = Math.max(La, Ia.VL);\r
561                                                         H = Math.min(H, Ia.left)\r
562                                                 }\r
563                                                 x.VL = La + 1;\r
564                                                 x.width = H / (x.PO + 1);\r
565                                                 x.left = H - x.width;\r
566                                         }\r
567                                         for (y = 0; y < t; y++) {\r
568                                                 x = k[y];\r
569                                                 x.left = 0;\r
570                                                 if (x.pe) for (D = x.pe.length; D--;) {\r
571                                                         H = x.pe[D];\r
572                                                         x.left = Math.max(x.left, H.left + H.width);\r
573                                                 }\r
574                                                 var p = (1 - x.left) / x.VL;\r
575                                                 x.width = Math.max(x.width, p);\r
576                                                 x.aQ = Math.min(1 - x.left, x.width + 0.7 * p); //width offset\r
577                                         }\r
578                                         de = null;\r
579                                         tmp_scrollevents[i] = k;\r
580                                 }\r
581                         }\r
582                         return dMax;\r
583                 }\r
584 \r
585 \r
586                 // Week view: top row (full-day events)\r
587                 function BuildWT(dayarrs, events, dMax) {\r
588                         //1:\r
589                         var i, j, h, e, el, x, l;\r
590                         var html = "<table class=\"wk-top\">";\r
591                         html += "<tr><th style='width: 60px;' rowspan=\"3\">&nbsp;</th>";\r
592                         for (i = 0; i < dayarrs.length; i++) {\r
593                                 var ev, title, cl;\r
594                                 if (dayarrs.length == 1) {\r
595                                         ev = "";\r
596                                         title = "";\r
597                                         cl = "";\r
598                                 }\r
599                                 else {\r
600                                         ev = ""; // "onclick=\"javascript:FunProxy('week2day',event,this);\"";\r
601                                         title = i18n.xgcalendar.to_date_view;\r
602                                         cl = "wk-daylink";\r
603                                 }\r
604                                 html += "<th data-abbr='" + dayarrs[i].date.getTime() + "' class='gcweekname' scope=\"col\">";\r
605                                 html += "<div title='" + title + "' " + ev + " class='wk-dayname'><span class='" + cl + "'>" + dayarrs[i].display + "</span></div></th>";\r
606 \r
607                         }\r
608                         html += "<th style='width: 16px;' rowspan=\"3\">&nbsp;</th>";\r
609                         html += "</tr>"; //end tr1;\r
610                         //2:          \r
611                         html += "<tr>";\r
612                         html += "<td class=\"wk-allday\"";\r
613 \r
614                         if (dayarrs.length > 1) {\r
615                                 html += " colSpan='" + dayarrs.length + "'";\r
616                         }\r
617                         //onclick=\"javascript:FunProxy('rowhandler',event,this);\"\r
618                         html += "><div class=\"weekViewAllDaywk\" ><table class=\"st-grid\"><tbody>";\r
619 \r
620                         if (dMax == 0) {\r
621                                 html += "<tr>";\r
622                                 for (i = 0; i < dayarrs.length; i++) {\r
623                                         html += "<td class=\"st-c st-s\" data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "' data-axis='00:00'>&nbsp;</td>";\r
624                                 }\r
625                                 html += "</tr>";\r
626                         }\r
627                         else {\r
628                                 l = events.length;\r
629                                 el = 0;\r
630                                 x = [];\r
631                                 for (j = 0; j < l; j++) {\r
632                                         x.push(0);\r
633                                 }\r
634                                 //var c = tc();\r
635                                 for (j = 0; el < dMax; j++) {\r
636                                         html += "<tr class='row" + j + "'>";\r
637                                         for (h = 0; h < l;) {\r
638                                                 e = events[h][x[h]];\r
639                                                 html += "<td class='st-c col" + h;\r
640                                                 if (e) { //if exists\r
641                                                         x[h] = x[h] + 1;\r
642                                                         html += "'";\r
643                                                         if (e.colSpan > 1) {\r
644                                                                 html += " colSpan='" + e.colSpan + "'";\r
645                                                                 h += e.colSpan;\r
646                                                         }\r
647                                                         else {\r
648                                                                 h++;\r
649                                                         }\r
650                                                         html += " ch='show'>";\r
651                                                         el++;\r
652                                                 }\r
653                                                 else {\r
654                                                         html += " st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime()  + "' data-axis='00:00'>&nbsp;";\r
655                                                         h++;\r
656                                                 }\r
657                                                 html += "</td>";\r
658                                         }\r
659                                         html += "</tr>";\r
660                                 }\r
661                                 html += "<tr>";\r
662                                 for (h = 0; h < l; h++) {\r
663                                         html += "<td class='st-c st-s' data-ch='qkadd' data-abbr='" + dayarrs[h].date.getTime() + "' data-axis='00:00'>&nbsp;</td>";\r
664                                 }\r
665                                 html += "</tr>";\r
666                         }\r
667                         html += "</tbody></table></div></td></tr>"; // stgrid end //wvAd end //td2 end //tr2 end\r
668                         //3:\r
669                         html += "<tr>";\r
670 \r
671                         html += "<td style=\"height: 5px;\"";\r
672                         if (dayarrs.length > 1) {\r
673                                 html += " colSpan='" + dayarrs.length + "'";\r
674                         }\r
675                         html += "></td>";\r
676                         html += "</tr>";\r
677                         html += "</table>";\r
678                         var $el = $(html);\r
679 \r
680                         if (dMax > 0) {\r
681                                 l = events.length;\r
682                                 el = 0;\r
683                                 x = [];\r
684                                 for (j = 0; j < l; j++) {\r
685                                         x.push(0);\r
686                                 }\r
687                                 for (j = 0; el < dMax; j++) {\r
688                                         for (h = 0; h < l;) {\r
689                                                 e = events[h][x[h]];\r
690                                                 if (e) { //if exists\r
691                                                         x[h] = x[h] + 1;\r
692                                                         var $t = BuildMonthDayEvent(e, dayarrs[h].date, l - h);\r
693                                                         $el.find(".row" + j + " .col" + h).append($t);\r
694                                                         if (e.colSpan > 1) {\r
695                                                                 h += e.colSpan;\r
696                                                         }\r
697                                                         else {\r
698                                                                 h++;\r
699                                                         }\r
700                                                         el++;\r
701                                                 }\r
702                                                 else {\r
703                                                         h++;\r
704                                                 }\r
705                                         }\r
706                                 }\r
707                         }\r
708 \r
709                         return $el;\r
710                 }\r
711 \r
712                 function BuildDayScollEventContainer(dayarrs, events) {\r
713                         //1:\r
714                         var i, c;\r
715 \r
716                         var html = "<table style=\"table-layout: fixed;";\r
717                         html += ($.browser.msie ? "" : "width:100%");\r
718                         html += "\"><tbody><tr><td><table style=\"height: " + (option.hour_height * 24) + "px\" class=\"tg-timedevents\"><tbody>";\r
719                         html += "<tr><td style='width:60px;'></td><td";\r
720                         if (dayarrs.length > 1) {\r
721                                 html += " colSpan='" + dayarrs.length + "'";\r
722                         }\r
723                         html += "><div class=\"tg-spanningwrapper\"><div style=\"font-size: " + (Math.round(option.hour_height / 2) - 1) + "px\" class=\"tg-hourmarkers\">";\r
724                         for (i = 0; i < 24; i++) {\r
725                                 html += "<div class=\"tg-dualmarker\"></div>";\r
726                         }\r
727                         html += "</div></div></td></tr>";\r
728 \r
729                         //2:\r
730                         html += "<tr>";\r
731                         html += "<td style=\"width: 60px; \" class=\"tg-times\">";\r
732 \r
733                         //get current time \r
734                         var now = new Date();\r
735                         var h = now.getHours();\r
736                         var m = now.getMinutes();\r
737                         var mHg = gP(h, m) - 4; //make middle alignment vertically\r
738                         html += "<div id=\"tgnowptr\" class=\"tg-nowptr\" style=\"left:0;top:" + mHg + "px\"></div>";\r
739                         for (i = 0; i < 24; i++) html += "<div style=\"height: " + (option.hour_height - 1) + "px\" class=\"tg-time\">" + fomartTimeShow(i) + "</div>";\r
740                         html += "</td>";\r
741 \r
742                         var l = dayarrs.length;\r
743                         var hh24 = option.hour_height * 24;\r
744                         for (i = 0; i < l; i++) {\r
745                                 html += "<td class='tg-col' data-ch='qkadd' data-abbr='" + dayarrs[i].date.getTime() + "'>";\r
746                                 var istoday = formatDate(dayarrs[i].date) == formatDate(new Date());\r
747                                 // Today\r
748                                 if (istoday) {\r
749                                         html += "<div style=\"margin-bottom: -" + hh24 + "px; height:" + hh24 + "px\" class=\"tg-today\">&nbsp;</div>";\r
750                                 }\r
751                                 //var eventC = $(eventWrap);\r
752                                 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"\r
753                                 html += "<div  style=\"margin-bottom: -" + hh24 + "px; height: " + hh24 + "px\" data-col='" + i + "' class='tgCol" + i + " tg-col-eventwrapper'></div>";\r
754 \r
755                                 html += "<div class='tg-col-overlaywrapper tgOver" + i + "' data-col='" + i + "'>";\r
756                                 if (istoday) {\r
757                                         var mhh = mHg + 4;\r
758                                         html += "<div class=\"tg-hourmarker tg-nowmarker\" style=\"left:0;top:" + mhh + "px\"></div>";\r
759                                 }\r
760                                 html += "</div>";\r
761                                 html += "</td>";\r
762                         }\r
763                         html += "</tr>";\r
764 \r
765                         html += "</tbody></table></td></tr></tbody></table>";\r
766                         var $container = $(html);\r
767 \r
768                         for (i = 0; i < l; i++) {\r
769                                 var $col = $container.find(".tgCol" + i);\r
770                                 for (var j = 0; j < events[i].length; j++) {\r
771                                         if (events[i][j].event["color"] && events[i][j].event["color"].match(/^#[0-9a-f]{6}$/i)) {\r
772                                                 c = events[i][j].event["color"];\r
773                                         }\r
774                                         else {\r
775                                                 c = option.std_color;\r
776                                         }\r
777                                         var $tt = BuildDayEvent(c, events[i][j], j);\r
778                                         $col.append($tt);\r
779                                 }\r
780                         }\r
781 \r
782                         return $container;\r
783                 }\r
784 \r
785 \r
786                 function getTitle(event) {\r
787                         var timeshow, eventshow;\r
788                         var showtime = event["is_allday"] != 1;\r
789                         eventshow = event["subject"];\r
790                         var startformat = getymformat(event["start"], null, showtime, true);\r
791                         var endformat = getymformat(event["end"], event["start"], showtime, true);\r
792                         timeshow = dateFormat.call(event["start"], startformat) + " - " + dateFormat.call(event["end"], endformat);\r
793                         //var linebreak = ($.browser.mozilla?"":"\r\n");\r
794                         var linebreak = "\r\n";\r
795                         var ret = [];\r
796                         if (event["is_allday"] == 1) {\r
797                                 //ret.push("[" + i18n.xgcalendar.allday_event + "]", linebreak );\r
798                         }\r
799                         else {\r
800                                 if (event["is_recurring"] == 1) {\r
801                                         ret.push("[" + i18n.xgcalendar.repeat_event + "]", linebreak);\r
802                                 }\r
803                         }\r
804                         ret.push(i18n.xgcalendar.time + ": ", timeshow, linebreak, i18n.xgcalendar.event + ": ", eventshow);\r
805 \r
806                         if (event["location"] != undefined && event["location"] != "") {\r
807                                 ret.push(linebreak, i18n.xgcalendar.location + ": ", event["location"]);\r
808                         }\r
809 \r
810                         if (event["attendees"] != undefined && event["attendees"] != "") {\r
811                                 ret.push(linebreak, i18n.xgcalendar.participant + ": ", event["attendees"]);\r
812                         }\r
813                         return ret.join("");\r
814                 }\r
815 \r
816                 function BuildDayEvent(color, e, index) {\r
817                         var theme = ColorCalcValues(color);\r
818                         var p = { bdcolor:theme[0], bgcolor2:theme[0], bgcolor1:theme[2], width:"70%", icon:"", title:"", data:"" };\r
819                         p.starttime = pZero(e.st.hour) + ":" + pZero(e.st.minute);\r
820                         p.endtime = pZero(e.et.hour) + ":" + pZero(e.et.minute);\r
821                         p.content = e.event["subject"];\r
822                         p.title = getTitle(e.event);\r
823                         var icons = [];\r
824                         if (e.event["has_notification"] == 1) icons.push("<I class=\"cic cic-tmr\">&nbsp;</I>");\r
825                         if (e.reevent) {\r
826                                 icons.push("<I class=\"cic cic-spcl\">&nbsp;</I>");\r
827                         }\r
828                         p.icon = icons.join("");\r
829                         var sP = gP(e.st.hour, e.st.minute);\r
830                         var eP = gP(e.et.hour, e.et.minute);\r
831                         p.top = sP + "px";\r
832                         p.left = (e.left * 100) + "%";\r
833                         p.width = (e.aQ * 100) + "%";\r
834                         p.height = (eP - sP - 4);\r
835                         p.i = index;\r
836                         if (option.enableDrag && e.event["is_editable_quick"] == 1) {\r
837                                 p.drag = "drag";\r
838                                 p.redisplay = "block";\r
839                         }\r
840                         else {\r
841                                 p.drag = "";\r
842                                 p.redisplay = "none";\r
843                         }\r
844 \r
845                         p.addclasses = (e.event["is_editable_quick"] ? "editable" : "not_editable");\r
846 \r
847                         var $newtemp = $(Tp(__SCOLLEVENTTEMP, p));\r
848                         $newtemp.data("eventdata", $.extend(true, {}, e.event));\r
849 \r
850                         return $newtemp;\r
851                 }\r
852 \r
853                 //get body height in month view\r
854                 function GetMonthViewBodyHeight() {\r
855                         return option.height;\r
856                 }\r
857 \r
858                 function GetMonthViewHeaderHeight() {\r
859                         return 21;\r
860                 }\r
861 \r
862                 function BuilderMonthBody(showday, startday, events, bodyHeight) {\r
863                         var i, j, k, b, day;\r
864 \r
865                         var htb = [];\r
866                         var firstdate = new Date(showday.getFullYear(), showday.getMonth(), 1);\r
867                         var diffday = startday - firstdate.getDay();\r
868                         var showmonth = showday.getMonth();\r
869                         if (diffday > 0) {\r
870                                 diffday -= 7;\r
871                         }\r
872                         var startdate = DateAdd("d", diffday, firstdate);\r
873                         var enddate = DateAdd("d", 34, startdate);\r
874                         var rc = 5;\r
875 \r
876                         if (enddate.getFullYear() == showday.getFullYear() && enddate.getMonth() == showday.getMonth() && enddate.getDate() < __MonthDays[showmonth]) {\r
877                                 enddate = DateAdd("d", 7, enddate);\r
878                                 rc = 6;\r
879                         }\r
880                         option.vstart = startdate;\r
881                         option.vend = enddate;\r
882                         option.datestrshow = CalDateShow(startdate, enddate);\r
883                         bodyHeight = bodyHeight - 18 * rc;\r
884                         var rowheight = bodyHeight / rc;\r
885                         var roweventcount = parseInt(rowheight / 21);\r
886                         if (rowheight % 21 > 15) {\r
887                                 roweventcount++;\r
888                         }\r
889                         var p = 100 / rc;\r
890                         var formatevents = [];\r
891                         var hastdata = formartEventsInHashtable(events, startday, 7, startdate, enddate);\r
892                         var B = [];\r
893                         var C = [];\r
894                         for (j = 0; j < rc; j++) {\r
895                                 k = 0;\r
896                                 formatevents[j] = b = [];\r
897                                 for (i = 0; i < 7; i++) {\r
898                                         var newkeyDate = DateAdd("d", j * 7 + i, startdate);\r
899                                         C[j * 7 + i] = newkeyDate;\r
900                                         var newkey = dateFormat.call(newkeyDate, i18n.xgcalendar.dateformat.fulldaykey);\r
901                                         b[i] = hastdata[newkey];\r
902                                         if (b[i] && b[i].length > 0) {\r
903                                                 k += b[i].length;\r
904                                         }\r
905                                 }\r
906                                 B[j] = k;\r
907                         }\r
908                         eventDiv.data("mvdata", formatevents);\r
909                         for (j = 0; j < rc; j++) {\r
910                                 //onclick=\"javascript:FunProxy('rowhandler',event,this);\"\r
911                                 htb.push("<div style=\"HEIGHT:", p, "%; TOP:", p * j, "%\" data-row=\"" + j + "\" class=\"month-row mvrow_" + j + "\">");\r
912                                 htb.push("<table class=\"st-bg-table\"><tbody><tr>");\r
913 \r
914                                 for (i = 0; i < 7; i++) {\r
915                                         day = C[j * 7 + i];\r
916                                         htb.push("<td data-abbr='", day.getTime(), "' data-ch='qkadd' data-axis='00:00' title=''");\r
917 \r
918                                         if (formatDate(day) == formatDate(new Date())) {\r
919                                                 htb.push(" class=\"st-bg st-bg-today\">");\r
920                                         } else if (day.getMonth() != showmonth) {\r
921                                                 htb.push(" class=\"st-bg st-bg-nonmonth\">");\r
922                                         } else {\r
923                                                 htb.push(" class=\"st-bg\">");\r
924                                         }\r
925                                         htb.push("&nbsp;</td>");\r
926                                 }\r
927                                 //bgtable\r
928                                 htb.push("</tr></tbody></table>");\r
929 \r
930                                 //stgrid\r
931                                 htb.push("<table class=\"st-grid row" + j + "\"><tbody>");\r
932 \r
933                                 //title tr\r
934                                 htb.push("<tr>");\r
935                                 var titletemp = "<td class=\"st-dtitle{titleClass}\" data-ch='qkadd' data-abbr='{abbr}' data-axis='00:00' title=\"{title}\"><span class='monthdayshow'>{dayshow}</span></a></td>";\r
936 \r
937                                 for (i = 0; i < 7; i++) {\r
938                                         var o = { titleClass:"", dayshow:"" };\r
939                                         day = C[j * 7 + i];\r
940                                         if (formatDate(day) == formatDate(new Date())) {\r
941                                                 o.titleClass = " st-dtitle-today";\r
942                                         }\r
943                                         if (day.getMonth() != showmonth) {\r
944                                                 o.titleClass = " st-dtitle-nonmonth";\r
945                                         }\r
946                                         o.title = formatDate(day);\r
947                                         if (day.getDate() == 1) {\r
948                                                 if (day.getMonth == 0) {\r
949                                                         o.dayshow = formatDate(day);\r
950                                                 }\r
951                                                 else {\r
952                                                         o.dayshow = dateFormat.call(day, option.date_format_dm2).toString();\r
953                                                 }\r
954                                         }\r
955                                         else {\r
956                                                 o.dayshow = day.getDate();\r
957                                         }\r
958                                         o.abbr = day.getTime();\r
959                                         htb.push(Tp(titletemp, o));\r
960                                 }\r
961                                 htb.push("</tr>");\r
962                                 htb.push("</tbody></table>");\r
963                                 //month-row\r
964                                 htb.push("</div>");\r
965                         }\r
966                         var $ret = $(htb.join(""));\r
967 \r
968                         for (j = 0; j < rc; j++) {\r
969                                 var sfirstday = C[j * 7];\r
970                                 var dMax = B[j];\r
971                                 var obs = BuildMonthRow(formatevents[j], dMax, roweventcount, sfirstday);\r
972                                 for (i = 0; i < obs.length; i++) $ret.find(".row" + j).append(obs[i]);\r
973                                 //htb=htb.concat(rowHtml); rowHtml = null;\r
974 \r
975                         }\r
976                         return $ret;\r
977                 }\r
978 \r
979                 //formate datetime \r
980                 function formartEventsInHashtable(events, startday, daylength, rbdate, redate) {\r
981                         var key;\r
982                         var hast = new Object();\r
983                         var l = events.length;\r
984                         for (var i = 0; i < l; i++) {\r
985                                 var sD = events[i]["start"];\r
986                                 var eD = events[i]["end"];\r
987                                 var diff = DateDiff("d", sD, eD);\r
988                                 var s = {};\r
989                                 s.event = events[i];\r
990                                 s.day = sD.getDate();\r
991                                 s.year = sD.getFullYear();\r
992                                 s.month = sD.getMonth() + 1;\r
993                                 s.allday = events[i]["is_allday"] == 1;\r
994                                 s.crossday = events[i]["is_moredays"] == 1;\r
995                                 s.reevent = events[i]["is_recurring"] == 1; //Recurring event\r
996                                 s.daystr = s.year + "/" + s.month + "/" + s.day;\r
997                                 s.st = {};\r
998                                 s.st.hour = sD.getHours();\r
999                                 s.st.minute = sD.getMinutes();\r
1000                                 s.st.p = s.st.hour * 60 + s.st.minute; // start time position\r
1001                                 s.et = {};\r
1002                                 s.et.hour = eD.getHours();\r
1003                                 s.et.minute = eD.getMinutes();\r
1004                                 s.et.p = s.et.hour * 60 + s.et.minute; // end time postition\r
1005 \r
1006                                 if (diff > 0) {\r
1007                                         if (sD < rbdate) { //start date out of range\r
1008                                                 sD = rbdate;\r
1009                                         }\r
1010                                         if (eD > redate) { //end date out of range\r
1011                                                 eD = redate;\r
1012                                         }\r
1013                                         var f = startday - sD.getDay();\r
1014                                         if (f > 0) {\r
1015                                                 f -= daylength;\r
1016                                         }\r
1017                                         var sdtemp = DateAdd("d", f, sD);\r
1018                                         for (; sdtemp <= eD; sD = sdtemp = DateAdd("d", daylength, sdtemp)) {\r
1019                                                 var d = $.extend(s, {});\r
1020                                                 key = dateFormat.call(sD, i18n.xgcalendar.dateformat.fulldaykey);\r
1021                                                 var x = DateDiff("d", sdtemp, eD);\r
1022                                                 if (hast[key] == null) {\r
1023                                                         hast[key] = [];\r
1024                                                 }\r
1025                                                 d.colSpan = (x >= daylength) ? daylength - DateDiff("d", sdtemp, sD) : DateDiff("d", sD, eD) + 1;\r
1026                                                 hast[key].push(d);\r
1027                                                 d = null;\r
1028                                         }\r
1029                                 }\r
1030                                 else {\r
1031                                         key = dateFormat.call(events[i]["start"], i18n.xgcalendar.dateformat.fulldaykey);\r
1032                                         if (hast[key] == null) {\r
1033                                                 hast[key] = [];\r
1034                                         }\r
1035                                         s.colSpan = 1;\r
1036                                         hast[key].push(s);\r
1037                                 }\r
1038                                 s = null;\r
1039                         }\r
1040                         return hast;\r
1041                 }\r
1042 \r
1043                 function BuildMonthRow(events, dMax, sc, day) {\r
1044                         var j, e, m,\r
1045                                 x = [],\r
1046                                 y = [],\r
1047                                 z = [],\r
1048                                 cday = [];\r
1049                         var l = events.length;\r
1050                         var el = 0;\r
1051                         var ret = [];\r
1052                         for (j = 0; j < l; j++) {\r
1053                                 x.push(0);\r
1054                                 y.push(0);\r
1055                                 z.push(0);\r
1056                                 cday.push(DateAdd("d", j, day));\r
1057                         }\r
1058                         for (j = 0; j < l; j++) {\r
1059                                 var ec = events[j] ? events[j].length : 0;\r
1060                                 y[j] += ec;\r
1061                                 for (var k = 0; k < ec; k++) {\r
1062                                         e = events[j][k];\r
1063                                         if (e && e.colSpan > 1) {\r
1064                                                 for (m = 1; m < e.colSpan; m++) {\r
1065                                                         y[j + m]++;\r
1066                                                 }\r
1067                                         }\r
1068                                 }\r
1069                         }\r
1070 \r
1071                         var tdtemp = "<td class='{cssclass}' data-axis='{axis}' data-ch='{ch}' data-abbr='{abbr}' title='{title}' {otherAttr}>{html}</td>";\r
1072                         for (j = 0; j < sc && el < dMax; j++) {\r
1073                                 var $row = $("<tr></tr>");\r
1074                                 //var gridtr = $(__TRTEMP);\r
1075                                 for (var h = 0; h < l;) {\r
1076                                         e = events[h] ? events[h][x[h]] : undefined;\r
1077                                         var $ev = null;\r
1078                                         var tempdata = { "class":"", axis:"", ch:"", title:"", abbr:"", html:"", otherAttr:"", click:"javascript:void(0);" };\r
1079                                         var tempCss = ["st-c"];\r
1080 \r
1081                                         if (e) {\r
1082                                                 x[h] = x[h] + 1;\r
1083                                                 //last event of the day\r
1084                                                 var bs = false;\r
1085                                                 if (z[h] + 1 == y[h] && e.colSpan == 1) {\r
1086                                                         bs = true;\r
1087                                                 }\r
1088                                                 if (!bs && j == (sc - 1) && z[h] < y[h]) {\r
1089                                                         el++;\r
1090                                                         $.extend(tempdata, { "axis":h, ch:"more", "abbr":cday[h].getTime(), html:i18n.xgcalendar.others + (y[h] - z[h]) + i18n.xgcalendar.item, click:"javascript:alert('more event');" });\r
1091                                                         tempCss.push("st-more st-moreul");\r
1092                                                         h++;\r
1093                                                 }\r
1094                                                 else {\r
1095                                                         tempdata.html = "";\r
1096                                                         $ev = BuildMonthDayEvent(e, cday[h], l - h);\r
1097                                                         tempdata.ch = "show";\r
1098                                                         if (e.colSpan > 1) {\r
1099                                                                 tempdata.otherAttr = " colSpan='" + e.colSpan + "'";\r
1100                                                                 for (m = 0; m < e.colSpan; m++) {\r
1101                                                                         z[h + m] = z[h + m] + 1;\r
1102                                                                 }\r
1103                                                                 h += e.colSpan;\r
1104 \r
1105                                                         }\r
1106                                                         else {\r
1107                                                                 z[h] = z[h] + 1;\r
1108                                                                 h++;\r
1109                                                         }\r
1110                                                         el++;\r
1111                                                 }\r
1112                                         }\r
1113                                         else {\r
1114                                                 if (j == (sc - 1) && z[h] < y[h] && y[h] > 0) {\r
1115                                                         $.extend(tempdata, { "axis":h, ch:"more", "abbr":cday[h].getTime(), html:i18n.xgcalendar.others + (y[h] - z[h]) + i18n.xgcalendar.item, click:"javascript:alert('more event');" });\r
1116                                                         tempCss.push("st-more st-moreul");\r
1117                                                         h++;\r
1118                                                 }\r
1119                                                 else {\r
1120                                                         $.extend(tempdata, { html:"&nbsp;", ch:"qkadd", "axis":"00:00", "abbr":cday[h].getTime(), title:"" });\r
1121                                                         tempCss.push("st-s");\r
1122                                                         h++;\r
1123                                                 }\r
1124                                         }\r
1125                                         tempdata.cssclass = tempCss.join(" ");\r
1126                                         tempCss = null;\r
1127                                         var $z = $(Tp(tdtemp, tempdata));\r
1128                                         if ($ev != null) $z.append($ev);\r
1129                                         $row.append($z);\r
1130                                         tempdata = null;\r
1131                                 }\r
1132                                 ret.push($row);\r
1133                         }\r
1134                         return ret;\r
1135                 }\r
1136 \r
1137                 function BuildMonthDayEvent(e, cday, length) {\r
1138                         var theme;\r
1139                         if (e.event["color"] && e.event["color"].match(/^#[0-9a-f]{6}$/i)) {\r
1140                                 theme = ColorCalcValues(e.event["color"]);\r
1141                         }\r
1142                         else {\r
1143                                 theme = ColorCalcValues(option.std_color);\r
1144                         }\r
1145                         var p = { color:theme[2], title:"", extendClass:"", extendHTML:"", data:"" };\r
1146 \r
1147                         p.title = getTitle(e.event);\r
1148                         p.id = "bbit_cal_event_" + e.event["uri"];\r
1149                         if (option.enableDrag && e.event["is_editable_quick"] == 1) {\r
1150                                 p.eclass = "drag";\r
1151                         }\r
1152                         else {\r
1153                                 p.eclass = "cal_" + e.event["uri"];\r
1154                         }\r
1155                         p.eclass += " " + (e.event["is_editable"] ? "editable" : "not_editable");\r
1156                         var sp = "<span style=\"cursor: pointer\">{content}</span>";\r
1157                         var i = "<I class=\"cic cic-tmr\">&nbsp;</I>";\r
1158                         var i2 = "<I class=\"cic cic-rcr\">&nbsp;</I>";\r
1159                         var ml = "<div class=\"st-ad-ml\"></div>";\r
1160                         var mr = "<div class=\"st-ad-mr\"></div>";\r
1161                         var arrm = [];\r
1162                         var sf = e.event["start"] < cday;\r
1163                         var ef = DateDiff("d", cday, e.event["end"]) >= length;  //e.event["end"] >= DateAdd("d", 1, cday);\r
1164                         if (sf || ef) {\r
1165                                 if (sf) {\r
1166                                         arrm.push(ml);\r
1167                                         p.extendClass = "st-ad-mpad ";\r
1168                                 }\r
1169                                 if (ef) {\r
1170                                         arrm.push(mr);\r
1171                                 }\r
1172                                 p.extendHTML = arrm.join("");\r
1173 \r
1174                         }\r
1175                         var cen;\r
1176                         if (!e.allday && !sf) {\r
1177                                 cen = pZero(e.st.hour) + ":" + pZero(e.st.minute) + " " + e.event["subject"];\r
1178                         }\r
1179                         else {\r
1180                                 cen = e.event["subject"];\r
1181                         }\r
1182                         var content = [];\r
1183                         if (cen.indexOf("Geburtstag:") == 0) {\r
1184                                 content.push("<img src='/pics/silk/cake.png' alt='Geburtstag: ' title='Geburtstag' style='height: 12px; margin-right: 3px;'>");\r
1185                                 cen = cen.replace(/Geburtstag: /, "");\r
1186                         }\r
1187                         content.push(Tp(sp, { content:cen }));\r
1188                         if (e.event["has_notification"] == 1) content.push(i);\r
1189                         if (e.reevent) {\r
1190                                 content.push(i2);\r
1191                         }\r
1192                         p.content = content.join("");\r
1193                         var $newel = $(Tp(__ALLDAYEVENTTEMP, p));\r
1194                         $newel.data("eventdata", e.event);\r
1195                         return $newel;\r
1196                 }\r
1197 \r
1198                 //to populate the data \r
1199                 function populate() {\r
1200                         if (option.isloading) {\r
1201                                 return true;\r
1202                         }\r
1203                         if (option.url && option.url != "") {\r
1204                                 option.isloading = true;\r
1205                                 //clearcontainer();\r
1206                                 if (option.onBeforeRequestData && $.isFunction(option.onBeforeRequestData)) {\r
1207                                         option.onBeforeRequestData(1);\r
1208                                 }\r
1209                                 var param = [\r
1210                                         { name:"showdate", value: Math.floor(option.showday.getTime() / 1000) },\r
1211                                         { name:"viewtype", value:option.view },\r
1212                                         { name:"weekstartday", value:option.weekstartday }\r
1213                                 ];\r
1214                                 if (option.view == "multi_days") {\r
1215                                         param.push({ name:"num_days", value:option.num_days });\r
1216                                 }\r
1217                                 if (option.extParam) {\r
1218                                         for (var pi = 0; pi < option.extParam.length; pi++) {\r
1219                                                 param[param.length] = option.extParam[pi];\r
1220                                         }\r
1221                                 }\r
1222 \r
1223                                 $.ajax({\r
1224                                         type:option.method, //\r
1225                                         url:option.url + option.url_add,\r
1226                                         data:param,\r
1227                                         dataType:"json",\r
1228                                         dataFilter:function (data) {\r
1229                                                 //return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, "new $1");\r
1230 \r
1231                                                 return data;\r
1232                                         },\r
1233                                         success:function (data) {//function(datastr) {                                                                  \r
1234                                                 //datastr =datastr.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1');                                          \r
1235                                                 //var data = (new Function("return " + datastr))();\r
1236                                                 if (data != null && data.error != null) {\r
1237                                                         if (option.onRequestDataError) {\r
1238                                                                 option.onRequestDataError(1, data);\r
1239                                                         }\r
1240                                                 }\r
1241                                                 else {\r
1242                                                         data["start"] = parseDate(data["start"]);\r
1243                                                         data["end"] = parseDate(data["end"]);\r
1244                                                         $.each(data.events, function (index, value) {\r
1245                                                                 value["start"] = new Date(value["start"] * 1000);\r
1246                                                                 value["end"] = new Date(value["end"] * 1000);\r
1247                                                         });\r
1248                                                         responseData(data, data.start, data.end);\r
1249                                                 }\r
1250                                                 if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {\r
1251                                                         option.onAfterRequestData(1);\r
1252                                                 }\r
1253                                                 option.isloading = false;\r
1254                                         },\r
1255                                         error:function (data) {\r
1256                                                 try {\r
1257                                                         if (option.onRequestDataError) {\r
1258                                                                 option.onRequestDataError(1, data);\r
1259                                                         } else {\r
1260                                                                 alert(i18n.xgcalendar.get_data_exception);\r
1261                                                         }\r
1262                                                         if (option.onAfterRequestData && $.isFunction(option.onAfterRequestData)) {\r
1263                                                                 option.onAfterRequestData(1);\r
1264                                                         }\r
1265                                                         option.isloading = false;\r
1266                                                 } catch (e) {\r
1267                                                 }\r
1268                                         }\r
1269                                 });\r
1270                         }\r
1271                         else {\r
1272                                 alert("url" + i18n.xgcalendar.i_undefined);\r
1273                         }\r
1274                         return true;\r
1275                 }\r
1276 \r
1277                 function responseData(data, start, end) {\r
1278                         var events = data.events;\r
1279                         ConcatEvents(events, start, end);\r
1280                         render();\r
1281 \r
1282                 }\r
1283 \r
1284                 function clearrepeat(events, start) {\r
1285                         var jl = events.length;\r
1286                         if (jl > 0) {\r
1287                                 var es = events[0]["start"];\r
1288                                 var el = events[jl - 1]["start"];\r
1289                                 for (var i = 0, l = option.eventItems.length; i < l; i++) {\r
1290 \r
1291                                         if (option.eventItems[i]["sart"] > el || jl == 0) {\r
1292                                                 break;\r
1293                                         }\r
1294                                         if (option.eventItems[i]["start"] >= es) {\r
1295                                                 for (var j = 0; j < jl; j++) {\r
1296                                                         if (option.eventItems[i]["uri"] == events[j]["uri"] && option.eventItems[i]["start"] < start) {\r
1297                                                                 events.splice(j, 1); //for duplicated event\r
1298                                                                 jl--;\r
1299                                                                 break;\r
1300                                                         }\r
1301                                                 }\r
1302                                         }\r
1303                                 }\r
1304                         }\r
1305                 }\r
1306 \r
1307                 function ConcatEvents(events, start, end) {\r
1308                         var e, s;\r
1309                         if (!events) {\r
1310                                 events = [];\r
1311                         }\r
1312                         if (events) {\r
1313                                 if (option.eventItems.length == 0) {\r
1314                                         option.eventItems = events;\r
1315                                 }\r
1316                                 else {\r
1317                                         //remove duplicated one\r
1318                                         clearrepeat(events, start);\r
1319                                         var sl = option.eventItems.length;\r
1320                                         var sI = -1;\r
1321                                         var eI = sl;\r
1322                                         s = start;\r
1323                                         e = end;\r
1324                                         if (option.eventItems[0]["start"] > e) {\r
1325                                                 option.eventItems = events.concat(option.eventItems);\r
1326                                                 return;\r
1327                                         }\r
1328                                         if (option.eventItems[sl - 1]["start"] < s) {\r
1329                                                 option.eventItems = option.eventItems.concat(events);\r
1330                                                 return;\r
1331                                         }\r
1332                                         for (var i = 0; i < sl; i++) {\r
1333                                                 if (option.eventItems[i]["start"] >= s && sI < 0) {\r
1334                                                         sI = i;\r
1335                                                         continue;\r
1336                                                 }\r
1337                                                 if (option.eventItems[i]["start"] > e) {\r
1338                                                         eI = i;\r
1339                                                         break;\r
1340                                                 }\r
1341                                         }\r
1342 \r
1343                                         var e1 = sI <= 0 ? [] : option.eventItems.slice(0, sI);\r
1344                                         var e2 = eI == sl ? [] : option.eventItems.slice(eI);\r
1345                                         option.eventItems = [].concat(e1, events, e2);\r
1346                                 }\r
1347                         }\r
1348                 }\r
1349 \r
1350                 //utils goes here\r
1351                 function weekormonthtoday(e) {\r
1352                         var th = $(this);\r
1353                         option.showday = new Date(parseInt(th.data("abbr")));\r
1354                         option.view = "day";\r
1355                         render();\r
1356                         if (option.onWeekOrMonthToDay) {\r
1357                                 option.onWeekOrMonthToDay(option);\r
1358                         }\r
1359                         e.stopPropagation();\r
1360                         e.preventDefault();\r
1361                 }\r
1362 \r
1363                 function parseDate(str) {\r
1364                         return new Date(Date.parse(str));\r
1365                 }\r
1366 \r
1367                 function gP(h, m) {\r
1368                         return h * option.hour_height + parseInt(m / 60 * option.hour_height);\r
1369                 }\r
1370 \r
1371                 function gW(ts1, ts2) {\r
1372                         var t1 = ts1 / option.hour_height;\r
1373                         var t2 = parseInt(t1);\r
1374                         var t3 = t1 - t2 >= 0.5 ? 30 : 0;\r
1375                         var t4 = ts2 / option.hour_height;\r
1376                         var t5 = parseInt(t4);\r
1377                         var t6 = t4 - t5 >= 0.5 ? 30 : 0;\r
1378                         return { sh:t2, sm:t3, eh:t5, em:t6, h:ts2 - ts1 };\r
1379                 }\r
1380 \r
1381                 function gH(y1, y2, pt) {\r
1382                         var sy1 = Math.min(y1, y2);\r
1383                         var sy2 = Math.max(y1, y2);\r
1384                         var t1 = (sy1 - pt) / option.hour_height;\r
1385                         var t2 = parseInt(t1);\r
1386                         var t3 = t1 - t2 >= 0.5 ? 30 : 0;\r
1387                         var t4 = (sy2 - pt) / option.hour_height;\r
1388                         var t5 = parseInt(t4);\r
1389                         var t6 = t4 - t5 >= 0.5 ? 30 : 0;\r
1390                         return { sh:t2, sm:t3, eh:t5, em:t6, h:sy2 - sy1 };\r
1391                 }\r
1392 \r
1393                 function pZero(n) {\r
1394                         return n < 10 ? "0" + n : "" + n;\r
1395                 }\r
1396 \r
1397                 function Tp(temp, dataarry) {\r
1398                         return temp.replace(/\{([\w]+)\}/g, function (s1, s2) {\r
1399                                 var s = dataarry[s2];\r
1400                                 if (typeof (s) != "undefined") {\r
1401                                         return s;\r
1402                                 } else {\r
1403                                         return s1;\r
1404                                 }\r
1405                         });\r
1406                 }\r
1407 \r
1408                 function fomartTimeShow(h) {\r
1409                         return h < 10 ? "0" + h + ":00" : h + ":00";\r
1410                 }\r
1411 \r
1412                 function getymformat(date, comparedate, isshowtime, isshowweek) {\r
1413                         var showyear = isshowtime != undefined ? (date.getFullYear() != new Date().getFullYear()) : true;\r
1414                         var showmonth = true;\r
1415                         var showday = true;\r
1416                         var showtime = isshowtime || false;\r
1417                         var showweek = isshowweek || false;\r
1418                         if (comparedate) {\r
1419                                 showyear = comparedate.getFullYear() != date.getFullYear();\r
1420                                 //showmonth = comparedate.getFullYear() != date.getFullYear() || date.getMonth() != comparedate.getMonth();\r
1421                                 if (comparedate.getFullYear() == date.getFullYear() &&\r
1422                                         date.getMonth() == comparedate.getMonth() &&\r
1423                                         date.getDate() == comparedate.getDate()\r
1424                                         ) {\r
1425                                         showyear = showmonth = showday = showweek = false;\r
1426                                 }\r
1427                         }\r
1428 \r
1429                         var a = [];\r
1430                         if (showyear) {\r
1431                                 a.push(option.date_format_dm3)\r
1432                         } else if (showmonth) {\r
1433                                 a.push(option.date_format_dm2)\r
1434                         } else if (showday) {\r
1435                                 a.push(i18n.xgcalendar.dateformat.day);\r
1436                         }\r
1437                         a.push(showweek ? " (W)" : "", showtime ? " HH:mm" : "");\r
1438                         return a.join("");\r
1439                 }\r
1440 \r
1441                 function CalDateShow(startday, endday, isshowtime, isshowweek) {\r
1442                         if (!endday) {\r
1443                                 return dateFormat.call(startday, getymformat(startday, null, isshowtime));\r
1444                         } else {\r
1445                                 var strstart = dateFormat.call(startday, getymformat(startday, null, isshowtime, isshowweek));\r
1446                                 var strend = dateFormat.call(endday, getymformat(endday, startday, isshowtime, isshowweek));\r
1447                                 var join = (strend != "" ? " - " : "");\r
1448                                 return [strstart, strend].join(join);\r
1449                         }\r
1450                 }\r
1451 \r
1452                 function buildtempdayevent(sh, sm, eh, em, h, title, w, resize, color) {\r
1453                         if (!color.match(/^#[0-9a-f]{6}$/i)) color = option.std_color;\r
1454                         var t = ColorCalcValues(color);\r
1455                         return Tp(__SCOLLEVENTTEMP, {\r
1456                                 bdcolor:t[0],\r
1457                                 bgcolor2:t[1],\r
1458                                 bgcolor1:t[2],\r
1459                                 data:"",\r
1460                                 starttime:[pZero(sh), pZero(sm)].join(":"),\r
1461                                 endtime:[pZero(eh), pZero(em)].join(":"),\r
1462                                 content:title ? title : i18n.xgcalendar.new_event,\r
1463                                 title:title ? title : i18n.xgcalendar.new_event,\r
1464                                 icon:"<I class=\"cic cic-tmr\">&nbsp;</I>",\r
1465                                 top:"0px",\r
1466                                 left:"",\r
1467                                 width:w ? w : "100%",\r
1468                                 height:h - 4,\r
1469                                 i:"-1",\r
1470                                 drag:"drag-chip",\r
1471                                 redisplay:resize ? "block" : "none"\r
1472                         });\r
1473                 }\r
1474 \r
1475                 function quickd(type) {\r
1476                         $("#bbit-cs-buddle").css("visibility", "hidden");\r
1477                         var calid = $("#bbit-cs-id").val();\r
1478                         var param = [\r
1479                                 { "name":"calendarId", value:calid },\r
1480                                 { "name":"type", value:type}\r
1481                         ];\r
1482                         var de = rebyKey(calid, true);\r
1483                         option.onBeforeRequestData && option.onBeforeRequestData(3);\r
1484                         $.post(option.quickDeleteUrl, param, function (data) {\r
1485                                 if (data) {\r
1486                                         $(document).trigger("wdcal:updated");\r
1487                                         if (data["IsSuccess"]) {\r
1488                                                 de = null;\r
1489                                                 populate();\r
1490                                                 option.onAfterRequestData && option.onAfterRequestData(3);\r
1491                                         }\r
1492                                         else {\r
1493                                                 option.onRequestDataError && option.onRequestDataError(3, data);\r
1494                                                 Ind(de);\r
1495                                                 render();\r
1496                                                 option.onAfterRequestData && option.onAfterRequestData(3);\r
1497                                         }\r
1498                                 }\r
1499                         }, "json");\r
1500                 }\r
1501 \r
1502                 function getbuddlepos(x, y) {\r
1503                         var tleft = x - 110;\r
1504                         var ttop = y - 217;\r
1505                         var maxLeft = document.documentElement.clientWidth;\r
1506                         var maxTop = document.documentElement.clientHeight;\r
1507                         var ishide = false;\r
1508                         if (tleft <= 0 || ttop <= 0 || tleft + 400 > maxLeft) {\r
1509                                 tleft = x - 200 <= 0 ? 10 : x - 200;\r
1510                                 ttop = y - 159 <= 0 ? 10 : y - 159;\r
1511                                 if (tleft + 400 >= maxLeft) {\r
1512                                         tleft = maxLeft - 410;\r
1513                                 }\r
1514                                 if (ttop + 164 >= maxTop) {\r
1515                                         ttop = maxTop - 165;\r
1516                                 }\r
1517                                 ishide = true;\r
1518                         }\r
1519                         return { left:tleft, top:ttop, hide:ishide };\r
1520                 }\r
1521 \r
1522                 function dayshow(e, data) {\r
1523                         var $t = $(e.target);\r
1524                         if ($t.hasClass("axx_username") || $t.parents(".axx_username").length > 0 || $t.hasClass("cal_nojs") || $t.parents(".cal_nojs").length > 0) return false;\r
1525 \r
1526                         if (data == undefined) {\r
1527                                 if ($t.hasClass("chip") || $t.hasClass("rb-o")) data = $t.data("eventdata");\r
1528                                 else data = $t.parents(".chip, .rb-o").data("eventdata");\r
1529                         }\r
1530 \r
1531                         if (data != null) {\r
1532                                 var editable = false;\r
1533                                 if (option.quickDeleteUrl != "" && data["is_editable"] == 1 && option.readonly != true) editable = true;\r
1534                                 var csbuddle = '<div id="bbit-cs-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble"><table class="bubble-table"><tbody' +\r
1535                                         '><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>' +\r
1536                                         '<td class="bubble-cell-main"><div class="bubble-top"></div><td class="bubble-cell-side"><div id="tr1" class="bubble-corner"><div class="bubble-sprite bubble-tr"></div></div>' +\r
1537                                         '<tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">' +\r
1538                                         '<table class="cb-table"><tbody><tr><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid">' +\r
1539                                         '<a href="" title="' + i18n.xgcalendar.click_to_detail + '" class="bbit-cs-what textbox-fill-div lk"></a></div></div></td></tr>' +\r
1540                                         '<tr><td class=cb-value><div id="bbit-cs-buddle-timeshow"></div></td></tr>' +\r
1541                                         '</tbody></table><div class="bbit-cs-split"><input id="bbit-cs-id" type="hidden" value=""/>[ <span id="bbit-cs-delete" class="lk">'\r
1542                                         + i18n.xgcalendar.i_delete + '</span> ]&nbsp;' +\r
1543                                         '<a href="" class="bbit-cs-editLink lk">' + i18n.xgcalendar.update_detail + ' <strong>&gt;&gt;</strong></a>' +\r
1544                                         '</div></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div>' +\r
1545                                         '<td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody>' +\r
1546                                         '</table><div id="bubbleClose2" class="bubble-closebutton"></div><div id="prong1" class="prong"><div class=bubble-sprite></div></div></div>';\r
1547                                 var $bud = $("#bbit-cs-buddle");\r
1548                                 if ($bud.length == 0) {\r
1549                                         $bud = $(csbuddle).appendTo(document.body);\r
1550                                         var calbutton = $("#bbit-cs-delete");\r
1551                                         $("#bubbleClose2").on("click", function () {\r
1552                                                 $("#bbit-cs-buddle").css("visibility", "hidden");\r
1553                                         });\r
1554                                         calbutton.on("click", function () {\r
1555                                                 var data = $("#bbit-cs-buddle").data("cdata");\r
1556                                                 if (option.quickDeleteHandler && $.isFunction(option.quickDeleteHandler)) {\r
1557                                                         option.quickDeleteHandler.call(this, data, quickd);\r
1558                                                 }\r
1559                                                 else {\r
1560                                                         if (confirm(i18n.xgcalendar.confirm_delete_event)) {\r
1561                                                                 var s = 0; //0 single event , 1 for Recurring event\r
1562                                                                 if (data["is_recurring"] == 1) {\r
1563                                                                         if (confirm(i18n.xgcalendar.confrim_delete_event_or_all)) {\r
1564                                                                                 s = 0;\r
1565                                                                         }\r
1566                                                                         else {\r
1567                                                                                 s = 1;\r
1568                                                                         }\r
1569                                                                 }\r
1570                                                                 else {\r
1571                                                                         s = 0;\r
1572                                                                 }\r
1573                                                                 quickd(s);\r
1574                                                         }\r
1575                                                 }\r
1576                                         });\r
1577                                 }\r
1578 \r
1579                                 if (editable) {\r
1580                                         $("#bbit-cs-delete").parents(".bbit-cs-split").show();\r
1581                                         $bud.find(".bbit-cs-editLink").attr("href", data["url_edit"]).show();\r
1582                                 }\r
1583                                 else {\r
1584                                         $("#bbit-cs-delete").parents(".bbit-cs-split").hide();\r
1585                                         $bud.find(".bbit-cs-editLink").hide();\r
1586                                 }\r
1587 \r
1588                                 var pos = getbuddlepos(e.pageX, e.pageY);\r
1589                                 if (pos.hide) {\r
1590                                         $("#prong1").hide()\r
1591                                 }\r
1592                                 else {\r
1593                                         $("#prong1").show()\r
1594                                 }\r
1595                                 var ss = [];\r
1596                                 var iscos = DateDiff("d", data["start"], data["end"]) != 0;\r
1597                                 ss.push(dateFormat.call(data["start"], option.date_format_dm2), " (", __WDAY[data["start"].getDay()], ")");\r
1598                                 if (data["is_allday"] != 1) {\r
1599                                         ss.push(",", dateFormat.call(data["start"], "HH:mm"));\r
1600                                 }\r
1601 \r
1602                                 if (iscos) {\r
1603                                         ss.push(" - ", dateFormat.call(data["end"], option.date_format_dm2), " (", __WDAY[data["end"].getDay()], ")");\r
1604                                         if (data["is_allday"] != 1) {\r
1605                                                 ss.push(",", dateFormat.call(data["end"], "HH:mm"));\r
1606                                         }\r
1607                                 }\r
1608                                 var location = "";\r
1609                                 if (data["location"] != "") location = data["location"] + ", ";\r
1610                                 $("#bbit-cs-buddle-timeshow").html(location + ss.join(""));\r
1611                                 $bud.find(".bbit-cs-what").html(data["subject"]).attr("href", data["url_detail"]);\r
1612                                 $("#bbit-cs-id").val(data["uri"]);\r
1613                                 $bud.data("cdata", data);\r
1614                                 $bud.css({ "visibility":"visible", left:pos.left, top:pos.top });\r
1615 \r
1616                                 $(document).one("click", function () {\r
1617                                         $("#bbit-cs-buddle").css("visibility", "hidden");\r
1618                                 });\r
1619                         }\r
1620                         else {\r
1621                                 alert(i18n.xgcalendar.data_format_error);\r
1622                         }\r
1623                         return false;\r
1624                 }\r
1625 \r
1626                 function moreshow(mv) {\r
1627                         var $me = $(this);\r
1628                         var $pdiv = $(mv);\r
1629                         var divIndex = parseInt($pdiv.data("row"));\r
1630                         var offsetMe = $me.position();\r
1631                         var offsetP = $pdiv.position();\r
1632                         var width = ($me.width() + 2) * 1.5;\r
1633                         var top = offsetP.top + 15;\r
1634                         var left = offsetMe.left;\r
1635 \r
1636                         var day = new Date(parseInt($me.data("abbr")));\r
1637                         var cc = $gridcontainer.find(".cal-month-cc");\r
1638                         var ccontent = $gridcontainer.find(".cal-month-cc-content table tbody");\r
1639                         var ctitle = $gridcontainer.find(".cal-month-cc-title");\r
1640                         ctitle.html(formatDate(day));\r
1641                         ccontent.empty();\r
1642                         var edata = $("#gridEvent").data("mvdata");\r
1643                         var events = edata[divIndex];\r
1644                         var index = parseInt($me.data("axis"));\r
1645                         ccontent.find("*").remove();\r
1646                         for (var i = 0; i <= index; i++) {\r
1647                                 var ec = events[i] ? events[i].length : 0;\r
1648                                 for (var j = 0; j < ec; j++) {\r
1649                                         var e = events[i][j];\r
1650                                         if (e) {\r
1651                                                 if ((e.colSpan + i - 1) >= index) {\r
1652                                                         var $x = $("<tr><td class='st-c'></td></tr>");\r
1653                                                         var $y = BuildMonthDayEvent(e, day, 1);\r
1654                                                         $x.find(".st-c").append($y);\r
1655                                                         ccontent.append($x);\r
1656                                                 }\r
1657                                         }\r
1658                                 }\r
1659                         }\r
1660                         //click\r
1661                         ccontent.find("div.rb-o").each(function () {\r
1662                                 $(this).click(dayshow);\r
1663                         });\r
1664 \r
1665                         var height = cc.height();\r
1666                         var maxleft = document.documentElement.clientWidth;\r
1667                         var maxtop = document.documentElement.clientHeight;\r
1668                         if (left + width >= maxleft) {\r
1669                                 left = offsetMe.left - ($me.width() + 2) * 0.5;\r
1670                         }\r
1671                         if (top + height >= maxtop) {\r
1672                                 top = maxtop - height - 2;\r
1673                         }\r
1674                         var newOff = { left:left, top:top, "z-index":180, width:width, "visibility":"visible" };\r
1675                         cc.css(newOff);\r
1676                         $(document).on("click", closeCc);\r
1677                         return false;\r
1678                 }\r
1679 \r
1680                 function dayupdate(data, start, end) {\r
1681                         if (option.quickUpdateUrl != "" && data["is_editable_quick"] == 1 && option.readonly != true) {\r
1682                                 if (option.isloading) {\r
1683                                         return false;\r
1684                                 }\r
1685                                 option.isloading = true;\r
1686                                 var id = data["uri"];\r
1687                                 var os = data["start"];\r
1688                                 var od = data["end"];\r
1689                                 var param = [\r
1690                                         { "name":"calendarId", value:id },\r
1691                                         { "name":"CalendarStartTime", value:Math.floor(start.getTime() / 1000) },\r
1692                                         { "name":"CalendarEndTime", value:Math.floor(end.getTime() / 1000) }\r
1693                                 ];\r
1694                                 var d;\r
1695                                 if (option.quickUpdateHandler && $.isFunction(option.quickUpdateHandler)) {\r
1696                                         option.quickUpdateHandler.call(this, param);\r
1697                                 }\r
1698                                 else {\r
1699                                         option.onBeforeRequestData && option.onBeforeRequestData(4);\r
1700                                         $.post(option.quickUpdateUrl, param, function (data) {\r
1701                                                 if (data) {\r
1702                                                         $(document).trigger("wdcal:updated");\r
1703                                                         if (data["IsSuccess"] == true) {\r
1704                                                                 option.isloading = false;\r
1705                                                                 option.onAfterRequestData && option.onAfterRequestData(4);\r
1706                                                         }\r
1707                                                         else {\r
1708                                                                 option.onRequestDataError && option.onRequestDataError(4, data);\r
1709                                                                 option.isloading = false;\r
1710                                                                 d = rebyKey(id, true);\r
1711                                                                 d["start"] = os;\r
1712                                                                 d["end"] = od;\r
1713                                                                 Ind(d);\r
1714                                                                 render();\r
1715                                                                 d = null;\r
1716                                                                 option.onAfterRequestData && option.onAfterRequestData(4);\r
1717                                                         }\r
1718                                                 }\r
1719                                         }, "json");\r
1720                                         d = rebyKey(id, true);\r
1721                                         if (d) {\r
1722                                                 d["start"] = start;\r
1723                                                 d["end"] = end;\r
1724                                         }\r
1725                                         Ind(d);\r
1726                                         render();\r
1727                                 }\r
1728                         }\r
1729                         return false;\r
1730                 }\r
1731 \r
1732                 function quickadd(start, end, isallday, pos) {\r
1733                         if ((!option.quickAddHandler && option.quickAddUrl == "") || option.readonly) {\r
1734                                 return false;\r
1735                         }\r
1736                         var buddle = $("#bbit-cal-buddle");\r
1737                         if (buddle.length == 0) {\r
1738                                 var temparr = [];\r
1739                                 temparr.push('<form id="bbit-cal-submitFORM">');\r
1740                                 temparr.push('<div id="bbit-cal-buddle" style="z-index: 180; width: 400px;visibility:hidden;" class="bubble">');\r
1741                                 temparr.push('<table class="bubble-table"><tbody><tr><td class="bubble-cell-side"><div id="tl1" class="bubble-corner"><div class="bubble-sprite bubble-tl"></div></div>');\r
1742                                 temparr.push('<td class="bubble-cell-main"><div class="bubble-top"></div><td class="bubble-cell-side"><div id="tr1" class="bubble-corner"><div class="bubble-sprite bubble-tr"></div></div>  <tr><td class="bubble-mid" colSpan="3"><div style="overflow: hidden" id="bubbleContent1"><div><div></div><div class="cb-root">');\r
1743                                 temparr.push('<table class="cb-table"><tbody><tr><th class="cb-key">');\r
1744                                 temparr.push(i18n.xgcalendar.time, ':</th><td class=cb-value><div id="bbit-cal-buddle-timeshow"></div></td></tr><tr><th class="cb-key">');\r
1745                                 temparr.push(i18n.xgcalendar.content, ':</th><td class="cb-value"><div class="textbox-fill-wrapper"><div class="textbox-fill-mid"><input id="bbit-cal-what" class="textbox-fill-input"/></div></div><div class="cb-example">');\r
1746                                 temparr.push(i18n.xgcalendar.example, '</div></td></tr></tbody></table><input id="bbit-cal-start" type="hidden"/><input id="bbit-cal-end" type="hidden"/><input id="bbit-cal-allday" type="hidden"/><input id="bbit-cal-quickAddBTN" value="');\r
1747                                 temparr.push(i18n.xgcalendar.create_event, '" type="submit"/>&nbsp; <SPAN id="bbit-cal-editLink" class="lk">');\r
1748                                 temparr.push(i18n.xgcalendar.update_detail, ' <StrONG>&gt;&gt;</StrONG></SPAN></div></div></div><tr><td><div id="bl1" class="bubble-corner"><div class="bubble-sprite bubble-bl"></div></div><td><div class="bubble-bottom"></div><td><div id="br1" class="bubble-corner"><div class="bubble-sprite bubble-br"></div></div></tr></tbody></table><div id="bubbleClose1" class="bubble-closebutton"></div><div id="prong2" class="prong"><div class=bubble-sprite></div></div></div>');\r
1749                                 temparr.push('</form>');\r
1750                                 var tempquickAddHanler = temparr.join("");\r
1751                                 temparr = null;\r
1752                                 $(document.body).append(tempquickAddHanler);\r
1753                                 buddle = $("#bbit-cal-buddle");\r
1754                                 $("#bubbleClose1").click(function () {\r
1755                                         $("#bbit-cal-buddle").css("visibility", "hidden");\r
1756                                         releasedragevent();\r
1757                                 });\r
1758                                 $("#bbit-cal-submitFORM").keyup(function (e) {\r
1759                                         if (e.which == 27) $("#bubbleClose1").click();\r
1760                                 });\r
1761                                 $("#bbit-cal-submitFORM").submit(function (e) {\r
1762                                         e.stopPropagation();\r
1763                                         e.preventDefault();\r
1764                                         if (option.isloading) {\r
1765                                                 return false;\r
1766                                         }\r
1767                                         option.isloading = true;\r
1768                                         var what = $("#bbit-cal-what").val();\r
1769                                         var datestart = $("#bbit-cal-start").val();\r
1770                                         var dateend = $("#bbit-cal-end").val();\r
1771                                         var allday = $("#bbit-cal-allday").val();\r
1772                                         var f = /^[^\$<>]+$/.test(what);\r
1773                                         if (!f) {\r
1774                                                 alert(i18n.xgcalendar.invalid_title);\r
1775                                                 $("#bbit-cal-what").focus();\r
1776                                                 option.isloading = false;\r
1777                                                 return false;\r
1778                                         }\r
1779                                         var param = [\r
1780                                                 { "name":"CalendarTitle", value:what },\r
1781                                                 { "name":"CalendarStartTime", value: Math.floor(datestart / 1000)},\r
1782                                                 { "name":"CalendarEndTime", value: Math.floor(dateend / 1000)},\r
1783                                                 { "name":"IsAllDayEvent", value:allday }\r
1784                                         ];\r
1785 \r
1786                                         if (option.extParam) {\r
1787                                                 for (var pi = 0; pi < option.extParam.length; pi++) {\r
1788                                                         param[param.length] = option.extParam[pi];\r
1789                                                 }\r
1790                                         }\r
1791 \r
1792                                         if (option.quickAddHandler && $.isFunction(option.quickAddHandler)) {\r
1793                                                 option.quickAddHandler.call(this, param);\r
1794                                                 $("#bbit-cal-buddle").css("visibility", "hidden");\r
1795                                                 releasedragevent();\r
1796                                         }\r
1797                                         else {\r
1798                                                 $("#bbit-cal-buddle").css("visibility", "hidden");\r
1799                                                 var tId = -1;\r
1800                                                 option.onBeforeRequestData && option.onBeforeRequestData(2);\r
1801 \r
1802                                                 var sd = new Date(datestart),\r
1803                                                         ed = new Date(dateend),\r
1804                                                         diff = DateDiff("d", sd, ed);\r
1805                                                 var newdata = {\r
1806                                                         "uri":"",\r
1807                                                         "subject":what,\r
1808                                                         "start":sd,\r
1809                                                         "end":ed,\r
1810                                                         "is_allday":(allday == "1" ? 1 : 0),\r
1811                                                         "is_moredays":(diff > 0 ? 1 : 0),\r
1812                                                         "is_recurring":0,\r
1813                                                         "color":option.std_color,\r
1814                                                         "is_editable":0,\r
1815                                                         "is_editable_quick":0,\r
1816                                                         "location":"",\r
1817                                                         "attendees":""\r
1818                                                 };\r
1819                                                 tId = Ind(newdata);\r
1820                                                 releasedragevent();\r
1821                                                 render();\r
1822 \r
1823                                                 $.post(option.quickAddUrl, param, function (data) {\r
1824                                                         option.isloading = false;\r
1825                                                         if (data) {\r
1826                                                                 if (data["IsSuccess"] == true) {\r
1827                                                                         populate();\r
1828                                                                         option.onAfterRequestData && option.onAfterRequestData(2);\r
1829                                                                 }\r
1830                                                                 else {\r
1831                                                                         option.onRequestDataError && option.onRequestDataError(2, data);\r
1832                                                                         option.onAfterRequestData && option.onAfterRequestData(2);\r
1833                                                                 }\r
1834                                                                 $(document).trigger("wdcal:updated");\r
1835                                                         }\r
1836 \r
1837                                                 }, "json");\r
1838                                         }\r
1839                                         return false;\r
1840                                 });\r
1841                                 buddle.mousedown(function (e) {\r
1842                                         e.stopPropagation();\r
1843                                         e.preventDefault();\r
1844                                 });\r
1845                         }\r
1846 \r
1847                         var dateshow = CalDateShow(start, end, !isallday, true);\r
1848                         var off = getbuddlepos(pos.left, pos.top);\r
1849                         if (off.hide) {\r
1850                                 $("#prong2").hide()\r
1851                         }\r
1852                         else {\r
1853                                 $("#prong2").show()\r
1854                         }\r
1855                         $("#bbit-cal-buddle-timeshow").html(dateshow);\r
1856                         var calwhat = $("#bbit-cal-what").val("");\r
1857                         $("#bbit-cal-allday").val(isallday ? "1" : "0");\r
1858                         $("#bbit-cal-start").val(start.getTime());\r
1859                         $("#bbit-cal-end").val(end.getTime());\r
1860                         buddle.css({ "visibility":"visible", left:off.left, top:off.top });\r
1861                         calwhat.blur().focus(); //add 2010-01-26 blur() fixed chrome \r
1862                         $(document).one("mousedown", function () {\r
1863                                 $("#bbit-cal-buddle").css("visibility", "hidden");\r
1864                                 releasedragevent();\r
1865                         });\r
1866                         return false;\r
1867                 }\r
1868 \r
1869                 function formatDate(time, format) {\r
1870                         if (typeof(format) == "undefined") return $.datepicker.formatDate(option.date_format_full,time);\r
1871                         var time2 = $.datepicker.formatDate(format, time);\r
1872                         var h = time.getHours();\r
1873                         var i = time.getMinutes();\r
1874                         time2 = time2.replace("HH", (h > 10 ? "" : "0") + h);\r
1875                         time2 = time2.replace("ii", (i > 10 ? "" : "0") + i);\r
1876                         return time2;\r
1877                 }\r
1878 \r
1879                 function rebyKey(key, remove) {\r
1880                         if (option.eventItems && option.eventItems.length > 0) {\r
1881                                 var sl = option.eventItems.length;\r
1882                                 var i = -1;\r
1883                                 for (var j = 0; j < sl; j++) {\r
1884                                         if (option.eventItems[j]["uri"] == key) {\r
1885                                                 i = j;\r
1886                                                 break;\r
1887                                         }\r
1888                                 }\r
1889                                 if (i >= 0) {\r
1890                                         var t = option.eventItems[i];\r
1891                                         if (remove) {\r
1892                                                 option.eventItems.splice(i, 1);\r
1893                                         }\r
1894                                         return t;\r
1895                                 }\r
1896                         }\r
1897                         return null;\r
1898                 }\r
1899 \r
1900                 function Ind(event, i) {\r
1901                         var d = 0;\r
1902                         var j;\r
1903                         if (!i) {\r
1904                                 if (option.eventItems && option.eventItems.length > 0) {\r
1905                                         var sl = option.eventItems.length;\r
1906                                         var s = event["start"];\r
1907                                         var d1 = s.getTime() - option.eventItems[0]["start"].getTime();\r
1908                                         var d2 = option.eventItems[sl - 1]["start"].getTime() - s.getTime();\r
1909                                         var diff = d1 - d2;\r
1910                                         if (d1 < 0 || diff < 0) {\r
1911                                                 for (j = 0; j < sl; j++) {\r
1912                                                         if (option.eventItems[j]["start"] >= s) {\r
1913                                                                 i = j;\r
1914                                                                 break;\r
1915                                                         }\r
1916                                                 }\r
1917                                         }\r
1918                                         else if (d2 < 0) {\r
1919                                                 i = sl;\r
1920                                         }\r
1921                                         else {\r
1922                                                 for (j = sl - 1; j >= 0; j--) {\r
1923                                                         if (option.eventItems[j]["start"] < s) {\r
1924                                                                 i = j + 1;\r
1925                                                                 break;\r
1926                                                         }\r
1927                                                 }\r
1928                                         }\r
1929                                 }\r
1930                                 else {\r
1931                                         i = 0;\r
1932                                 }\r
1933                         }\r
1934                         else {\r
1935                                 d = 1;\r
1936                         }\r
1937                         if (option.eventItems && option.eventItems.length > 0) {\r
1938                                 if (i == option.eventItems.length) {\r
1939                                         option.eventItems.push(event);\r
1940                                 }\r
1941                                 else {\r
1942                                         option.eventItems.splice(i, d, event);\r
1943                                 }\r
1944                         }\r
1945                         else {\r
1946                                 option.eventItems = [event];\r
1947                         }\r
1948                         return i;\r
1949                 }\r
1950 \r
1951 \r
1952                 function ResizeView() {\r
1953                         var _viewType = option.view;\r
1954                         if (_viewType == "day" || _viewType == "week" || _viewType == "multi_days") {\r
1955                                 var $dvwkcontaienr = $gridcontainer.find(".wktopcontainer");\r
1956                                 var $dvtec = $gridcontainer.find(".scrolltimeevent");\r
1957                                 if ($dvwkcontaienr.length == 0 || $dvtec.length == 0) {\r
1958                                         alert(i18n.xgcalendar.view_no_ready);\r
1959                                         return;\r
1960                                 }\r
1961                                 var dvwkH = $dvwkcontaienr.height() + 2;\r
1962                                 var calH = option.height - 8 - dvwkH;\r
1963                                 $dvtec.height(calH);\r
1964                                 if (typeof (option.scroll) == "undefined") {\r
1965                                         var currentday = new Date();\r
1966                                         var h = currentday.getHours();\r
1967                                         var m = currentday.getMinutes();\r
1968                                         var th = gP(h, m);\r
1969                                         //var ch = $dvtec.attr("clientHeight");\r
1970                                         var ch = $dvtec.height();\r
1971                                         var sh = th - 0.5 * ch;\r
1972                                         //var ph = $dvtec.attr("scrollHeight");\r
1973                                         var ph = $dvtec.children().height();\r
1974                                         if (sh < 0) sh = 0;\r
1975                                         if (sh > ph - ch) sh = ph - ch - 10 * (23 - h);\r
1976                                         //$dvtec.attr("scrollTop", sh);\r
1977                                         $dvtec.scrollTop(sh);\r
1978                                 }\r
1979                                 else {\r
1980                                         $dvtec.scrollTop(option.scroll);\r
1981                                 }\r
1982                         }\r
1983                         else if (_viewType == "month") {\r
1984                                 //Resize GridContainer\r
1985                         }\r
1986                 }\r
1987 \r
1988                 function returnfalse() {\r
1989                         return false;\r
1990                 }\r
1991 \r
1992                 function initevents(viewtype) {\r
1993                         if (viewtype == "week" || viewtype == "day" || viewtype == "multi_days") {\r
1994                                 $("div.chip", $gridcontainer).each(function () {\r
1995                                         var chip = $(this);\r
1996                                         chip.click(dayshow);\r
1997                                         if (chip.hasClass("drag")) {\r
1998                                                 chip.mousedown(function (e) {\r
1999                                                         dragStart.call(this, "std_item_move", e);\r
2000                                                         e.stopPropagation();\r
2001                                                         e.preventDefault();\r
2002                                                 });\r
2003                                                 //resize                      \r
2004                                                 chip.find("div.resizer").mousedown(function (e) {\r
2005                                                         dragStart.call($(this).parent().parent(), "std_item_resize", e);\r
2006                                                         e.stopPropagation();\r
2007                                                         e.preventDefault();\r
2008                                                 });\r
2009                                         }\r
2010                                         else {\r
2011                                                 chip.mousedown(returnfalse)\r
2012                                         }\r
2013                                 });\r
2014                                 $("div.rb-o", $gridcontainer).each(function () {\r
2015                                         var chip = $(this);\r
2016                                         chip.click(dayshow);\r
2017                                         if (chip.hasClass("drag") && (viewtype == "week" || viewtype == "multi_days")) {\r
2018                                                 //drag;\r
2019                                                 chip.mousedown(function (e) {\r
2020                                                         dragStart.call(this, "fullday_item_move", e);\r
2021                                                         e.stopPropagation();\r
2022                                                         e.preventDefault();\r
2023                                                 });\r
2024                                         }\r
2025                                         else {\r
2026                                                 chip.mousedown(returnfalse)\r
2027                                         }\r
2028                                 });\r
2029                                 if (option.readonly == false) {\r
2030                                         $("td.tg-col", $gridcontainer).each(function () {\r
2031                                                 $(this).mousedown(function (e) {\r
2032                                                         dragStart.call(this, "std_empty_drag", e);\r
2033                                                         e.stopPropagation();\r
2034                                                         e.preventDefault();\r
2035                                                 });\r
2036                                         });\r
2037                                         $gridcontainer.find(".weekViewAllDaywk").mousedown(function (e) {\r
2038                                                 dragStart.call(this, "fullday_empty_drag", e);\r
2039                                                 e.stopPropagation();\r
2040                                                 e.preventDefault();\r
2041                                         });\r
2042                                 }\r
2043 \r
2044                                 if (viewtype == "week" || viewtype == "multi_days") {\r
2045                                         $gridcontainer.find(".wktopcontainer th.gcweekname").each(function () {\r
2046                                                 $(this).click(weekormonthtoday);\r
2047                                         });\r
2048                                 }\r
2049 \r
2050 \r
2051                         }\r
2052                         else if (viewtype = "month") {\r
2053                                 $("div.rb-o", $gridcontainer).each(function () {\r
2054                                         var chip = $(this);\r
2055                                         chip.click(dayshow);\r
2056                                         if (chip.hasClass("drag")) {\r
2057                                                 //drag;\r
2058                                                 chip.mousedown(function (e) {\r
2059                                                         dragStart.call(this, "std_item_month_drag", e);\r
2060                                                         e.stopPropagation();\r
2061                                                         e.preventDefault();\r
2062                                                 });\r
2063                                         }\r
2064                                         else {\r
2065                                                 chip.mousedown(returnfalse)\r
2066                                         }\r
2067                                 });\r
2068                                 $("td.st-more", $gridcontainer).each(function () {\r
2069 \r
2070                                         $(this).on("click", function (e) {\r
2071                                                 moreshow.call(this, $(this).parent().parent().parent().parent()[0]);\r
2072                                                 e.stopPropagation();\r
2073                                                 e.preventDefault();\r
2074                                         }).on("mousedown", function (e) {\r
2075                                                         e.stopPropagation();\r
2076                                                         e.preventDefault();\r
2077                                                 });\r
2078                                 });\r
2079                                 if (option.readonly == false) {\r
2080                                         $gridcontainer.find(".mvEventContainer").mousedown(function (e) {\r
2081                                                 dragStart.call(this, "empty_month_drag", e);\r
2082                                                 e.stopPropagation();\r
2083                                                 e.preventDefault();\r
2084                                         });\r
2085                                 }\r
2086                         }\r
2087 \r
2088                 }\r
2089 \r
2090                 function releasedragevent() {\r
2091                         if (_dragevent) {\r
2092                                 _dragevent();\r
2093                                 _dragevent = null;\r
2094                         }\r
2095                 }\r
2096 \r
2097                 function dragStart(type, e) {\r
2098                         var w, h, offset, moffset, left, top, l, py, pw, xa, ya, i, data, fdi, dp, yl;\r
2099                         var $obj = $(this);\r
2100                         releasedragevent();\r
2101                         switch (type) {\r
2102                                 case "std_empty_drag":\r
2103                                         _dragdata = { type:"std_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY };\r
2104                                         break;\r
2105                                 case "fullday_empty_drag":\r
2106                                         w = $obj.width();\r
2107                                         h = $obj.height();\r
2108                                         offset = $obj.offset();\r
2109                                         left = offset.left;\r
2110                                         top = offset.top;\r
2111                                         l = option.view == "day" ? 1 : 7;\r
2112                                         py = w % l;\r
2113                                         pw = parseInt(w / l);\r
2114                                         if (py > l / 2 + 1) {\r
2115                                                 pw++;\r
2116                                         }\r
2117                                         xa = [];\r
2118                                         ya = [];\r
2119                                         for (i = 0; i < l; i++) {\r
2120                                                 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });\r
2121                                         }\r
2122                                         ya.push({ s:top, e:top + h });\r
2123                                         _dragdata = { type:"fullday_empty_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };\r
2124                                         w = left = l = py = pw = xa = null;\r
2125                                         break;\r
2126                                 case "std_item_move":\r
2127                                         var evid = $obj.parent().data("col");\r
2128                                         var p = $obj.parent();\r
2129                                         var pos = p.offset();\r
2130                                         w = p.width() + 10;\r
2131                                         h = $obj.height();\r
2132                                         data = $obj.data("eventdata");\r
2133                                         _dragdata = { type:"std_item_move", target:$obj, sx:e.pageX, sy:e.pageY,\r
2134                                                 pXMin:pos.left, pXMax:pos.left + w, pw:w, h:h,\r
2135                                                 cdi:parseInt(evid), fdi:parseInt(evid), data:data\r
2136                                         };\r
2137                                         break;\r
2138                                 case "std_item_resize":\r
2139                                         h = $obj.height();\r
2140                                         data = $obj.data("eventdata");\r
2141                                         _dragdata = { type:"std_item_resize", target:$obj, sx:e.pageX, sy:e.pageY, h:h, data:data };\r
2142                                         break;\r
2143                                 case "fullday_item_move":\r
2144                                         var con = $gridcontainer.find(".weekViewAllDaywk");\r
2145                                         w = con.width();\r
2146                                         h = con.height();\r
2147                                         offset = con.offset();\r
2148                                         moffset = $obj.offset();\r
2149                                         left = offset.left;\r
2150                                         top = offset.top;\r
2151                                         l = 7;\r
2152                                         py = w % l;\r
2153                                         pw = parseInt(w / l);\r
2154                                         if (py > l / 2 + 1) {\r
2155                                                 pw++;\r
2156                                         }\r
2157                                         xa = [];\r
2158                                         ya = [];\r
2159                                         var di = 0;\r
2160                                         for (i = 0; i < l; i++) {\r
2161                                                 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });\r
2162                                                 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {\r
2163                                                         di = i;\r
2164                                                 }\r
2165                                         }\r
2166                                         fdi = { x:di, y:0, di:di };\r
2167                                         ya.push({ s:top, e:top + h });\r
2168                                         data = $obj.data("eventdata");\r
2169                                         dp = DateDiff("d", data["start"], data["end"]) + 1;\r
2170                                         _dragdata = { type:"fullday_item_move", target:$obj, sx:e.pageX, sy:e.pageY, data:data, xa:xa, ya:ya, fdi:fdi, h:h, dp:dp, pw:pw };\r
2171                                         break;\r
2172                                 case "empty_month_drag":\r
2173                                         w = $obj.width();\r
2174                                         offset = $obj.offset();\r
2175                                         left = offset.left;\r
2176                                         top = offset.top;\r
2177                                         l = 7;\r
2178                                         yl = $obj.children().length;\r
2179                                         py = w % l;\r
2180                                         pw = parseInt(w / l);\r
2181                                         if (py > l / 2 + 1) {\r
2182                                                 pw++;\r
2183                                         }\r
2184                                         h = $gridcontainer.find(".mvrow_0").height();\r
2185                                         xa = [];\r
2186                                         ya = [];\r
2187                                         for (i = 0; i < l; i++) {\r
2188                                                 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });\r
2189                                         }\r
2190                                         xa = [];\r
2191                                         ya = [];\r
2192                                         for (i = 0; i < l; i++) {\r
2193                                                 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });\r
2194                                         }\r
2195                                         for (i = 0; i < yl; i++) {\r
2196                                                 ya.push({ s:i * h + top, e:(i + 1) * h + top });\r
2197                                         }\r
2198                                         _dragdata = { type:"empty_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, pw:pw, xa:xa, ya:ya, h:h };\r
2199                                         break;\r
2200                                 case "std_item_month_drag":\r
2201                                         var row0 = $gridcontainer.find(".mvrow_0");\r
2202                                         var row1 = $gridcontainer.find(".mvrow_1");\r
2203                                         w = row0.width();\r
2204                                         offset = row0.offset();\r
2205                                         var diffset = row1.offset();\r
2206                                         moffset = $obj.offset();\r
2207                                         h = diffset.top - offset.top;\r
2208                                         left = offset.left;\r
2209                                         top = offset.top;\r
2210                                         l = 7;\r
2211                                         yl = row0.parent().children().length;\r
2212                                         py = w % l;\r
2213                                         pw = parseInt(w / l);\r
2214                                         if (py > l / 2 + 1) {\r
2215                                                 pw++;\r
2216                                         }\r
2217                                         xa = [];\r
2218                                         ya = [];\r
2219                                         var xi = 0;\r
2220                                         var yi = 0;\r
2221                                         for (i = 0; i < l; i++) {\r
2222                                                 xa.push({ s:i * pw + left, e:(i + 1) * pw + left });\r
2223                                                 if (moffset.left >= xa[i].s && moffset.left < xa[i].e) {\r
2224                                                         xi = i;\r
2225                                                 }\r
2226                                         }\r
2227                                         for (i = 0; i < yl; i++) {\r
2228                                                 ya.push({ s:i * h + top, e:(i + 1) * h + top });\r
2229                                                 if (moffset.top >= ya[i].s && moffset.top < ya[i].e) {\r
2230                                                         yi = i;\r
2231                                                 }\r
2232                                         }\r
2233                                         fdi = { x:xi, y:yi, di:yi * 7 + xi };\r
2234                                         data = $obj.data("eventdata");\r
2235                                         dp = DateDiff("d", data["start"], data["end"]) + 1;\r
2236                                         _dragdata = { type:"std_item_month_drag", target:$obj, sx:e.pageX, sy:e.pageY, data:data, xa:xa, ya:ya, fdi:fdi, h:h, dp:dp, pw:pw };\r
2237                                         break;\r
2238                         }\r
2239                         $('body').noSelect();\r
2240                 }\r
2241 \r
2242                 function dragMove(e) {\r
2243                         var d, sy, sx, x, y, diffy, gh, ny, tempdata, cpwrap, ndi, evid, nh, cp, w1;\r
2244                         if (_dragdata) {\r
2245                                 if (e.pageX < 0 || e.pageY < 0\r
2246                                         || e.pageX > document.documentElement.clientWidth\r
2247                                         || e.pageY >= document.documentElement.clientHeight) {\r
2248                                         dragEnd(e);\r
2249                                         return false;\r
2250                                 }\r
2251                                 d = _dragdata;\r
2252                                 switch (d.type) {\r
2253                                         case "std_empty_drag":\r
2254                                                 sy = d.sy;\r
2255                                                 y = e.pageY;\r
2256                                                 diffy = y - sy;\r
2257                                                 if (diffy > (option.hour_height / 4) || diffy < (-1 * (option.hour_height / 4)) || d.cpwrap) {\r
2258                                                         if (diffy == 0) {\r
2259                                                                 diffy = Math.ceil(option.hour_height / 2);\r
2260                                                         }\r
2261                                                         var dy = diffy % Math.ceil(option.hour_height / 2);\r
2262                                                         if (dy != 0) {\r
2263                                                                 diffy = dy > 0 ? diffy + Math.ceil(option.hour_height / 2) - dy : diffy - Math.ceil(option.hour_height / 2) - dy;\r
2264                                                                 y = d.sy + diffy;\r
2265                                                                 if (diffy < 0) {\r
2266                                                                         sy = sy + Math.ceil(option.hour_height / 2);\r
2267                                                                 }\r
2268                                                         }\r
2269                                                         if (!d.tp) {\r
2270                                                                 d.tp = $(d.target).offset().top;\r
2271                                                         }\r
2272                                                         gh = gH(sy, y, d.tp);\r
2273                                                         ny = gP(gh.sh, gh.sm);\r
2274                                                         if (!d.cpwrap) {\r
2275                                                                 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);\r
2276                                                                 cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);\r
2277                                                                 $(d.target).find("div.tg-col-overlaywrapper").append(cpwrap);\r
2278                                                                 d.cpwrap = cpwrap;\r
2279                                                         }\r
2280                                                         else {\r
2281                                                                 if (d.cgh.sh != gh.sh || d.cgh.eh != gh.eh || d.cgh.sm != gh.sm || d.cgh.em != gh.em) {\r
2282                                                                         tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);\r
2283                                                                         d.cpwrap.css("top", ny + "px").html(tempdata);\r
2284                                                                 }\r
2285                                                         }\r
2286                                                         d.cgh = gh;\r
2287                                                 }\r
2288                                                 break;\r
2289                                         case "fullday_empty_drag":\r
2290                                                 sx = d.sx;\r
2291                                                 x = e.pageX;\r
2292                                                 diffx = x - sx;\r
2293                                                 if (diffx > 5 || diffx < -5 || d.lasso) {\r
2294                                                         if (!d.lasso) {\r
2295                                                                 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");\r
2296                                                                 $(document.body).append(d.lasso);\r
2297                                                         }\r
2298                                                         if (!d.sdi) {\r
2299                                                                 d.sdi = getdi(d.xa, d.ya, sx, d.sy);\r
2300                                                         }\r
2301                                                         ndi = getdi(d.xa, d.ya, x, e.pageY);\r
2302                                                         if (!d.fdi || d.fdi.di != ndi.di) {\r
2303                                                                 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);\r
2304                                                         }\r
2305                                                         d.fdi = ndi;\r
2306                                                 }\r
2307                                                 break;\r
2308                                         case "empty_month_drag":\r
2309                                                 sx = d.sx;\r
2310                                                 x = e.pageX;\r
2311                                                 sy = d.sy;\r
2312                                                 y = e.pageY;\r
2313                                                 diffx = x - sx;\r
2314                                                 diffy = y - sy;\r
2315                                                 if (diffx > 5 || diffx < -5 || diffy < -5 || diffy > 5 || d.lasso) {\r
2316                                                         if (!d.lasso) {\r
2317                                                                 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");\r
2318                                                                 $(document.body).append(d.lasso);\r
2319                                                         }\r
2320                                                         if (!d.sdi) {\r
2321                                                                 d.sdi = getdi(d.xa, d.ya, sx, sy);\r
2322                                                         }\r
2323                                                         ndi = getdi(d.xa, d.ya, x, y);\r
2324                                                         if (!d.fdi || d.fdi.di != ndi.di) {\r
2325                                                                 addlasso(d.lasso, d.sdi, ndi, d.xa, d.ya, d.h);\r
2326                                                         }\r
2327                                                         d.fdi = ndi;\r
2328                                                 }\r
2329                                                 break;\r
2330                                         case "std_item_move":\r
2331                                                 data = d.data;\r
2332                                                 if (data != null && data["is_editable_quick"] == 1) {\r
2333                                                         sx = d.sx;\r
2334                                                         x = e.pageX;\r
2335                                                         sy = d.sy;\r
2336                                                         y = e.pageY;\r
2337                                                         diffx = x - sx;\r
2338                                                         diffy = y - sy;\r
2339                                                         if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.cpwrap) {\r
2340                                                                 if (!d.cpwrap) {\r
2341                                                                         gh = { sh:data["start"].getHours(),\r
2342                                                                                 sm:data["start"].getMinutes(),\r
2343                                                                                 eh:data["end"].getHours(),\r
2344                                                                                 em:data["end"].getMinutes(),\r
2345                                                                                 h:d.h\r
2346                                                                         };\r
2347                                                                         d.target.hide();\r
2348                                                                         ny = gP(gh.sh, gh.sm);\r
2349                                                                         d.top = ny;\r
2350                                                                         tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);\r
2351                                                                         cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);\r
2352                                                                         evid = ".tgOver" + d.target.parent().data("col");\r
2353                                                                         $gridcontainer.find(evid).append(cpwrap);\r
2354                                                                         d.cpwrap = cpwrap;\r
2355                                                                         d.ny = ny;\r
2356                                                                 }\r
2357                                                                 else {\r
2358                                                                         var pd = 0;\r
2359                                                                         if (x < d.pXMin) {\r
2360                                                                                 pd = -1;\r
2361                                                                         }\r
2362                                                                         else if (x > d.pXMax) {\r
2363                                                                                 pd = 1;\r
2364                                                                         }\r
2365                                                                         if (pd != 0) {\r
2366 \r
2367                                                                                 d.cdi = d.cdi + pd;\r
2368                                                                                 var ov = $gridcontainer.find(".tgOver" + d.cdi);\r
2369                                                                                 if (ov.length == 1) {\r
2370                                                                                         d.pXMin = d.pXMin + d.pw * pd;\r
2371                                                                                         d.pXMax = d.pXMax + d.pw * pd;\r
2372                                                                                         ov.append(d.cpwrap);\r
2373                                                                                 }\r
2374                                                                                 else {\r
2375                                                                                         d.cdi = d.cdi - pd;\r
2376                                                                                 }\r
2377                                                                         }\r
2378                                                                         ny = d.top + diffy;\r
2379                                                                         var pny = ny % Math.ceil(option.hour_height / 2);\r
2380                                                                         if (pny != 0) {\r
2381                                                                                 ny = ny - pny;\r
2382                                                                         }\r
2383                                                                         if (d.ny != ny) {\r
2384                                                                                 //log.info("ny=" + ny);\r
2385                                                                                 gh = gW(ny, ny + d.h);\r
2386                                                                                 //log.info("sh=" + gh.sh + ",sm=" + gh.sm);\r
2387                                                                                 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], false, false, data["color"]);\r
2388                                                                                 d.cpwrap.css("top", ny + "px").html(tempdata);\r
2389                                                                         }\r
2390                                                                         d.ny = ny;\r
2391                                                                 }\r
2392                                                         }\r
2393                                                 }\r
2394 \r
2395                                                 break;\r
2396                                         case "std_item_resize":\r
2397                                                 var data = d.data;\r
2398                                                 if (data != null && data["is_editable_quick"] == 1) {\r
2399                                                         sy = d.sy;\r
2400                                                         y = e.pageY;\r
2401                                                         diffy = y - sy;\r
2402                                                         if (diffy != 0 || d.cpwrap) {\r
2403                                                                 if (!d.cpwrap) {\r
2404                                                                         gh = { sh:data["start"].getHours(),\r
2405                                                                                 sm:data["start"].getMinutes(),\r
2406                                                                                 eh:data["end"].getHours(),\r
2407                                                                                 em:data["end"].getMinutes(),\r
2408                                                                                 h:d.h\r
2409                                                                         };\r
2410                                                                         d.target.hide();\r
2411                                                                         ny = gP(gh.sh, gh.sm);\r
2412                                                                         d.top = ny;\r
2413                                                                         tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);\r
2414                                                                         cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);\r
2415                                                                         evid = ".tgOver" + d.target.parent().data("col");\r
2416                                                                         $gridcontainer.find(evid).append(cpwrap);\r
2417                                                                         d.cpwrap = cpwrap;\r
2418                                                                 }\r
2419                                                                 else {\r
2420                                                                         nh = d.h + diffy;\r
2421                                                                         var pnh = nh % Math.ceil(option.hour_height / 2);\r
2422                                                                         nh = pnh > 1 ? nh - pnh + Math.ceil(option.hour_height / 2) : nh - pnh;\r
2423                                                                         if (d.nh != nh) {\r
2424                                                                                 gh = gW(d.top, d.top + nh);\r
2425                                                                                 tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, data["subject"], "100%", true, data["color"]);\r
2426                                                                                 d.cpwrap.html(tempdata);\r
2427                                                                         }\r
2428                                                                         d.nh = nh;\r
2429                                                                 }\r
2430                                                         }\r
2431                                                 }\r
2432                                                 break;\r
2433                                         case "fullday_item_move":\r
2434                                                 sx = d.sx;\r
2435                                                 x = e.pageX;\r
2436                                                 y = e.pageY;\r
2437                                                 diffx = x - sx;\r
2438                                                 if (diffx > 5 || diffx < -5 || d.lasso) {\r
2439                                                         if (!d.lasso) {\r
2440                                                                 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);\r
2441                                                                 cp = d.target.clone();\r
2442                                                                 if (d.dp > 1) {\r
2443                                                                         cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ")&nbsp;");\r
2444                                                                 }\r
2445                                                                 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);\r
2446                                                                 d.cpwrap = cpwrap;\r
2447                                                                 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");\r
2448                                                                 $(document.body).append(d.lasso);\r
2449                                                                 cp = cpwrap = null;\r
2450                                                         }\r
2451                                                         fixcppostion(d.cpwrap, e, d.xa, d.ya);\r
2452                                                         ndi = getdi(d.xa, d.ya, x, e.pageY);\r
2453                                                         if (!d.cdi || d.cdi.di != ndi.di) {\r
2454                                                                 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);\r
2455                                                         }\r
2456                                                         d.cdi = ndi;\r
2457                                                 }\r
2458                                                 break;\r
2459                                         case "std_item_month_drag":\r
2460                                                 sx = d.sx;\r
2461                                                 sy = d.sy;\r
2462                                                 x = e.pageX;\r
2463                                                 y = e.pageY;\r
2464                                                 var diffx = x - sx;\r
2465                                                 diffy = y - sy;\r
2466                                                 if (diffx > 5 || diffx < -5 || diffy > 5 || diffy < -5 || d.lasso) {\r
2467                                                         if (!d.lasso) {\r
2468                                                                 w1 = d.dp > 1 ? (d.pw - 4) * 1.5 : (d.pw - 4);\r
2469                                                                 cp = d.target.clone();\r
2470                                                                 if (d.dp > 1) {\r
2471                                                                         cp.find("div.rb-i>span").prepend("(" + d.dp + " " + i18n.xgcalendar.day_plural + ")&nbsp;");\r
2472                                                                 }\r
2473                                                                 cpwrap = $("<div class='drag-event st-contents' style='width:" + w1 + "px'/>").append(cp).appendTo(document.body);\r
2474                                                                 d.cpwrap = cpwrap;\r
2475                                                                 d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");\r
2476                                                                 $(document.body).append(d.lasso);\r
2477                                                                 cp = cpwrap = null;\r
2478                                                         }\r
2479                                                         fixcppostion(d.cpwrap, e, d.xa, d.ya);\r
2480                                                         ndi = getdi(d.xa, d.ya, x, e.pageY);\r
2481                                                         if (!d.cdi || d.cdi.di != ndi.di) {\r
2482                                                                 addlasso(d.lasso, ndi, { x:ndi.x, y:ndi.y, di:ndi.di + d.dp - 1 }, d.xa, d.ya, d.h);\r
2483                                                         }\r
2484                                                         d.cdi = ndi;\r
2485                                                 }\r
2486                                                 break;\r
2487                                 }\r
2488                         }\r
2489                         return false;\r
2490                 }\r
2491 \r
2492                 function dragEnd(e) {\r
2493                         if (_dragdata) {\r
2494                                 var d = _dragdata;\r
2495                                 var tp, start, end, gh;\r
2496                                 switch (d.type) {\r
2497                                         case "std_empty_drag": //day view\r
2498                                                 var wrapid = new Date().getTime();\r
2499                                                 tp = d.target.offset().top;\r
2500                                                 if (!d.cpwrap) {\r
2501                                                         gh = gH(d.sy, d.sy + option.hour_height, tp);\r
2502                                                         var ny = gP(gh.sh, gh.sm);\r
2503                                                         var tempdata = buildtempdayevent(gh.sh, gh.sm, gh.eh, gh.em, gh.h, "", "", "", option.std_color);\r
2504                                                         d.cpwrap = $("<div class='ca-evpi drag-chip-wrapper' style='top:" + ny + "px'/>").html(tempdata);\r
2505                                                         $(d.target).find("div.tg-col-overlaywrapper").append(d.cpwrap);\r
2506                                                         d.cgh = gh;\r
2507                                                 }\r
2508                                                 var pos = d.cpwrap.offset();\r
2509                                                 pos.left = pos.left + 30;\r
2510                                                 d.cpwrap.attr("id", wrapid);\r
2511                                                 start = new Date(parseInt(d.target.data("abbr")) + (d.cgh.sh * 3600 + d.cgh.sm * 60) * 1000);\r
2512                                                 end = new Date(parseInt(d.target.data("abbr")) + (d.cgh.eh * 3600 + d.cgh.em * 60) * 1000);\r
2513                                                 _dragevent = function () {\r
2514                                                         $("#" + wrapid).remove();\r
2515                                                         $("#bbit-cal-buddle").css("visibility", "hidden");\r
2516                                                 };\r
2517                                                 quickadd(start, end, false, pos);\r
2518                                                 break;\r
2519                                         case "fullday_empty_drag": //week view\r
2520                                         case "empty_month_drag": //month view\r
2521                                                 var source = e.srcElement || e.target;\r
2522                                                 var lassoid = new Date().getTime();\r
2523                                                 if (!d.lasso) {\r
2524                                                         if ($(source).hasClass("monthdayshow")) {\r
2525                                                                 weekormonthtoday.call($(source).parent()[0], e);\r
2526                                                                 break;\r
2527                                                         }\r
2528                                                         d.fdi = d.sdi = getdi(d.xa, d.ya, d.sx, d.sy);\r
2529                                                         d.lasso = $("<div style='z-index: 10; display: block' class='drag-lasso-container'/>");\r
2530                                                         $(document.body).append(d.lasso);\r
2531                                                         addlasso(d.lasso, d.sdi, d.fdi, d.xa, d.ya, d.h);\r
2532                                                 }\r
2533                                                 d.lasso.attr("id", lassoid);\r
2534                                                 var si = Math.min(d.fdi.di, d.sdi.di);\r
2535                                                 var ei = Math.max(d.fdi.di, d.sdi.di);\r
2536                                                 var firstday = option.vstart;\r
2537                                                 start = DateAdd("d", si, firstday);\r
2538                                                 end = DateAdd("d", ei, firstday);\r
2539                                                 _dragevent = function () {\r
2540                                                         $("#" + lassoid).remove();\r
2541                                                 };\r
2542                                                 quickadd(start, end, true, { left:e.pageX, top:e.pageY });\r
2543                                                 break;\r
2544                                         case "std_item_move": // event moving\r
2545                                                 if (d.cpwrap) {\r
2546                                                         start = DateAdd("d", d.cdi, option.vstart);\r
2547                                                         end = DateAdd("d", d.cdi, option.vstart);\r
2548                                                         gh = gW(d.ny, d.ny + d.h);\r
2549                                                         start.setHours(gh.sh, gh.sm);\r
2550                                                         end.setHours(gh.eh, gh.em);\r
2551                                                         if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {\r
2552                                                                 d.cpwrap.remove();\r
2553                                                                 d.target.show();\r
2554                                                         }\r
2555                                                         else {\r
2556                                                                 dayupdate(d.data, start, end);\r
2557                                                         }\r
2558                                                 }\r
2559                                                 break;\r
2560                                         case "std_item_resize": //Resize\r
2561                                                 if (d.cpwrap) {\r
2562                                                         start = new Date(d.data["start"].toString());\r
2563                                                         end = new Date(d.data["end"].toString());\r
2564                                                         gh = gW(d.top, d.top + d.nh);\r
2565                                                         start.setHours(gh.sh, gh.sm);\r
2566                                                         end.setHours(gh.eh, gh.em);\r
2567                                                         if (start.getTime() == d.data["start"].getTime() && end.getTime() == d.data["end"].getTime()) {\r
2568                                                                 d.cpwrap.remove();\r
2569                                                                 d.target.show();\r
2570                                                         }\r
2571                                                         else {\r
2572                                                                 dayupdate(d.data, start, end);\r
2573                                                         }\r
2574                                                 }\r
2575                                                 break;\r
2576                                         case "fullday_item_move":\r
2577                                         case "std_item_month_drag":\r
2578                                                 if (d.lasso) {\r
2579                                                         d.cpwrap.remove();\r
2580                                                         d.lasso.remove();\r
2581                                                         start = new Date(d.data["start"].toString());\r
2582                                                         end = new Date(d.data["end"].toString());\r
2583                                                         var currrentdate = DateAdd("d", d.cdi.di, option.vstart);\r
2584                                                         var diff = DateDiff("d", start, currrentdate);\r
2585                                                         start = DateAdd("d", diff, start);\r
2586                                                         end = DateAdd("d", diff, end);\r
2587                                                         if (start.getTime() != d.data["start"].getTime() || end.getTime() != d.data["end"].getTime()) {\r
2588                                                                 dayupdate(d.data, start, end);\r
2589                                                         }\r
2590                                                 }\r
2591                                                 break;\r
2592                                 }\r
2593                                 d = _dragdata = null;\r
2594                                 $('body').noSelect(false);\r
2595                                 return false;\r
2596                         }\r
2597                         return false;\r
2598                 }\r
2599 \r
2600                 function getdi(xa, ya, x, y) {\r
2601                         var ty = 0;\r
2602                         var tx = 0;\r
2603                         var lx = 0;\r
2604                         var ly = 0;\r
2605                         if (xa && xa.length != 0) {\r
2606                                 lx = xa.length;\r
2607                                 if (x >= xa[lx - 1].e) {\r
2608                                         tx = lx - 1;\r
2609                                 }\r
2610                                 else {\r
2611                                         for (var i = 0; i < lx; i++) {\r
2612                                                 if (x > xa[i].s && x <= xa[i].e) {\r
2613                                                         tx = i;\r
2614                                                         break;\r
2615                                                 }\r
2616                                         }\r
2617                                 }\r
2618                         }\r
2619                         if (ya && ya.length != 0) {\r
2620                                 ly = ya.length;\r
2621                                 if (y >= ya[ly - 1].e) {\r
2622                                         ty = ly - 1;\r
2623                                 }\r
2624                                 else {\r
2625                                         for (var j = 0; j < ly; j++) {\r
2626                                                 if (y > ya[j].s && y <= ya[j].e) {\r
2627                                                         ty = j;\r
2628                                                         break;\r
2629                                                 }\r
2630                                         }\r
2631                                 }\r
2632                         }\r
2633                         return { x:tx, y:ty, di:ty * lx + tx };\r
2634                 }\r
2635 \r
2636                 function addlasso(lasso, sdi, edi, xa, ya, height) {\r
2637                         var diff = sdi.di > edi.di ? sdi.di - edi.di : edi.di - sdi.di;\r
2638                         diff++;\r
2639                         var sp = sdi.di > edi.di ? edi : sdi;\r
2640                         var l = xa.length > 0 ? xa.length : 1;\r
2641                         var h = ya.length > 0 ? ya.length : 1;\r
2642                         var play = [];\r
2643                         var width = xa[0].e - xa[0].s;\r
2644                         var i = sp.x;\r
2645                         var j = sp.y;\r
2646                         var max = Math.min(document.documentElement.clientWidth, xa[l - 1].e) - 2;\r
2647 \r
2648                         while (j < h && diff > 0) {\r
2649                                 var left = xa[i].s;\r
2650                                 var d = i + diff > l ? l - i : diff;\r
2651                                 var wid = width * d;\r
2652                                 while (left + wid >= max) {\r
2653                                         wid--;\r
2654                                 }\r
2655                                 play.push(Tp(__LASSOTEMP, { left:left, top:ya[j].s, height:height, width:wid }));\r
2656                                 i = 0;\r
2657                                 diff = diff - d;\r
2658                                 j++;\r
2659                         }\r
2660                         lasso.html(play.join(""));\r
2661                 }\r
2662 \r
2663                 function fixcppostion(cpwrap, e, xa, ya) {\r
2664                         var x = e.pageX - 6;\r
2665                         var y = e.pageY - 4;\r
2666                         var w = cpwrap.width();\r
2667                         var h = 21;\r
2668                         var lmin = xa[0].s + 6;\r
2669                         var tmin = ya[0].s + 4;\r
2670                         var lmax = xa[xa.length - 1].e - w - 2;\r
2671                         var tmax = ya[ya.length - 1].e - h - 2;\r
2672                         if (x > lmax) {\r
2673                                 x = lmax;\r
2674                         }\r
2675                         if (x <= lmin) {\r
2676                                 x = lmin + 1;\r
2677                         }\r
2678                         if (y <= tmin) {\r
2679                                 y = tmin + 1;\r
2680                         }\r
2681                         if (y > tmax) {\r
2682                                 y = tmax;\r
2683                         }\r
2684                         cpwrap.css({ left:x, top:y });\r
2685                 }\r
2686 \r
2687                 $(document)\r
2688                         .mousemove(dragMove)\r
2689                         .mouseup(dragEnd);\r
2690                 //.mouseout(dragEnd);\r
2691 \r
2692                 this[0].bcal = {\r
2693                         sv:function (view) { //switch view                \r
2694                                 if (view == option.view) {\r
2695                                         return;\r
2696                                 }\r
2697                                 clearcontainer();\r
2698                                 option.view = view;\r
2699                                 render();\r
2700                                 populate();\r
2701                         },\r
2702                         rf:function () {\r
2703                                 populate();\r
2704                         },\r
2705                         gt:function (d) {\r
2706                                 if (!d) {\r
2707                                         d = new Date();\r
2708                                 }\r
2709                                 option.showday = d;\r
2710                                 render();\r
2711                                 populate();\r
2712                         },\r
2713 \r
2714                         pv:function () {\r
2715                                 switch (option.view) {\r
2716                                         case "day":\r
2717                                                 option.showday = DateAdd("d", -1, option.showday);\r
2718                                                 break;\r
2719                                         case "week":\r
2720                                                 option.showday = DateAdd("w", -1, option.showday);\r
2721                                                 break;\r
2722                                         case "multi_days":\r
2723                                                 option.showday = DateAdd("w", -1, option.showday);\r
2724                                                 break;\r
2725                                         case "month":\r
2726                                                 option.showday = DateAdd("m", -1, option.showday);\r
2727                                                 break;\r
2728                                 }\r
2729                                 render();\r
2730                                 populate();\r
2731                         },\r
2732                         nt:function () {\r
2733                                 switch (option.view) {\r
2734                                         case "day":\r
2735                                                 option.showday = DateAdd("d", 1, option.showday);\r
2736                                                 break;\r
2737                                         case "week":\r
2738                                                 option.showday = DateAdd("w", 1, option.showday);\r
2739                                                 break;\r
2740                                         case "multi_days":\r
2741                                                 option.showday = DateAdd("w", 1, option.showday);\r
2742                                                 break;\r
2743                                         case "month":\r
2744                                                 var od = option.showday.getDate();\r
2745                                                 option.showday = DateAdd("m", 1, option.showday);\r
2746                                                 var nd = option.showday.getDate();\r
2747                                                 if (od != nd) //we go to the next month\r
2748                                                 {\r
2749                                                         option.showday = DateAdd("d", 0 - nd, option.showday); //last day of last month\r
2750                                                 }\r
2751                                                 break;\r
2752                                 }\r
2753                                 render();\r
2754                                 populate();\r
2755                         },\r
2756                         go:function () {\r
2757                                 return option;\r
2758                         },\r
2759                         so:function (p) {\r
2760                                 option = $.extend(option, p);\r
2761                         }\r
2762                 };\r
2763 \r
2764                 return this;\r
2765         };\r
2766 \r
2767         /**\r
2768          * @description {Method} switchView To switch to another view.\r
2769          * @param {String} view View name, one of 'day', 'week', 'multi_days', 'month'.\r
2770          */\r
2771         $.fn.switchView = function (view) {\r
2772                 return this.each(function () {\r
2773                         if (this.bcal) {\r
2774                                 this.bcal.sv(view);\r
2775                         }\r
2776                 })\r
2777         };\r
2778 \r
2779         /**\r
2780          * @description {Method} reload To reload event of current time range.\r
2781          */\r
2782         $.fn.reload = function () {\r
2783                 return this.each(function () {\r
2784                         if (this.bcal) {\r
2785                                 this.bcal.rf();\r
2786                         }\r
2787                 })\r
2788         };\r
2789 \r
2790         /**\r
2791          * @description {Method} gotoDate To go to a range containing date.\r
2792          * If view is week, it will go to a week containing date.\r
2793          * If view is month, it will got to a month containing date.\r
2794          * @param {Date} d. Date to go.\r
2795          */\r
2796         $.fn.gotoDate = function (d) {\r
2797                 return this.each(function () {\r
2798                         if (this.bcal) {\r
2799                                 this.bcal.gt(d);\r
2800                         }\r
2801                 })\r
2802         };\r
2803 \r
2804         /**\r
2805          * @description {Method} previousRange To go to previous date range.\r
2806          * If view is week, it will go to previous week.\r
2807          * If view is month, it will got to previous month.\r
2808          */\r
2809         $.fn.previousRange = function () {\r
2810                 return this.each(function () {\r
2811                         if (this.bcal) {\r
2812                                 this.bcal.pv();\r
2813                         }\r
2814                 })\r
2815         };\r
2816 \r
2817         /**\r
2818          * @description {Method} nextRange To go to next date range.\r
2819          * If view is week, it will go to next week.\r
2820          * If view is month, it will got to next month.\r
2821          */\r
2822         $.fn.nextRange = function () {\r
2823                 return this.each(function () {\r
2824                         if (this.bcal) {\r
2825                                 this.bcal.nt();\r
2826                         }\r
2827                 })\r
2828         };\r
2829 \r
2830 \r
2831         $.fn.BcalGetOp = function () {\r
2832                 if (this[0].bcal) {\r
2833                         return this[0].bcal.go();\r
2834                 }\r
2835                 return null;\r
2836         };\r
2837 \r
2838 \r
2839         $.fn.BcalSetOp = function (p) {\r
2840                 if (this[0].bcal) {\r
2841                         return this[0].bcal.so(p);\r
2842                 }\r
2843         };\r
2844 \r
2845 })(jQuery);