! function($) { "use strict"; var CalendarApp = function() { this.$body = $("body") this.$calendar = $('#calendar'), this.$event = ('#calendar-events div.calendar-events'), this.$categoryForm = $('#add-new-event form'), this.$extEvents = $('#calendar-events'), this.$modal = $('#my-event'), this.$saveCategoryBtn = $('.save-category'), this.$calendarObj = null }; /* on drop */ CalendarApp.prototype.onDrop = function(eventObj, date) { var $this = this; // retrieve the dropped element's stored Event Object var originalEventObject = eventObj.data('eventObject'); var $categoryClass = eventObj.attr('data-class'); // we need to copy it, so that multiple events don't have a reference to the same object var copiedEventObject = $.extend({}, originalEventObject); // assign it the date that was reported copiedEventObject.start = date; if ($categoryClass) copiedEventObject['className'] = [$categoryClass]; // render the event on the calendar $this.$calendar.fullCalendar('renderEvent', copiedEventObject, true); // is the "remove after drop" checkbox checked? if ($('#drop-remove').is(':checked')) { // if so, remove the element from the "Draggable Events" list eventObj.remove(); } }, /* on click on event */ CalendarApp.prototype.onEventClick = function(calEvent, jsEvent, view) { var $this = this; var form = $("
"); form.append(""); form.append("
"); $this.$modal.modal({ backdrop: 'static' }); $this.$modal.find('.delete-event').show().end().find('.save-event').hide().end().find('.modal-body').empty().prepend(form).end().find('.delete-event').unbind('click').click(function() { $this.$calendarObj.fullCalendar('removeEvents', function(ev) { return (ev._id == calEvent._id); }); $this.$modal.modal('hide'); }); $this.$modal.find('form').on('submit', function() { calEvent.title = form.find("input[type=text]").val(); $this.$calendarObj.fullCalendar('updateEvent', calEvent); $this.$modal.modal('hide'); return false; }); }, /* on select */ CalendarApp.prototype.onSelect = function(start, end, allDay) { var $this = this; $this.$modal.modal({ backdrop: 'static' }); var form = $("
"); form.append("
"); form.find(".row") .append("
") .append("
") .find("select[name='category']") .append("") .append("") .append("") .append("") .append(""); $this.$modal.find('.delete-event').hide().end().find('.save-event').show().end().find('.modal-body').empty().prepend(form).end().find('.save-event').unbind('click').click(function() { form.submit(); }); $this.$modal.find('form').on('submit', function() { var title = form.find("input[name='title']").val(); var beginning = form.find("input[name='beginning']").val(); var ending = form.find("input[name='ending']").val(); var categoryClass = form.find("select[name='category'] option:checked").val(); if (title !== null && title.length != 0) { $this.$calendarObj.fullCalendar('renderEvent', { title: title, start: start, end: end, allDay: false, className: categoryClass }, true); $this.$modal.modal('hide'); } else { alert('You have to give a title to your event'); } return false; }); $this.$calendarObj.fullCalendar('unselect'); }, CalendarApp.prototype.enableDrag = function() { //init events $(this.$event).each(function() { // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/) // it doesn't need to have a start or end var eventObject = { title: $.trim($(this).text()) // use the element's text as the event title }; // store the Event Object in the DOM element so we can get to it later $(this).data('eventObject', eventObject); // make the event draggable using jQuery UI $(this).draggable({ zIndex: 999, revert: true, // will cause the event to go back to its revertDuration: 0 // original position after the drag }); }); } /* Initializing */ CalendarApp.prototype.init = function() { this.enableDrag(); /* Initialize the calendar */ var date = new Date(); var d = date.getDate(); var m = date.getMonth(); var y = date.getFullYear(); var form = ''; var today = new Date($.now()); var defaultEvents = [{ title: 'Meeting #3', start: new Date($.now() + 506800000), className: 'bg-info' }, { title: 'Submission #1', start: today, end: today, className: 'bg-danger' }, { title: 'Meetup #6', start: new Date($.now() + 848000000), className: 'bg-info' }, { title: 'Seminar #4', start: new Date($.now() - 1099000000), end: new Date($.now() - 919000000), className: 'bg-warning' }, { title: 'Event Conf.', start: new Date($.now() - 1199000000), end: new Date($.now() - 1199000000), className: 'bg-purple' }, { title: 'Meeting #5', start: new Date($.now() - 399000000), end: new Date($.now() - 219000000), className: 'bg-info' }, { title: 'Submission #2', start: new Date($.now() + 868000000), className: 'bg-danger' }, { title: 'Seminar #5', start: new Date($.now() + 348000000), className: 'bg-success' } ]; var $this = this; $this.$calendarObj = $this.$calendar.fullCalendar({ slotDuration: '00:15:00', /* If we want to split day time each 15minutes */ minTime: '08:00:00', maxTime: '19:00:00', defaultView: 'month', handleWindowResize: true, header: { left: 'prev,next today', center: 'title', right: 'month,agendaWeek,agendaDay' }, events: defaultEvents, editable: true, droppable: true, // this allows things to be dropped onto the calendar !!! eventLimit: true, // allow "more" link when too many events selectable: true, drop: function(date) { $this.onDrop($(this), date); }, select: function(start, end, allDay) { $this.onSelect(start, end, allDay); }, eventClick: function(calEvent, jsEvent, view) { $this.onEventClick(calEvent, jsEvent, view); } }); //on new event this.$saveCategoryBtn.on('click', function() { var categoryName = $this.$categoryForm.find("input[name='category-name']").val(); var categoryColor = $this.$categoryForm.find("select[name='category-color']").val(); if (categoryName !== null && categoryName.length != 0) { $this.$extEvents.append('
' + categoryName + '
') $this.enableDrag(); } }); }, //init CalendarApp $.CalendarApp = new CalendarApp, $.CalendarApp.Constructor = CalendarApp }(window.jQuery), //initializing CalendarApp $(window).on('load', function() { $.CalendarApp.init() });