/*
Copyright 2012-2020 OpenBroadcaster, Inc.
This file is part of OpenBroadcaster Server.
OpenBroadcaster Server is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenBroadcaster Server is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with OpenBroadcaster Server. If not, see .
*/
OB.Sidebar = new Object();
OB.Sidebar.init = function()
{
OB.Callbacks.add('ready',-5,OB.Sidebar.sidebarInit);
}
OB.Sidebar.sidebarInit = function()
{
if(parseInt(OB.Account.userdata.sidebar_display_left))
{
$('body').addClass('sidebar-left');
}
else
{
$('body').addClass('sidebar-right');
}
OB.Sidebar.mediaDetails();
$('#sidebar_player').droppable({
drop: function(event, ui) {
var mode = $(ui.draggable).attr('data-mode');
var type = $(ui.draggable).attr('data-type');
var id = $(ui.draggable).attr('data-id');
if(!mode || !type || !id) return;
OB.Sidebar.playerPlay(mode,type,id);
}
});
$('#sidebar_search_media_input').keyup(
function (event) {
// cancel advanced search (if applicable)
OB.Sidebar.advanced_search_filters = null;
if(event.keyCode=='13') {
$.doTimeout('media_search_timeout'); // cancel timeout function below.
OB.Sidebar.mediaSearch();
}
else $.doTimeout('media_search_timeout',750, function() { OB.Sidebar.mediaSearch(); });
});
$('#sidebar_search_playlist_input').keyup(
function () {
$.doTimeout('playlist_search_timeout',750, function() { OB.Sidebar.playlistSearch(); });
});
OB.Sidebar.playlistEditDeleteVisibility();
OB.Sidebar.mediaSearchFilter('approved');
OB.Sidebar.playlistSearch();
var media_simplebar = new SimpleBar(document.getElementById('sidebar_search_media_results_container'));
media_simplebar.getScrollElement().addEventListener('scroll', function()
{
var distance_to_bottom = $('#sidebar_search_media_results_container .simplebar-content').height() - $(this).scrollTop() - $('#sidebar_search_media_results_container').height();
if(distance_to_bottom<50 && $('#sidebar_search_media_loadmore').is(':visible')) OB.Sidebar.mediaSearchMore();
});
var playlist_simplebar = new SimpleBar(document.getElementById('sidebar_search_playlist_results_container'));
playlist_simplebar.getScrollElement().addEventListener('scroll', function()
{
var distance_to_bottom = $('#sidebar_search_playlist_results_container .simplebar-content').height() - $(this).scrollTop() - $('#sidebar_search_playlist_results_container').height();
if(distance_to_bottom<50 && $('#sidebar_search_playlist_loadmore').is(':visible')) OB.Sidebar.playlistSearchMore();
});
}
OB.Sidebar.playerToggle = function()
{
$('#sidebar_player').toggleClass('closed');
OB.UI.sidebarSearchResultsHeight();
}
OB.Sidebar.playerPlay = function(mode,type,id)
{
if(mode=='playlist')
{
//T Playlist preview coming soon.
OB.UI.alert('Playlist preview coming soon.');
}
else
{
type = type.toLowerCase();
image_width = $('#sidebar_player_draghere').innerWidth();
image_height = $('#sidebar_player_draghere').innerHeight();
if(type=='video')
{
$('#sidebar_player_draghere').html('');
}
else if(type=='audio')
{
$('#sidebar_player_draghere').html('');
}
else if(type=='image')
{
$('#sidebar_player_draghere').html('');
}
}
}
OB.Sidebar.showMediaSearch = function()
{
$('#sidebar_search_playlist_container').hide();
$('#sidebar_search_media_container').showFlex();
$('.sidebar_search_tab').removeClass('selected');
$('#sidebar_search_tab_media').addClass('selected');
OB.Layout.tableFixedHeaders($('#sidebar_search_media_headings'),$('#sidebar_search_media_results'));
}
OB.Sidebar.showPlaylistSearch = function()
{
// if we are showing detailed media view, then close back to basic view before switching to playlist view.
if($('#sidebar_search').hasClass('sidebar_search_detailed')) OB.Sidebar.mediaDetailedToggle();
$('#sidebar_search_media_container').hide();
$('#sidebar_search_playlist_container').showFlex();
$('.sidebar_search_tab').removeClass('selected');
$('#sidebar_search_tab_playlist').addClass('selected');
OB.Layout.tableFixedHeaders($('#sidebar_search_playlist_headings'),$('#sidebar_search_playlist_results'));
}
OB.Sidebar.mediaDetailedToggle = function()
{
if($('#sidebar_search').hasClass('sidebar_search_detailed'))
{
$('body').removeClass('sidebar-expanded');
$('#sidebar_search').removeClass('sidebar_search_detailed');
$('#sidebar_search_media_container').addClass('sidebar_search_media_container_basic');
$('#sidebar_search_media_container').removeClass('sidebar_search_media_container_detailed');
// hide detailed columns
$('.sidebar_search_media_detailed_column').hide();
// update detailed toggle link
$('#media_detailed_toggle_text').text(OB.t('more'));
}
else {
$('body').addClass('sidebar-expanded');
$('#sidebar_search').addClass('sidebar_search_detailed');
$('#sidebar_search_media_container').removeClass('sidebar_search_media_container_basic');
$('#sidebar_search_media_container').addClass('sidebar_search_media_container_detailed');
// show detailed columns
$('.sidebar_search_media_detailed_column').each(function(index, column)
{
var name = $(column).attr('data-column');
if(name=='genre') name = 'category';
if(OB.Settings.media_required_fields[name]!='disabled' && OB.Settings.media_required_fields[name+'_id']!='disabled') $(column).show();
});
// update detailed toggle link
$('#media_detailed_toggle_text').text(OB.t('less'));
}
$('#sidebar_search_media_headings').width($('#sidebar_search_media_results').width());
OB.Layout.tableFixedHeaders($('#sidebar_search_media_headings'),$('#sidebar_search_media_results'));
}
OB.Sidebar.media_search_filters = new Object();
OB.Sidebar.media_search_filters.mode='approved';
OB.Sidebar.media_search_filters.my=false;
OB.Sidebar.media_search_filters.bookmarked=false;
OB.Sidebar.mediaSearchFilter = function(what)
{
// group one (can select only one of these)
if(what=='approved' || what=='unapproved' || what=='archived')
{
OB.Sidebar.media_search_filters.mode=what;
}
// group two (toggle on and off).
else
{
if(what=='my') OB.Sidebar.media_search_filters.my = !OB.Sidebar.media_search_filters.my;
else if(what=='bookmarked') OB.Sidebar.media_search_filters.bookmarked = !OB.Sidebar.media_search_filters.bookmarked;
}
// set the look of the buttons
//T ap
if(OB.Sidebar.media_search_filters.mode=='approved') $('#sidebar_search_media_approved').html(OB.t('ap').toUpperCase());
else $('#sidebar_search_media_approved').html(OB.t('ap').toLowerCase());
//T un
if(OB.Sidebar.media_search_filters.mode=='unapproved') $('#sidebar_search_media_unapproved').html(OB.t('un').toUpperCase());
else $('#sidebar_search_media_unapproved').html(OB.t('un').toLowerCase());
//T ar
if(OB.Sidebar.media_search_filters.mode=='archived') $('#sidebar_search_media_archived').html(OB.t('ar').toUpperCase());
else $('#sidebar_search_media_archived').html(OB.t('ar').toLowerCase());
//T my
if(OB.Sidebar.media_search_filters.my==true) $('#sidebar_search_media_my').html(OB.t('my').toUpperCase());
else $('#sidebar_search_media_my').html(OB.t('my').toLowerCase());
//T bk
if(OB.Sidebar.media_search_filters.bookmarked==true) $('#sidebar_search_media_bookmarked').html('BK');
else $('#sidebar_search_media_bookmarked').html('bk');
// reload search
OB.Sidebar.mediaSearch();
}
OB.Sidebar.mediaSelectAll = function()
{
$('.sidebar_search_media_result').addClass('sidebar_search_media_selected');
}
OB.Sidebar.mediaSelectNone = function()
{
$('.sidebar_search_media_result').removeClass('sidebar_search_media_selected');
}
OB.Sidebar.media_last_selected = null;
OB.Sidebar.mediaSelect = function(object,dragging,keypress)
{
if(keypress==null && !dragging) $('.sidebar_search_media_selected').removeClass('sidebar_search_media_selected');
else if(keypress==null && dragging && !$(object).hasClass('sidebar_search_media_selected')) $('.sidebar_search_media_selected').removeClass('sidebar_search_media_selected');
var media_id = $(object).attr('data-id');
if(!dragging && keypress!='shift' && $('#sidebar_search_media_result_'+media_id).hasClass('sidebar_search_media_selected'))
$('#sidebar_search_media_result_'+media_id).removeClass('sidebar_search_media_selected');
else
{
if(keypress=='shift')
{
var last_selected = $('#sidebar_search_media_result_'+OB.Sidebar.media_last_selected);
// figure out if we have to move up or down.
if($(last_selected).parent().children().index($(last_selected)) < $('#sidebar_search_media_result_'+media_id).parent().children().index($('#sidebar_search_media_result_'+media_id))) var shift_down = true;
else var shift_down = false;
while(last_selected.attr('data-id')!=media_id)
{
if(shift_down) last_selected = $(last_selected).next();
else last_selected = $(last_selected).prev();
last_selected.addClass('sidebar_search_media_selected');
}
}
else $('#sidebar_search_media_result_'+media_id).addClass('sidebar_search_media_selected');
OB.Sidebar.media_last_selected = media_id;
}
OB.Sidebar.mediaEditDeleteVisibility();
}
// adjust the visibility of the media edit / delete buttons.
OB.Sidebar.mediaEditDeleteVisibility = function()
{
// default to true.
var visible = true;
// if there is nothing selected, then we can't edit or delete.
if($('#sidebar_search_media_results tbody .sidebar_search_media_selected').length==0) visible = false;
// see if we can edit/delete each item.
$('#sidebar_search_media_results tbody .sidebar_search_media_selected').each(function(index,element)
{
if($(element).attr('data-can_edit')!="true") { visible = false; return false; }
});
if(visible)
{
$('#sidebar_media_edit_button').show();
$('#sidebar_media_delete_button').show();
if(OB.Sidebar.media_search_filters.mode=='archived') $('#sidebar_media_unarchive_button').show();
}
else
{
$('#sidebar_media_edit_button').hide();
$('#sidebar_media_delete_button').hide();
$('#sidebar_media_unarchive_button').hide();
}
}
OB.Sidebar.mediaSearchNumResults = function()
{
var num_results = $('#sidebar_search_media_results').attr('data-num_results');
// special case for no results.
if(num_results == 0)
{
$('#sidebar_search_media_results tbody').html('
');
//T No Media Found
$('#sidebar_search_media_results tbody .sidebar_search_noresults').text(OB.t('No Media Found'));
}
//T 1 result
if(num_results==1) var num_results_text = OB.t('1 result');
//T %1 results
else var num_results_text = OB.t('%1 results', format_number(num_results));
$('#sidebar_search_media_footer .results .num_results').html(num_results_text);
$('#sidebar_search_media_footer .results .dynamic_selection').html(' ');
}
OB.Sidebar.media_search_offset = 0;
OB.Sidebar.mediaSearchMore = function()
{
OB.Sidebar.media_search_offset += OB.ClientStorage.get('results_per_page');
OB.Sidebar.mediaSearch(true);
}
OB.Sidebar.media_search_sort_by = 'updated';
OB.Sidebar.media_search_sort_dir = 'desc';
OB.Sidebar.mediaSearchSort = function(sortby)
{
// change direction if already sorting by this column
if(sortby == OB.Sidebar.media_search_sort_by)
{
if(OB.Sidebar.media_search_sort_dir=='asc') OB.Sidebar.media_search_sort_dir = 'desc';
else OB.Sidebar.media_search_sort_dir = 'asc';
}
OB.Sidebar.media_search_sort_by = sortby;
OB.Sidebar.mediaSearch();
}
// we keep track of the last simple/advanced search so people can toggle between.
OB.Sidebar.media_search_last_simple = false;
OB.Sidebar.media_search_last_advanced = false;
OB.Sidebar.media_search_last_query = false;
OB.Sidebar.mediaSearchMode = function(mode)
{
if(OB.Sidebar.media_search_last_query)
{
if(mode=='simple')
{
$('#sidebar_search_media_input').unbind('click');
$('#sidebar_search_media_input').focus();
//T enter search query
$('#sidebar_search_media_input').attr('placeholder','(' + OB.t('enter search query') + ')');
if(OB.Sidebar.media_search_last_query.mode=='advanced' && OB.Sidebar.media_search_last_simple) $('#sidebar_search_media_input').val(OB.Sidebar.media_search_last_simple.string);
OB.Sidebar.advanced_search_filters = null;
OB.Sidebar.mediaSearch();
}
if(mode=='advanced')
{
OB.Sidebar.advancedSearchWindow();
}
}
}
OB.Sidebar.mediaDetails = function()
{
$('#sidebar_search_media_container').removeClass('thumbnails').addClass('details');
}
OB.Sidebar.mediaThumbnails = function()
{
$('#sidebar_search_media_container').removeClass('details').addClass('thumbnails');
}
OB.Sidebar.mediaSearch = function(more)
{
// if not the result of pagination (new search), reset offset to 0
if(!more)
{
OB.Sidebar.media_search_offset = 0;
$('.context-menu-media-item:first-child').parent().remove();
}
// generate our search query
var search_query = Object();
if(OB.Sidebar.advanced_search_filters==null)
{
search_query.mode = 'simple';
search_query.string = $('#sidebar_search_media_input').val();
}
else
{
search_query.mode = 'advanced';
search_query.filters = OB.Sidebar.advanced_search_filters;
$('#sidebar_search_media_input').val('');
//T advanced mode
$('#sidebar_search_media_input').attr('placeholder','(' + OB.t('advanced mode') + ')');
$('#sidebar_search_media_input').click(function(e) { OB.Sidebar.mediaSearchMode('advanced'); });
}
$('#sidebar_search_media_loading').show();
$('#sidebar_search_media_loadmore').hide();
OB.API.post('media','search',{ save_history: true, sort_by: OB.Sidebar.media_search_sort_by, sort_dir: OB.Sidebar.media_search_sort_dir, q: search_query, s: OB.Sidebar.media_search_filters.mode, l: OB.ClientStorage.get('results_per_page'), o: OB.Sidebar.media_search_offset, my: OB.Sidebar.media_search_filters.my },function (data)
{
var media_class = media; // media singleton is needed, but media local variable below overrides.
var media = data.data.media;
var num_results = data.data.num_results;
// handle results
if(!more) $('#sidebar_search_media_results tbody').html('');
if(data.status != false) for(var i in media)
{
var duration = media[i]['duration'];
if(duration==null) duration = '';
else duration = secsToTime(duration);
if(media[i]['is_archived']==1) var data_mode = 'media_archived';
else if(media[i]['is_approved']==0) var data_data = 'media_unapproved';
else data_mode = 'media';
var media_type_symbol = '';
switch (media[i]['type']) {
case 'audio':
media_type_symbol = '';
break;
case 'video':
media_type_symbol = '';
break;
case 'image':
media_type_symbol = '';
break;
}
var thumbnail = media[i]['thumbnail'] ? '' : '';
$('#sidebar_search_media_results tbody').append('\
\
'+thumbnail+'
\
'+media_type_symbol+'
\
'+htmlspecialchars(media[i]['artist'])+'
\
'+htmlspecialchars(media[i]['album'])+'
\
'+htmlspecialchars(media[i]['title'])+'
\
'+htmlspecialchars(media[i]['year'])+'
\
'+htmlspecialchars(media[i]['category_name'])+'
\
'+htmlspecialchars(media[i]['genre_name'])+'
\
'+htmlspecialchars(media[i]['country_name'])+'
\
'+htmlspecialchars(media[i]['language_name'])+'
\
'+duration+'
\
');
if(OB.Settings.media_required_fields.artist=='disabled') $('.sidebar_search_media_artist').hide();
$('#sidebar_search_media_result_'+media[i]['id']).click(function(e) {
var keypress = null;
if(e.shiftKey) keypress='shift';
else if(e.ctrlKey) keypress='ctrl';
OB.Sidebar.mediaSelect(this,false,keypress);
});
// change null object to blank string when required
if(media[i]['year'] === null) media[i]['year']='';
if(media[i]['country_id'] === null) media[i]['country_id']='';
if(media[i]['country_name'] === null) media[i]['country_name']='';
if(media[i]['language_id'] === null) media[i]['language_id']='';
if(media[i]['language_name'] === null) media[i]['language_name']='';
// some additional attributes to set
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-duration', media[i]['duration']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-id', media[i]['id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-artist', media[i]['artist']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-title', media[i]['title']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-year', media[i]['year']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-album', media[i]['album']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-type', media[i]['type']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-filename', media[i]['filename']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-category_id', media[i]['category_id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-category_name', media[i]['category_name']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-country_id', media[i]['country_id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-country_name', media[i]['country_name']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-language_id', media[i]['language_id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-language_name', media[i]['language_name']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-genre_id', media[i]['genre_id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-genre_name', media[i]['genre_name']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-comments', media[i]['comments']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-is_copyright_owner', media[i]['is_copyright_owner']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-visibility', media[i]['status']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-dynamic_select', media[i]['dynamic_select']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-owner_id', media[i]['owner_id']);
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-can_edit', media[i]['can_edit']);
if(media[i]['is_archived']==1) $('#sidebar_search_media_result_'+media[i]['id']).attr('data-status', 'archived');
else if(media[i]['is_approved']==0) $('#sidebar_search_media_result_'+media[i]['id']).attr('data-status', 'unapproved');
else $('#sidebar_search_media_result_'+media[i]['id']).attr('data-status', 'approved');
// set custom metadata
$.each(OB.Settings.media_metadata, function(index, metadata)
{
if(metadata.type=='hidden') return;
$('#sidebar_search_media_result_'+media[i]['id']).attr('data-metadata_'+metadata.name, media[i]['metadata_'+metadata.name]);
});
// remove our hidden class from detailed columns if we're in an expanded (detailed) view.
if($('#sidebar_search').hasClass('sidebar_search_detailed')) $('.sidebar_search_media_detailed_column').show();
// set up context menu
var menuOptions = new Object();
//T Details
menuOptions[OB.t('Details')] = { klass: 'context-menu-media-item', click: function(element) { OB.Sidebar.contextMenuDetailsPage($(element).attr('data-id')); } };
if(media[i]['can_edit']=="true") menuOptions[OB.t('Edit')] = { klass: 'context-menu-media-item', click: function(element) { OB.Sidebar.contextMenuEditPage(); } };
//T Download
if(OB.Settings.permissions.indexOf('download_media')!=-1) menuOptions[OB.t('Download')] = { klass: 'context-menu-media-item', click: function(element){ OB.Sidebar.contextMenuDownload($(element).attr('data-id')); } };
//T Versions
if(media[i]['can_edit']=="true" && OB.Settings.permissions.indexOf('manage_media_versions')!=-1) menuOptions[OB.t('Versions')] = { klass: 'context-menu-media-item', click: function(element) { OB.Sidebar.contextMenuVersionPage($(element).attr('data-id'), $(element).attr('data-title')); } };
if(Object.keys(menuOptions).length>0)
{
$('#sidebar_search_media_result_'+media[i]['id']).contextMenu('context-menu-media-'+media[i]['id'],
menuOptions,
{
disable_native_context_menu: false,
showMenu: function(element) { $(element).click(); },
hideMenu: function() { },
leftClick: false // trigger on left click instead of right click
});
}
// double click loads detail
$('#sidebar_search_media_result_'+media[i]['id']).dblclick(function() { OB.Sidebar.contextMenuDetailsPage($(this).attr('data-id')); });
}
if(data.status==false) $('#sidebar_search_media_results').attr('data-num_results',0);
else $('#sidebar_search_media_results').attr('data-num_results',num_results);
OB.Sidebar.mediaSearchNumResults();
OB.Sidebar.media_search_last_query = search_query;
if(search_query.mode=='simple') OB.Sidebar.media_search_last_simple = search_query;
else OB.Sidebar.media_search_last_advanced = search_query;
if(data.status!=false && media.length>0) {
$('.sidebar_search_media_result').not('.ui-draggable').draggable({helper: 'clone',
start: function(event, ui) {
var keypress = null;
if(event.shiftKey) keypress='shift';
else if(event.ctrlKey) keypress='ctrl';
// select the media we're dragging also.
OB.Sidebar.mediaSelect($(ui.helper),true,keypress);
// but we don't actually want the helper to count as part of this.
$(ui.helper).removeClass('sidebar_search_media_selected');
var num_selected = $('.sidebar_search_media_selected').size();
if(num_selected==1) var helper_html = htmlspecialchars($(ui.helper).attr('data-artist')) + ' ' + htmlspecialchars($(ui.helper).attr('data-title'));
else var helper_html = htmlspecialchars(num_selected+' items');
$(ui.helper).html('');
OB.UI.dragHelperOn(helper_html);
var data_status = $(ui.helper).attr('data-status');
if(data_status == 'approved')
$('.droppable_target_media').addClass('droppable_target_highlighted');
else if(data_status == 'unapproved')
$('.droppable_target_media_unapproved').addClass('droppable_target_highlighted');
else if(data_status == 'archived')
$('.droppable_target_media_unapproved').addClass('droppable_target_highlighted');
},
stop: function(event, ui) {
OB.UI.dragHelperOff();
var data_status = $(ui.helper).attr('data-status');
if(data_status == 'approved')
$('.droppable_target_media').removeClass('droppable_target_highlighted');
else if(data_status == 'unapproved')
$('.droppable_target_media_unapproved').removeClass('droppable_target_highlighted');
else if(data_status == 'archived')
$('.droppable_target_media_unapproved').removeClass('droppable_target_highlighted');
}
});
OB.Layout.tableFixedHeaders($('#sidebar_search_media_headings'),$('#sidebar_search_media_results'));
}
OB.Sidebar.mediaEditDeleteVisibility();
// show/hide loadmore as necessary, hide loading
$('#sidebar_search_media_loadmore').toggle( $('.sidebar_search_media_result').length < num_results );
$('#sidebar_search_media_loading').hide();
});
}
OB.Sidebar.contextMenuEditPage = function()
{
OB.Media.editPage();
}
OB.Sidebar.contextMenuDownload = function(id)
{
OB.Media.download(id);
}
OB.Sidebar.contextMenuDetailsPage = function(id)
{
OB.Media.detailsPage(id);
}
OB.Sidebar.contextMenuVersionPage = function(id, title)
{
OB.Media.versionPage(id, title);
}
OB.Sidebar.contextMenuPlaylistEditPage = function()
{
OB.Playlist.editPage();
}
OB.Sidebar.contextMenuPlaylistDetailsPage = function(id)
{
OB.Playlist.detailsPage(id);
}
OB.Sidebar.playlist_search_filters = new Object();
OB.Sidebar.playlist_search_filters.my=false;
OB.Sidebar.playlist_search_filters.bookmarked=false;
OB.Sidebar.playlistSearchFilter = function(what)
{
// toggle on off
if(what=='my') OB.Sidebar.playlist_search_filters.my = !OB.Sidebar.playlist_search_filters.my;
//T my
if(OB.Sidebar.playlist_search_filters.my==true) $('#sidebar_search_playlist_my').text(OB.t('my').toUpperCase());
else $('#sidebar_search_playlist_my').text(OB.t('my').toLowerCase());
// reload search
OB.Sidebar.playlistSearch();
}
OB.Sidebar.playlistSelectAll = function()
{
$('.sidebar_search_playlist_result').addClass('sidebar_search_playlist_selected');
}
OB.Sidebar.playlistSelectNone = function()
{
$('.sidebar_search_playlist_result').removeClass('sidebar_search_playlist_selected');
}
OB.Sidebar.playlist_last_selected = null;
OB.Sidebar.playlistSelect = function(object,dragging,keypress)
{
if(keypress==null && !dragging) $('.sidebar_search_playlist_selected').removeClass('sidebar_search_playlist_selected');
else if(keypress==null && dragging && !$(object).hasClass('sidebar_search_playlist_selected')) $('.sidebar_search_playlist_selected').removeClass('sidebar_search_playlist_selected');
var media_id = $(object).attr('data-id');
if(!dragging && keypress!='shift' && $('#sidebar_search_playlist_result_'+media_id).hasClass('sidebar_search_playlist_selected'))
$('#sidebar_search_playlist_result_'+media_id).removeClass('sidebar_search_playlist_selected');
else
{
if(keypress=='shift')
{
var last_selected = $('#sidebar_search_playlist_result_'+OB.Sidebar.playlist_last_selected);
// figure out if we have to move up or down.
if($(last_selected).parent().children().index($(last_selected)) < $('#sidebar_search_playlist_result_'+media_id).parent().children().index($('#sidebar_search_playlist_result_'+media_id))) var shift_down = true;
else var shift_down = false;
while(last_selected.attr('data-id')!=media_id)
{
if(shift_down) last_selected = $(last_selected).next();
else last_selected = $(last_selected).prev();
last_selected.addClass('sidebar_search_playlist_selected');
}
}
else $('#sidebar_search_playlist_result_'+media_id).addClass('sidebar_search_playlist_selected');
OB.Sidebar.playlist_last_selected = media_id;
}
OB.Sidebar.playlistEditDeleteVisibility();
}
// adjust the visibility of the playlist edit / delete buttons.
OB.Sidebar.playlistEditDeleteVisibility = function()
{
// default to true.
var visible = true;
// if there is nothing selected, then we can't edit or delete.
if($('#sidebar_search_playlist_results tbody .sidebar_search_playlist_selected').length==0) visible = false;
// check to make sure we can edit all selected items
$('#sidebar_search_playlist_results tbody .sidebar_search_playlist_selected').each(function(index,element)
{
if($(element).attr('data-can_edit')!="true") { visible = false; }
});
if(visible) { $('#sidebar_playlist_edit_button').show(); $('#sidebar_playlist_delete_button').show(); }
else { $('#sidebar_playlist_edit_button').hide(); $('#sidebar_playlist_delete_button').hide(); }
}
OB.Sidebar.playlist_search_offset = 0;
OB.Sidebar.playlistSearchMore = function()
{
OB.Sidebar.playlist_search_offset += OB.ClientStorage.get('results_per_page');
OB.Sidebar.playlistSearch(true);
}
OB.Sidebar.playlist_search_sort_by = 'updated';
OB.Sidebar.playlist_search_sort_dir = 'desc';
OB.Sidebar.playlistSearchSort = function(sortby)
{
// change direction if already sorting by this column
if(sortby == OB.Sidebar.playlist_search_sort_by)
{
if(OB.Sidebar.playlist_search_sort_dir=='asc') OB.Sidebar.playlist_search_sort_dir = 'desc';
else OB.Sidebar.playlist_search_sort_dir = 'asc';
}
OB.Sidebar.playlist_search_sort_by = sortby;
OB.Sidebar.playlistSearch();
}
OB.Sidebar.playlistSearch = function(more)
{
// if not the result of pagination (new search), reset offset to 0
if(!more)
{
OB.Sidebar.playlist_search_offset = 0;
$('.context-menu-playlist-item:first-child').parent().remove();
}
$('#sidebar_search_playlist_headings').show();
$('#sidebar_search_playlist_loading').show();
$('#sidebar_search_playlist_loadmore').hide();
OB.API.post('playlist','search',{ sort_by: OB.Sidebar.playlist_search_sort_by, sort_dir: OB.Sidebar.playlist_search_sort_dir, q: $('#sidebar_search_playlist_input').val(), l: OB.ClientStorage.get('results_per_page'), o: OB.Sidebar.playlist_search_offset, my: OB.Sidebar.playlist_search_filters.my },function (data) {
var playlist = data.data.playlists;
var num_results = data.data.num_results;
// handle results
$('#sidebar_search_playlist_results').attr('data-num_results',num_results);
if(!more) $('#sidebar_search_playlist_results tbody').html('');
if(num_results == 0)
{
$('#sidebar_search_playlist_results tbody').html('
');
//T No Playlists Found
$('#sidebar_search_playlist_results tbody .sidebar_search_noresults').text(OB.t('No Playlists Found'));
}
//T 1 result
//T %1 results
if(num_results==1) num_results_text = OB.t('1 result');
else num_results_text = OB.t('%1 results', format_number(num_results));
$('#sidebar_search_playlist_footer .results .num_results').html(num_results_text);
for(var i in playlist)
{
var duration = playlist[i]['duration'];
if(duration==null) duration = '';
else duration = secsToTime(duration);
var playlist_description = playlist[i]['description'];
if(playlist_description.length>150) playlist_description = playlist_description.substr(0,150)+'...';
$('#sidebar_search_playlist_results tbody').append('\
\
'+htmlspecialchars(playlist[i]['name'])+'
\
'+playlist_description+'
\
');
$('#sidebar_search_playlist_result_'+playlist[i]['id']).click(function(e) {
var keypress = null;
if(e.shiftKey) keypress='shift';
else if(e.ctrlKey) keypress='ctrl';
OB.Sidebar.playlistSelect(this,false,keypress);
});
// some additional attributes to set
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-id', playlist[i]['id']);
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-name', playlist[i]['name']);
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-description', playlist[i]['description']);
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-visibility', playlist[i]['status']);
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-owner_id', playlist[i]['owner_id']);
$('#sidebar_search_playlist_result_'+playlist[i]['id']).attr('data-can_edit', playlist[i]['can_edit']);
// set up context menu
var menuOptions = new Object();
//T Details
menuOptions[OB.t('Details')] = { klass: 'context-menu-playlist-item', click: function(element) { OB.Sidebar.contextMenuPlaylistDetailsPage($(element).attr('data-id')); } };
//T Edit
if(playlist[i]['can_edit']) menuOptions[OB.t('Edit')] = { klass: 'context-menu-playlist-item', click: function(element) { OB.Sidebar.contextMenuPlaylistEditPage(); } };
if(Object.keys(menuOptions).length>0)
{
$('#sidebar_search_playlist_result_'+playlist[i]['id']).contextMenu('context-menu-playlist-'+playlist[i]['id'],
menuOptions,
{
disable_native_context_menu: false,
showMenu: function(element) { $(element).click(); },
hideMenu: function() { },
leftClick: false // trigger on left click instead of right click
}
);
}
// double click loads details page
$('#sidebar_search_playlist_result_'+playlist[i]['id']).dblclick(function() { OB.Sidebar.contextMenuPlaylistDetailsPage($(this).attr('data-id')); });
}
if(playlist.length>0) {
$('.sidebar_search_playlist_result').not('.ui-draggable').draggable({helper: 'clone',
start: function(event, ui) {
var keypress = null;
if(event.shiftKey) keypress='shift';
else if(event.ctrlKey) keypress='ctrl';
// select the media we're dragging also.
OB.Sidebar.playlistSelect($(ui.helper),true,keypress);
// but we don't actually want the helper to count as part of this.
$(ui.helper).removeClass('sidebar_search_playlist_selected');
var num_selected = $('.sidebar_search_playlist_selected').size();
if(num_selected==1) var helper_html = htmlspecialchars($(ui.helper).attr('data-name'));
else var helper_html = htmlspecialchars(num_selected+' items');
$(ui.helper).html('');
OB.UI.dragHelperOn(helper_html);
$('.droppable_target_playlist').addClass('droppable_target_highlighted');
},
stop: function(event, ui) {
$('.droppable_target_playlist').removeClass('droppable_target_highlighted');
OB.UI.dragHelperOff();
}
});
OB.Layout.tableFixedHeaders($('#sidebar_search_playlist_headings'),$('#sidebar_search_playlist_results'));
}
OB.Sidebar.playlistEditDeleteVisibility();
// show/hide loadmore as necessary, hide loading
$('#sidebar_search_playlist_loadmore').toggle( $('.sidebar_search_playlist_result').length < num_results );
$('#sidebar_search_playlist_loading').hide();
});
}
OB.Sidebar.mySearchesContextMenuOn = function(e,type,id)
{
$('#my_searches_item_'+id).addClass('context_menu_on');
$('#my_searches_'+type+'_context_menu').css('left',e.pageX).css('top',e.pageY);
// set default or unset default?
if(type=='saved')
{
if($('#my_searches_item_'+id+' .media_search_item_default_text').length)
{
$('#my_searches_context_menu_unset_default').show();
$('#my_searches_context_menu_set_default').hide();
}
else
{
$('#my_searches_context_menu_set_default').show();
$('#my_searches_context_menu_unset_default').hide();
}
}
$('#my_searches_'+type+'_context_menu').show();
$(window).bind('mousedown',OB.Sidebar.mySearchesContextMenuOff);
}
OB.Sidebar.mySearchesContextMenuOff = function(e)
{
var $target = $(e.target);
if($target.hasClass('context_menu_item')) $target.click();
$('#my_searches_history_context_menu').hide();
$('#my_searches_saved_context_menu').hide();
$('.my_searches_item').removeClass('context_menu_on');
$(window).unbind('mousedown',OB.Sidebar.mySearchesContextMenuOff);
}
OB.Sidebar.mySearchesSave = function()
{
if(!$('.my_searches_item.context_menu_on').length) return;
var id = $('.my_searches_item.context_menu_on').attr('data-id');
OB.API.post('media','media_my_searches_save',{ 'id': id }, function(response)
{
if(response.status==true)
{
$('.my_searches_item[data-id='+id+']').prependTo('#my_searches_saved');
OB.Sidebar.mySearchesItemContextMenu($('.my_searches_item[data-id='+id+']'),'saved');
OB.Sidebar.mySearchesNosearchtext();
}
//T An error occurred while trying to save this search item.
else OB.UI.alert('An error occurred while trying to save this search item.');
});
}
OB.Sidebar.mySearchesDelete = function()
{
if(!$('.my_searches_item.context_menu_on').length) return;
var id = $('.my_searches_item.context_menu_on').attr('data-id');
OB.API.post('media','media_my_searches_delete',{ 'id': id }, function(response)
{
if(response.status==true)
{
$('.my_searches_item[data-id='+id+']').remove();
OB.Sidebar.mySearchesNosearchtext();
}
//T An error occurred while trying to delete this search item.
else OB.UI.alert('An error occurred while trying to delete this search item.');
});
}
OB.Sidebar.mySearchesNosearchtext = function()
{
if($('#my_searches_history .my_searches_item').length==0) $('#my_searches_history_nosearches').show();
else $('#my_searches_history_nosearches').hide();
if($('#my_searches_saved .my_searches_item').length==0) $('#my_searches_saved_nosearches').show();
else $('#my_searches_saved_nosearches').hide();
}
OB.Sidebar.mySearchesSearch = function(id)
{
OB.Sidebar.advanced_search_filters = $('#my_searches_item_'+id).data('filters');
OB.Sidebar.mediaSearch();
OB.UI.closeModalWindow();
}
OB.Sidebar.mySearchesWindow = function()
{
OB.API.post('media','media_my_searches',{},function(response)
{
OB.UI.openModalWindow('sidebar/my_searches.html');
var history = response.data.history;
var saved = response.data.saved;
if(history && history.length>0)
{
$.each(history, function(index,data)
{
OB.Sidebar.mySearchesWindowAddItem(data,'history');
});
}
if(saved && saved.length>0)
{
$.each(saved, function(index,data)
{
OB.Sidebar.mySearchesWindowAddItem(data,'saved');
});
}
OB.Sidebar.mySearchesNosearchtext();
});
}
OB.Sidebar.mySearchesWindowAddItem = function(data,type)
{
if(data.query.mode!='advanced') return; // this shouldn't be.
$('#my_searches_'+type).append('');
$('#my_searches_item_'+data.id).click(function() { OB.Sidebar.mySearchesSearch(data.id); });
$('#my_searches_item_'+data.id).data('filters',data.query.filters);
$('#my_searches_item_'+data.id).data('description',data.description);
OB.Sidebar.mySearchesItemContextMenu($('#my_searches_item_'+data.id), type);
//T All simple searches will include these filters by default.
if(data.default=='1') $('#my_searches_item_'+data.id).append('
' + OB.t('All simple searches will include these filters by default.') + '