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.time_format = "h:m b"; window.date_time_str_format = 'y/MM/d H:m'; 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.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,property_id,currentView,display_hire_event){ c = this; display_hire_event = (display_hire_event == undefined ? true : display_hire_event); 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 = currentView || "dayGridMonth"; this.property_id = property_id; this.navigation = $("#navigation"); this.rangeSelection = $("#range_selection"); var agendaView = new AgendaView(c); var loadeventsonviewchange = false; this.initialize = function(){ var date = new Date(); var d = date.getDate(); var m = date.getMonth(); var y = date.getFullYear(); var dview = (c.currentView == "agenda" ? "dayGridMonth" : c.currentView); c.calendar_dom.css("overflow","visible"); c.calendar_dom.fullCalendar({ themeSystem: 'bootstrap', editable: false, selectable: true, width: "100%", events: function(args, success_callback, fail_callback) { var start = args.start; var end = args.end; $.ajax({ url: "/xhr/property_hires/get_bookings?property_id="+c.property_id, dataType: 'json', type: 'GET', data: { start: Math.round(start.getTime() / 1000), end: Math.round(end.getTime() / 1000), _: Date.now(), display_hire_event: display_hire_event }, success: function(json) { // json = json.map(function(obj){ // obj.start = new Date(obj.start).toJSON(); // obj.end = new Date(obj.end).toJSON(); // return obj; // }) success_callback(json); } }); }, // events: 'https://fullcalendar.io/demo-events.json', headerToolbar: false, fixedWeekCount: false, initialView: dview, loading: function(bool) { if (bool) c.loading.show(); else c.loading.hide(); if(this.currentData) $('#current_title').html(this.currentData.viewTitle); }, windowResize : function(view){ c.calendar_dom.calendar.refetchEvents(); }, eventTimeFormat: { hour12: true, hour: '2-digit', minute: '2-digit', omitZeroMinute: true, meridiem: 'narrow' }, eventClick: function(calEvent, e, view) { if(calEvent.jsEvent && !e){ e = {"originalEvent": calEvent.jsEvent} } var el = $(calEvent.el); if(el.hasClass("reserve_btn")){ window.calEvent = calEvent; var start_time = calEvent.event.start; var date_str = window.getDateString(start_time,std_date_format); c.dialog.hide(); var allow_times = calEvent.event._def.extendedProps.allow_times; window.pick_hire_date(date_str,allow_times); }else{ c.dialog.dismiss(); c.dialog.inflate(calEvent); c.dialog.show({"x":e.originalEvent.clientX,"y":e.originalEvent.clientY}); } }, dateClick: function(ev) { var calendar = this; var calendar_dom = $(this.el); if(c.calendar_dom.hasClass("active_picker")){ var date = ev.date, date_str = getDateString(date,date_time_str_format), day_element = ev.dayEl, jsEvent = ev.jsEvent; var time_str = date_str.split(" ")[1]; var date_str = date_str.split(" ")[0]; calendar_dom.trigger("init_time",[time_str]); calendar_dom.trigger("select_time",[date_str]); } }, views: { dayGridMonth: { dayMaxEvents: true } } }); 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(); }); 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.renderEvent = function(eventStick){ if(eventStick.recurring === true) c.calendar_dom.calendar.refetchEvents(); else c.calendar_dom.calendar.renderEvent(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; _event.hiring_person_name = _event.event.extendedProps.hiring_person_name; _event.error_message = _event.event.extendedProps.error_message; if(!_event.hiring_person_name) _event.hiring_person_name = ""; _event.note = _event.event.extendedProps.note; _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 + "" + 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 = ' '; } this.show = function(pos){ event_quick_view.css({display: 'inline-block',width: '',height: '', position: "fixed", "z-index": "10000"}); var offset; var padding = 20; if(pos){ offset = {"left":pos.x,"top":pos.y}; var pos = getPosition(pos); event_quick_view.offset(offset); }else{ offset = {"left": padding, "top": padding}; } event_quick_view.html(template).appendTo("body").show(); event_quick_view.find(".event-close-btn").one("click",function(){_t.dismiss();}); event_quick_view.find("a.delete").one("click",function(){calendar.deleteEvent(_this_event.delete_url,_this_event._id);return false;}); event_quick_view.find("a.edit").one("click",function(){calendar.editEvent(_this_event.edit_url,_this_event.allDay);return false;}); var window_width = $(window).width(), window_height = $(window).height(); var dialog_width = event_quick_view.width(), dialog_height = event_quick_view.height(); var new_offset = Object.assign({},offset); var need_redisplay = false; var new_width = null, new_height = null; var padding_top = padding + 40; if(offset.left + dialog_width > window_width){ new_offset.left = window_width - dialog_width - padding; need_redisplay = true; } if(new_offset.left < padding){ new_width = dialog_width - (padding - new_offset.left); new_offset.left = padding; need_redisplay = true; } if(offset.top + dialog_height > window_height){ new_offset.top = window_height - dialog_height - padding; need_redisplay = true; } if(new_offset.top < padding_top){ new_height = dialog_height - (padding_top - new_offset.top); new_offset.top = padding_top; need_redisplay = true; } if(need_redisplay){ event_quick_view.offset(new_offset); event_quick_view.width(new_width); event_quick_view.height(new_height); } } this.hide = function(){ calendar.calendar_dom.find('.fc-popover-close').click(); $(event_quick_view).hide(); } this.dismiss = function(){ if(event_quick_view) event_quick_view.remove(); } var getPosition = function(pos){ var x = pos.x, y = pos.y, winheight = $(window).height(); if((x + event_quick_view.width()) > $(window).width()){ x = x - event_quick_view.width(); } if((y + event_quick_view.height()) > winheight){ y = y - event_quick_view.height(); } return {"x":x,"y":y}; } if(event) _t.inflate(event); } var UserException = function(message) { this.message = message; this.name = "UserException"; this.toString = function(){ return this.message; } } var AgendaView = function(calendar){ var av = this; var _calendar = calendar; var agenda_space = _calendar.agenda_space; var today = new Date(); var minDifference = 6; var start_month = today.getMonth(); var start_year = today.getFullYear(); var end_month = ((start_month + minDifference) > 11 ? (start_month + minDifference) - 11 : start_month + minDifference); var end_year = ((start_month + minDifference) > 11 ? start_year+1 : start_year); var monthNames = ['January','February','March','April','May','June','July','August','September','October','November','December']; var month_template = 'Sun | ' + 'Mon | ' + 'Tue | ' + 'Wed | ' + 'Thu | ' + 'Fri | ' + 'Sat | ' + '
---|
Date | ' + 'Time | ' + 'Events | ' + 'Borrower | ' + '
---|---|---|---|
No events for this month. | ' + '
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
---|
No events for this month. |