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