sintonia/legacy/public/js/airtime/schedule/schedule.js

560 lines
15 KiB
JavaScript

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");
},
};
},
});
});