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