var AIRTIME = (function(AIRTIME){ var mod; if (AIRTIME.schedule === undefined) { AIRTIME.schedule = {}; } mod = AIRTIME.schedule; return AIRTIME; }(AIRTIME || {})); var serverTimezoneOffset = 0; function closeDialogCalendar(event, ui) { $el = $(this); $el.dialog('destroy'); $el.remove(); //need to refetch the events to update scheduled status. $("#schedule_calendar").fullCalendar( 'refetchEvents' ); } function confirmCancelShow(show_instance_id){ if (confirm($.i18n._('Cancel Current Show?'))) { var url = baseUrl+"Schedule/cancel-current-show"; $.ajax({ url: url, data: {format: "json", id: show_instance_id}, success: function(data){ scheduleRefetchEvents(data); } }); } } function confirmCancelRecordedShow(show_instance_id){ if (confirm($.i18n._('Stop recording current show?'))) { var url = baseUrl+"Schedule/cancel-current-show"; $.ajax({ url: url, data: {format: "json", id: show_instance_id}, success: function(data){ scheduleRefetchEvents(data); } }); } } function findViewportDimensions() { var viewportwidth, viewportheight; // the more standards compliant browsers (mozilla/netscape/opera/IE7) use // window.innerWidth and window.innerHeight if (typeof window.innerWidth != 'undefined') { viewportwidth = window.innerWidth, viewportheight = window.innerHeight; } // IE6 in standards compliant mode (i.e. with a valid doctype as the first // line in the document) else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) { viewportwidth = document.documentElement.clientWidth; viewportheight = document.documentElement.clientHeight; } // older versions of IE else { viewportwidth = document.getElementsByTagName('body')[0].clientWidth; viewportheight = document.getElementsByTagName('body')[0].clientHeight; } return { width: viewportwidth, height: viewportheight-45 }; } function highlightMediaTypeSelector(dialog) { var selected; if (location.hash === "") { selected = dialog.find("a[href$='#tracks']"); } else { selected = dialog.find("a[href$='"+location.hash+"']") } selected.parent().addClass("selected"); $("#library_filter").text(selected.text()); // Slightly hacky way of triggering the click event when it's outside of the anchor text dialog.find(".media_type_selector").on("click", function() { // Need get(0) here so we don't create a stack overflow by recurring the click on the parent $(this).find("a").get(0).click(); }); $(window).on('hashchange', function() { var selected = dialog.find("a[href$='"+location.hash+"']"); AIRTIME.library.selectNone(); dialog.find(".media_type_selector").each(function () { $(this).removeClass("selected"); }); $("#library_filter").text(selected.text()); selected.parent().addClass("selected"); oTable.fnDraw(); }); } function buildTimerange(dialog) { var builder = dialog.find("#show_builder"), oBaseDatePickerSettings = { dateFormat: 'yy-mm-dd', //i18n_months, i18n_days_short are in common.js monthNames: i18n_months, dayNamesMin: i18n_days_short, onClick: function(sDate, oDatePicker) { $(this).datepicker("setDate", sDate); }, onClose: validateTimeRange }, oBaseTimePickerSettings = { showPeriodLabels: false, showCloseButton: true, closeButtonText: $.i18n._("Done"), showLeadingZero: false, defaultTime: '0:00', hourText: $.i18n._("Hour"), minuteText: $.i18n._("Minute"), onClose: validateTimeRange }; /* * Icon hover states for search. */ builder.on("mouseenter", ".sb-timerange .ui-button", function(ev) { $(this).addClass("ui-state-hover"); }); builder.on("mouseleave", ".sb-timerange .ui-button", function(ev) { $(this).removeClass("ui-state-hover"); }); builder.find(dateStartId) .datepicker(oBaseDatePickerSettings); builder.find(timeStartId) .timepicker(oBaseTimePickerSettings); builder.find(dateEndId) .datepicker(oBaseDatePickerSettings); builder.find(timeEndId) .timepicker(oBaseTimePickerSettings); var oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId, dateEndId, timeEndId); AIRTIME.showbuilder.fnServerData.start = oRange.start; AIRTIME.showbuilder.fnServerData.end = oRange.end; } function buildScheduleDialog (json, instance_id) { var dialog = $(json.dialog), viewport = findViewportDimensions(), height = Math.floor(viewport.height * 0.96), width = Math.floor(viewport.width * 0.96), fnServer = AIRTIME.showbuilder.fnServerData; dialog.dialog({ autoOpen: false, title: json.title, width: width, height: height, resizable: false, draggable: true, modal: true, close: closeDialogCalendar, buttons: [ { text: $.i18n._("Ok"), class: "btn", click: function() { $(this).dialog("close"); //getUsabilityHint(); } } ] }); //set the start end times so the builder datatables knows its time range. fnServer.start = json.start; fnServer.end = json.end; fnServer.ops = {}; fnServer.ops.showFilter = 0; fnServer.ops.showInstanceFilter = instance_id; fnServer.ops.myShows = 0; AIRTIME.library.libraryInit(); AIRTIME.showbuilder.builderDataTable(); dialog.dialog('open'); highlightMediaTypeSelector(dialog); buildTimerange(dialog); } function buildContentDialog (json){ var dialog = $(json.dialog), viewport = findViewportDimensions(), height = viewport.height * 2/3, width = viewport.width * 4/5; if (json.show_error == true){ alertShowErrorAndReload(); } dialog.find("#show_progressbar").progressbar({ value: json.percentFilled }); dialog.dialog({ autoOpen: false, title: $.i18n._("Contents of Show") +" '" + json.showTitle + "'", width: width, height: height, modal: true, close: closeDialogCalendar, buttons: [ { text: $.i18n._("Ok"), "class": "btn", click: function() { dialog.remove(); } } ] }); dialog.dialog('open'); } /** * Use user preference for time scale; defaults to month if preference was never set */ function getTimeScalePreference(data) { return data.calendarInit.timeScale; } /** * Use user preference for time interval; defaults to 30m if preference was never set */ function getTimeIntervalPreference(data) { return parseInt(data.calendarInit.timeInterval); } function createFullCalendar(data){ serverTimezoneOffset = data.calendarInit.timezoneOffset; var mainHeight = $(window).height() - 200 - 35; $('#schedule_calendar').fullCalendar({ header: { left: 'prev, next, today', center: 'title', right: 'agendaDay, agendaWeek, month' }, defaultView: getTimeScalePreference(data), slotMinutes: getTimeIntervalPreference(data), firstDay: data.calendarInit.weekStartDay, editable: false, allDaySlot: false, axisFormat: 'H:mm', timeFormat: { agenda: 'H:mm{ - H:mm}', month: 'H:mm{ - H:mm}' }, //i18n_months is in common.js monthNames: i18n_months, monthNamesShort: [ $.i18n._('Jan'), $.i18n._('Feb'), $.i18n._('Mar'), $.i18n._('Apr'), $.i18n._('May'), $.i18n._('Jun'), $.i18n._('Jul'), $.i18n._('Aug'), $.i18n._('Sep'), $.i18n._('Oct'), $.i18n._('Nov'), $.i18n._('Dec') ], buttonText: { today: $.i18n._('Today'), month: $.i18n._('Month'), week: $.i18n._('Week'), day: $.i18n._('Day') }, dayNames: [ $.i18n._('Sunday'), $.i18n._('Monday'), $.i18n._('Tuesday'), $.i18n._('Wednesday'), $.i18n._('Thursday'), $.i18n._('Friday'), $.i18n._('Saturday') ], dayNamesShort: [ $.i18n._('Sun'), $.i18n._('Mon'), $.i18n._('Tue'), $.i18n._('Wed'), $.i18n._('Thu'), $.i18n._('Fri'), $.i18n._('Sat') ], contentHeight: mainHeight, theme: true, lazyFetching: true, serverTimestamp: parseInt(data.calendarInit.timestamp, 10), serverTimezoneOffset: parseInt(data.calendarInit.timezoneOffset, 10), events: getFullCalendarEvents, //callbacks (in full-calendar-functions.js) viewDisplay: viewDisplay, dayClick: dayClick, eventRender: eventRender, eventAfterRender: eventAfterRender, eventDrop: eventDrop, eventResize: eventResize, windowResize: windowResize }); } //Alert the error and reload the page //this function is used to resolve concurrency issue function alertShowErrorAndReload(){ alert($.i18n._("The show instance doesn't exist anymore!")); window.location.reload(); } $(document).ready(function() { $.contextMenu({ selector: 'div.fc-event', trigger: "left", ignoreRightClick: true, className: 'calendar-context-menu', build: function($el, e) { var data, items, callback; data = $el.data("event"); function processMenuItems(oItems) { //define a schedule callback. if (oItems.schedule !== undefined) { callback = function() { $.post(oItems.schedule.url, {format: "json", id: data.id}, function(json){ buildScheduleDialog(json, data.id); }); }; oItems.schedule.callback = callback; } //define a clear callback. if (oItems.clear !== undefined) { callback = function() { if (confirm($.i18n._("Remove all content?"))) { $.post(oItems.clear.url, {format: "json", id: data.id}, function(json){ scheduleRefetchEvents(json); }); } }; oItems.clear.callback = callback; } //define an edit callback. if (oItems.edit !== undefined) { if(oItems.edit.items !== undefined){ var edit = oItems.edit.items; //edit a single instance callback = function() { $.get(edit.instance.url, {format: "json", showId: data.showId, instanceId: data.id, type: "instance"}, function(json){ beginEditShow(json); }); }; edit.instance.callback = callback; //edit this instance and all callback = function() { $.get(edit.all.url, {format: "json", showId: data.showId, instanceId: data.id, type: "all"}, function(json){ beginEditShow(json); }); }; edit.all.callback = callback; }else{ callback = function() { $.get(oItems.edit.url, {format: "json", showId: data.showId, instanceId: data.id, type: oItems.edit._type}, function(json){ beginEditShow(json); }); }; oItems.edit.callback = callback; } } //define a content callback. if (oItems.content !== undefined) { callback = function() { $.get(oItems.content.url, {format: "json", id: data.id}, function(json){ buildContentDialog(json); }); }; oItems.content.callback = callback; } //define a cancel recorded show callback. if (oItems.cancel_recorded !== undefined) { callback = function() { confirmCancelRecordedShow(data.id); }; oItems.cancel_recorded.callback = callback; } //define a view recorded callback. if (oItems.view_recorded !== undefined) { callback = function() { $.get(oItems.view_recorded.url, {format: "json"}, function(json){ //in library.js buildEditMetadataDialog(json); }); }; oItems.view_recorded.callback = callback; } //define a cancel callback. if (oItems.cancel !== undefined) { callback = function() { confirmCancelShow(data.id); }; oItems.cancel.callback = callback; } //define a delete callback. if (oItems.del !== undefined) { //repeating show multiple delete options if (oItems.del.items !== undefined) { var del = oItems.del.items; //delete a single instance callback = function() { $.post(del.single.url, {format: "json", id: data.id}, function(json){ scheduleRefetchEvents(json); }); }; del.single.callback = callback; //delete this instance and all following instances. callback = function() { $.post(del.following.url, {format: "json", id: data.id}, function(json){ scheduleRefetchEvents(json); }); }; del.following.callback = callback; } //single show else { callback = function() { $.post(oItems.del.url, {format: "json", id: data.id}, function(json){ scheduleRefetchEvents(json); }); }; oItems.del.callback = callback; } } items = oItems; } $.ajax({ url: baseUrl+"schedule/make-context-menu", type: "GET", data: {instanceId : data.id, showId: data.showId, format: "json"}, dataType: "json", async: false, success: function(json){ processMenuItems(json.items); } }); return { className: 'calendar-context-menu', items: items, determinePosition : function($menu, x, y) { $menu.css('display', 'block') .position({ my: "left top", at: "right top", of: this, offset: "-20 10", collision: "fit"}) .css('display', 'none'); } }; } }); });