!(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.show(); $(".bckdrop").addClass("show"); $(".bckdrop").removeClass("hide"); $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.hide("hide"); $(".bckdrop").addClass("hide"); $(".bckdrop").removeClass("show"); }); $this.$modal.find("form").on("submit", function () { calEvent.title = form.find("input[type=text]").val(); $this.$calendarObj.fullCalendar("updateEvent", calEvent); $this.$modal.hide("hide"); $(".bckdrop").addClass("hide"); $(".bckdrop").removeClass("show"); return false; }); }), /* on select */ (CalendarApp.prototype.onSelect = function (start, end, allDay) { var $this = this; $this.$modal.show(); $(".bckdrop").addClass("show"); $(".bckdrop").removeClass("hide"); 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(); $(".bckdrop").addClass("hide"); $(".bckdrop").removeClass("show"); $("body").removeClass("modal-open"); }); // $this.$modal.find(".close-dialog").click(function () { // $this.$modal.hide("hide"); // $(".bckdrop").addClass("hide"); // $(".bckdrop").removeClass("show"); // $("body").removeClass("modal-open"); // }); $this.$modal.find(".close-dialog").click(function () { $this.$modal.hide("hide"); $(".bckdrop").addClass("hide"); $(".bckdrop").removeClass("show"); $this.$modal.hide(); // $("body").removeClass("modal-open"); }); $("body").addClass("modal-open"); $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.hide("hide"); $(".bckdrop").addClass("hide"); $(".bckdrop").removeClass("show"); } 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(); });