', { class: 'playlistup containerbox clickplaylist'}).prependTo($(this));
up.html('
', { class: 'playlistdown containerbox clickplaylist'}).appendTo($(this));
down.html('
').css('width', w+'px');
$(this).addClass('highlighted');
if ($(this).hasClass('item')) {
$(this).next().addClass('highlighted').slideUp('fast');
}
}
});
return this;
}
jQuery.fn.hasBunnyEars = function() {
if ($(this).find('.playlistup').length > 0) {
return true;
} else {
return false;
}
}
jQuery.fn.removeBunnyEars = function() {
this.each(function() {
$(this).find('.playlistup').remove();
$(this).find('.playlistdown').remove();
$(this).removeClass('highlighted');
if ($(this).hasClass('item')) {
$(this).next().removeClass('highlighted');
}
});
playlist.doPopMove();
return this;
}
// Functions that could just be in layoutProcessor, but it makes maintenance easier
// if we have a proxy like this so we don't have to add new stuff to every single skin.
var uiHelper = function() {
return {
findAlbumDisplayer: function(key) {
try {
return layoutProcessor.findAlbumDisplayer(key);
} catch (err) {
if ($("#"+key).length > 0) {
return $("#"+key);
} else {
return $('i[name="'+key+'"]').parent();
}
}
},
findAlbumParent: function(key) {
try {
return layoutProcessor.findAlbumParent(key);
} catch (err) {
return $('i[name="'+key+'"]').parent();
}
},
findArtistDisplayer: function(key) {
try {
return layoutProcessor.findArtistDisplayer(key);
} catch (err) {
if ($("#"+key).length > 0) {
// If it already exists
return $("#"+key);
} else {
// Opener div (standard UI)
return $('i[name="'+key+'"]').parent();
}
}
},
insertAlbum: function(v) {
try {
return layoutProcessor.insertAlbum(v);
} catch (err) {
var albumindex = v.id;
var reinsert = false;
$('#'+v.why+'album'+albumindex).html(v.tracklist);
// This may look slightly messy but re-inserting the dropdown instead
// of just removing it re-opening it is much cleaner from a user
// experience perspective.
var dropdown = $('#'+v.why+'album'+albumindex);
if (dropdown.is(':visible')) {
reinsert = true;
dropdown.detach().html(v.tracklist);
}
uiHelper.findAlbumParent(v.why+'album'+albumindex).remove();
switch (v.type) {
case 'insertAfter':
debug.log("Insert After",v.where);
$(v.html).insertAfter(uiHelper.findAlbumDisplayer(v.where));
break;
case 'insertAtStart':
debug.log("Insert At Start",v.where);
$(v.html).prependTo($('#'+v.where));
break;
}
if (reinsert) {
uiHelper.findAlbumDisplayer(v.why+'album'+albumindex).find('.menu').toggleOpen();
dropdown.insertAfter(uiHelper.findAlbumDisplayer(v.why+'album'+albumindex));
infobar.markCurrentTrack();
}
uiHelper.makeResumeBar(dropdown);
layoutProcessor.postAlbumActions();
}
},
insertArtist: function(v) {
try {
return layoutProcessor.insertArtist(v);
} catch(err) {
switch (v.type) {
case 'insertAfter':
debug.log("Insert After",v.where);
switch (prefs.sortcollectionby) {
case 'album':
case 'albumbyartist':
$(v.html).insertAfter(uiHelper.findAlbumDisplayer(v.where));
break;
case 'artist':
$(v.html).insertAfter(uiHelper.findArtistDisplayer(v.where));
break;
}
break;
case 'insertAtStart':
debug.log("Insert At Start",v.where);
$(v.html).prependTo($('#'+v.where));
break;
}
}
},
removeAlbum: function(key) {
try {
return layoutProcessor.removeAlbum(key);
} catch (err) {
$('#'+key).remove();
uiHelper.findAlbumDisplayer(key).remove();
uiHelper.findAlbumParent(key).remove();
layoutProcessor.postAlbumActions();
}
},
removeArtist: function(v) {
try {
return layoutProcessor.removeArtist(v);
} catch (err) {
$("#aartist"+v).remove();
uiHelper.findArtistDisplayer('aartist'+v).remove();
layoutProcessor.postAlbumActions();
}
},
setupPersonalRadio: function(key) {
try {
return layoutProcessor.setupPersonalRadio(key);
} catch (err) {
}
},
setupPersonalRadioAdditions: function(key) {
try {
return layoutProcessor.setupPersonalRadioAdditions(key);
} catch (err) {
}
},
emptySearchResults: function() {
try {
return layoutProcessor.emptySearchResults();
} catch (err) {
$('#searchresultholder').empty();
}
},
fixupArtistDiv: function(jq, name) {
try {
return layoutProcessor.fixupArtistDiv(jq, name);
} catch (err) {
}
},
hackForSkinsThatModifyStuff: function(id) {
try {
return layoutProcessor.hackForSkinsThatModifyStuff(id);
} catch (err) {
}
},
postPlaylistLoad: function() {
try {
return layoutProcessor.postPlaylistLoad();
} catch (err) {
}
},
getElementPlaylistOffset: function(element) {
try {
return layoutProcessor.getElementPlaylistOffset(element);
} catch (err) {
}
},
createPluginHolder: function(icon, title, id, panel) {
try {
return layoutProcessor.createPluginHolder(icon, title, id, panel);
} catch (err) {
return false;
}
},
makeDropHolder: function(name, d, dontsteal) {
try {
return layoutProcessor.makeDropHolder(name);
} catch (err) {
var c = 'topdropmenu dropshadow rightmenu normalmenu stayopen';
if (dontsteal) {
c += ' dontstealmyclicks';
}
return $('
', {class: c, id: name}).appendTo(d);
}
},
postAlbumMenu: function(element) {
try {
return layoutProcessor.postAlbumMenu(element);
} catch (err) {
}
},
postPodcastSubscribe: function(data, index) {
try {
return layoutProcessor.postPodcastSubscribe(data, index);
} catch (err) {
$('i[name="podcast_'+index+'"]').parent().fadeOut('fast', function() {
$('i[name="podcast_'+index+'"]').parent().remove();
$('#podcast_'+index).remove();
$("#fruitbat").html(data);
infobar.notify(language.gettext('label_subscribed'));
podcasts.doNewCount();
layoutProcessor.postAlbumActions();
});
}
},
panelMapping: function() {
try {
return layoutProcessor.panelMapping();
} catch(err) {
return {
"albumlist": 'albumlist',
"searcher": 'searcher',
"filelist": 'filelist',
"radiolist": 'radiolist',
"podcastslist": 'podcastslist',
"audiobooklist": 'audiobooklist',
"playlistslist": 'playlistslist',
"pluginplaylistslist": 'pluginplaylistslist'
}
}
},
makeResumeBar: function(target) {
try {
layoutProcessor.makeResumeBar(target);
} catch(err) {
target.find('input.resumepos').each(function() {
var pos = parseInt($(this).val());
var duration = parseInt($(this).next().val());
debug.log("PODCASTS", "Episode has a progress bar",pos,duration);
var thething = $(
'
',
{
class: 'containerbox fullwidth playlistrow2 dropdown-container podcastresume playable ',
name: $(this).prev().attr('name')
}
).insertBefore($(this));
thething.append('
'+language.gettext('label_resume')+'
');
var bar = $('
', {class: 'expand', style: "height: 0.5em"}).appendTo(thething);
bar.rangechooser({range: duration, startmax: pos/duration, interactive: false});
});
}
},
setupCollectionDisplay: function() {
try {
layoutProcessor.setupCollectionDisplay();
} catch (err) {
}
},
showTagButton: function() {
try {
return layoutProcessor.showTagButton();
} catch (err) {
return true;
}
}
}
}();