window.auto_close_popup = false; $.fn.fullCalendar = function(args){ var self = this[0] if(!self.calendar_args) self.calendar_args = args; else args = Object.assign(self.calendar_args, args); var calendar = new FullCalendar.Calendar(self,args); calendar.render(); $(window).on("load",function(){ calendar.render(); }) this.calendar = calendar; self.calendar = calendar; $.fullCalendar = calendar; return calendar; }; function correct_date(date){ var new_date = new Date(); new_date.setTime(date.getTime() + date.getTimezoneOffset() * 60 * 1000); return new_date; } FullCalendar.Calendar.prototype.get_all_events = function(){ this.currentData.all_events = []; var all_events = this.currentData.all_events; if(this.currentData.eventStore && this.currentData.eventStore.instances){ var instances = this.currentData.eventStore.instances; Object.keys(instances).forEach(function(k){ var instance = instances[k]; var range = Object.assign({},instance.range); range.start = correct_date(range.start); range.end = correct_date(range.end); all_events.push(range); }) } return this.currentData.all_events; } FullCalendar.Calendar.prototype.isAnOverlapEvent = function(eventStartDay, eventEndDay){ eventStartDay = eventStartDay || eventEndDay; eventEndDay = eventEndDay || eventStartDay; if((typeof(eventStartDay)).toLowerCase() == "string") eventStartDay = new Date(eventStartDay); if((typeof(eventEndDay)).toLowerCase() == "string") eventEndDay = new Date(eventEndDay); var events = this.get_all_events(); for (var i = 0; i < events.length; i++) { var eventA = events[i]; // start-time in between any of the events if (eventStartDay >= eventA.start && eventStartDay <= eventA.end) { return true; } //end-time in between any of the events if (eventEndDay >= eventA.start && eventEndDay <= eventA.end) { return true; } //any of the events in between/on the start-time and end-time if (eventStartDay <= eventA.start && eventEndDay >= eventA.end) { return true; } } return false; } window.is_chinese = ( I18n && I18n.locale.indexOf('zh') != -1 ); window.datetime_format = is_chinese ? 'y M d h:m b' : 'd M, y h:m b'; window.date_format = is_chinese ? 'y M d' : 'd M, y'; window.datetime_format = window.date_format; window.time_format = "h:m b"; window.std_date_format = 'y-MM-d'; window.short_day = (is_chinese ? "d (w)" : "w d"); window.short_date = (is_chinese ? "M d (w)" : "w d, M"); window.short_date_time = (is_chinese ? "M d (w) h:m b" : "w d, M h:m b"); window.getDateString = function(date, format,is_chinese) { var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var week_days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']; if(is_chinese){ months = []; for(var i=0;i<12;i++){ months.push((i+1)+"月"); } week_days = ["週日","週一","週二","週三","週四","週五","週六"] } var getPaddedComp = function(comp) { return ((parseInt(comp) < 10) ? ('0' + comp) : comp) }, formattedDate = format, o = { "y+": date.getFullYear() + (is_chinese ? "年" : ""), // year "MM+": getPaddedComp(date.getMonth() + 1), //raw month "M+": months[date.getMonth()], //month "d+": (is_chinese ? (date.getDate() + "日") : getPaddedComp(date.getDate())), //day "w+": week_days[date.getDay()], //weekday "h+": getPaddedComp((date.getHours() > 12) ? date.getHours() % 12 : date.getHours()), //hour "H+": getPaddedComp(date.getHours()), //hour "m+": getPaddedComp(date.getMinutes()), //minute "s+": getPaddedComp(date.getSeconds()), //second "S+": getPaddedComp(date.getMilliseconds()), //millisecond, "b+": (date.getHours() >= 12) ? 'PM' : 'AM' }; for (var k in o) { if (new RegExp("(" + k + ")").test(format)) { formattedDate = formattedDate.replace(RegExp.$1, o[k]); } } return formattedDate; }; var Calendar = function(dom){ var c = this; this.create_event_btn = $("#create_event_btn"); this.event_create_space = $("#event_create_space"); this.mousePosition = {}; this.title = $("#current_title"); this.calendar_dom = $(dom); this.nextBtn = $("#next_month_btn"); this.prevBtn = $("#prev_month_btn"); this.todayBtn = $("#today_btn"); this.modeBtns = $(".calendar_mode button"); this.refreshBtn = $("#refresh_btn"); this.dialog = new EventDialog(c); this.loading = $('#calendar-loading'); this.agenda_space = $("#calendar_agenda"); this.currentView = "dayGridMonth"; this.navigation = $("#navigation"); this.rangeSelection = $("#range_selection"); var agendaView = new AgendaView(c); var loadeventsonviewchange = false; this.success_event = null; this.initialize = function(){ var date = new Date(); var d = date.getDate(); var m = date.getMonth(); var y = date.getFullYear(); var change_event = function(_event, delta) { _event.end = (_event.end ? _event.end : _event.start); var s = $.fullCalendar.parseDate(c.calendar_dom.find(".fc-view table tbody td:first").data("date")); var e = $.fullCalendar.parseDate(c.calendar_dom.find(".fc-view table tbody td:first").data("date")); $.ajax({ url: "/admin/calendars/"+_event.id, // data: {event:{id:_event.id,start:_event.start,end: _event.end,_s:Math.round(+s / 1000), _e:Math.round(+e / 1000)}}, data: {event:{id:_event.id,start:_event.start,end: _event.end}}, type: 'put' , datatype: 'JSON', error: function(jqXHR, textStatus, errorThrown) {}, success: function(data) { console.log('event was success updated'); } }); } var success_event = function(data,allDay,type,addbtn){ c.dialog.dismiss(); $('.bootstrap-datetimepicker-widget').remove(); c.event_create_space.html(data); var create_space_height = c.event_create_space.height(), create_space_width = c.event_create_space.width(); if((create_space_height + c.mousePosition["y"]) >= $(window).height()){ var top_pos = c.mousePosition["y"] - create_space_height if (top_pos < 0){ c.event_create_space.find('.modal-body').css('height',create_space_height+top_pos) c.event_create_space.css("top",0 + "px"); }else{ c.event_create_space.css("top",top_pos + "px"); } }else if(c.mousePosition["y"]+c.event_create_space.height()<$(window).height()){ c.event_create_space.css("top",c.mousePosition["y"] + "px"); } if((create_space_width + c.mousePosition["x"]) >= $(window).width()){ if (c.mousePosition["x"] - create_space_width < 0){ c.event_create_space.css("left",'0px') }else{ c.event_create_space.css("left",(c.mousePosition["x"] - create_space_width) + "px"); } }else{ c.event_create_space.css("left",c.mousePosition["x"] + "px"); } if(addbtn){ c.event_create_space.css({"right":"8px","bottom":"50px","left":"auto","top":"auto"}); }else{ c.event_create_space.css({"right":"","bottom":""}); } c.event_create_space.show(); var pickers = $('.default_picker input'); var checked = ($("#all_day_check").is(":checked") ? true : false); var checked_function = function(c){ var d = new Date() if(c){ for(i=0;i 9 ? start.getMonth() + 1 : "0" + (start.getMonth() + 1)) + "/" + (start.getDate() > 9 ? start.getDate() : "0" + start.getDate()), endString = end.getFullYear() + "/" + (end.getMonth() + 1 > 9 ? end.getMonth() + 1 : "0" + (end.getMonth() + 1)) + "/" + (end.getDate() > 9 ? end.getDate() : "0" + end.getDate()); if(!allDay){ startString += " " + (start.getHours() > 9 ? start.getHours() : "0" + start.getHours()) + ":" + (start.getMinutes() > 9 ? start.getMinutes() : "0" + start.getMinutes()); endString += " " + (end.getHours() > 9 ? end.getHours() : "0" + end.getHours()) + ":" + (end.getMinutes() > 9 ? end.getMinutes() : "0" + end.getMinutes()); }else{ startString += " " + start.getHours() + ":" + start.getMinutes(); endString += " " + end.getMinutes() + ":" + end.getMinutes(); } $.ajax({ type : "get", url : c.create_event_btn.attr("href"), data : {"startDate":startString,"endDate":endString,"allDay":allDay}, success : function(data){ success_event(data,allDay,"new"); } }) }, views: { dayGridMonth: { dayMaxEvents: false } } }); c.create_event_btn.click(function(){ $.ajax({ type : "get", url : $(this).attr("href"), success : function(data){ success_event(data,false,"new",true); } }) return false; }); c.nextBtn.click(function(){ c.dialog.dismiss(); c.calendar_dom.calendar.next(); }); c.prevBtn.click(function(){ c.dialog.dismiss(); c.calendar_dom.calendar.prev(); }); c.todayBtn.click(function(){ c.dialog.dismiss(); c.calendar_dom.calendar.today(); }); c.modeBtns.click(function(){ c.dialog.dismiss(); toggleViews($(this).data("mode")); }); c.refreshBtn.click(function(){ c.dialog.dismiss(); if(c.currentView == "agenda") agendaView.refresh(); else c.calendar_dom.calendar.refetchEvents(); }); c.calendar_dom.mouseup(function(e){ c.mousePosition = {"x" : e.pageX, "y" : e.pageY}; }) var toggleViews = function(view){ c.modeBtns.removeClass("active"); c.modeBtns.each(function(){ if ($(this).data("mode") == view) $(this).addClass("active"); }); if(view != "agenda"){ if(c.currentView == "agenda"){ // $("#sec1").addClass("span3").removeClass("span7"); $("#sec2").show(); // $("#sec3").addClass("span4").removeClass("span5"); agendaView.hide(); } c.calendar_dom.calendar.changeView(view); }else{ // $("#sec1").addClass("span7").removeClass("span3"); $("#sec2").hide(); // $("#sec3").addClass("span5").removeClass("span4"); agendaView.inflate(); } c.currentView = view; if(loadeventsonviewchange){ c.calendar_dom.calendar.refetchEvents(); loadeventsonviewchange = false; } if(c.calendar_dom.calendar.currentData){ var viewTitle = c.calendar_dom.calendar.currentData.viewTitle; if(view == "timeGridDay" && $('.fc-col-header-cell-cushion ').text() != "") viewTitle = $('.fc-col-header-cell-cushion ').text() + ', ' + viewTitle; $('#current_title').html(viewTitle); } c.calendar_dom.calendar.render(); //Rerender to fix layout }; if(c.currentView == "agenda"){toggleViews("agenda");loadeventsonviewchange = true;} }; this.updateEvent = function(eventStick){ c.calendar_dom.fullCalendar("updateEvent",eventStick); } this.deleteEvent = function(delete_url,_id){ $.ajax({ type : "delete", url : delete_url, success : function(){ c.calendar_dom.fullCalendar("removeEvents",[_id]); c.dialog.dismiss(); } }) } this.editEvent = function(edit_url,allDay){ $.ajax({ type : "get", url : edit_url, success : function(data){ c.success_event(data,allDay,"edit",true); c.dialog.dismiss(); } }) } this.renderEvent = function(eventStick){ if(eventStick.recurring === true) c.calendar_dom.calendar.refetchEvents(); else c.calendar_dom.calendar.addEvent(eventStick); }; $(document).ready(function() { c.initialize(); }); }; var EventDialog = function(calendar,event){ _t = this; var event_quick_view = null; var template = ""; var _this_event = null; this.inflate = function(_event){ if(!_event) throw new UserException("EventStick can't be null!"); _event.allDay = _event.event.allDay; _event._start = _event.event.start; _event._end = (_event.event.end ? _event.event.end : _event.event.start); // var start_date = getDateString(_event._start,date_format); // var end_date = getDateString(_event._end,date_format); if(_event._end - _event._start > 86400 * 1000){ _event.allDay = true; } _event.title = _event.event.title; var extendedProps = _event.event.extendedProps; Object.keys(extendedProps).forEach(function(k){ _event[k] = extendedProps[k]; }) if(_event.hiring_person_name == undefined) _event.hiring_person_name = ""; _this_event = _event; var start_time = "", end_time = "", time_string = null; if(_event.allDay) { start_time = getDateString(_event._start,datetime_format, is_chinese); if(_event._end) end_time = getDateString(_event._end,datetime_format, is_chinese); time_string = (_event._start === _event._end || !_event._end ? "

" + start_time + "

" : "" + start_time + "
" + end_time + ""); } else { start_time = getDateString(_event._start,date_format, is_chinese); end_time = getDateString(_event._end,date_format, is_chinese); var stime = getDateString(_event._start,time_format, is_chinese), etime = getDateString(_event._end,time_format, is_chinese), same = (start_time == end_time); if( same ){ time_string = "

" + start_time + "

" + stime + " " + etime ; }else{ time_string = "" + start_time + " " + stime + "
" + end_time + " " + etime + "" } // time_string = (same ? "

" + start_time + "

" + stime + " " + etime : "

" + start_time + "" + stime + "

" + end_time + "" + etime + "

"); } event_quick_view = $(''); template = '