// *******************************************************************
//
// ALBUM LIST
//
// *******************************************************************
function album_list() {
var title = 'Albums';
var alias = "album";
var ds = new Ext.data.JsonStore({
url:'grid/get_list_data.php?type=' + alias,
id: 'id',
totalProperty: 'total',
root: 'data',
fields: [
{name:'albumID'},
{name:'name'},
{name:'cover'},
{name:'artist'},
{name:'artistID'},
{name:'num_files'},
{name:'name_slashes'},
{name:'artist_slashes'}
],
listeners:
{
datachanged: function()
{
/*console.log(ds);
console.log(ds.baseParams.fields);
console.log(ds.sortInfo.direction);
console.log(ds.sortInfo.field);
console.log("album_feed.php?query=" + ds.baseParams.query + "&fields=" + ds.baseParams.fields + "&sort=" + ds.sortInfo.field + "&sort_dir=" + ds.sortInfo.direction);
console.log(cooliris_dont_reload);*/
if(cooliris_window && !cooliris_dont_reload)
{
cooliris.embed.setFeedURL("album_feed.php?query=" + ds.baseParams.query + "&fields=" + ds.baseParams.fields + "&sort=" + ds.sortInfo.field + "&sort_dir=" + ds.sortInfo.direction);
}
}
},
sortInfo: {field: 'name', direction: 'ASC'},
remoteSort: true
});
var cm = new Ext.grid.ColumnModel([
{dataIndex: 'name', header: 'Album', renderer: renderAlbum, sortable: true},
{dataIndex: 'artist', header: 'Artist', renderer: renderArtist, sortable: true}
]);
cm.defaultSortable = true;
var imageTooltip = 'qtip="Album: {name_slashes}
Interpret: {artist_slashes}
Songs: {num_files}"';
var giantCover = new Ext.Template(
'
'
);
var mediumCover = new Ext.Template(
''
);
var tinyCover = new Ext.Template(
''
);
function changeView(item, checked) {
var tpl;
if (checked) {
if (item.type == 'giant')
{
tpl = giantCover;
cp.set("album_list_template","giantCover");
}
else if (item.type == 'medium')
{
tpl = mediumCover;
cp.set("album_list_template","mediumCover");
}
else if (item.type == 'tiny')
{
tpl = tinyCover;
cp.set("album_list_template","tinyCover");
}
else
{
tpl = null;
cp.set("album_list_template",0);
}
grid.getView().changeTemplate(tpl);
}
}
function album_name(value, p, record)
{
if(record.get('cover_resized')==1)
var path = "cover/album/resized/" + record.get('albumID') +".jpg";
else
var path = "img/cover_no_album.gif";
return String.format(
'{1}
{2}
',
record.get('albumID'),record.get('name'),record.get('artist'));
}
var tpl_name = cp.get("album_list_template",0);
if(tpl_name)
var tpl = eval(cp.get("album_list_template",0));
else
var tpl = null;
var grid = new Ext.grid.GridPanel({
id: alias + "_list",
header: true,
border: false,
iconCls: 'icon-album',
title: title,
ds: ds,
cm: cm,
tbar:[],
enableHdMenu: false,
enableColLock: false,
loadMask: true,
plugins: [new Ext.ux.grid.GridViewMenuPlugin,new Ext.ux.grid.Search({
iconCls:'icon-zoom',
searchText: '',
readonlyIndexes:[],
disableIndexes:[],
position: "top",
minChars:1,
autoFocus:true
// ,menuStyle:'radio'
})],
tbar: new Ext.Toolbar({
items: [
{
tooltip: 'change view',
iconCls: 'icon-view',
menu: [{
group: 'view_album',
checkHandler: changeView,
checked: tpl_name=="giantCover",
text: 'large cover',
type: 'giant'
},{
group: 'view_album',
checkHandler: changeView,
checked: tpl_name=="mediumCover",
text: 'medium cover',
type: 'medium'
},{
group: 'view_album',
checkHandler: changeView,
checked: tpl_name=="tinyCover",
text: 'small cover',
type: 'tiny'
},{
group: 'view_album',
checkHandler: changeView,
checked: tpl_name=="",
text: 'list',
type: 'list'
},
new Ext.menu.Separator(),
{ text: 'Cooliris', handler : open_cooliris }
]
}
]
}),
forceFit: true,
trackMouseOver: false,
autoWidth:true,
layout:"fit",
autoScroll:true,
viewConfig: {
rowTemplate: tpl,
forceFit:true
/*enableRowBody:true,
showPreview:true,
getRowClass : function(record, rowIndex, p, store){
if(this.showPreview){
p.body = '
';
return 'x-grid3-row-expanded';
}
return 'x-grid3-row-collapsed';
}*/
},
bbar: new Ext.PagingToolbar({
store: ds,
pageSize: 30,
displayInfo:false,
listeners:
{
beforechange: function(){
cooliris_dont_reload = true;
},
change: function(){
cooliris_dont_reload = false;
}
}
})
});
//grid.getColumnModel().setHidden(1, true)
//Ext.util.Observable.capture(grid, function(e){console.info(e)});
/*grid.addListener({
'cellclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
var record = grid.getStore().getAt(rowIndex);
var ID = record.get('ID');
filter_setting("album",ID);
},
scope : this
}
});// end grid.addListener*/
ds.load({params:{start: 0, limit: 30}});
return grid;
}
// *******************************************************************
//
// ARTIST LIST
//
// *******************************************************************
function artist_list() {
var title = 'Artists';
var alias = "artist";
var ds = new Ext.data.JsonStore({
url:'grid/get_list_data.php?type=' + alias,
id: 'id',
totalProperty: 'total',
root: 'data',
fields: [
{name:'ID'},
{name:'name'},
{name:'loaded'}
],
sortInfo: {field: 'name', direction: 'ASC'},
remoteSort: true
});
function changeView(item, checked) {
var tpl;
if (checked) {
if (item.type == 'giant')
{
grid.removeClass("mediumCover");
grid.removeClass("tinyCover");
grid.removeClass("noCover");
grid.addClass("giantCover");
cp.set("artist_list_template","giantCover");
}
else if (item.type == 'medium')
{
grid.addClass("mediumCover");
grid.removeClass("tinyCover");
grid.removeClass("noCover");
grid.removeClass("giantCover");
cp.set("artist_list_template","mediumCover");
}
else if (item.type == 'tiny')
{
grid.removeClass("mediumCover");
grid.addClass("tinyCover");
grid.removeClass("noCover");
grid.removeClass("giantCover");
cp.set("artist_list_template","tinyCover");
}
else
{
grid.removeClass("mediumCover");
grid.removeClass("tinyCover");
grid.addClass("noCover");
grid.removeClass("giantCover");
cp.set("artist_list_template","noCover");
}
}
}
var expander = new Ext.grid.RowExpander({
remoteDataMethod : function(record,index) {
//grid.selModel.deselectRow(index);
if(!record.get("loaded"))
{
Ext.get("filter_panelID").mask('Loading album-info');
Ext.Ajax.request({
url: 'get_albums.php?ID=' + record.get("ID"),
success: function(xhr, options){
record.set("loaded",true);
record.set("alben",xhr.responseText);
record.commit();
document.getElementById('remData'+index).innerHTML = xhr.responseText;
Ext.get("filter_panelID").unmask();
}
});
}
else
document.getElementById('remData'+index).innerHTML = record.get("alben");
}
});
var cm = new Ext.grid.ColumnModel([
expander,
{dataIndex: 'name', sortable: true, menuDisabled: true, header: 'Name'}
]);
cm.defaultSortable = true;
var tpl_name = cp.get("artist_list_template","giantCover");
var grid = new Ext.grid.GridPanel({
id: alias + "_list",
title: title,
header: true,
border: false,
iconCls: 'icon-artist',
cls: tpl_name,
ds: ds,
cm: cm,
tbar: new Ext.Toolbar({
items: [{
tooltip: 'change view',
iconCls: 'icon-view',
menu: [{
group: 'view',
checkHandler: changeView,
checked: tpl_name=="giantCover",
text: 'large cover',
type: 'giant'
},{
group: 'view',
checkHandler: changeView,
checked: tpl_name=="mediumCover",
text: 'medium cover',
type: 'medium'
},{
group: 'view',
checkHandler: changeView,
checked: tpl_name=="tinyCover",
text: 'small cover',
type: 'tiny'
},{
group: 'view',
checkHandler: changeView,
checked: tpl_name=="noCover",
text: 'list',
type: 'list'
}]
}]
}),
enableColLock: false,
loadMask: true,
plugins: [expander,new Ext.ux.grid.Search({
iconCls:'icon-zoom',
searchText:'
',
readonlyIndexes:[],
disableIndexes:[],
no_button: true,
position: "top",
minChars:1,
autoFocus:true
// ,menuStyle:'radio'
})],
forceFit: true,
trackMouseOver: false,
autoWidth:true,
layout:'fit',
autoScroll:true,
viewConfig: {
forceFit:true
},
listeners: {
'beforerowselect': function()
{
if(from_cellclick)
return true;
else
return false;
}
},
bbar: new Ext.PagingToolbar({
store: ds,
pageSize: 30,
displayInfo:false
})
});
//grid.getColumnModel().setHidden(1, true)
grid.addListener({
'cellclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
if(columnIndex)
{
from_cellclick = true;
grid.selModel.selectRow(rowIndex);
from_cellclick = false
if (last_selected_album_from_artist)
last_selected_album_from_artist.className = 'album_from_artist_entry';
var record = grid.getStore().getAt(rowIndex);
var ID = record.get('ID');
filter_setting("artist",ID);
}
},
scope : this
}
});// end grid.addListener
ds.load({params:{start: 0, limit: 30}});
return grid;
}
// *******************************************************************
//
// MP3 LIST
//
// *******************************************************************
function mp3_list() {
//var title = 'MP3-list';
var title = '';
var alias = "mp3";
var last_filter = "";
var sort_array = new Array(0);
var sort_dir_array = new Array(0);
var actions = new Ext.ux.grid.RowActions({
header:' ',
actions:[
{
iconCls:'icon-extras',
tooltip:'Extras'
}
, {
iconCls:'icon-add-to-playlist',
tooltip:'Add to playlist'
}
],
listeners:
{
action: function(grid, record, action, row, col) {
switch(action)
{
case "icon-extras":
var menu = extras_menu(record.data,"mp3_list");
var cell = grid.getView().getCell(row,col);
menu.show(Ext.get(cell));
break;
case "icon-add-to-playlist":
var pl = Ext.getCmp("playlist_selectionID");
if(pl.selectedIndex>=0)
var userID = pl.store.data.items[pl.selectedIndex].data.userID;
else
var userID = 0;
if(pl.getValue()<=0 || 1 || (userID == 2 && 1))
{
var store = Ext.getCmp("playlistID").getStore();
// Search for duplicates
var foundItem = store.find('title', record.data.title);
// if not found
if (foundItem == -1) {
store.add(record);
player_obj.save_playlist();
}
}
else
{
Ext.MessageBox.show({
title: 'Error',
msg: 'you are not allowed to add songs to this playlist',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
}
break;
}
}
}
}
);
var proxy = new Ext.data.HttpProxy({
api: {
read: 'grid/get_list_data.php?type=' + alias,
update: 'save_rating.php'
}
});
var writer = new Ext.data.JsonWriter({
encode: true
});
var ds = new Ext.data.Store({
proxy: proxy,
writer: writer,
autoSave: true,
reader: new Ext.data.JsonReader({
successProperty: 'success',
idProperty: 'ID',
totalProperty: 'total',
root: 'data'
}, [
{name:'ID'},
{name:'filename'},
{name:'filemtime', type: 'date', dateFormat: 'timestamp'},
{name:'fileatime', type: 'date', dateFormat: 'timestamp'},
{name:'title'},
{name:'artist'},
{name:'artistID'},
{name:'album'},
{name:'albumID'},
{name:'genre'},
{name:'rating'},
{name:'comment'},
{name:'year'},
{name:'track'},
{name:'filesize'},
{name:'duration'},
{name:'full_path'},
{name:'num_downloads'},
{name:'num_plays'},
{name:'bit_rate'}
]),
listeners:
{
load: function()
{
//var p = Ext.getCmp("mp3_list").bottomToolbar.myinit();
var length = queryStore.length;
if(history_position>=length)
{
queryStore[length] = new Array();
queryStore[length]["albumID"] = this.baseParams.albumID;
queryStore[length]["artistID"] = this.baseParams.artistID;
queryStore[length]["letter_filter"] = this.baseParams.letter_filter;
queryStore[length]["field_filter"] = this.baseParams.field_filter;
queryStore[length]["fields"] = this.baseParams.fields;
queryStore[length]["query"] = this.baseParams.query;
queryStore[length]["full_text_search"] = this.baseParams.full_text_search;
queryStore[length]["limit"] = this.lastOptions.params.limit;
queryStore[length]["start"] = this.lastOptions.params.start;
}
history_button_status();
player_obj.stop_playlist = true;
}
},
sortInfo: {field: 'title', direction: 'ASC'},
remoteSort: true
});
/*var filters = new Ext.grid.GridFilters({
filters:[
{type: 'string', dataIndex: 'filename'},
{type: 'string', dataIndex: 'title'},
{type: 'string', dataIndex: 'artist'},
{type: 'string', dataIndex: 'album'},
{type: 'string', dataIndex: 'genre'},
{type: 'string', dataIndex: 'year'},
{type: 'string', dataIndex: 'track'},
{type: 'numeric', dataIndex: 'num_downloads'},
{type: 'numeric', dataIndex: 'num_plays'},
{type: 'numeric', dataIndex: 'bit_rate'}
]});*/
/*var cellActions = new Ext.ux.grid.CellActions({
listeners:{
action:function(grid, record, action, value) {
//Ext.ux.Toast.msg('Event: action', 'You have clicked: {0}, action: {1}', value, action);
}
,beforeaction:function() {
//Ext.ux.Toast.msg('Event: beforeaction', 'You can cancel the action by returning false from this event handler.');
}
}
,callbacks:{
'icon-artist-go':function(grid, record, action, value) {
var ID = record.get("artistID");
filter_setting("artist",ID);
},
'icon-album-go':function(grid, record, action, value) {
var ID = record.get("albumID");
filter_setting("album",ID);
},
'icon-go-to-folder':function(grid, record, action, value) {
open_path(record.get("full_path"));
}
}
,align:'left'
}); */
var rateColumnPlugin = new Ext.ux.grid.RateColumnPlugin({
zeroSensitivity: 0.25,
tickSize: 16
});
var cm = new Ext.grid.ColumnModel([
{ hidden: true, sortable: true, dataIndex: 'filename', header: 'Filename'},
{ hidden: true, sortable: true, dataIndex: 'filemtime', header: 'Last modified on', renderer: Ext.util.Format.dateRenderer('d.m.Y H:i') },
{ hidden: true, sortable: true, dataIndex: 'fileatime', header: 'Added on', renderer: Ext.util.Format.dateRenderer('d.m.Y H:i') },
{dataIndex: 'title', sortable: true, header: 'Title'},
{dataIndex: 'artist', sortable: true, header: 'Artist', renderer: renderArtist/*, cellActions:[
{
iconCls:'icon-artist-go',
qtip:'Files von diesem Interpreten auflisten'
}]*/},
{dataIndex: 'album', sortable: true, header: 'Album', renderer: renderAlbum/*, cellActions:[
{
iconCls:'icon-album-go',
qtip:'Files von diesem Album auflisten'
}]*/},
{hidden: true, sortable: true, dataIndex: 'genre', header: 'Genre', width: 50},
{hidden: true, sortable: true, dataIndex: 'comment', header: 'comment', width: 50},
{hidden: true, sortable: true, dataIndex: 'year', header: 'year', width: 30},
{dataIndex: 'track', sortable: true, header: '#', width: 20},
{hidden: true, sortable: true, dataIndex: 'filesize', header: 'Size', width: 40, renderer: renderFilesize, align: 'right'},
{dataIndex: 'duration', sortable: true, header: 'Length', width: 30, renderer: GridRenderDuration, align: 'right'},
{dataIndex: 'full_path', sortable: true, header: 'Path' , renderer: renderPath/*, cellActions:[
{
iconCls:'icon-go-to-folder',
qtip:'Zum Ordner'
}]*/},
{hidden: true, sortable: true, dataIndex: 'num_plays', header: 'played', width: 30, renderer: renderNumber, align: 'right'},
{hidden: true, sortable: true, dataIndex: 'bit_rate', header: 'Bit-rate', width: 30, renderer: renderBitrate, align: 'right'},
{header: 'rating', sortable: true, dataIndex: 'rating', width: 100, renderer: rateColumnPlugin.createRenderer(5)}
,actions
]);
cm.defaultSortable = true;
function history_jump()
{
var store = Ext.getCmp("mp3_list").getStore();
delete(store.baseParams["albumID"]);
delete(store.baseParams["artistID"]);
delete(store.baseParams["letter_filter"]);
delete(store.baseParams["query"]);
delete(store.baseParams["fields"]);
delete(store.baseParams["full_text_search"]);
delete(store.baseParams["full_path"]);
if (store.lastOptions && store.lastOptions.params) {
delete(store.lastOptions.params["albumID"]);
delete(store.lastOptions.params["artistID"]);
delete(store.lastOptions.params["letter_filter"]);
delete(store.lastOptions.params["query"]);
delete(store.lastOptions.params["fields"]);
delete(store.lastOptions.params["full_text_search"]);
delete(store.lastOptions.params["full_path"]);
}
store.baseParams.albumID = queryStore[history_position]["albumID"];
store.baseParams.artistID = queryStore[history_position]["artistID"];
store.baseParams.letter_filter = queryStore[history_position]["letter_filter"];
store.baseParams.field_filter = queryStore[history_position]["field_filter"];
store.baseParams.query = queryStore[history_position]["query"];
store.baseParams.fields = queryStore[history_position]["fields"];
store.baseParams.full_text_search = queryStore[history_position]["full_text_search"];
Ext.getCmp("main_search_fieldID").setValue(queryStore[history_position]["query"]);
Ext.getCmp("main_search_full_text_fieldID").setValue(queryStore[history_position]["full_text_search"]);
Ext.getCmp("pageSizeID").setValue(queryStore[history_position]["limit"]);
store.lastOptions.params[store.paramNames.limit] = queryStore[history_position]["limit"];
store.lastOptions.params[store.paramNames.start] = queryStore[history_position]["start"];
store.reload();
}
function history_button_status()
{
if(history_position==0)
Ext.getCmp("history_back").disable();
else
Ext.getCmp("history_back").enable();
if((queryStore.length-1)>history_position)
Ext.getCmp("history_forward").enable();
else
Ext.getCmp("history_forward").disable();
}
function letter_filter(letter)
{
if(Ext.getCmp('button_filter[' + last_filter + ']'))
Ext.getCmp('button_filter[' + last_filter + ']').toggle(false);
if(letter)
Ext.getCmp('button_filter[]').toggle(false);
Ext.getCmp('button_filter[' + letter + ']').toggle(true);
last_filter = letter;
filter_setting("letter",letter);
}
var filter_store_data = [
['filename','Filename'],
['title','Title'],
['artist','Artist'],
['album','Album'],
['genre','Genre']
];
// create the data store
var filter_store = new Ext.data.SimpleStore({
fields: [
{name: 'value'},
{name: 'text'}
]
});
filter_store.loadData(filter_store_data);
var grid = new Ext.grid.GridPanel({
ddGroup: 'PlaylistDDGroup',
enableDragDrop: true,
border: false,
id: alias + "_list",
title: title,
ds: ds,
cm: cm,
enableColLock: false,
loadMask: true,
enableHdMenu: false,
tbar: [ { iconCls: 'icon-left', id: 'history_back', disabled: 'true', text: 'Back', handler: function(){
history_position = history_position - 1;
history_jump();
// back
}},
{ iconCls: 'icon-right', id: 'history_forward', disabled: 'true', text: 'Forward', handler: function(){
history_position = history_position + 1;
history_jump();
// forward
}},
new Ext.menu.Separator(),
'Filter on: ',
new Ext.form.ComboBox({
id:'field_filter',
store: filter_store,
forceSelection: true,
valueField:'value',
displayField:'text',
typeAhead: true,
mode: 'local',
value: 'artist',
allowBlank: false,
triggerAction: 'all',
emptyText:'Please choose a filter...',
selectOnFocus:true,
onSelect: function(record, index)
{
if(this.fireEvent('beforeselect', this, record, index) !== false)
{
var v = this.getValue();
this.setValue(record.data[this.valueField || this.displayField]);
this.collapse();
this.fireEvent('select', this, record, index);
if (v != this.getValue()){
this.fireEvent('change', this, this.getValue(), v);
}
}
letter_filter(last_filter);
},
width:100
}),
{ enableToggle: true, text: 'All', id: 'button_filter[]', pressed: true, handler : function(){ letter_filter(''); }},
{ enableToggle: true, text: '!', id: 'button_filter[!]', handler : function(){ letter_filter('!'); }},
{ enableToggle: true, text: '#', id: 'button_filter[#]', handler : function(){ letter_filter('#'); }},
{ enableToggle: true, text: 'A', id: 'button_filter[a]', handler : function(){ letter_filter('a'); }},
{ enableToggle: true, text: 'B', id: 'button_filter[b]', handler : function(){ letter_filter('b'); }},
{ enableToggle: true, text: 'C', id: 'button_filter[c]', handler : function(){ letter_filter('c'); }},
{ enableToggle: true, text: 'D', id: 'button_filter[d]', handler : function(){ letter_filter('d'); }},
{ enableToggle: true, text: 'E', id: 'button_filter[e]', handler : function(){ letter_filter('e'); }},
{ enableToggle: true, text: 'F', id: 'button_filter[f]', handler : function(){ letter_filter('f'); }},
{ enableToggle: true, text: 'G', id: 'button_filter[g]', handler : function(){ letter_filter('g'); }},
{ enableToggle: true, text: 'H', id: 'button_filter[h]', handler : function(){ letter_filter('h'); }},
{ enableToggle: true, text: 'I', id: 'button_filter[i]', handler : function(){ letter_filter('i'); }},
{ enableToggle: true, text: 'J', id: 'button_filter[j]', handler : function(){ letter_filter('j'); }},
{ enableToggle: true, text: 'K', id: 'button_filter[k]', handler : function(){ letter_filter('k'); }},
{ enableToggle: true, text: 'L', id: 'button_filter[l]', handler : function(){ letter_filter('l'); }},
{ enableToggle: true, text: 'M', id: 'button_filter[m]', handler : function(){ letter_filter('m'); }},
{ enableToggle: true, text: 'N', id: 'button_filter[n]', handler : function(){ letter_filter('n'); }},
{ enableToggle: true, text: 'O', id: 'button_filter[o]', handler : function(){ letter_filter('o'); }},
{ enableToggle: true, text: 'P', id: 'button_filter[p]', handler : function(){ letter_filter('p'); }},
{ enableToggle: true, text: 'Q', id: 'button_filter[q]', handler : function(){ letter_filter('q'); }},
{ enableToggle: true, text: 'R', id: 'button_filter[r]', handler : function(){ letter_filter('r'); }},
{ enableToggle: true, text: 'S', id: 'button_filter[s]', handler : function(){ letter_filter('s'); }},
{ enableToggle: true, text: 'T', id: 'button_filter[t]', handler : function(){ letter_filter('t'); }},
{ enableToggle: true, text: 'U', id: 'button_filter[u]', handler : function(){ letter_filter('u'); }},
{ enableToggle: true, text: 'V', id: 'button_filter[v]', handler : function(){ letter_filter('v'); }},
{ enableToggle: true, text: 'W', id: 'button_filter[w]', handler : function(){ letter_filter('w'); }},
{ enableToggle: true, text: 'X', id: 'button_filter[x]', handler : function(){ letter_filter('x'); }},
{ enableToggle: true, text: 'Y', id: 'button_filter[y]', handler : function(){ letter_filter('y'); }},
{ enableToggle: true, text: 'Z', id: 'button_filter[z]', handler : function(){ letter_filter('z'); }}
],
height: 10000,
plugins: [rateColumnPlugin,new Ext.ux.grid.AutoSizeColumns(),new Ext.ux.grid.Search({
iconCls:'icon-zoom',
readonlyIndexes:[],
searchText: 'substring',
checkIndexes: ['title','artist','album'],
tbPosition: 11,
checkIndexes: cp.get("query_fields",'all'),
disableIndexes:['filesize','duration','filemtime','fileatime','num_downloads','num_plays','bit_rate','rating'],
minChars:1,
myid: 'main_search_fieldID',
autoFocus:true
// ,menuStyle:'radio'
}), new Ext.ux.grid.Search({
iconCls:'icon-zoom',
readonlyIndexes:[],
searchText: 'fulltext: ',
tbPosition: 11,
paramNames: {
fields:'fields',
query:'full_text_search',
from:'fulltext'
},
no_button: true,
disableIndexes:['filesize','duration','filemtime','fileatime','num_downloads','num_plays','bit_rate'],
minChars:4,
myid: 'main_search_full_text_fieldID',
autoFocus:true
// ,menuStyle:'radio'
}), new Ext.ux.grid.GridViewMenuPlugin, actions],
forceFit: true,
trackMouseOver: true,
autoWidth:true,
viewConfig: {
forceFit:true
},
keys:
{
key: 'a',
ctrl: true,
stopEvent: true,
handler: function() {
grid.getSelectionModel().selectAll();
}
},
bbar: new Ext.PagingToolbar({
store: ds,
pageSize: 50,
displayMsg: "{2} entries",
displayInfo:true,
listeners:
{
beforechange: function()
{
history_position++;
queryStore = cut_array_to_n_elements(queryStore,history_position);
}
},
plugins: [
/*new Ext.ux.SlidingPager(),*/
new Ext.ux.Andrie.pPageSize({
beforeText: "Show",
afterText: "entries"
}
)
]
}),
listeners:
{
sortchange: function(g,sort)
{
},
render: function()
{
/*var tbar2 = new Ext.Toolbar({
renderTo:Ext.getCmp("mp3_list").tbar,
items:[
{ iconCls: 'icon-left', id: 'history_back', disabled: 'true', text: 'Back', handler: function(){
history_position = history_position - 1;
history_jump();
// back
}},
{ iconCls: 'icon-right', id: 'history_forward', disabled: 'true', text: 'Forward', handler: function(){
history_position = history_position + 1;
history_jump();
// forward
}}
]
}); */
}
}
});
//grid.getColumnModel().setHidden(1, true)
Ext.apply(grid,{
});
grid.addListener({
'celldblclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
var record = grid.getStore().getAt(rowIndex);
var ID = record.get('ID');
record.data.num_plays = parseInt(record.data.num_plays) + 1;
record.commit();
player_obj.new_source("mp3_list");
player_obj.play_index(rowIndex);
},
scope : this
}
});// end grid.addListener
grid.addListener({
'cellclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
//Ext.getCmp("mp3_list").selModel.clearSelections();
//Ext.getCmp("mp3_list").selModel.selectRow(rowIndex);
if(!player_obj.currently_playingID)
{
Ext.getCmp("playlistID").selModel.clearSelections();
player_obj.new_source("mp3_list");
}
},
scope : this
}
});// end grid.addListener
ds.load({params:{start: 0, limit: 50}});
return grid;
}
// *******************************************************************
//
// PLAY LIST
//
// *******************************************************************
function play_list() {
var alias = "playlist";
var no_playlist_saving = false;
var actions = new Ext.ux.grid.RowActions({
header:' ',
getData:function(value, cell, record, row, col, store) {
var pl = Ext.getCmp("playlist_selectionID");
if(pl.selectedIndex>=0)
var userID = pl.store.data.items[pl.selectedIndex].data.userID;
else
var userID = 0;
if(!(1 || pl.getValue()<=0 || (userID == 2 && 1)))
return {
hideIndexCls: 1
};
else
return {
hideIndexCls: false
};
//return record.data || {};
},
actions:[
{
iconCls:'icon-extras',
tooltip:'Extras'
}
, {
iconCls:'icon-delete',
tooltip:'Delete',
hideIndex: 'hideIndexCls'
}
],
listeners:
{
action: function(grid, record, action, row, col) {
switch(action)
{
case "icon-extras":
var menu = extras_menu(record.data,"playlist");
var cell = grid.getView().getCell(row,col);
menu.show(Ext.get(cell));
break;
case "icon-delete":
var store = Ext.getCmp("playlistID").getStore();
/*if(record.data.ID == player_obj.currently_playingID && player_obj.source == "playlist")
{
if(store.data.length==1)
player_obj.stop_playing();
else
player_obj.prev_next(1);
}*/
store.remove(record);
enable_disable_buttons();
//player_obj.save_playlist();
}
}
}
}
);
var proxy = new Ext.data.HttpProxy({
api: {
read: 'grid/get_list_data.php?type=' + alias,
update: 'save_rating.php'
}
});
var writer = new Ext.data.JsonWriter({
encode: true
});
var ds = new Ext.data.Store({
proxy: proxy,
writer: writer,
autoSave: true,
reader: new Ext.data.JsonReader({
successProperty: 'success',
idProperty: 'ID',
totalProperty: 'total',
root: 'data'
}, [
{name:'ID'},
{name:'filename'},
{name:'filemtime', type: 'date', dateFormat: 'timestamp'},
{name:'fileatime', type: 'date', dateFormat: 'timestamp'},
{name:'title'},
{name:'artist'},
{name:'artistID'},
{name:'album'},
{name:'albumID'},
{name:'genre'},
{name:'rating'},
{name:'comment'},
{name:'year'},
{name:'track'},
{name:'filesize'},
{name:'duration'},
{name:'full_path'},
{name:'num_downloads'},
{name:'num_plays'},
{name:'bit_rate'},
{name:'sort_order'}
]),
listeners:
{
load: function()
{
player_obj.stop_playlist = true;
}
}
});
var rateColumnPlugin = new Ext.ux.grid.RateColumnPlugin({
zeroSensitivity: 0.25,
tickSize: 16
});
var cm = new Ext.grid.ColumnModel([
{dataIndex: 'track', sortable: true, header: '#', width: 20},
{ hidden: true, sortable: true, dataIndex: 'filename', header: 'Filename'},
{ hidden: true, sortable: true, dataIndex: 'filemtime', header: 'Last modified on', renderer: Ext.util.Format.dateRenderer('d.m.Y H:i') },
{ hidden: true, sortable: true, dataIndex: 'fileatime', header: 'Added on', renderer: Ext.util.Format.dateRenderer('d.m.Y H:i') },
{dataIndex: 'title', sortable: true, header: 'Title'},
{dataIndex: 'artist', sortable: true, header: 'Artist', renderer: renderArtist/*, cellActions:[
{
iconCls:'icon-artist-go',
qtip:'Files von diesem Interpreten auflisten'
}]*/},
{ hidden: true, sortable: true, dataIndex: 'album', header: 'Album', renderer: renderAlbum/*, cellActions:[
{
iconCls:'icon-album-go',
qtip:'Files von diesem Album auflisten'
}]*/},
{hidden: true, sortable: true, dataIndex: 'genre', header: 'Genre', width: 50},
{hidden: true, sortable: true, dataIndex: 'comment', header: 'comment', width: 50},
{hidden: true, sortable: true, dataIndex: 'year', header: 'year', width: 30},
{hidden: true, sortable: true, dataIndex: 'filesize', header: 'Size', width: 40, renderer: renderFilesize, align: 'right'},
{hidden: true, sortable: true, dataIndex: 'duration', header: 'Length', width: 30, renderer: GridRenderDuration, align: 'right'},
{hidden: true, sortable: true, dataIndex: 'full_path', header: 'Path' , renderer: renderPath/*, cellActions:[
{
iconCls:'icon-go-to-folder',
qtip:'Zum Ordner'
}]*/},
{hidden: true, sortable: true, dataIndex: 'num_plays', header: 'played', width: 30, renderer: renderNumber, align: 'right'},
{hidden: true, sortable: true, dataIndex: 'bit_rate', header: 'Bit-rate', width: 30, renderer: renderBitrate, align: 'right'},
/*{dataIndex: 'duration', header: 'Länge', width: 30, renderer: GridRenderDuration, align: 'right', sortable: false},*/
{header: 'rating', sortable: true, dataIndex: 'rating', width: 100, renderer: rateColumnPlugin.createRenderer(5)}
,actions
]);
cm.defaultSortable = true;
var grid = new Ext.grid.GridPanel({
ddGroup: 'PlaylistDDGroup',
enableDragDrop: true,
id: "playlistID",
ds: ds,
cm: cm,
enableHdMenu: false,
tbar: [
new Ext.form.ComboBox({
fieldLabel: 'Playlist',
id: 'playlist_selectionID',
hiddenName:'ID',
tpl: '{name}
',
store:new Ext.data.JsonStore({
url: 'json.data.php',
root: 'rows',
baseParams: {tab: 'playlist',no_assign: 1, addnobody: 1, nobody_text: 'none'},
fields: ['ID', 'name', 'tooltip','class_add','userID'],
autoLoad: true,
listeners:
{
load: function()
{
Ext.getCmp("playlist_selectionID").setValue(0);
}
}
}),
valueField:'ID',
displayField:'name',
forceSelection: true,
typeAhead: true,
mode: 'local',
triggerAction: 'all',
emptyText:'Choose playlist',
selectOnFocus:true,
width:160,
listWidth: 230,
onSelect: function(record, index)
{
if(this.fireEvent('beforeselect', this, record, index) !== false)
{
var v = this.getValue();
this.setValue(record.data[this.valueField || this.displayField]);
this.collapse();
this.fireEvent('select', this, record, index);
if (v != this.getValue()){
this.fireEvent('change', this, this.getValue(), v);
}
}
var store = Ext.getCmp("playlistID").getStore();
if(store.lastOptions && store.lastOptions.params)
store.lastOptions.params[store.paramNames.start] = 0;
store.baseParams.playlistID = this.getValue();
//enable_disable_buttons();
no_playlist_saving = true;
store.setDefaultSort("sort_order","ASC");
grid.getView().updateHeaderSortState();
grid.getView().updateHeaders();
store.reload(
{
callback: function()
{
enable_disable_buttons();
}
}
);
no_playlist_saving = false;
}
})
,
{
iconCls: 'icon-playlist-menu', // <-- icon
menu: [
{
id: "playlist_add_buttonID",
iconCls:'icon-add',
text: 'Create new playlist',
handler: create_playlist
},
{
disabled: true,
id: "playlist_edit_buttonID",
iconCls:'icon-edit',
text: 'Edit playlist',
handler: edit_playlist
},
{
disabled: true,
id: "playlist_delete_buttonID",
iconCls:'icon-delete',
text: 'Delete playlist',
handler: delete_playlist
},
{
disabled: true,
id: "playlist_clear_buttonID",
iconCls:'icon-clear-playlist',
text: 'clear playlist',
handler: clear_playlist
}
]
}
],
enableColLock: false,
loadMask: true,
plugins: [rateColumnPlugin,new Ext.ux.grid.AutoSizeColumns(),new Ext.ux.grid.GridViewMenuPlugin,actions],
forceFit: true,
border: false,
trackMouseOver: false,
autoWidth:true,
layout:'fit',
viewConfig: {
forceFit:true
},
listeners:
{
sortchange: function(g,sort)
{
var store = Ext.getCmp("playlistID").getStore();
store.baseParams.last_sort_field = sort.field;
store.baseParams.last_sort_dir = sort.direction;
},
render: function(g)
{
var ddrow = new Ext.ux.dd.GridReorderDropTarget(g, {
copy: false
,listeners: {
beforerowmove: function(objThis, oldIndex, newIndex, records){
// code goes here
// return false to cancel the move
},
afterrowmove: function(objThis, oldIndex, newIndex, records){
player_obj.save_playlist();
// code goes here
},
beforerowcopy: function(objThis, oldIndex, newIndex, records){
//alert("3");
// code goes here
// return false to cancel the copy
},
afterrowcopy: function(objThis, oldIndex, newIndex, records){
//alert("4");
// code goes here
}
}
});
}
}
});
//grid.getColumnModel().setHidden(1, true)
function enable_disable_buttons()
{
var pl = Ext.getCmp("playlist_selectionID");
if(pl.selectedIndex>=0)
var userID = pl.store.data.items[pl.selectedIndex].data.userID;
else
var userID = 0;
if(Ext.getCmp("playlistID").store.getTotalCount() && pl.getValue()>=0)
{
if(Ext.getCmp("playlist_clear_buttonID")) Ext.getCmp("playlist_clear_buttonID").enable();
}
else
{
if(Ext.getCmp("playlist_clear_buttonID")) Ext.getCmp("playlist_clear_buttonID").disable();
}
if(pl.getValue() && pl.getValue()>0 && (1 || (userID == 2 && 1)))
{
if(Ext.getCmp("playlist_edit_buttonID")) Ext.getCmp("playlist_edit_buttonID").enable();
if(Ext.getCmp("playlist_delete_buttonID")) Ext.getCmp("playlist_delete_buttonID").enable();
}
else
{
if(Ext.getCmp("playlist_edit_buttonID")) Ext.getCmp("playlist_edit_buttonID").disable();
if(Ext.getCmp("playlist_delete_buttonID")) Ext.getCmp("playlist_delete_buttonID").disable();
}
}
function clear_playlist()
{
Ext.Msg.show({
title:'Warning',
msg: 'Are you sure you want to clear this playlist?',
buttons: Ext.Msg.YESNO,
buttonText: Ext.MessageBox.buttonText.yes = 'Yes',
buttonText: Ext.MessageBox.buttonText.no = 'No',
icon: Ext.MessageBox.QUESTION,
fn: function(btn)
{
if(btn=="yes")
{
if(DEMO_MODE)
{
Ext.MessageBox.show({
title: 'Demo-Version',
msg: 'You can not clear playlists in the demo',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
}
else
{
var store = Ext.getCmp("playlistID").getStore().removeAll();
player_obj.save_playlist();
if(Ext.getCmp("playlist_clear_buttonID")) Ext.getCmp("playlist_clear_buttonID").disable();
}
}
}
});
}
function delete_playlist()
{
Ext.Msg.show({
title:'Warning',
msg: 'Are you sure you want to delete this playlist?',
buttons: Ext.Msg.YESNO,
buttonText: Ext.MessageBox.buttonText.yes = 'Yes',
buttonText: Ext.MessageBox.buttonText.no = 'No',
icon: Ext.MessageBox.QUESTION,
fn: function(btn)
{
if(btn=="yes")
{
if(DEMO_MODE)
{
Ext.MessageBox.show({
title: 'Demo-Version',
msg: 'You can not delete playlists in the demo',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
}
else
{
Ext.Ajax.request(
{
url:'playlist_handle.php',
params: { id: Ext.getCmp('playlist_selectionID').getValue(), action: 'delete' },
waitMsg:'Deleting...',
success:function(form, action)
{
Ext.Msg.show({
title: 'Delete',
msg: 'Successfully deleted',
minWidth: 200,
modal: true,
icon: Ext.Msg.INFO,
buttons: Ext.Msg.OK
});
Ext.getCmp('playlist_selectionID').disable();
Ext.getCmp('playlist_selectionID').store.reload(
{
callback: function()
{
Ext.getCmp("playlist_selectionID").setValue(0);
Ext.getCmp('playlist_selectionID').enable();
var store = Ext.getCmp("playlistID").getStore();
if(store.lastOptions && store.lastOptions.params)
store.lastOptions.params[store.paramNames.start] = 0;
store.baseParams.playlistID = 0;
store.reload();
enable_disable_buttons();
}
})
},
failure:function(form,action)
{
Ext.Msg.show({
title: 'Error',
msg: 'Error while trying to delete the playlist',
minWidth: 200,
modal: true,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK
});
}
})
}
}
}
}
)
}
function edit_playlist()
{
Ext.MessageBox.prompt('Edit playlist', 'Please enter a name for the playlist:', function(btn,text)
{
if(btn=="ok")
{
if(!text)
{
Ext.Msg.show({
title: 'Error',
msg: 'You need a name for your playlist',
minWidth: 200,
modal: true,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK
});
}
else
{
if(DEMO_MODE)
{
Ext.MessageBox.show({
title: 'Demo-Version',
msg: 'You can not edit playlists in the demo',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
}
else
{
id = Ext.getCmp("playlist_selectionID").getValue();
Ext.Ajax.request({
url: 'playlist_handle.php',
params: { name: text, action: 'edit',id: id },
success: function( result, options)
{
if(Ext.util.JSON.decode(result.responseText).success)
{
Ext.getCmp("playlist_selectionID").disable();
Ext.getCmp("playlist_selectionID").store.reload({
callback: function() {
Ext.getCmp("playlist_selectionID").setValue(id);
Ext.getCmp("playlist_selectionID").enable();
enable_disable_buttons();
}
});
}
else
{
Ext.Msg.show({
title: 'Error',
msg: Ext.util.JSON.decode(result.responseText).message,
minWidth: 200,
modal: true,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK
});
}
},
failure: function( result, options)
{
alert(result.responseText);
}
});
}
}
}
},'',false,Ext.getCmp("playlist_selectionID").getRawValue());
}
function create_playlist()
{
Ext.MessageBox.prompt('New playlist', 'Please enter a name for the playlist:', function(btn,text)
{
if(btn=="ok")
{
if(!text)
{
Ext.Msg.show({
title: 'Error',
msg: 'You need a name for your playlist',
minWidth: 200,
modal: true,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK
});
}
else
{
if(DEMO_MODE)
{
Ext.MessageBox.show({
title: 'Demo-Version',
msg: 'The demo does not support creating new playlists',
buttons: Ext.MessageBox.OK,
icon: Ext.MessageBox.INFO
});
}
else
{
Ext.Ajax.request({
url: 'playlist_handle.php',
params: { name: text, action: 'create' },
success: function( result, options)
{
if(Ext.util.JSON.decode(result.responseText).success)
{
Ext.getCmp("playlist_selectionID").disable();
Ext.getCmp("playlist_selectionID").store.reload({
callback: function() {
id = Ext.util.JSON.decode(result.responseText).id;
Ext.getCmp("playlist_selectionID").setValue(id);
Ext.getCmp("playlist_selectionID").enable();
var store = Ext.getCmp("playlistID").getStore();
if(store.lastOptions && store.lastOptions.params)
store.lastOptions.params[store.paramNames.start] = 0;
store.baseParams.playlistID = id;
store.reload();
enable_disable_buttons();
}
});
}
else
{
Ext.Msg.show({
title: 'Error',
msg: Ext.util.JSON.decode(result.responseText).message,
minWidth: 200,
modal: true,
icon: Ext.Msg.ERROR,
buttons: Ext.Msg.OK
});
}
},
failure: function( result, options)
{
alert(result.responseText);
}
});
}
}
}
});
}
grid.addListener({
'celldblclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
var record = grid.getStore().getAt(rowIndex);
var ID = record.get('ID');
record.data.num_plays = parseInt(record.data.num_plays) + 1;
record.commit();
player_obj.new_source("playlist");
player_obj.play_index(rowIndex);
},
scope : this
}
});// end grid.addListener
grid.addListener({
'cellclick' : {
fn : function(grid, rowIndex, columnIndex, event) {
//Ext.getCmp("playlistID").selModel.clearSelections();
//Ext.getCmp("playlistID").selModel.selectRow(rowIndex);
if(!player_obj.currently_playingID)
{
Ext.getCmp("mp3_list").selModel.clearSelections();
player_obj.new_source("playlist");
}
},
scope : this
}
});// end grid.addListener
grid.addListener({
'sortchange' : {
fn : function(grid, rowIndex, columnIndex, event) {
if(!no_playlist_saving)
{
player_obj.save_playlist();
}
},
scope : this
}
});// end grid.addListener
ds.load();
return grid;
}