123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591 |
- /**
- *
- * Full Calendar callback methods.
- *
- */
- function scheduleRefetchEvents(json) {
- if(json.show_error == true){
- alert($.i18n._("The show instance doesn't exist anymore!"));
- }
- if(json.show_id) {
- var dialog_id = parseInt($("#add_show_id").val(), 10);
- //if you've deleted the show you are currently editing, close the add show dialog.
- if (dialog_id === json.show_id) {
- $("#add-show-close").click();
- }
- }
- $("#schedule_calendar").fullCalendar( 'refetchEvents' );
- }
- function makeTimeStamp(date){
- var sy, sm, sd, h, m, s, timestamp;
- sy = date.getFullYear();
- sm = date.getMonth() + 1;
- sd = date.getDate();
- h = date.getHours();
- m = date.getMinutes();
- s = date.getSeconds();
- timestamp = sy+"-"+ pad(sm, 2) +"-"+ pad(sd, 2) +" "+ pad(h, 2) +":"+ pad(m, 2) +":"+ pad(s, 2);
- return timestamp;
- }
- function dayClick(date, allDay, jsEvent, view){
- // The show from will be preloaded if the user is admin or program manager.
- // Hence, if the user if DJ then it won't open anything.
- if(userType == "A" || userType == "P"){
- var now, today, selected, chosenDate, chosenTime;
- now = adjustDateToServerDate(new Date(), serverTimezoneOffset);
- if(view.name === "month") {
- today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
- selected = new Date(date.getFullYear(), date.getMonth(), date.getDate());
- }
- else {
- today = new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes());
- selected = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes());
- }
- if(selected >= today) {
- var addShow = $('.add-button');
- //remove the +show button if it exists.
- if(addShow.length == 1){
- var span = $(addShow).parent();
- $(span).prev().remove();
- $(span).remove();
- }
- // get current duration value on the form
- var duration_string = $.trim($("#add_show_duration").val());
- var duration_info = duration_string.split(" ");
- var duration_h = 0;
- var duration_m = 0;
- if(duration_info[0] != null){
- duration_h = parseInt(duration_info[0], 10);
- }
- if(duration_info[1] != null){
- duration_m = parseInt(duration_info[1], 10);
- }
- // duration in milisec
- var duration = (duration_h * 60 * 60 * 1000) + (duration_m * 60 * 1000);
- var startTime_string;
- var startTime = 0;
- // get start time value on the form
- if(view.name === "month") {
- startTime_string = $("#add_show_start_time").val();
- var startTime_info = startTime_string.split(':');
- if (startTime_info.length == 2) {
- var start_time_temp = (parseInt(startTime_info[0],10) * 60 * 60 * 1000)
- + (parseInt(startTime_info[1], 10) * 60 * 1000);
- if (!isNaN(start_time_temp)) {
- startTime = start_time_temp;
- }
- }
- }else{
- // if in day or week view, selected has all the time info as well
- // so we don't ahve to calculate it explicitly
- startTime_string = pad(selected.getHours(),2)+":"+pad(selected.getMinutes(),2)
- startTime = 0
- }
- // calculate endDateTime
- var endDateTime = new Date(selected.getTime() + startTime + duration);
- chosenDate = selected.getFullYear() + '-' + pad(selected.getMonth()+1,2) + '-' + pad(selected.getDate(),2);
- var endDateFormat = endDateTime.getFullYear() + '-' + pad(endDateTime.getMonth()+1,2) + '-' + pad(endDateTime.getDate(),2);
- $("#add_show_start_date").val(chosenDate);
- $("#add_show_end_date_no_repeat").val(endDateFormat);
- $("#add_show_end_date").val(endDateFormat);
- if(view.name !== "month") {
- var endTimeString = pad(endDateTime.getHours(),2)+":"+pad(endDateTime.getMinutes(),2);
- $("#add_show_start_time").val(startTime_string)
- $("#add_show_end_time").val(endTimeString)
- }
- $("#schedule-show-when").show();
- openAddShowForm();
- }
- }
- }
- function viewDisplay( view ) {
- view_name = view.name;
-
- if(view.name === 'agendaDay' || view.name === 'agendaWeek') {
- var calendarEl = this;
- var select = $('<select class="schedule_change_slots input_select"/>')
- .append('<option value="1">'+$.i18n._("1m")+'</option>')
- .append('<option value="5">'+$.i18n._("5m")+'</option>')
- .append('<option value="10">'+$.i18n._("10m")+'</option>')
- .append('<option value="15">'+$.i18n._("15m")+'</option>')
- .append('<option value="30">'+$.i18n._("30m")+'</option>')
- .append('<option value="60">'+$.i18n._("60m")+'</option>')
- .change(function(){
- var slotMin = $(this).val();
- var opt = view.calendar.options;
- var date = $(calendarEl).fullCalendar('getDate');
- opt.slotMinutes = parseInt(slotMin);
- opt.events = getFullCalendarEvents;
- opt.defaultView = view.name;
- //re-initialize calendar with new slotmin options
- $(calendarEl)
- .fullCalendar('destroy')
- .fullCalendar(opt)
- .fullCalendar( 'gotoDate', date );
- //save slotMin value to db
- var url = baseUrl+'Schedule/set-time-interval/format/json';
- $.post(url, {timeInterval: slotMin});
- });
- var topLeft = $(view.element).find("table.fc-agenda-days > thead th:first");
- //select.width(topLeft.width())
- // .height(topLeft.height());
- topLeft.empty()
- .append(select);
- var slotMin = view.calendar.options.slotMinutes;
- $('.schedule_change_slots option[value="'+slotMin+'"]').attr('selected', 'selected');
- }
- if(($("#add-show-form").length == 1) && ($("#add-show-form").css('display')=='none') && ($('.fc-header-left > span').length == 5)) {
- //userType is defined in bootstrap.php, and is derived from the currently logged in user.
- if(userType == "A" || userType == "P"){
- makeAddShowButton();
- }
- }
- //save view name to db
- var url = baseUrl+'Schedule/set-time-scale/format/json';
- $.post(url, {timeScale: view.name});
- }
- function eventRender(event, element, view) {
- $(element).addClass("fc-show-instance-"+event.id);
- $(element).attr("data-show-id", event.showId);
- $(element).attr("data-show-linked", event.linked);
- $(element).data("event", event);
- //only put progress bar on shows that aren't being recorded.
- if((view.name === 'agendaDay' || view.name === 'agendaWeek') && event.record === 0) {
- var div = $('<div/>');
- div
- .height('5px')
- .width('95%')
- .css('margin-top', '1px')
- .css('margin-left', 'auto')
- .css('margin-right', 'auto')
- .progressbar({
- value: event.percent
- });
- $(element).find(".fc-event-content").append(div);
- }
-
- //add the record/rebroadcast/soundcloud icons if needed
- if (event.record === 1) {
- if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
- if (event.soundcloud_id === -1) {
- $(element).find(".fc-event-time").before('<span class="small-icon recording"></span>');
- } else if ( event.soundcloud_id > 0) {
- $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
- } else if (event.soundcloud_id === -2) {
- $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
- } else if (event.soundcloud_id === -3) {
- $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
- }
- } else if (view.name === 'month') {
- if(event.soundcloud_id === -1) {
- $(element).find(".fc-event-title").after('<span class="small-icon recording"></span>');
- } else if (event.soundcloud_id > 0) {
- $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
- } else if (event.soundcloud_id === -2) {
- $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
- } else if (event.soundcloud_id === -3) {
- $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
- }
- }
- }
- if (event.record === 0 && event.rebroadcast === 0) {
- if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
- if (event.show_empty === 1) {
- if (event.linked) {
- $(element)
- .find(".fc-event-time")
- .before('<span class="small-icon linked"></span><span class="small-icon show-empty"></span>');
- } else {
- $(element)
- .find(".fc-event-time")
- .before('<span class="small-icon show-empty"></span>');
- }
- } else if (event.show_partial_filled === true) {
- if (event.linked) {
- $(element)
- .find(".fc-event-time")
- .before('<span class="small-icon linked"></span><span class="small-icon show-partial-filled"></span>');
- } else {
- $(element)
- .find(".fc-event-time")
- .before('<span class="small-icon show-partial-filled"></span>');
- }
- } else {
- if (event.linked) {
- $(element)
- .find(".fc-event-time")
- .before('<span class="small-icon linked"></span>');
- }
- }
- } else if (view.name === 'month') {
- if (event.show_empty === 1) {
- if (event.linked) {
- $(element)
- .find(".fc-event-title")
- .after('<span class="small-icon linked"></span><span title="'+$.i18n._("Show is empty")+'" class="small-icon show-empty"></span>');
- } else {
- $(element)
- .find(".fc-event-title")
- .after('<span title="'+$.i18n._("Show is empty")+'" class="small-icon show-empty"></span>');
- }
- } else if (event.show_partial_filled === true) {
- if (event.linked) {
- $(element)
- .find(".fc-event-title")
- .after('<span class="small-icon linked"></span><span title="'+$.i18n._("Show is partially filled")+'" class="small-icon show-partial-filled"></span>');
- } else {
- $(element)
- .find(".fc-event-title")
- .after('<span title="'+$.i18n._("Show is partially filled")+'" class="small-icon show-partial-filled"></span>');
- }
- } else {
- if (event.linked) {
- $(element)
- .find(".fc-event-title")
- .after('<span class="small-icon linked"></span>');
- }
- }
- }
- }
- //rebroadcast icon
- if (event.rebroadcast === 1) {
- if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
- $(element).find(".fc-event-time").before('<span class="small-icon rebroadcast"></span>');
- } else if (view.name === 'month') {
- $(element).find(".fc-event-title").after('<span class="small-icon rebroadcast"></span>');
- }
- }
-
- //now playing icon.
- var span = '<span class="small-icon now-playing"></span>';
- if (event.nowPlaying === true) {
-
- if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
-
- $(element).find(".fc-event-time").before(span);
- }
- else if (view_name === 'month') {
-
- $(element).find(".fc-event-title").after(span);
- }
- }
- }
- function eventAfterRender( event, element, view ) {
- $(element).find(".small-icon").live('mouseover',function(){
- addQtipsToIcons($(this), event.id);
- });
- }
- function eventDrop(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {
- var url = baseUrl+'Schedule/move-show/format/json';
- $.post(url,
- {day: dayDelta, min: minuteDelta, showInstanceId: event.id},
- function(json){
- if(json.show_error == true){
- alertShowErrorAndReload();
- }
- if(json.error) {
- alert(json.error);
- revertFunc();
- }
-
- //Workaround for cases where FullCalendar handles events over DST
- //time changes in a different way than Airtime does.
- //(Airtime preserves show duration, FullCalendar doesn't.)
- scheduleRefetchEvents(json);
- });
- }
- function eventResize( event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view ) {
- var url = baseUrl+'Schedule/resize-show/format/json';
- $.post(url,
- {day: dayDelta, min: minuteDelta, showId: event.showId, instanceId: event.id},
- function(json){
- if(json.show_error == true){
- alertShowErrorAndReload();
- }
- if(json.error) {
- alert(json.error);
- revertFunc();
- }
- scheduleRefetchEvents(json);
- });
- }
- function windowResize() {
- // 200 px for top dashboard and 50 for padding on main content
- // this calculation was copied from schedule.js line 326
- var mainHeight = $(window).height() - 200 - 24;
- $('#schedule_calendar').fullCalendar('option', 'contentHeight', mainHeight);
- }
- function preloadEventFeed () {
- var url = baseUrl+'Schedule/event-feed-preload';
- var d = new Date();
- $.post(url, {format: "json", cachep: d.getTime()}, function(json){
- calendarEvents = json.events;
- createFullCalendar({calendarInit: calendarPref});
- });
- }
- var initialLoad = true;
- function getFullCalendarEvents(start, end, callback) {
-
- if (initialLoad) {
- initialLoad = false;
- callback(calendarEvents);
- } else {
- var url, start_date, end_date;
- start_date = makeTimeStamp(start);
- end_date = makeTimeStamp(end);
- url = baseUrl+'Schedule/event-feed';
- var d = new Date();
- $.post(url, {format: "json", start: start_date, end: end_date, cachep: d.getTime()}, function(json){
- callback(json.events);
- });
- }
- }
- function checkSCUploadStatus(){
- var url = baseUrl+'Library/get-upload-to-soundcloud-status/format/json',
- id;
- $("span[class*=progress]").each(function(){
- id = $(this).parents("div.fc-event").data("event").id;
-
- $.post(url, {format: "json", id: id, type:"show"}, function(json){
- if (json.sc_id > 0){
- $(".fc-show-instance-"+id)
- .find(".progress")
- .removeClass("progress")
- .addClass("soundcloud");
- }
- else if (json.sc_id == "-3"){
- $(".fc-show-instance-"+id)
- .find(".progress")
- .removeClass("progress")
- .addClass("sc-error");
- }
-
- setTimeout(checkSCUploadStatus, 5000);
- });
- });
- }
- /** This function adds and removes the current
- * show icon
- */
- function getCurrentShow() {
-
- var url = baseUrl+'Schedule/get-current-show/format/json';
-
- function addNowPlaying(json) {
-
- var $el,
- span = '<span class="small-icon now-playing"></span>';
-
- $(".now-playing").remove();
-
- if (json.current_show === true) {
-
- $el = $(".fc-show-instance-"+json.si_id);
-
- if (view_name === 'agendaDay' || view_name === 'agendaWeek') {
-
- $el.find(".fc-event-time").before(span);
- }
- else if (view_name === 'month') {
-
- $el.find(".fc-event-title").after(span);
- }
- }
- setTimeout(getCurrentShow, 5000);
- }
-
- $.post(url, {format: "json"}, addNowPlaying);
- }
- function addQtipsToIcons(ele, id){
-
- if ($(ele).hasClass("progress")){
- $(ele).qtip({
- content: {
- text: $.i18n._("Uploading in progress...")
- },
- position:{
- adjust: {
- resize: true,
- method: "flip flip"
- },
- at: "right center",
- my: "left top",
- viewport: $(window)
- },
- style: {
- classes: "ui-tooltip-dark file-md-long"
- },
- show: {
- ready: true // Needed to make it show on first mouseover event
- }
- });
- }else if($(ele).hasClass("soundcloud")){
- $(ele).qtip({
- content: {
- text: $.i18n._("Retreiving data from the server..."),
- ajax: {
- url: baseUrl+"Library/get-upload-to-soundcloud-status",
- type: "post",
- data: ({format: "json", id : id, type: "show"}),
- success: function(json, status){
- this.set('content.text', $.i18n._("The soundcloud id for this file is: ")+json.sc_id);
- }
- }
- },
- position:{
- adjust: {
- resize: true,
- method: "flip flip"
- },
- at: "right center",
- my: "left top",
- viewport: $(window)
- },
- style: {
- classes: "ui-tooltip-dark file-md-long"
- },
- show: {
- ready: true // Needed to make it show on first mouseover event
- }
- });
- }else if($(ele).hasClass("sc-error")){
- $(ele).qtip({
- content: {
- text: $.i18n._("Retreiving data from the server..."),
- ajax: {
- url: baseUrl+"Library/get-upload-to-soundcloud-status",
- type: "post",
- data: ({format: "json", id : id, type: "show"}),
- success: function(json, status){
- this.set('content.text', $.i18n._("There was error while uploading to soundcloud.")+"<br>"+$.i18n._("Error code: ")+json.error_code+
- "<br>"+$.i18n._("Error msg: ")+json.error_msg+"<br>");
- }
- }
- },
- position:{
- adjust: {
- resize: true,
- method: "flip flip"
- },
- at: "right center",
- my: "left top",
- viewport: $(window)
- },
- style: {
- classes: "ui-tooltip-dark file-md-long"
- },
- show: {
- ready: true // Needed to make it show on first mouseover event
- }
- });
- }else if ($(ele).hasClass("show-empty")){
- $(ele).qtip({
- content: {
- text: $.i18n._("This show has no scheduled content.")
- },
- position:{
- adjust: {
- resize: true,
- method: "flip flip"
- },
- at: "right center",
- my: "left top",
- viewport: $(window)
- },
- style: {
- classes: "ui-tooltip-dark file-md-long"
- },
- show: {
- ready: true // Needed to make it show on first mouseover event
- }
- });
- } else if ($(ele).hasClass("show-partial-filled")){
- $(ele).qtip({
- content: {
- text: $.i18n._("This show is not completely filled with content.")
- },
- position:{
- adjust: {
- resize: true,
- method: "flip flip"
- },
- at: "right center",
- my: "left top",
- viewport: $(window)
- },
- style: {
- classes: "ui-tooltip-dark file-md-long"
- },
- show: {
- ready: true // Needed to make it show on first mouseover event
- }
- });
- }
- }
- //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(){
- preloadEventFeed();
- checkSCUploadStatus();
- getCurrentShow();
- });
- var view_name;
|