var Calendar = function(dom){ c = this; this.create_event_btn = $("#create_event_btn"); this.event_create_space = $("#event_create_space"); this.title = $("#current_title"); this.calendar = $(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.mousePosition = {}; this.dialog = new EventDialog(c); this.loading = $('#calendar-loading'); this.success_event = null; this.agenda_space = $("#calendar_agenda"); this.currentView = "month"; 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 change_event = function(_event, delta) { _event.end = (_event.end ? _event.end : _event.start); var s = $.fullCalendar.parseDate(c.calendar.find(".fc-view table tbody td:first").data("date")); var e = $.fullCalendar.parseDate(c.calendar.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 dtpick = $('.datetimepick'); var pickers = new Array(); var checked = ($("#all_day_check").is(":checked") ? true : false); var checked_function = function(c){ if(c){ for(i in pickers){ var input = pickers[i].find("input"); input.val(input.val().split(" ")[0]); } }else{ for(i in pickers){ var d = new Date(); var input = pickers[i].find("input"); if(input.val()) input.val(input.val() + " " + d.getHours() + ":" + d.getMinutes()); } } } var repeat_function = function(){ if(c.event_create_space.find("#event_period").val() == c.event_create_space.find("#event_period option:eq(0)").val()){ c.event_create_space.find("#event_frequency").attr("disabled","disabled"); }else{ c.event_create_space.find("#event_frequency").removeAttr("disabled"); } } dtpick.each(function() { var $data = $(this).data(); var options = { format: $data.dateFormat, pickTime: $data.picktime, language: $data.language, place: "top" } pickers.push( $(this).datetimepicker(options) ); }); $("a.btn-close").one("click",function(){ c.event_create_space.html("").hide(); $('.bootstrap-datetimepicker-widget').remove(); return false; }); $("#all_day_check").click(function(){ if($(this).is(":checked")){ checked = true; }else{ checked = false; } checked_function(checked); }); $("#recurring_checkbox").click(function(){ if($(this).is(":checked")) $("#recurring_panel").show(); else $("#recurring_panel").hide(); }) $('form[data-remote]').bind("ajax:success",function(evt, data, status){ c.event_create_space.html("").hide(); if(type == "new") c.renderEvent(data); if(type == "edit") c.calendar.fullCalendar("refetchEvents"); }); c.event_create_space.find("#event_period").change(function(){ repeat_function(); }) for(i in pickers){ pickers[i].on("changeDate",function(e){ if(checked){ var input = $(this).find("input"); input.val(input.val().split(" ")[0]); } }) } repeat_function(); if(allDay) checked_function(checked); } c.success_event = success_event; var dview = (c.currentView == "agenda" ? "month" : c.currentView); c.calendar.fullCalendar({ editable: true, selectable: true, events: window.location.href, eventResize: change_event, eventDrop: change_event , header: false, default: dview, height: $(window).height() - 315, loading: function(bool) { if (bool) c.loading.css("left",($(window).width()/2 - 60) + "px").show(); else c.loading.hide(); }, windowResize : function(view){ view.setHeight($(window).height() - 315); c.calendar.fullCalendar("refetchEvents"); }, viewDisplay: function(view) { c.title.html(view.title); }, eventClick: function(calEvent, e, view) { c.event_create_space.html("").hide(); c.dialog.dismiss(); c.dialog.inflate(calEvent); c.dialog.show({"x":e.originalEvent.clientX,"y":e.originalEvent.clientY}); }, select : function(startDate, endDate, allDay, jsEvent, view){ var start = new Date(startDate), end = new Date(endDate), startString = start.getFullYear() + "/"+ (start.getMonth() + 1 > 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"); } }) } }); 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.fullCalendar('next'); }); c.prevBtn.click(function(){ c.dialog.dismiss(); c.calendar.fullCalendar('prev'); }); c.todayBtn.click(function(){ c.dialog.dismiss(); c.calendar.fullCalendar('today'); }); c.modeBtns.click(function(){ c.dialog.dismiss(); c.event_create_space.html("").hide(); toggleViews($(this).data("mode")); }); c.refreshBtn.click(function(){ c.dialog.dismiss(); if(c.currentView == "agenda") agendaView.refresh(); else c.calendar.fullCalendar("refetchEvents"); }); c.calendar.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.fullCalendar('changeView',view); }else{ // $("#sec1").addClass("span7").removeClass("span3"); $("#sec2").hide(); // $("#sec3").addClass("span5").removeClass("span4"); agendaView.inflate(); } c.currentView = view; if(loadeventsonviewchange){ c.calendar.fullCalendar("refetchEvents"); loadeventsonviewchange = false; } } if(c.currentView == "agenda"){toggleViews("agenda");loadeventsonviewchange = true;} c.calendar.on("DOMMouseScroll mousewheel", function(e){ if(c.calendar.fullCalendar("getView").name == "month"){ if(!c.isFormVisible()){ c.dialog.dismiss(); if(/Firefox/i.test(navigator.userAgent)){ if(e.originalEvent.detail == 1){ c.calendar.fullCalendar('next'); }else if(e.originalEvent.detail == -1){ c.calendar.fullCalendar('prev'); } }else{ if(e.originalEvent.wheelDelta /120 > 0) c.calendar.fullCalendar('prev'); else c.calendar.fullCalendar('next'); } } } }); } this.isFormVisible = function(){ return (c.event_create_space.html() == "" ? false : true); } this.renderEvent = function(eventStick){ if(eventStick.recurring == true){ c.calendar.fullCalendar("refetchEvents"); }else{ c.calendar.fullCalendar("renderEvent",eventStick); } } this.updateEvent = function(eventStick){ c.calendar.fullCalendar("updateEvent",eventStick); } this.deleteEvent = function(delete_url,_id){ $.ajax({ type : "delete", url : delete_url, success : function(){ c.calendar.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(); } }) } $(document).ready(function() { c.initialize(); }); } var EventDialog = function(calendar,event){ _t = this; var event_quick_view = null; var template = ""; var _this_event = null; var month_names = ["Jan","Feb","March","April","May","June","July","Aug","Sep","Oct","Nov","Dec"]; this.inflate = function(_event){ if(!_event) throw new UserException("EventStick can't be null!"); _this_event = _event; var start_time = "", end_time = "", time_string = null; if(_event.allDay) { start_time = $.fullCalendar.formatDate(_event._start,"MMM dd, yyyy"); if(_event._end) end_time = $.fullCalendar.formatDate(_event._end,"MMM dd, yyyy"); time_string = (_event._start === _event._end || !_event._end ? "
" + start_time + "
" : " " + start_time + " " + end_time + ""); } else { var sh = _event._start.getHours() > 12 ? _event._start.getHours() - 12 : _event._start.getHours(), eh = _event._end.getHours() > 12 ? _event._end.getHours() - 12 : _event._end.getHours(), sm = _event._start.getMinutes() < 10 ? '0' + _event._start.getMinutes() : _event._start.getMinutes(), em = _event._end.getMinutes() < 10 ? '0' + _event._end.getMinutes() : _event._end.getMinutes(), stime = _event._start.getHours() > 12 ? sh + ':' + sm + " PM" : sh + ':' + sm + " AM", etime = _event._end.getHours() > 12 ? eh + ':' + em + " PM" : eh + ':' + em + " AM", same = (_event._start.getDate() == _event._end.getDate() && _event._start.getMonth() == _event._end.getMonth() && _event._start.getFullYear() == _event._end.getFullYear()); start_time = month_names[_event._start.getMonth()] + " " + _event._start.getDate() + ", " + _event._start.getFullYear(); end_time = month_names[_event._end.getMonth()] + " " + _event._end.getDate() + ", " + _event._end.getFullYear(); time_string = (same ? "" + start_time + "
" + stime + " " + etime : "
" + start_time + "" + stime + "
" + end_time + "" + etime + "
"); } event_quick_view = $(''); template = 'Sun | ' + 'Mon | ' + 'Tue | ' + 'Wed | ' + 'Thu | ' + 'Fri | ' + 'Sat | ' + '
---|
Date | ' + 'Time | ' + 'Events | ' + '
---|---|---|
No events for this month. | ' + '