$(document).ready(function() { var tableDiv = $('#show_builder_table'), oTable, oBaseDatePickerSettings, oBaseTimePickerSettings, fnAddSelectedItems, fnRemoveSelectedItems; oBaseDatePickerSettings = { dateFormat: 'yy-mm-dd', onSelect: function(sDate, oDatePicker) { var oDate, dInput; dInput = $(this); oDate = dInput.datepicker( "setDate", sDate ); } }; oBaseTimePickerSettings = { showPeriodLabels: false, showCloseButton: true, showLeadingZero: false, defaultTime: '0:00' }; /* * Get the schedule range start in unix timestamp form (in seconds). * defaults to NOW if nothing is selected. * * @param String sDatePickerId * * @param String sTimePickerId * * @return Number iTime */ function fnGetUIPickerUnixTimestamp(sDatePickerId, sTimePickerId) { var oDate, oTimePicker = $( sTimePickerId ), iTime, iHour, iMin, iServerOffset, iClientOffset; oDate = $( sDatePickerId ).datepicker( "getDate" ); //nothing has been selected from this datepicker. if (oDate === null) { oDate = new Date(); } else { iHour = oTimePicker.timepicker('getHour'); iMin = oTimePicker.timepicker('getMinute'); oDate.setHours(iHour, iMin); } iTime = oDate.getTime(); //value is in millisec. iTime = Math.round(iTime / 1000); iServerOffset = serverTimezoneOffset; iClientOffset = oDate.getTimezoneOffset() * 60;//function returns minutes //adjust for the fact the the Date object is iTime = iTime + iServerOffset + iClientOffset; return iTime; } /* * Returns an object containing a unix timestamp in seconds for the start/end range * * @return Object {"start", "end", "range"} */ function fnGetScheduleRange() { var iStart, iEnd, iRange, MIN_RANGE = 60*60*24; iStart = fnGetUIPickerUnixTimestamp("#show_builder_datepicker_start", "#show_builder_timepicker_start"); iEnd = fnGetUIPickerUnixTimestamp("#show_builder_datepicker_end", "#show_builder_timepicker_end"); iRange = iEnd - iStart; //return min range if (iRange < MIN_RANGE){ iEnd = iStart + MIN_RANGE; iRange = MIN_RANGE; } return { start: iStart, end: iEnd, range: iRange }; } var fnServerData = function ( sSource, aoData, fnCallback ) { aoData.push( { name: "format", value: "json"} ); if (fnServerData.hasOwnProperty("start")) { aoData.push( { name: "start", value: fnServerData.start} ); } if (fnServerData.hasOwnProperty("end")) { aoData.push( { name: "end", value: fnServerData.end} ); } $.ajax( { "dataType": "json", "type": "GET", "url": sSource, "data": aoData, "success": fnCallback } ); }; var fnShowBuilderRowCallback = function ( nRow, aData, iDisplayIndex, iDisplayIndexFull ){ var i, sSeparatorHTML, fnPrepareSeparatorRow, node; //save some info for reordering purposes. $(nRow).data({"aData": aData}); fnPrepareSeparatorRow = function(sRowContent, sClass) { node = nRow.children[1]; node.innerHTML = sRowContent; node.setAttribute('colspan',100); for (i = 2; i < nRow.children.length; i = i+1) { node = nRow.children[i]; node.innerHTML = ""; node.setAttribute("style", "display : none"); } nRow.className = sClass; }; if (aData.header === true) { node = nRow.children[0]; node.innerHTML = ''; sSeparatorHTML = ''+aData.title+''+aData.starts+''+aData.ends+''; fnPrepareSeparatorRow(sSeparatorHTML, "sb-header"); } else if (aData.footer === true) { node = nRow.children[0]; node.innerHTML = ''; sSeparatorHTML = 'Show Footer'; fnPrepareSeparatorRow(sSeparatorHTML, "sb-footer"); } else if (aData.empty === true) { node = nRow.children[0]; node.innerHTML = ''; sSeparatorHTML = 'Show Empty'; fnPrepareSeparatorRow(sSeparatorHTML, "sb-empty odd"); } else { $(nRow).attr("id", "sched_"+aData.id); node = nRow.children[0]; if (aData.checkbox === true) { node.innerHTML = ''; } else { node.innerHTML = ''; $(nRow).addClass("sb-not-allowed"); } } return nRow; }; fnRemoveSelectedItems = function() { var oTT = TableTools.fnGetInstance('show_builder_table'), aData = oTT.fnGetSelectedData(), item, temp, ids = []; for (item in aData) { temp = aData[item]; if (temp !== null && temp.hasOwnProperty('id')) { ids.push(temp.id); } } $.post( "/showbuilder/schedule-remove", {"ids": ids, "format": "json"}, function(data) { oTable.fnDraw(); }); }; oTable = tableDiv.dataTable( { "aoColumns": [ /* checkbox */ {"mDataProp": "checkbox", "sTitle": "", "sWidth": "15px"}, // /* scheduled id */{"mDataProp": "id", "sTitle": "id"}, // /* instance */{"mDataProp": "instance", "sTitle": "si_id"}, /* starts */{"mDataProp": "starts", "sTitle": "Airtime"}, /* ends */{"mDataProp": "ends", "sTitle": "Off Air"}, /* runtime */{"mDataProp": "runtime", "sTitle": "Runtime"}, /* title */{"mDataProp": "title", "sTitle": "Title"}, /* creator */{"mDataProp": "creator", "sTitle": "Creator"}, /* album */{"mDataProp": "album", "sTitle": "Album"} ], "asStripClasses": [ 'odd' ], "bJQueryUI": true, "bSort": false, "bFilter": false, "bProcessing": true, "bServerSide": true, "bInfo": false, "bAutoWidth": false, "fnServerData": fnServerData, "fnRowCallback": fnShowBuilderRowCallback, "fnHeaderCallback": function(nHead) { $(nHead).find("input[type=checkbox]").attr("checked", false); }, "oColVis": { "aiExclude": [ 0, 1 ] }, "oColReorder": { "iFixedColumns": 2 }, "oTableTools": { "sRowSelect": "multi", "aButtons": [], "fnPreRowSelect": function ( e ) { var node = e.currentTarget; //don't select separating rows, or shows without privileges. if ($(node).hasClass("sb-header") || $(node).hasClass("sb-footer") || $(node).hasClass("sb-not-allowed")){ return false; } return true; }, "fnRowSelected": function ( node ) { //seems to happen if everything is selected if ( node === null) { oTable.find("input[type=checkbox]").attr("checked", true); } else { $(node).find("input[type=checkbox]").attr("checked", true); } }, "fnRowDeselected": function ( node ) { //seems to happen if everything is deselected if ( node === null) { oTable.find("input[type=checkbox]").attr("checked", false); } else { $(node).find("input[type=checkbox]").attr("checked", false); } } }, // R = ColReorderResize, C = ColVis, T = TableTools "sDom": 'Rr<"H"CT<"#show_builder_toolbar">>t<"F">', "sAjaxDataProp": "schedule", "sAjaxSource": "/showbuilder/builder-feed" }); $('[name="sb_cb_all"]').click(function(){ var oTT = TableTools.fnGetInstance('show_builder_table'); if ($(this).is(":checked")) { var allowedNodes; allowedNodes = oTable.find('tr:not(.sb-header):not(.sb-footer):not(.sb-not-allowed)'); allowedNodes.each(function(i, el){ oTT.fnSelect(el); }); } else { oTT.fnSelectNone(); } }); $( "#show_builder_datepicker_start" ).datepicker(oBaseDatePickerSettings); $( "#show_builder_timepicker_start" ).timepicker(oBaseTimePickerSettings); $( "#show_builder_datepicker_end" ).datepicker(oBaseDatePickerSettings); $( "#show_builder_timepicker_end" ).timepicker(oBaseTimePickerSettings); $( "#show_builder_timerange_button" ).click(function(ev){ var oSettings, oRange; oRange = fnGetScheduleRange(); oSettings = oTable.fnSettings(); oSettings.fnServerData.start = oRange.start; oSettings.fnServerData.end = oRange.end; oTable.fnDraw(); }); var sortableConf = (function(){ var origRow, oItemData, oPrevData, fnAdd, fnMove, fnReceive, fnUpdate; fnAdd = function() { var aSchedIds = [], aMediaIds = []; aSchedIds.push({"id": oPrevData.id, "instance": oPrevData.instance}); aMediaIds.push({"id": oItemData.id, "type": oItemData.ftype}); $.post("/showbuilder/schedule-add", {"format": "json", "mediaIds": aMediaIds, "schedIds": aSchedIds}, function(json){ oTable.fnDraw(); }); }; fnReceive = function(event, ui) { origRow = ui.item; }; fnUpdate = function(event, ui) { oPrevData = ui.item.prev().data("aData"); //item was dragged in if (origRow !== undefined) { oItemData = origRow.data("aData"); fnAdd(); } //item was reordered. else { oItemData = ui.item.data("aData"); } origRow = undefined; }; return { placeholder: "placeholder show-builder-placeholder", forceHelperSize: true, forcePlaceholderSize: true, items: 'tr:not(:first):not(.sb-header):not(.sb-footer):not(.sb-not-allowed):not(.sb-empty)', receive: fnReceive, update: fnUpdate }; }()); tableDiv.sortable(sortableConf); $("#show_builder_toolbar") .append('') .find(".ui-icon-trash") .click(fnRemoveSelectedItems); });