diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php
index 26a6843c7..e64c74136 100644
--- a/airtime_mvc/application/Bootstrap.php
+++ b/airtime_mvc/application/Bootstrap.php
@@ -31,6 +31,7 @@ require_once "Auth.php";
require_once "interface/OAuth2.php";
require_once "TaskManager.php";
require_once "UsabilityHints.php";
+require_once "MediaType.php";
require_once __DIR__.'/models/formatters/LengthFormatter.php';
require_once __DIR__.'/services/CeleryService.php';
require_once __DIR__.'/services/SoundcloudService.php';
diff --git a/airtime_mvc/application/airtime-boot.php b/airtime_mvc/application/airtime-boot.php
index 08a5b9869..5ed3cb4bc 100644
--- a/airtime_mvc/application/airtime-boot.php
+++ b/airtime_mvc/application/airtime-boot.php
@@ -36,6 +36,8 @@ set_include_path(implode(PATH_SEPARATOR, array(
)));
set_include_path(APPLICATION_PATH . 'common' . PATH_SEPARATOR . get_include_path());
+set_include_path(APPLICATION_PATH . 'common/enum' . PATH_SEPARATOR . get_include_path());
+set_include_path(APPLICATION_PATH . 'common/interface' . PATH_SEPARATOR . get_include_path());
//Propel classes.
set_include_path(APPLICATION_PATH . 'models' . PATH_SEPARATOR . get_include_path());
diff --git a/airtime_mvc/application/common/enum/Enum.php b/airtime_mvc/application/common/enum/Enum.php
new file mode 100644
index 000000000..b0d34fbc3
--- /dev/null
+++ b/airtime_mvc/application/common/enum/Enum.php
@@ -0,0 +1,47 @@
+getConstants();
+ }
+ return self::$constCacheArray[$calledClass];
+ }
+
+ public static function isValidName($name, $strict = false) {
+ $constants = self::getConstants();
+
+ if ($strict) {
+ return array_key_exists($name, $constants);
+ }
+
+ $keys = array_map('strtolower', array_keys($constants));
+ return in_array(strtolower($name), $keys);
+ }
+
+ public static function isValidValue($value) {
+ $values = array_values(self::getConstants());
+ return in_array($value, $values, $strict = true);
+ }
+
+ public static function getDefault() {
+ return static::__default;
+ }
+
+}
\ No newline at end of file
diff --git a/airtime_mvc/application/common/enum/MediaType.php b/airtime_mvc/application/common/enum/MediaType.php
new file mode 100644
index 000000000..69843c0d7
--- /dev/null
+++ b/airtime_mvc/application/common/enum/MediaType.php
@@ -0,0 +1,14 @@
+
-
+
-
navigation()->menu(); ?>
@@ -90,7 +89,6 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
totalSpace-$disk->totalFreeSpace;
$total = $disk->totalSpace;
diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php
index 3cffe1fcb..21973887a 100644
--- a/airtime_mvc/application/models/StoredFile.php
+++ b/airtime_mvc/application/models/StoredFile.php
@@ -805,21 +805,17 @@ SQL;
$unionTable = "({$plTable} UNION {$blTable} UNION {$fileTable} UNION {$streamTable}) AS RESULTS";
//choose which table we need to select data from.
- // TODO : use constants instead of numbers -- RG
switch ($type) {
- case 0:
- $fromTable = $unionTable;
- break;
- case 1:
+ case MediaType::FILE:
$fromTable = $fileTable." AS File"; //need an alias for the table if it's standalone.
break;
- case 2:
+ case MediaType::PLAYLIST:
$fromTable = $plTable." AS Playlist"; //need an alias for the table if it's standalone.
break;
- case 3:
+ case MediaType::BLOCK:
$fromTable = $blTable." AS Block"; //need an alias for the table if it's standalone.
break;
- case 4:
+ case MediaType::WEBSTREAM:
$fromTable = $streamTable." AS StreamTable"; //need an alias for the table if it's standalone.
break;
default:
diff --git a/airtime_mvc/application/views/scripts/partialviews/dashboard-sub-nav.php b/airtime_mvc/application/views/scripts/partialviews/dashboard-sub-nav.php
new file mode 100644
index 000000000..fe9428f1e
--- /dev/null
+++ b/airtime_mvc/application/views/scripts/partialviews/dashboard-sub-nav.php
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml b/airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml
index fb346cc94..9ac17f639 100644
--- a/airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml
+++ b/airtime_mvc/application/views/scripts/showbuilder/builderDialog.phtml
@@ -1,30 +1,7 @@
csrf ?>
diff --git a/airtime_mvc/application/views/scripts/showbuilder/index.phtml b/airtime_mvc/application/views/scripts/showbuilder/index.phtml
index b3f90508b..d36794257 100644
--- a/airtime_mvc/application/views/scripts/showbuilder/index.phtml
+++ b/airtime_mvc/application/views/scripts/showbuilder/index.phtml
@@ -15,6 +15,7 @@
diff --git a/airtime_mvc/public/ajax/library_placeholders.json b/airtime_mvc/public/ajax/library_placeholders.json
deleted file mode 100644
index d1fa5f8af..000000000
--- a/airtime_mvc/public/ajax/library_placeholders.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "1": {
- "media": "tracks",
- "icon": "icon-music",
- "subtext": "Click 'Upload' to add some now.",
- "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/add-media/"
- },
- "2": {
- "media": "playlists",
- "icon": "icon-list",
- "subtext": "Click 'New' to create one now.",
- "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
- },
- "3": {
- "media": "smart blocks",
- "icon": "icon-time",
- "subtext": "Click 'New' to create one now.",
- "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
-
- },
- "4": {
- "media": "webstreams",
- "icon": "icon-random",
- "subtext": "Click 'New' to create one now.",
- "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
- },
- "unauthorized": "You don't have permission to view the library."
-}
\ No newline at end of file
diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css
index 4cb70ee68..d6a668d48 100644
--- a/airtime_mvc/public/css/dashboard.css
+++ b/airtime_mvc/public/css/dashboard.css
@@ -716,3 +716,15 @@ th.library_checkbox {
background-color: #FF5D1A !important;
height: 38px !important;
}
+
+/* ~~~~~~~~~~~~~~~~
+ Podcasts
+ ~~~~~~~~~~~~~~~~ */
+
+#podcast_table {
+ display: none;
+}
+
+/* ~~~~~~~~~~~~~~~~
+ END Podcasts
+ ~~~~~~~~~~~~~~~~ */
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css
index 9f4294be8..0780d3b44 100644
--- a/airtime_mvc/public/css/styles.css
+++ b/airtime_mvc/public/css/styles.css
@@ -3598,7 +3598,7 @@ button.btn-icon-text > i.icon-white {
.media_type_selector a {
text-decoration: none;
color: #cecece;
- padding: 10px 10px 10px 10px;
+ padding: 10px 0 10px 10px;
display: block;
}
diff --git a/airtime_mvc/public/js/airtime/library/events/library_showbuilder.js b/airtime_mvc/public/js/airtime/library/events/library_showbuilder.js
index c6d8f8bbd..4be63d7c9 100644
--- a/airtime_mvc/public/js/airtime/library/events/library_showbuilder.js
+++ b/airtime_mvc/public/js/airtime/library/events/library_showbuilder.js
@@ -80,22 +80,20 @@ var AIRTIME = (function(AIRTIME) {
var libEmpty = $('#library_empty');
if (emptyRow.length > 0) {
emptyRow.hide();
- var mediaType = parseInt($('.media_type_selector.selected').attr('data-selection-id')),
+ var mediaType = parseInt($('.media_type_selector.selected').data('selection-id')),
img = $('#library_empty_image');
// Remove all classes for when we change between empty media types
img.removeClass(function() {
return $( this ).attr( "class" );
});
- // TODO: once the new manual pages are added, change links!
- $.getJSON( "ajax/library_placeholders.json", function( data ) {
- var opts = data[mediaType];
- img.addClass("icon-white " + opts.icon);
- $('#library_empty_text').html(
- $.i18n._("You haven't added any " + opts.media + ".")
- + "
" + $.i18n._(opts.subtext)
- + "
" + $.i18n._("Learn about " + opts.media) + " "
- );
- });
+
+ var opts = AIRTIME.library.placeholder(mediaType);
+ img.addClass("icon-white " + opts.icon);
+ $('#library_empty_text').html(
+ $.i18n._("You haven't added any " + opts.media + ".")
+ + "
" + $.i18n._(opts.subtext)
+ + "
" + $.i18n._("Learn about " + opts.media) + " "
+ );
libEmpty.show();
} else {
@@ -333,13 +331,13 @@ var AIRTIME = (function(AIRTIME) {
return;
}
- var selection = $(".media_type_selector.selected").attr("data-selection-id");
+ var selection = $(".media_type_selector.selected").data("selection-id");
- if (selection == 2) {
+ if (selection == AIRTIME.library.MediaTypeEnum.PLAYLIST) {
AIRTIME.playlist.fnNew();
- } else if (selection == 3) {
+ } else if (selection == AIRTIME.library.MediaTypeEnum.BLOCK) {
AIRTIME.playlist.fnNewBlock();
- } else if (selection == 4) {
+ } else if (selection == AIRTIME.library.MediaTypeEnum.WEBSTREAM) {
AIRTIME.playlist.fnWsNew();
}
});
diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js
index 680c7816c..1d9cb57f7 100644
--- a/airtime_mvc/public/js/airtime/library/library.js
+++ b/airtime_mvc/public/js/airtime/library/library.js
@@ -58,6 +58,67 @@ var AIRTIME = (function(AIRTIME) {
}
mod = AIRTIME.library;
+ /* ############################################
+ CONFIGURATION
+ ############################################ */
+
+ mod.MediaTypeEnum = Object.freeze({
+ DEFAULT: 1,
+ FILE: 1,
+ PLAYLIST: 2,
+ BLOCK: 3,
+ WEBSTREAM: 4,
+ PODCAST: 5
+ });
+
+ // TODO: once the new manual pages are added, change links!
+ mod.placeholder = function(mediaType) {
+ switch (mediaType) {
+ // TODO: remove duplication in a nice way?
+ case MediaTypeEnum.FILE:
+ return {
+ "media": "tracks",
+ "icon": "icon-music",
+ "subtext": "Click 'Upload' to add some now.",
+ "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/add-media/"
+ };
+ case MediaTypeEnum.PLAYLIST:
+ return {
+ "media": "playlists",
+ "icon": "icon-list",
+ "subtext": "Click 'New' to create one now.",
+ "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
+ };
+ case MediaTypeEnum.BLOCK:
+ return {
+ "media": "smart blocks",
+ "icon": "icon-time",
+ "subtext": "Click 'New' to create one now.",
+ "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
+ };
+ case MediaTypeEnum.WEBSTREAM:
+ return {
+ "media": "webstreams",
+ "icon": "icon-random",
+ "subtext": "Click 'New' to create one now.",
+ "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
+ };
+ case MediaTypeEnum.PODCAST:
+ return {
+ "media": "podcasts",
+ "icon": "icon-headphones",
+ "subtext": "Click 'Add' to create one now.",
+ "href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
+ };
+ default:
+ break;
+ }
+ };
+
+ /* ############################################
+ END CONFIGURATION
+ ############################################ */
+
mod.getChosenItemsLength = function(){
var cItem,
selected,
@@ -198,10 +259,10 @@ var AIRTIME = (function(AIRTIME) {
};
mod.checkNewButton = function() {
- var selected = $(".media_type_selector.selected").attr("data-selection-id"),
+ var selected = $(".media_type_selector.selected").data("selection-id"),
check = false;
- if (selected != 1) {
+ if (selected != AIRTIME.library.MediaTypeEnum.FILE) {
check = true;
}
@@ -454,7 +515,262 @@ var AIRTIME = (function(AIRTIME) {
var colReorderMap = new Array();
- $libTable = $libContent.find("table");
+ $libTable = $("#library_display");
+
+ /* ############################################
+ DATATABLES
+ ############################################ */
+
+ mod.libraryDataTable = $libTable.dataTable({
+
+ // put hidden columns at the top to insure they can never be visible
+ // on the table through column reordering.
+
+ //IMPORTANT: WHEN ADDING A NEW COLUMN PLEASE CONSULT WITH THE WIKI
+ // https://wiki.sourcefabric.org/display/CC/Adding+a+new+library+datatable+column
+ "aoColumns": [
+ /* ftype */ {"sTitle": "", "mDataProp": "ftype", "bSearchable": false, "bVisible": false},
+ /* Checkbox */ {"sTitle": "", "mDataProp": "checkbox", "bSortable": false, "bSearchable": false, "sWidth": "16px", "sClass": "library_checkbox"},
+ /* Type */ {"sTitle": "", "mDataProp": "image", "bSortable": false, "bSearchable": false, "sWidth": "16px", "sClass": "library_type", "iDataSort": 0},
+ /* Is Scheduled */ {"sTitle": $.i18n._("Scheduled"), "mDataProp": "is_scheduled", "bVisible": false, "bSearchable": false, "sWidth": "90px", "sClass": "library_is_scheduled"},
+ ///* Is Playlist */ { "sTitle" : $.i18n._("Playlist / Block") , "mDataProp" : "is_playlist" , "bSearchable" : false , "sWidth" : "110px" , "sClass" : "library_is_playlist"} ,
+ /* Title */ {"sTitle": $.i18n._("Title"), "mDataProp": "track_title", "sClass": "library_title", "sWidth": "170px"},
+ /* Creator */ {"sTitle": $.i18n._("Creator"), "mDataProp": "artist_name", "sClass": "library_creator", "sWidth": "160px"},
+ /* Album */ {"sTitle": $.i18n._("Album"), "mDataProp": "album_title", "sClass": "library_album", "sWidth": "150px"},
+ /* Bit Rate */ {"sTitle": $.i18n._("Bit Rate"), "mDataProp": "bit_rate", "bVisible": false, "sClass": "library_bitrate", "sWidth": "80px"},
+ /* BPM */ {"sTitle": $.i18n._("BPM"), "mDataProp": "bpm", "bVisible": false, "sClass": "library_bpm", "sWidth": "50px"},
+ /* Composer */ {"sTitle": $.i18n._("Composer"), "mDataProp": "composer", "bVisible": false, "sClass": "library_composer", "sWidth": "150px"},
+ /* Conductor */ {"sTitle": $.i18n._("Conductor"), "mDataProp": "conductor", "bVisible": false, "sClass": "library_conductor", "sWidth": "125px"},
+ /* Copyright */ {"sTitle": $.i18n._("Copyright"), "mDataProp": "copyright", "bVisible": false, "sClass": "library_copyright", "sWidth": "125px"},
+ /* Cue In */ {"sTitle": $.i18n._("Cue In"), "mDataProp": "cuein", "bVisible": false, "sClass": "library_length", "sWidth": "80px"},
+ /* Cue Out */ {"sTitle": $.i18n._("Cue Out"), "mDataProp": "cueout", "bVisible": false, "sClass": "library_length", "sWidth": "80px"},
+ /* Encoded */ {"sTitle": $.i18n._("Encoded By"), "mDataProp": "encoded_by", "bVisible": false, "sClass": "library_encoded", "sWidth": "150px"},
+ /* Genre */ {"sTitle": $.i18n._("Genre"), "mDataProp": "genre", "bVisible": false, "sClass": "library_genre", "sWidth": "100px"},
+ /* ISRC Number */ {"sTitle": $.i18n._("ISRC"), "mDataProp": "isrc_number", "bVisible": false, "sClass": "library_isrc", "sWidth": "150px"},
+ /* Label */ {"sTitle": $.i18n._("Label"), "mDataProp": "label", "bVisible": false, "sClass": "library_label", "sWidth": "125px"},
+ /* Language */ {"sTitle": $.i18n._("Language"), "mDataProp": "language", "bVisible": false, "sClass": "library_language", "sWidth": "125px"},
+ /* Last Modified */ {"sTitle": $.i18n._("Last Modified"), "mDataProp": "mtime", "bVisible": false, "sClass": "library_modified_time", "sWidth": "155px"},
+ /* Last Played */ {"sTitle": $.i18n._("Last Played"), "mDataProp": "lptime", "bVisible": false, "sClass": "library_modified_time", "sWidth": "155px"},
+ /* Length */ {"sTitle": $.i18n._("Length"), "mDataProp": "length", "sClass": "library_length", "sWidth": "80px"},
+ /* Mime */ {"sTitle": $.i18n._("Mime"), "mDataProp": "mime", "bVisible": false, "sClass": "library_mime", "sWidth": "80px"},
+ /* Mood */ {"sTitle": $.i18n._("Mood"), "mDataProp": "mood", "bVisible": false, "sClass": "library_mood", "sWidth": "70px"},
+ /* Owner */ {"sTitle": $.i18n._("Owner"), "mDataProp": "owner_id", "bVisible": false, "sClass": "library_language", "sWidth": "125px"},
+ /* Replay Gain */ {"sTitle": $.i18n._("Replay Gain"), "mDataProp": "replay_gain", "bVisible": false, "sClass": "library_replay_gain", "sWidth": "125px"},
+ /* Sample Rate */ {"sTitle": $.i18n._("Sample Rate"), "mDataProp": "sample_rate", "bVisible": false, "sClass": "library_sr", "sWidth": "125px"},
+ /* Track Number */ {"sTitle": $.i18n._("Track Number"), "mDataProp": "track_number", "bVisible": false, "sClass": "library_track", "sWidth": "125px"},
+ /* Upload Time */ {"sTitle": $.i18n._("Uploaded"), "mDataProp": "utime", "bVisible": false, "sClass": "library_upload_time", "sWidth": "155px"},
+ /* Website */ {"sTitle": $.i18n._("Website"), "mDataProp": "info_url", "bVisible": false, "sClass": "library_url", "sWidth": "150px"},
+ /* Year */ {"sTitle": $.i18n._("Year"), "mDataProp": "year", "bVisible": false, "sClass": "library_year", "sWidth": "60px"},
+ /* Context Menu */ {"sTitle": "", "mDataProp": "options", "bSortable": false, "bSearchable": false, "sWidth": "20px", "sClass": "library_actions"}
+ ],
+
+ "bProcessing": true,
+ "bServerSide": true,
+
+ "aLengthMenu": [25, 50, 100],
+
+ "bStateSave": true,
+ "fnStateSaveParams": function (oSettings, oData) {
+ // remove oData components we don't want to save.
+ delete oData.oSearch;
+ delete oData.aoSearchCols;
+ },
+ "fnStateSave": function (oSettings, oData) {
+ localStorage.setItem('datatables-library', JSON.stringify(oData));
+
+ // Sadly, this is necessary because we need to unscramble the colReorder map on the backend
+ $.ajax({
+ url: baseUrl + "usersettings/set-library-datatable",
+ type: "POST",
+ data: {settings: oData, format: "json"},
+ dataType: "json"
+ });
+
+ colReorderMap = oData.ColReorder;
+ },
+ "fnStateLoad": function fnLibStateLoad(oSettings) {
+ var settings = JSON.parse(localStorage.getItem('datatables-library'));
+ // Hacky; always set the visibility of the last column (actions buttons) to true
+ if (settings && settings.abVisCols) settings.abVisCols[settings.abVisCols.length - 1] = true;
+
+ try {
+ return settings;
+ } catch (e) {
+ return null;
+ }
+ },
+ "fnStateLoadParams": function (oSettings, oData) {
+ var i,
+ length,
+ a = oData.abVisCols;
+
+ if (a) {
+ // putting serialized data back into the correct js type to make
+ // sure everything works properly.
+ for (i = 0, length = a.length; i < length; i++) {
+ if (typeof(a[i]) === "string") {
+ a[i] = (a[i] === "true");
+ }
+ }
+ }
+
+ a = oData.ColReorder;
+ if (a) {
+ for (i = 0, length = a.length; i < length; i++) {
+ if (typeof(a[i]) === "string") {
+ a[i] = parseInt(a[i], 10);
+ }
+ }
+ }
+
+ oData.iEnd = parseInt(oData.iEnd, 10);
+ oData.iLength = parseInt(oData.iLength, 10);
+ oData.iStart = parseInt(oData.iStart, 10);
+ oData.iCreate = parseInt(oData.iCreate, 10);
+ },
+
+ "sAjaxSource": baseUrl + "Library/contents-feed",
+ "sAjaxDataProp": "files",
+
+ "fnServerData": function (sSource, aoData, fnCallback) {
+ /*
+ * The real validation check is done in
+ * dataTables.columnFilter.js We also need to check it here
+ * because datatable is redrawn everytime an action is performed
+ * in the Library page. In order for datatable to redraw the
+ * advanced search fields MUST all be valid.
+ */
+ var advSearchFields = $("div#advanced_search").children(':visible');
+ var advSearchValid = validateAdvancedSearch(advSearchFields);
+ var type;
+ aoData.push({name: "format", value: "json"});
+ aoData.push({name: "advSearch", value: advSearchValid});
+
+ // push whether to search files/playlists or all.
+ type = $(".media_type_selector.selected").data("selection-id");
+ type = (type === undefined) ? AIRTIME.library.MediaTypeEnum.DEFAULT : type;
+ aoData.push({name: "type", value: type});
+
+ //getUsabilityHint();
+
+ $.ajax({
+ "dataType": 'json',
+ "type": "POST",
+ "url": sSource,
+ "data": aoData,
+ "success": fnCallback,
+ "error": handleAjaxError
+ }).done(function (data) {
+ if (data.iTotalRecords > data.iTotalDisplayRecords) {
+ $('#filter_message').text(
+ $.i18n._("Filtering out ") + (data.iTotalRecords - data.iTotalDisplayRecords)
+ + $.i18n._(" of ") + data.iTotalRecords
+ + $.i18n._(" records")
+ );
+ $('#library_empty').hide();
+ $('#library_display').find('tr:has(td.dataTables_empty)').show();
+ } else {
+ $('#filter_message').text("");
+ }
+ $('#library_content').find('.dataTables_filter input[type="text"]')
+ .css('padding-right', $('#advanced-options').find('button').outerWidth());
+ });
+ },
+ "fnRowCallback": AIRTIME.library.fnRowCallback,
+ "fnCreatedRow": function (nRow, aData, iDataIndex) {
+ // add checkbox
+ $(nRow).find('td.library_checkbox').html("
");
+
+ $(nRow).find('td.library_actions')
+ .text("...")
+ .on('click', function (e) {
+ $(this).contextMenu({x: $(e.target).offset().left, y: $(e.target).offset().top})
+ }).html("
...
");
+
+ // add audio preview image/button
+ if (aData.ftype === "audioclip") {
+ $(nRow).find('td.library_type').html('
');
+ } else if (aData.ftype === "playlist") {
+ $(nRow).find('td.library_type').html('
');
+ } else if (aData.ftype === "block") {
+ $(nRow).find('td.library_type').html('
');
+ } else if (aData.ftype === "stream") {
+ $(nRow).find('td.library_type').html('
');
+ }
+
+ if (aData.is_scheduled) {
+ $(nRow).find("td.library_is_scheduled").html('
');
+ } else if (!aData.is_scheduled) {
+ $(nRow).find("td.library_is_scheduled").html('');
+ }
+ if (aData.is_playlist) {
+ $(nRow).find("td.library_is_playlist").html('
');
+ } else if (!aData.is_playlist) {
+ $(nRow).find("td.library_is_playlist").html('');
+ }
+
+ // add the play function to the library_type td
+ $(nRow).find('td.library_type').click(function () {
+ if (aData.ftype === 'playlist' && aData.length !== '0.0') {
+ open_playlist_preview(aData.audioFile, 0);
+ } else if (aData.ftype === 'audioclip') {
+ if (isAudioSupported(aData.mime)) {
+ open_audio_preview(aData.ftype, aData.id);
+ }
+ } else if (aData.ftype == 'stream') {
+ if (isAudioSupported(aData.mime)) {
+ open_audio_preview(aData.ftype, aData.id);
+ }
+ } else if (aData.ftype == 'block' && aData.bl_type == 'static') {
+ open_block_preview(aData.audioFile, 0);
+ }
+ return false;
+ });
+ },
+ // remove any selected nodes before the draw.
+ "fnPreDrawCallback": function (oSettings) {
+
+ // make sure any dragging helpers are removed or else they'll be
+ // stranded on the screen.
+ $("#draggingContainer").remove();
+ },
+ "fnDrawCallback": AIRTIME.library.fnDrawCallback,
+
+ "aaSorting": [[5, 'asc']],
+ "sPaginationType": "full_numbers",
+ "bJQueryUI": true,
+ "bAutoWidth": false,
+ "oLanguage": getLibraryDatatableStrings(),
+
+ // z = ColResize, R = ColReorder, C = ColVis
+ "sDom": 'Rf<"dt-process-rel"r><"H"<"library_toolbar"C>><"dataTables_scrolling"t<"#library_empty"<"#library_empty_image"><"#library_empty_text">>><"F"lip>>',
+
+ "oColVis": {
+ "sAlign": "right",
+ "aiExclude": [0, 1, 2, 31],
+ "sSize": "css",
+ "fnStateChange": setFilterElement,
+ "buttonText": $.i18n._("Columns"),
+ "iOverlayFade": 0
+ },
+
+ "oColReorder": {
+ "iFixedColumnsRight": 1,
+ "iFixedColumns": 3
+ },
+
+ "bScrollCollapse": false
+
+ });
+
+ /* TODO: implement podcast datatable
+ * mod.podcastDataTable = $("#podcast_table").dataTable({});
+ */
+ mod.podcastDataTable = mod.libraryDataTable;
+
+ /* ############################################
+ END DATATABLES
+ ############################################ */
function getTableHeight() {
return $libContent.height() - 175;
@@ -526,8 +842,8 @@ var AIRTIME = (function(AIRTIME) {
function getLibraryDatatableStrings() {
//Set up the datatables string translation table with different strings depending on
//whether you're viewing files, playlists, smart blocks, etc.
- var type = parseInt($(".media_type_selector.selected").attr("data-selection-id"));
- type = (type === undefined) ? 1 : type;
+ var type = parseInt($(".media_type_selector.selected").data("selection-id"));
+ type = (type === undefined) ? AIRTIME.library.MediaTypeEnum.DEFAULT : type;
//FIXME: The code that calls this function doesn't work as intended because you can't
// change the oLanguage property of a datatable dynamically. :(
@@ -570,255 +886,19 @@ var AIRTIME = (function(AIRTIME) {
if (r.status === 403) {
// Hide the processing div
$("#library_display_wrapper").find(".dt-process-rel").hide();
- $.getJSON( "ajax/library_placeholders.json", function( data ) {
- $('#library_empty_text').text($.i18n._(data.unauthorized));
- }) ;
+ $('#library_empty_text').text($.i18n._("You don't have permission to view the library."));
$('#library_empty').show();
}
}
- oTable = $libTable.dataTable( {
-
- // put hidden columns at the top to insure they can never be visible
- // on the table through column reordering.
-
- //IMPORTANT: WHEN ADDING A NEW COLUMN PLEASE CONSULT WITH THE WIKI
- // https://wiki.sourcefabric.org/display/CC/Adding+a+new+library+datatable+column
- "aoColumns": [
- /* ftype */ { "sTitle" : "" , "mDataProp" : "ftype" , "bSearchable" : false , "bVisible" : false },
- /* Checkbox */ { "sTitle" : "" , "mDataProp" : "checkbox" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_checkbox" },
- /* Type */ { "sTitle" : "" , "mDataProp" : "image" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_type" , "iDataSort" : 0 },
- /* Is Scheduled */ { "sTitle" : $.i18n._("Scheduled") , "mDataProp" : "is_scheduled" , "bVisible" : false , "bSearchable" : false , "sWidth" : "90px" , "sClass" : "library_is_scheduled" },
- ///* Is Playlist */ { "sTitle" : $.i18n._("Playlist / Block") , "mDataProp" : "is_playlist" , "bSearchable" : false , "sWidth" : "110px" , "sClass" : "library_is_playlist"} ,
- /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "track_title" , "sClass" : "library_title" , "sWidth" : "170px" },
- /* Creator */ { "sTitle" : $.i18n._("Creator") , "mDataProp" : "artist_name" , "sClass" : "library_creator" , "sWidth" : "160px" },
- /* Album */ { "sTitle" : $.i18n._("Album") , "mDataProp" : "album_title" , "sClass" : "library_album" , "sWidth" : "150px" },
- /* Bit Rate */ { "sTitle" : $.i18n._("Bit Rate") , "mDataProp" : "bit_rate" , "bVisible" : false , "sClass" : "library_bitrate" , "sWidth" : "80px" },
- /* BPM */ { "sTitle" : $.i18n._("BPM") , "mDataProp" : "bpm" , "bVisible" : false , "sClass" : "library_bpm" , "sWidth" : "50px" },
- /* Composer */ { "sTitle" : $.i18n._("Composer") , "mDataProp" : "composer" , "bVisible" : false , "sClass" : "library_composer" , "sWidth" : "150px" },
- /* Conductor */ { "sTitle" : $.i18n._("Conductor") , "mDataProp" : "conductor" , "bVisible" : false , "sClass" : "library_conductor" , "sWidth" : "125px" },
- /* Copyright */ { "sTitle" : $.i18n._("Copyright") , "mDataProp" : "copyright" , "bVisible" : false , "sClass" : "library_copyright" , "sWidth" : "125px" },
- /* Cue In */ { "sTitle" : $.i18n._("Cue In") , "mDataProp" : "cuein" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" },
- /* Cue Out */ { "sTitle" : $.i18n._("Cue Out") , "mDataProp" : "cueout" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" },
- /* Encoded */ { "sTitle" : $.i18n._("Encoded By") , "mDataProp" : "encoded_by" , "bVisible" : false , "sClass" : "library_encoded" , "sWidth" : "150px" },
- /* Genre */ { "sTitle" : $.i18n._("Genre") , "mDataProp" : "genre" , "bVisible" : false , "sClass" : "library_genre" , "sWidth" : "100px" },
- /* ISRC Number */ { "sTitle" : $.i18n._("ISRC") , "mDataProp" : "isrc_number" , "bVisible" : false , "sClass" : "library_isrc" , "sWidth" : "150px" },
- /* Label */ { "sTitle" : $.i18n._("Label") , "mDataProp" : "label" , "bVisible" : false , "sClass" : "library_label" , "sWidth" : "125px" },
- /* Language */ { "sTitle" : $.i18n._("Language") , "mDataProp" : "language" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" },
- /* Last Modified */ { "sTitle" : $.i18n._("Last Modified") , "mDataProp" : "mtime" , "bVisible" : false , "sClass" : "library_modified_time" , "sWidth" : "155px" },
- /* Last Played */ { "sTitle" : $.i18n._("Last Played") , "mDataProp" : "lptime" , "bVisible" : false , "sClass" : "library_modified_time" , "sWidth" : "155px" },
- /* Length */ { "sTitle" : $.i18n._("Length") , "mDataProp" : "length" , "sClass" : "library_length" , "sWidth" : "80px" },
- /* Mime */ { "sTitle" : $.i18n._("Mime") , "mDataProp" : "mime" , "bVisible" : false , "sClass" : "library_mime" , "sWidth" : "80px" },
- /* Mood */ { "sTitle" : $.i18n._("Mood") , "mDataProp" : "mood" , "bVisible" : false , "sClass" : "library_mood" , "sWidth" : "70px" },
- /* Owner */ { "sTitle" : $.i18n._("Owner") , "mDataProp" : "owner_id" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" },
- /* Replay Gain */ { "sTitle" : $.i18n._("Replay Gain") , "mDataProp" : "replay_gain" , "bVisible" : false , "sClass" : "library_replay_gain" , "sWidth" : "125px" },
- /* Sample Rate */ { "sTitle" : $.i18n._("Sample Rate") , "mDataProp" : "sample_rate" , "bVisible" : false , "sClass" : "library_sr" , "sWidth" : "125px" },
- /* Track Number */ { "sTitle" : $.i18n._("Track Number") , "mDataProp" : "track_number" , "bVisible" : false , "sClass" : "library_track" , "sWidth" : "125px" },
- /* Upload Time */ { "sTitle" : $.i18n._("Uploaded") , "mDataProp" : "utime" , "bVisible" : false , "sClass" : "library_upload_time" , "sWidth" : "155px" },
- /* Website */ { "sTitle" : $.i18n._("Website") , "mDataProp" : "info_url" , "bVisible" : false , "sClass" : "library_url" , "sWidth" : "150px" },
- /* Year */ { "sTitle" : $.i18n._("Year") , "mDataProp" : "year" , "bVisible" : false , "sClass" : "library_year" , "sWidth" : "60px" },
- /* Context Menu */ { "sTitle" : "" , "mDataProp" : "options" , "bSortable" : false , "bSearchable" : false , "sWidth" : "20px", "sClass" : "library_actions" }
- ],
-
- "bProcessing": true,
- "bServerSide": true,
-
- "aLengthMenu": [25, 50, 100],
-
- "bStateSave": true,
- "fnStateSaveParams": function (oSettings, oData) {
- // remove oData components we don't want to save.
- delete oData.oSearch;
- delete oData.aoSearchCols;
- },
- "fnStateSave": function (oSettings, oData) {
- localStorage.setItem('datatables-library', JSON.stringify(oData));
-
- // Sadly, this is necessary because we need to unscramble the colReorder map on the backend
- $.ajax({
- url: baseUrl + "usersettings/set-library-datatable",
- type: "POST",
- data: {settings: oData, format: "json"},
- dataType: "json"
- });
-
- colReorderMap = oData.ColReorder;
- },
- "fnStateLoad": function fnLibStateLoad(oSettings) {
- var settings = JSON.parse(localStorage.getItem('datatables-library'));
- // Hacky; always set the visibility of the last column (actions buttons) to true
- if (settings && settings.abVisCols) settings.abVisCols[settings.abVisCols.length - 1] = true;
-
- try {
- return settings;
- } catch (e) {
- return null;
- }
- },
- "fnStateLoadParams": function (oSettings, oData) {
- var i,
- length,
- a = oData.abVisCols;
-
- if (a) {
- // putting serialized data back into the correct js type to make
- // sure everything works properly.
- for (i = 0, length = a.length; i < length; i++) {
- if (typeof(a[i]) === "string") {
- a[i] = (a[i] === "true");
- }
- }
- }
-
- a = oData.ColReorder;
- if (a) {
- for (i = 0, length = a.length; i < length; i++) {
- if (typeof(a[i]) === "string") {
- a[i] = parseInt(a[i], 10);
- }
- }
- }
-
- oData.iEnd = parseInt(oData.iEnd, 10);
- oData.iLength = parseInt(oData.iLength, 10);
- oData.iStart = parseInt(oData.iStart, 10);
- oData.iCreate = parseInt(oData.iCreate, 10);
- },
-
- "sAjaxSource": baseUrl+"Library/contents-feed",
- "sAjaxDataProp": "files",
-
- "fnServerData": function ( sSource, aoData, fnCallback ) {
- /*
- * The real validation check is done in
- * dataTables.columnFilter.js We also need to check it here
- * because datatable is redrawn everytime an action is performed
- * in the Library page. In order for datatable to redraw the
- * advanced search fields MUST all be valid.
- */
- var advSearchFields = $("div#advanced_search").children(':visible');
- var advSearchValid = validateAdvancedSearch(advSearchFields);
- var type;
- aoData.push( { name: "format", value: "json"} );
- aoData.push( { name: "advSearch", value: advSearchValid} );
-
- // push whether to search files/playlists or all.
- type = $(".media_type_selector.selected").attr("data-selection-id");
- type = (type === undefined) ? 1 : type;
- aoData.push( { name: "type", value: type} );
-
- //getUsabilityHint();
-
- $.ajax({
- "dataType": 'json',
- "type": "POST",
- "url": sSource,
- "data": aoData,
- "success": fnCallback,
- "error": handleAjaxError
- }).done(function(data) {
- if (data.iTotalRecords > data.iTotalDisplayRecords) {
- $('#filter_message').text(
- $.i18n._("Filtering out ") + (data.iTotalRecords - data.iTotalDisplayRecords)
- + $.i18n._(" of ") + data.iTotalRecords
- + $.i18n._(" records")
- );
- $('#library_empty').hide();
- $('#library_display').find('tr:has(td.dataTables_empty)').show();
- } else {
- $('#filter_message').text("");
- }
- $('#library_content').find('.dataTables_filter input[type="text"]')
- .css('padding-right', $('#advanced-options').find('button').outerWidth());
- });
- },
- "fnRowCallback": AIRTIME.library.fnRowCallback,
- "fnCreatedRow": function( nRow, aData, iDataIndex ) {
- // add checkbox
- $(nRow).find('td.library_checkbox').html("
");
-
- $(nRow).find('td.library_actions')
- .text("...")
- .on('click', function(e) {
- $(this).contextMenu({x: $(e.target).offset().left, y: $(e.target).offset().top})
- }).html("
...
");
-
- // add audio preview image/button
- if (aData.ftype === "audioclip") {
- $(nRow).find('td.library_type').html('
');
- } else if (aData.ftype === "playlist") {
- $(nRow).find('td.library_type').html('
');
- } else if (aData.ftype === "block") {
- $(nRow).find('td.library_type').html('
');
- } else if (aData.ftype === "stream") {
- $(nRow).find('td.library_type').html('
');
- }
-
- if (aData.is_scheduled) {
- $(nRow).find("td.library_is_scheduled").html('
');
- } else if (!aData.is_scheduled) {
- $(nRow).find("td.library_is_scheduled").html('');
- }
- if (aData.is_playlist) {
- $(nRow).find("td.library_is_playlist").html('
');
- } else if (!aData.is_playlist) {
- $(nRow).find("td.library_is_playlist").html('');
- }
-
- // add the play function to the library_type td
- $(nRow).find('td.library_type').click(function(){
- if (aData.ftype === 'playlist' && aData.length !== '0.0'){
- open_playlist_preview(aData.audioFile, 0);
- } else if (aData.ftype === 'audioclip') {
- if (isAudioSupported(aData.mime)) {
- open_audio_preview(aData.ftype, aData.id);
- }
- } else if (aData.ftype == 'stream') {
- if (isAudioSupported(aData.mime)) {
- open_audio_preview(aData.ftype, aData.id);
- }
- } else if (aData.ftype == 'block' && aData.bl_type == 'static') {
- open_block_preview(aData.audioFile, 0);
- }
- return false;
- });
- },
- // remove any selected nodes before the draw.
- "fnPreDrawCallback": function( oSettings ) {
-
- // make sure any dragging helpers are removed or else they'll be
- // stranded on the screen.
- $("#draggingContainer").remove();
- },
- "fnDrawCallback": AIRTIME.library.fnDrawCallback,
-
- "aaSorting": [[5, 'asc']],
- "sPaginationType": "full_numbers",
- "bJQueryUI": true,
- "bAutoWidth": false,
- "oLanguage": getLibraryDatatableStrings(),
-
- // z = ColResize, R = ColReorder, C = ColVis
- "sDom": 'Rf<"dt-process-rel"r><"H"<"library_toolbar"C>><"dataTables_scrolling"t<"#library_empty"<"#library_empty_image"><"#library_empty_text">>><"F"lip>>',
-
- "oColVis": {
- "sAlign": "right",
- "aiExclude": [0, 1, 2, 31],
- "sSize": "css",
- "fnStateChange": setFilterElement,
- "buttonText": $.i18n._("Columns"),
- "iOverlayFade": 0
- },
-
- "oColReorder": {
- "iFixedColumnsRight": 1,
- "iFixedColumns": 3
- },
-
- "bScrollCollapse": false
-
- });
+ var selected = $("a[href$='"+location.hash+"']");
+ if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeEnum.PODCAST) {
+ $("#library_display_wrapper").hide();
+ oTable = mod.podcastDataTable.show();
+ } else {
+ oTable = mod.libraryDataTable;
+ }
setColumnFilter(oTable);
oTable.fnSetFilteringDelay(350);
diff --git a/airtime_mvc/public/js/airtime/library/plupload.js b/airtime_mvc/public/js/airtime/library/plupload.js
index b8f1d2a32..21a92de9f 100644
--- a/airtime_mvc/public/js/airtime/library/plupload.js
+++ b/airtime_mvc/public/js/airtime/library/plupload.js
@@ -37,90 +37,13 @@ $(document).ready(function () {
self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide
//In DataTables 1.10 and greater, we can use .fnAjaxReload()
});
- this.on("complete", function() {
+
+ this.on("queuecomplete", function() {
uploadProgress = false;
});
}
};
- /*
- var uploader = new plupload.Uploader({
- runtimes: 'html5, flash, html4',
- browse_button: 'pickfiles',
- container: $("#container"),
- url : baseUrl+'rest/media',
- filters : [
- {title: "Audio Files", extensions: "ogg,mp3,oga,flac,wav,m4a,mp4,opus,aac,oga,mp1,mp2,wma,au"}
- ],
- multipart_params : {
- "csrf_token" : $("#csrf").attr('value')
- },
-
- init: {
- PostInit: function() {
- document.getElementById('filelist').innerHTML = '';
-
- document.getElementById('uploadfiles').onclick = function() {
- uploader.start();
- return false;
- };
- },
-
- FilesAdded: function(up, files) {
- plupload.each(files, function(file) {
- document.getElementById('filelist').innerHTML += '
' + file.name + ' (' + plupload.formatSize(file.size) + ')
';
- });
- },
-
- UploadProgress: function(up, file) {
- document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '
' + file.percent + "% ";
- },
-
- Error: function(up, err) {
- document.getElementById('console').innerHTML += "\nError #" + err.code + ": " + err.message;
- }
- }
- });
-
- uploader.init();
- */
-
-
- /*
- $("#plupload_files").pluploadQueue({
- // General settings
- runtimes : 'gears, html5, html4',
- url : baseUrl+'rest/media',
- //chunk_size : '5mb', //Disabling chunking since we're using the File Upload REST API now
- unique_names : 'true',
- multiple_queues : 'true',
- filters : [
- {title: "Audio Files", extensions: "ogg,mp3,oga,flac,wav,m4a,mp4,opus,aac,oga,mp1,mp2,wma,au"}
- ],
- multipart_params : {
- "csrf_token" : $("#csrf").attr('value'),
- }
- });
-
- uploader = $("#plupload_files").pluploadQueue();
-
- uploader.bind('FileUploaded', function(up, file, json)
- {
- //Refresh the upload table:
- self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide
- //In DataTables 1.10 and greater, we can use .fnAjaxReload()
- });
-
- var uploadProgress = false;
-
- uploader.bind('QueueChanged', function(){
- uploadProgress = (uploader.files.length > 0);
- });
-
- uploader.bind('UploadComplete', function(){
- uploadProgress = false;
- });*/
-
$(window).bind('beforeunload', function () {
if (uploadProgress) {
return sprintf($.i18n._("You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?"),
@@ -173,11 +96,11 @@ $(document).ready(function () {
});
self.setupRecentUploadsTable = function () {
- recentUploadsTable = $("#recent_uploads_table").dataTable({
+ return $("#recent_uploads_table").dataTable({
"bJQueryUI": true,
"bProcessing": false,
"bServerSide": true,
- "sAjaxSource": '/Plupload/recent-uploads/format/json',
+ "sAjaxSource": '/plupload/recent-uploads/format/json',
"sAjaxDataProp": 'files',
"bSearchable": false,
"bInfo": true,
@@ -221,11 +144,13 @@ $(document).ready(function () {
areAnyFileImportsPending = true;
}
}
+
if (areAnyFileImportsPending) {
//alert("pending uploads, starting refresh on timer");
self.startRefreshingRecentUploads();
- } else {
+ } else if (self.isRecentUploadsRefreshTimerActive) {
self.stopRefreshingRecentUploads();
+ self.recentUploadsTable.fnDraw();
}
// Update usability hint - in common.js
@@ -239,7 +164,7 @@ $(document).ready(function () {
var sw = $(this)[0].scrollWidth, iw = $(this).innerWidth();
if (sw > iw) {
$(this).stop().animate({
- textIndent: "-" + (sw + 2 - iw) + "px"
+ textIndent: "-" + (sw - iw) + "px"
}, sw * 8);
}
},
@@ -251,37 +176,41 @@ $(document).ready(function () {
);
}
});
-
- return recentUploadsTable;
};
+ self.isRecentUploadsRefreshTimerActive = false;
+
self.startRefreshingRecentUploads = function () {
- if (self.isRecentUploadsRefreshTimerActive()) { //Prevent multiple timers from running
- return;
+ if (!self.isRecentUploadsRefreshTimerActive) { //Prevent multiple timers from running
+ self.recentUploadsRefreshTimer = setInterval(function() {
+ self.recentUploadsTable.fnDraw();
+ }, 3000);
+ self.isRecentUploadsRefreshTimerActive = true;
}
- self.recentUploadsRefreshTimer = setInterval("self.recentUploadsTable.fnDraw()", 3000);
- };
-
- self.isRecentUploadsRefreshTimerActive = function () {
- return (self.recentUploadsRefreshTimer != null);
};
self.stopRefreshingRecentUploads = function () {
clearInterval(self.recentUploadsRefreshTimer);
- self.recentUploadsRefreshTimer = null;
+ self.isRecentUploadsRefreshTimerActive = false;
};
$("#upload_status_all").click(function () {
- self.uploadFilter = "all";
- self.recentUploadsTable.fnPageChange(0).fnDraw();
+ if (self.uploadFilter !== "all") {
+ self.uploadFilter = "all";
+ self.recentUploadsTable.fnPageChange(0).fnDraw();
+ }
});
$("#upload_status_pending").click(function () {
- self.uploadFilter = "pending";
- self.recentUploadsTable.fnPageChange(0).fnDraw();
+ if (self.uploadFilter !== "pending") {
+ self.uploadFilter = "pending";
+ self.recentUploadsTable.fnPageChange(0).fnDraw();
+ }
});
$("#upload_status_failed").click(function () {
- self.uploadFilter = "failed";
- self.recentUploadsTable.fnPageChange(0).fnDraw();
+ if (self.uploadFilter !== "failed") {
+ self.uploadFilter = "failed";
+ self.recentUploadsTable.fnPageChange(0).fnDraw();
+ }
});
//Create the recent uploads table.
diff --git a/airtime_mvc/public/js/airtime/showbuilder/main_builder.js b/airtime_mvc/public/js/airtime/showbuilder/main_builder.js
index e114d677e..6ea091420 100644
--- a/airtime_mvc/public/js/airtime/showbuilder/main_builder.js
+++ b/airtime_mvc/public/js/airtime/showbuilder/main_builder.js
@@ -137,8 +137,24 @@ AIRTIME = (function(AIRTIME) {
});
$(window).on('hashchange', function() {
- var selected = $("a[href$='"+location.hash+"']");
- var dashboardLink = $(".media_type_selector:first");
+ var selected = $("a[href$='"+location.hash+"']"),
+ dashboardLink = $(".media_type_selector:first"),
+ t;
+
+ if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeEnum.PODCAST) {
+ $("#library_display_wrapper").hide();
+ $("#podcast_table").show();
+
+ t = AIRTIME.library.podcastDataTable;
+ } else {
+ if (typeof oTable === 'undefined') {
+ oTable = AIRTIME.library.libraryDataTable;
+ }
+
+ $("#library_display_wrapper").show();
+ $("#podcast_table").hide();
+ t = oTable;
+ }
dashboardLink.find("a").attr("href", selected.attr("href"));
AIRTIME.library.selectNone();
@@ -146,7 +162,7 @@ AIRTIME = (function(AIRTIME) {
$(this).removeClass("selected");
});
selected.parent().addClass("selected");
- oTable.fnDraw();
+ t.fnDraw();
$("#library_filter").text(selected.text());
// Highlight the dashboard link
dashboardLink.addClass("highlight");