var fb; // fb2k state var br; // file browser state var br_offsets = {}; // directory scroll offsets var library; var aa = new Object; // albumart image var windows_list = {}; // opened dialog windows list var isworking = false; // true while doing something network related var settingtabs = false; // true when mangling with playlist tabs var timeoutid, timeoutid2; var npid; var brparams = new Object; var keypressed = {}; var input_has_focus = false; var refresh_interval = 1000; // ms,.data retrieval interval, (not supposed to be changed) var mouse = { x: 0, y: 0, down: false, reset: function() { this.down = false; } } var drag = { start: null, end: null, dragging: false, timeout: null, pageshift: 0, reset: function() { this.dragging = false; this.pageshift = 0; clearTimeout(this.timeout); } }; var selection = { items: {}, count: 0, lowest: 0, highest: 0, length: 0, calc: function () { var count = 0; var lowest = fb.playlistItemsCount; var highest = 0; var length = 0; $.each(this.items, function(k,v) { if (v) { k = parseInt(k); if (!isNaN(k)) { if (k < lowest) lowest = k; if (k > highest) highest = k; var pr = fb.playlist[k-(fb.playlistPage-1)*fb.playlistItemsPerPage]; if (pr) { len = parseInt(pr.ls); if (!(isNaN(len))) length += len; } ++count; } } }); this.count = count; this.lowest = lowest; this.highest = highest; this.length = length; }, tostr: function (shift) { var shift = shift || 0; var result = ''; $.each(this.items, function(k,v) { if (v) { if (result) result += ','; result += (parseInt(k)+shift); } }); return result; }, reset: function () { this.items = {}; this.count = 0; } } var tooltip = { show: function(text, l, t) { $('#tooltip').text(text); if (t && l) $('#tooltip').css( { position: 'absolute', left: l, top: t } ).show(); }, hide: function() { $('#tooltip').hide(); } } jQuery.cookie = function(name, value, options) { /** * Cookie plugin * * Copyright (c) 2006 Klaus Hartl (stilbuero.de) * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ if (typeof value != 'undefined') { // name and value given, set cookie options = options || {}; if (value === null) { value = ''; options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE } // CAUTION: Needed to parenthesize options.path and options.domain // in the following expressions, otherwise they evaluate to undefined // in the packed version for some reason... var path = options.path ? '; path=' + (options.path) : ''; var domain = options.domain ? '; domain=' + (options.domain) : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { // only name given, get cookie var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } }; function promptf(msg, value) { input_has_focus = true; var result = prompt(msg, value); input_has_focus = false; return result; } /* This script and many more are available free online at The JavaScript Source!! http://javascript.internet.com Created by: Justas | http://www.webtoolkit.info/ */ var Url = { // public method for URL encoding encode : function (string) { return escape(this._utf8_encode(string)); }, // public method for URL decoding decode : function (string) { return this._utf8_decode(unescape(string)); }, // private method for UTF-8 encoding _utf8_encode : function (string) { if (!string) return ''; string = string.replace(/\r\n/g,"\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }, // private method for UTF-8 decoding _utf8_decode : function (utftext) { if (!utftext) return ''; var string = ""; var i = 0; var c = c1 = c2 = 0; while ( i < utftext.length ) { c = utftext.charCodeAt(i); if (c < 128) { string += String.fromCharCode(c); i++; } else if((c > 191) && (c < 224)) { c2 = utftext.charCodeAt(i+1); string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); i += 2; } else { c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2); string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } } return string; } } function getnumfromid(id) { return parseInt(id.substr(1, id.length-1)); } function gettickcount() { var now = new Date(); var ticks = now.getTime(); return ticks; } var stripXmlEntities = { values: {}, regexp: null, init: function() { this.values['''] = "'"; this.values['\'] = "\\"; this.values['"'] = '"'; this.values['>'] = '>'; this.values['<'] = '<'; this.values['&'] = '&'; var regexp_str = new String; jQuery.each(this.values, function(k, v) { if (regexp_str != '') regexp_str += '|'; else regexp_str = '('; regexp_str += k; }); regexp_str += ')'; this.regexp = new RegExp(regexp_str, "g"); }, perform: function(str) { return str.replace(this.regexp, function (val) { return stripXmlEntities.values[val]; }); } } stripXmlEntities.init(); function save_window_to_cookie(wnd, state) // stores state of a window (opened/closed) in the cookie { windows_list[wnd] = state; var windows = new Array(); jQuery.each(windows_list, function(k, v) { if (v) windows.push(k); }); $.cookie('windows', windows.join('.'), { expires: 365, path: '/'} ); } function reopen_windows() // restores open windows { if (isworking || !fb || fb && (fb.isPlaying == '1' && fb.helper1 == '') ) // try again if something is loading while we're trying to mangle with windows { setTimeout('reopen_windows()', 500); } else { var cookie = $.cookie('windows'); if (cookie) { var values = cookie.split('.'); jQuery.each(values, function(k,v) { switch (v) { case 'pbs_dlg': $('#pbs_btn').click(); break; case 'aa_pane': $('#aa_btn').click(); break; case 'browse_dlg': $('#browse_btn').click(); break; case 'search_dlg': $('#search_btn').click(); break; }; }); } } } function restore_playlist_size() { if (isworking || !fb) setTimeout('restore_playlist_size()', 250); else { var cookie = $.cookie('pl_size'); if (cookie) { var pl_size = cookie.split('.'); if (pl_size.length == 2) { var diff = $('#tabs').width() - parseInt(pl_size[0]); $('#tabs').width(parseInt(pl_size[0])); $('#progressbar').width($('#progressbar').width()-diff); if (fb.playlistItemsPerPage != pl_size[1]) retrievestate('PlaylistItemsPerPage', pl_size[1]); } } } } function save_playlist_size(rows) { if (fb) { rows = rows || fb.playlistItemsPerPage; $('#tabs').height('auto'); $.cookie('pl_size', [$('#tabs').width(), rows].join('.'), { expires: 365, path: '/'} ); } } function set_playlist_rowcount(rows) { if (!isNaN(rows)) { save_playlist_size(rows); $('#tabs').height('auto'); retrievestate('PlaylistItemsPerPage', rows); } } function get_values_from_cookie(name) // array of left, top, width, height { var cookie = $.cookie(name); var values = ['auto', 'auto', 'auto', 'auto']; if (cookie) { var values_cookie = cookie.split('.'); for (var i = 0; i < values_cookie.length && i < values.length; ++i) if (!isNaN(values_cookie[i])) values[i] = parseInt(values_cookie[i]); } return values; } function save_dialog_position_to_cookie(name, ui) { var values = get_values_from_cookie(name); if (ui.position) { values[0] = Math.abs(Math.round(ui.position.left)); values[1] = Math.abs(Math.round(ui.position.top)); } if (ui.size) { values[2] = Math.abs(Math.round(ui.size.width)); values[3] = Math.abs(Math.round(ui.size.height)); } $.cookie(name, values.join('.'), { expires: 365, path: '/'} ); } function save_div_position_to_cookie(name) { var values = get_values_from_cookie(name); var div = document.getElementById(name); if (div) { values[0] = Math.round(div.offsetLeft); values[1] = Math.round(div.offsetTop); values[2] = Math.round(div.offsetWidth); values[3] = Math.round(div.offsetHeight); } $.cookie(name, values.join('.'), { expires: 365, path: '/'} ); } function set_dialog_state(dlg, values) { if (values && (values.length == 4)) { dlg.dialog('option', 'position', [values[0],values[1]]); if (values[2] != 'auto') dlg.dialog('option', 'width', values[2]); if (values[3] != 'auto') dlg.dialog('option', 'height', values[3]); } else positiondialog(dlg, mouse.x, mouse.y+15); } function blink_dialog(dlg) { if (dlg.dialog('isOpen')) { dlg.dialog('close'); dlg.dialog('open'); } } function checkhotkeys(code) { if (selection.count) { switch (code) { case 81: // q $('#QueueItems').click(); break; case 87: // w $('#DequeueItems').click(); break; case 46: // del $('#Del').click(); break; default: } } switch (code) { case 85: // u $('#Undo').click(); break; case 82: // r $('#Redo').click(); break; case 32: // space $('#PlayOrPause').click(); break; case 70: // f $('#FocusOnPlaying').click(); break; case 83: // s $('#SAC').click(); break; case 34: // PageUp case 33: // PageDown if (keypressed[16] && fb) // shift set_playlist_rowcount(parseInt(fb.playlistItemsPerPage) + parseInt(code == 33?-1:1)); break; default: } } function keydown(e) { if (e == 16 || e == 17) // shift or ctrl keypressed[e] = gettickcount(); else if (!input_has_focus) checkhotkeys(e); } function keyup(e) { keypressed[e] = 0; } function startwork() { isworking = true; $("#loading").css("visibility", "visible"); } function finishwork() { isworking = false; $("#loading").css("visibility", "hidden"); } function pad(str, chr, count) { var str_out = str.toString(); while (str_out.length < count) str_out = chr + str_out; return str_out; } function format_time(time) { hours = Math.floor(time / 3600); mins = Math.floor((time-hours*3600) / 60); secs = pad(time % 60, '0', 2); if (hours) return [hours, pad(mins, '0', 2), secs].join(':'); else return [mins, secs].join(':'); } function select_album(pitem) { if (!keypressed[16]) selection.reset(); var shift = (fb.playlistPage-1)*fb.playlistItemsPerPage; var artist = ''; var album = ''; var len = fb.playlist.length; for (var i = pitem - shift,k = (fb.playlistPage-1)*fb.playlistItemsPerPage + pitem - shift; i < len; ++i,++k) { var row = fb.playlist[i]; if (artist == '' && album == '') { artist = row.a; album = row.b; } if (artist == row.a && album == row.b) selection.items[k] = true; else break; } updateplaylist(); } function volume_from_slider(ui) { var dbcommand; var msg = ''; if (ui.value == 0) // mute { msg = 'Mute'; dbcommand = 1000; // -100dB } else { var volumedb = (134-ui.value)*0.5*(-1); msg = volumedb.toFixed(1) + 'dB'; dbcommand = Math.round(volumedb*(-10)); } command('VolumeDB', dbcommand); return msg; } function togglestate(selector,condition) { if (condition) $(selector).removeClass('ui-state-disabled'); else $(selector).addClass('ui-state-disabled'); } function updatepreferencesdynamic() { togglestate('#RemovePlaylist,#RenamePlaylist', fb.playlists.length); togglestate('#EmptyPlaylist, #QueueRandomItems', fb.playlist.length&&fb.playlists.length); togglestate('#Undo', fb.isUndoAvailable=='1'); togglestate('#Redo', fb.isRedoAvailable=='1'); togglestate('#FocusOnPlaying', fb.isPlaying=='1' || fb.isPaused=='1'); togglestate('#QueueItems,#DequeueItems,#Del', selection.count); togglestate('#SetFocus', selection.count == 1); togglestate('#FlushQueue', fb.queueTotalTime); togglestate('#prevpage_btn', fb.playlistPage - 1); togglestate('#nextpage_btn', fb.playlistPage == 1 && Math.ceil(fb.playlistItemsCount / fb.playlistItemsPerPage) == 0 ? 0 : fb.playlistPage - Math.ceil(fb.playlistItemsCount / fb.playlistItemsPerPage)); title = fb.playlistPage != 1 ? 'Page '+(fb.playlistPage - 1)+'/'+Math.ceil(fb.playlistItemsCount / fb.playlistItemsPerPage) : '' $('#prevpage_btn').attr('title', title); title = (fb.playlistPage - Math.floor(fb.playlistItemsCount / fb.playlistItemsPerPage) - 1 != 0)? 'Page '+(fb.playlistPage + 1)+'/'+Math.ceil(fb.playlistItemsCount / fb.playlistItemsPerPage) : '' $('#nextpage_btn').attr('title', title); } function updatebrowser() { var tmp; var a = []; var len = br.path.length; for (var i = 0; i < len; ++i) { var row = br.path[i]; a.push(['', row.path.substring(0, row.path.length - 1), ''].join('')); } $('#browse_path').html(a.join(' > ')); tmp = ''].join(''); else tmp += ''; if (row.pu) tmp += [''].join(''); else tmp += [''].join(''); tmp += ['', '', ''].join(''); } tmp += '
'; if (br.pathcurrent != '%20') { brparams.cmdenqueue = 'Browse¶m1='+br.pathcurrent+'¶m2=EnqueueDir&'; brparams.cmdenqueuenested = 'Browse¶m1='+br.pathcurrent+'¶m2=EnqueueDirSubdirs&'; $('#browse_parent').text('[ .. ]'); $('#browse_parent').off('click'); $('#browse_parent').click(function() { br_offsets[br.pathcurrent]=$('#browse_dlg').scrollTop(); retrievebrowserstate(br.parent); }); } else { brparams.cmdenqueue = ''; brparams.cmdenqueuenested = ''; $('#browse_parent').text(''); $('#browse_parent').off('click'); $('#browse_parent').click(function() { } ); } len = br.browser.length; bookmark = false; for (var i = 0; i < len; ++i) { var row = br.browser[i]; var st = []; if (i % 2) st.push('br_o'); if (!row.pu) st.push('br_g'); if (row.pu && !row.cm && row.fs) row.cm = 'Extra format'; if (st.length) tmp += ['
', row.p, '', row.p, '', row.fs, '', row.cm, '', row.ft, '
'; $('#browse_table').html(tmp); if (br_offsets.hasOwnProperty(br.pathcurrent)) $('#browse_dlg').scrollTop( br_offsets[br.pathcurrent] ); } function switchpage(shift) { if (mouse.down && drag.dragging) retrievestate('P', fb.playlistPage + shift); } function updateplaylistsortable() { $("#pl div[id*='i']").mousedown(function() { drag.start = getnumfromid($(this).attr('id')); mouse.down = true; selection.calc(); }) .mouseup(function() { if (drag.dragging) { var shift = drag.end - selection.lowest; if (selection.count > 1 && shift > 0) shift -= selection.count - 1; selection.calc(); if (shift != 0 & selection.count > 0) command('Move', selection.tostr(), shift); else $("#pl div[id*='i']").removeClass('dragplacer-top').removeClass('dragplacer-bottom'); selection.reset(); } mouse.reset(); drag.reset(); }) .mousemove(function() { if (mouse.down) { tooltip.show(selection.tostr()); if (!drag.dragging) { drag.dragging = true; if (!$('#i'+drag.start).hasClass('pl_selected')) { $("#pl div[id*='i']").removeClass('pl_selected'); selection.reset(); selection.items[drag.start] = true; $('#i'+drag.start).addClass('pl_selected') } selection.calc(); } drag.end = getnumfromid($(this).attr('id')); var cl = ''; clearTimeout(drag.timeout) if (mouse.y < $(this).offset().top + $(this).height() / 2) { if (!$('#i'+(drag.end-1)).hasClass('dragplacer-bottom') && !$('#i'+(drag.end-1)).hasClass('pl_selected')) cl = 'dragplacer-top'; if (drag.end > drag.start) drag.end -= 1; if (drag.end == (fb.playlistPage - 1)*fb.playlistItemsPerPage && fb.playlistItemsCount > fb.playlistItemsPerPage && fb.playlistPage != 1) drag.timeout = setTimeout('switchpage(-1)', 2000); } else { if (!$('#i'+(drag.end+1)).hasClass('dragplacer-top') && !$('#i'+(drag.end+1)).hasClass('pl_selected')) cl = 'dragplacer-bottom'; if (drag.end < drag.start && (drag.end >= (fb.playlistPage-1)*fb.playlistItemsPerPage && drag.end <= ((fb.playlistPage-1)*fb.playlistItemsPerPage + fb.playlistItemsPerPage) )) drag.end += 1; if (drag.end >= ((fb.playlistPage - 1)*fb.playlistItemsPerPage+fb.playlistItemsPerPage - 1) && fb.playlistItemsCount > fb.playlistItemsPerPage && fb.playlistPage != Math.ceil(fb.playlistItemsCount / fb.playlistItemsPerPage)) drag.timeout = setTimeout('switchpage(1)', 2000); } if (cl) { $("#pl div[id*='i']").removeClass('dragplacer-top').removeClass('dragplacer-bottom'); $(this).addClass(cl); } } }); $('#pl div, span').disableSelection(); } function updateselectionstats() { selection.calc(); var total_time; if (selection.count > 1) total_time = [format_time(selection.length), '/', fb.playlistTotalTime].join(''); else total_time = fb.playlistTotalTime; if (fb.queueTotalTime) $('#totaltime').text(['(', fb.queueTotalTime, ') ', total_time].join('')); else $('#totaltime').text(total_time); updatepreferencesdynamic(); } function updateplaylist() { var shift = (fb.playlistPage-1)*fb.playlistItemsPerPage; var npt = fb.playingItem; if (!isNaN(npt)) npt = fb.playingItem - shift; var npp = fb.playlistPlaying; var ap = fb.playlistActive; var ppt = fb.prevplayedItem - shift; var ft = fb.focusedItem - shift; var st; var artist; var album; var group; var ta = ['
']; var len = fb.playlist.length; for (var i = 0,k = (fb.playlistPage-1)*fb.playlistItemsPerPage; i < len; ++i,++k) { group = ''; var row = fb.playlist[i]; var cl_1 = []; var cl_2 = []; var cl_3 = []; var cl_r = []; if (album != row.b || artist != row.a) { // — group = [' / ', row.a, ' [', row.d, '] ', row.b, ""].join(''); artist = row.a; album = row.b; if (i != 0 && ft != i) { cl_1.push('bbt'); cl_2.push('bbt'); cl_3.push('bbt'); } } if (i % 2 == 0) cl_r.push('pl_even'); if (npt == i && ap == npp) { if (fb.isPlaying == '1') row.n = ['', row.n].join(''); else if (fb.isPaused == '1') row.n = ['', row.n].join(''); } if (ppt == i) cl_r.push('pl_prev'); if (ft == i) { cl_1.push('bbl bbm'); cl_2.push('bbm'); cl_3.push('bbm bbr'); } else { cl_1.push('bwl bwm'); cl_2.push('bwm '); cl_3.push('bwm bwr'); } if (cl_1.length == 0) cl_1.push('bwm'); ta.push(['
', '
', row.n, '.
', '
', row.t, group, '
', '
', row.l, '
'].join('')); } var a = []; len = fb.playlistItemsPerPage - fb.playlist.length; for (var i = 0; i < len; ++i) a.push('
 
 
 
'); ta.push([a.join(''), '
'].join('')); $('#playlist').html(ta.join('')); var playingItem = isNaN(fb.playingItem) ? '?' : fb.playingItem + 1; var tmp = ''; if (fb.isPlaying == "1") tmp += ['Playing ', playingItem, ' of ', fb.playlistPlayingItemsCount, ' | ', fb.helper3].join(''); else if (fb.isPaused == "1") tmp += ['Paused ', playingItem, ' of ', fb.playlistPlayingItemsCount, ' | ', fb.helper3].join(''); else tmp += 'Stopped '; tmp += ' fb.playlistItemsPerPage) { pageslider.slider('option', 'max', Math.ceil(fb.playlistItemsCount*1.0 / fb.playlistItemsPerPage)); pageslider.slider('value', fb.playlistPage); pageslider.slider('enable'); } else { pageslider.slider('disable'); pageslider.slider('value', 1); pageslider.slider('option', 'max', 1); } updateplaylistsortable(); $.each(selection.items, function(k,v) { if (v) $('#i'+k).addClass('pl_selected'); }); $("#pl span[id*='n']").off('click'); $("#pl span[id*='n']").click(function() { select_album(getnumfromid($(this).attr('id'))); }); $("#pl div[id*='i']").off('dblclick').off('click'); $("#pl div[id*='i']").dblclick(function() { $("#pl div[id*='i']").removeClass('pl_selected'); command('Start', getnumfromid($(this).attr('id'))); }) .click(function() { var i = getnumfromid($(this).attr('id')); selection.calc(); if (keypressed[16] && selection.count) //shift { $("#pl div[id*='i']").removeClass('pl_selected'); var start = 0; var end = 0; if (i < selection.lowest) { start = i; end = selection.highest; } if (i > selection.highest) { start = selection.lowest; end = i; } selection.reset(); for (var k = start; k <= end; ++k) { $('#i'+k).addClass('pl_selected'); selection.items[k] = true; } } else if (keypressed[17]) // ctrl { if (selection.items[i]) { $(this).removeClass('pl_selected'); selection.items[i] = false; } else { $(this).addClass('pl_selected'); selection.items[i] = true; } } else { $("#pl div[id*='i']").removeClass('pl_selected'); selection.reset(); selection.items[i] = true; $(this).addClass('pl_selected'); } updateselectionstats(); }) .disableSelection(); updateselectionstats(); } function updatenp() { if (!fb) return; var pos = parseInt(fb.itemPlayingPos) || 0; var len = parseInt(fb.itemPlayingLen) || -1; clearTimeout(npid); if (pos >= len && pos && len != -1) { retrievestate(); return; } if (len > 0) { $("#progressbar").progressbar('enable').progressbar('option', 'max', len); // % 10 second resolution $("#progressbar").progressbar('value', pos); if (pos < len) { fb.itemPlayingPos = pos + 1; $("#playingtime").html("-" + format_time(len-pos)); if (fb.isPlaying == "1") npid = setTimeout('updatenp()', refresh_interval); } } else if (fb.isPlaying != "1" && fb.isPaused != "1") { $("#progressbar").progressbar('disable').progressbar('value', 0); $("#playingtime").html(""); } if (fb.isPlaying == "1" && len == -1) { $("#progressbar").progressbar('enable').progressbar('value', 0); fb.itemPlayingPos = pos + 1; $("#playingtime").html(format_time(pos)); if (pos % 15 == 0) { retrievestate_schedule(1100, "RefreshPlayingInfo"); } else npid = setTimeout('updatenp()', refresh_interval); } } function updatetabs() { var tc = parseInt($("#tabs >ul >li").size()); var fp = parseInt(fb.playlists.length); var tabs = $('#tabs'); settingtabs = true; if (tc < fp) for(var i = 0; i < fp - tc; ++i) { $( "
  • " ) .appendTo( "#tabs .ui-tabs-nav" ); $( "#tabs" ).tabs('refresh'); } if (tc > fp) for(var i = 0; i < tc - fp; ++i) { $( "#tabs" ).find( ".ui-tabs-nav li:eq("+(i+1)+")" ).remove(); $( "#tabs" ).tabs('refresh'); } for (var i = 0; i < fp; ++i) if (fb.playlistPlaying == i) { var c = '' if (fb.isPlaying == '1') c = '', fb.playlists[i].name, ''].join('')); } else $("#tabs a:eq("+i+")").html(['', fb.playlists[i].name, ''].join('')); // tabs.tabs('select', parseInt(fb.playlistActive)); // var index = $('#tabs a[href="#simple-tab-2"]').parent().index(); $("#tabs").tabs("option", "active", parseInt(fb.playlistActive)); settingtabs = false; } function updatealbumartaspect() { if (aa.img.width == 0 || aa.img.height == 0) setTimeout('updatealbumartaspect()', refresh_interval); else { if ($('#aa_pane').hasClass("ui-resizeable")) $('#aa_pane').resizable('destroy'); $('#aa_pane').resizable({alsoResize: "#aa_img", handles: 'all', aspectRatio: aa.img.width/aa.img.height, stop: function (event, ui) { save_window_to_cookie('aa_pane', true); save_div_position_to_cookie('aa_pane'); } }); } } function updatealbumart() { if ($('#aa_pane').is(':visible')) { aa.img = new Image(); aa.img.src = fb.albumArt; $('#aa_img').attr('src', aa.img.src); updatealbumartaspect(); } } function updatelibrary() { var a = []; for (var i = 0; i < library.query.length; ++i) a.push(['
    ', stripXmlEntities.perform(library.query[i]), '
    '].join('')); $('#querylist').html(a.join('')); $('#querylist div').hover(function() { $(this).addClass('qr_selected'); }, function() { $(this).removeClass('qr_selected'); }) .off('click').click(function() { retrievelibrarystate('QueryAdvance', ($(this).text())); }); if (library.queryInfo.length < 1) $('#r_btn').html('Query'); else $('#r_btn').text('<'); for (var i = 0, a = []; i < library.queryInfo.length; ++i) a.push(stripXmlEntities.perform(library.queryInfo[i])); $('#querypath').html(a.join(' > ')); } function updateui() { if (fb) { document.title = stripXmlEntities.perform(fb.helper1) + ' foobar2000'; if (fb.isPlaying == '1' || fb.isPaused == '1') $("#playingtitle").html(fb.helper2); else $("#playingtitle").html(' '); if (fb.SAC === 'checked') $('#progressbar').addClass('ui-state-error'); else $('#progressbar').removeClass('ui-state-error'); volume_value = fb.volumedb == "1000" ? 0 : 134-Math.round(parseInt(fb.volumedb) / 10.0 / 0.5); $("#volume").slider("value", volume_value); if (fb.volumedb == 1000) $('#mute').addClass('ui-state-error').attr('title', 'Unmute'); else $('#mute').removeClass('ui-state-error').attr('title', 'Mute'); $("#SAC").prop('checked', fb.SAC === "checked"); $("#SAQ").prop('checked', fb.SAQ === "checked"); $("select#PBO").val(fb.playbackOrder); if (!drag.dragging) { mouse.reset(); drag.reset(); selection.reset(); } updatealbumart(); updateplaylist(); updatetabs(); updatepreferencesdynamic(); } updatenp(); tooltip.hide(); } function command(command, p1, p2) { startwork(); var params = {}; if (command) params['cmd'] = command; if (p1 || p1 == 0) params['param1'] = p1; if (p2 || p2 == 0) params['param2'] = p2; params['param3'] = 'NoResponse'; $.get('/ajquery/', params, function (data) { if (!(command == "VolumeDB")) retrievestate_schedule(command == "Start" ? 500 : 250); else finishwork(); }); } function retrievestate_schedule(timeout, cmd) { timeout = timeout || 500; cmd = cmd || ''; if (timeoutid) { clearTimeout(timeoutid); timeoutid = null; } if (!timeoutid) timeoutid = setTimeout('retrievestate("'+cmd+'")', timeout); } function retrievestate(cmd,p1) { startwork(); if (timeoutid) { clearTimeout(timeoutid); timeoutid = null; } cmd = cmd || ''; p1 = p1 || ''; cmd = cmd ? ['?cmd=', cmd, '&'].join('') : '?'; p1 = p1 ? ['¶m1=', p1, '&'].join('') : ''; fb = null; $.getJSON(['/ajquery/', cmd, p1, 'param3=js/state.json'].join(''), function(data, status) { fb = data; if (fb.isPlaying == '1' && fb.helper1 == '' || fb.isEnqueueing == '1') retrievestate_schedule(refresh_interval); else { fb.playingItem = parseInt(fb.playingItem); fb.prevplayedItem = parseInt(fb.prevplayedItem); fb.focusedItem = parseInt(fb.focusedItem); fb.playlistItemsCount = parseInt(fb.playlistItemsCount); fb.playlistItemsPerPage = parseInt(fb.playlistItemsPerPage); fb.playlistPage = parseInt(fb.playlistPage); fb.playlistPlaying = parseInt(fb.playlistPlaying); fb.playlistActive = parseInt(fb.playlistActive); if (fb.playlistPage == 0) fb.playlistPage = 1; if (fb.playlists.length == 0) fb.playlists = [{ name: ' ', count: 0 } ]; updateui(); finishwork(); } }); } function retrievebrowserstate(p1) { startwork(); p1 = p1 || ''; if (p1) p1 = '¶m1=' + p1; $.getJSON(['/ajquery/?cmd=Browse', p1, '¶m3=js/browser.json'].join(''), function(data, status) { br = data; updatebrowser(); retrievestate(); finishwork(); }); } function retrievelibrarystate(cmd, p1) { startwork(); cmd = cmd || ''; p1 = Url.encode(p1); $.getJSON(['/ajquery/?cmd=', cmd, '¶m1=', p1, '¶m3=js/library.json'].join(''), function(data, status) { library = data; updatelibrary(); command(); }); } function positiondialog(dlg,X,Y) { var sw = document.documentElement.clientWidth - 20; var dw = dlg.dialog('option', 'width'); if (X + dw > sw) X = sw - dw; if (X < 0) X = 0; dlg.dialog('option', 'position', [X, Y]); } function searchmedialibrary(v) { command('SearchMediaLibrary', jQuery.trim(v)); } $(function(){ $(document).ready(function() { $('body').css('overflow','hidden'); // ui dialog bug workaround $('*').mousemove(function(e){ mouse.x = e.pageX; mouse.y = e.pageY; }).mouseup(function() { if (drag.dragging) $("#pl div[id*='i']").mouseup(); mouse.reset(); drag.reset(); }); $('#tabs').tabs({ selected: -1, activate: function(event, ui) { if (!settingtabs) retrievestate('SwitchPlaylist', $("#tabs").tabs('option','active')); } }); $('#pageslider').slider({ change: function(event, ui) { if (event.originalEvent) { tooltip.hide(); if (fb && fb.playlistPage != ui.value || !fb) retrievestate('P', ui.value); } }, slide: function(event,ui) { tooltip.show( 'Page ' + ui.value + '/' + (Math.ceil(fb.playlistItemsCount*1.0 / fb.playlistItemsPerPage)) , mouse.x+20 , ($(this).offset().top - 15) ); }, range: false, min: 1, max: 1, value: 1 }); // playback preferences dialog $('#pbs_dlg').dialog({ autoOpen: false, close: function(event, ui) { save_window_to_cookie($(this).attr('id'), false); }, open: function(event, ui) { save_window_to_cookie($(this).attr('id'), true); $("#PBO").blur(); }, dragStop: function(event, ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) }, resizeStop: function(event,ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) return true; } }); $('#SAC').click(function(e){ if ($(this).prop('checked')) command('SAC', '1'); else command('SAC', '0'); }); $('#SAQ').click(function(e){ if ($(this).prop('checked')) command('SAQ', '1'); else command('SAQ', '0'); }); $('#PBO').change(function(e){ command('PlaybackOrder', $(this).prop('selectedIndex')); }); // search dialog $('#search_dlg').dialog({ autoOpen: false, width: 300, close: function(event, ui) { save_window_to_cookie($(this).attr('id'), false); }, open: function(event, ui) { save_window_to_cookie($(this).attr('id'), true); $('#searchstr').focus(); }, resizable : 'n,e,s,w,nw,sw,ne', dragStop: function(event, ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) }, resizeStop: function(event,ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) return true; } }); $('#search_dlg_nav1').insertBefore('#search_dlg'); $('#search_dlg_nav2').insertBefore('#search_dlg'); $('#searchstr').keypress(function(e) { if (e.which == 13) searchmedialibrary($('#searchstr').val()); else { if (timeoutid2) { clearTimeout(timeoutid2); timeoutid2 = null; } if (!timeoutid2) timeoutid2 = setTimeout("searchmedialibrary($('#searchstr').val())", 500); } }); $('#r_btn').click(function(e) { $(this).blur(); retrievelibrarystate('QueryRetrace'); }); // browse dialog $('#browse_dlg').dialog({ autoOpen: false, position: ['left', 'top'], open: function(event, ui) { retrievebrowserstate(); save_window_to_cookie($(this).attr('id'), true); }, buttons: { "Browse to..." : function() { var path = promptf("Browse to:", Url.decode(br.pathcurrent)); if (path != null) retrievebrowserstate(path); }, "Enqueue current" : function() { retrievestate(brparams.cmdenqueue); }, "Enqueue nested" : function() { retrievestate(brparams.cmdenqueuenested); }, "Close": function() { $(this).dialog("close"); } }, close: function(event, ui) { save_window_to_cookie($(this).attr('id'), false); br_offsets = {}; }, dragStop: function(event, ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) }, resizeStop: function(event,ui) { save_dialog_position_to_cookie($(this).attr('id'), ui) return true; } }); $("#browse_dlg_nav").insertBefore("#browse_dlg"); // error dialog $('#error_dlg').dialog({ autoOpen: false, modal: true, bgiframe: true, width: 500 }); //hover states on the static widgets $('ul#buttons li:not([id=vol])').hover( function() { $(this).addClass('ui-state-hover'); }, function() { $(this).removeClass('ui-state-hover'); } ); // toolbar buttons $('.btncmd').click(function(e){ e.preventDefault(); command($(this).attr('id')); }); $('#mute').click(function(e){ command('VolumeMuteToggle'); }); $('#pbs_btn').click(function(e){ set_dialog_state($('#pbs_dlg'), get_values_from_cookie('pbs_dlg')); blink_dialog($('#pbs_dlg')); $('#pbs_dlg').dialog('open').dialog('moveToTop'); }); $('#search_btn').click(function(e){ set_dialog_state($('#search_dlg'), get_values_from_cookie('search_dlg')); blink_dialog($('#search_dlg')); $('#search_dlg').dialog('open').dialog('moveToTop'); }); $('#browse_btn').click(function(e){ set_dialog_state($('#browse_dlg'), get_values_from_cookie('browse_dlg')); if ($('#browse_dlg').dialog('option', 'height') == 'auto') { $('#browse_dlg').dialog('option', 'height', 400); $('#browse_dlg').dialog('option', 'width', 500); } blink_dialog($('#browse_dlg')); $('#browse_dlg').dialog('open').dialog('moveToTop'); }); $('#aa_btn').click(function(e){ if ($('#aa_pane').is(':hidden')) { var values = get_values_from_cookie('aa_pane'); if (values[0] == 'auto' || values[1] == 'auto') { values[0] = document.documentElement.clientWidth - $('#aa_pane').outerWidth()-5; values[1] = 5; } // stupid workaround for firefox if (values[2] != 'auto') $('#aa_pane').css( { width: values[2] } ); if (values[3] != 'auto') $('#aa_pane').css( { width: values[3] } ); $('#aa_pane').css( { position: 'absolute', left: values[0], top: values[1], display: 'inline', visibility: 'visible' } ); updatealbumart(); save_window_to_cookie('aa_pane', true); } else { $('#aa_pane').hide(); save_window_to_cookie('aa_pane', false); } }); // album art panel $('#aa_pane').draggable( {stop: function(event, ui) { save_div_position_to_cookie('aa_pane'); }}) .dblclick(function(e){ $('#aa_pane').css({ width: aa.img.width, height: aa.img.height }); $('#aa_img').css({ width: aa.img.width, height: aa.img.height }); save_div_position_to_cookie('aa_pane') }); // playback volume slider $('#volume').slider({ range: false, min: 0, max: 134, value: 134, slide: function(event, ui) { tooltip.show(volume_from_slider(ui), mouse.x+15, $(this).offset().top - 15); }, stop: function(event, ui) { volume_from_slider(ui); tooltip.hide(); } }); $('#CreatePlaylist').click(function(e) { var name = promptf('Enter new playlist name:', 'New Playlist'); if (name != null) command($(this).attr('id'), name); }); $('#RemovePlaylist').click(function(e) { if (!$(this).hasClass('ui-state-disabled')) if (confirm("Remove \""+fb.playlists[fb.playlistActive].name+"\" playlist?")) command($(this).attr('id'), fb.playlistActive); }); $('#RenamePlaylist').click(function(e) { if (!$(this).hasClass('ui-state-disabled')) { var new_name = promptf("Enter new name:", fb.playlists[fb.playlistActive].name); if (new_name != null) command('RenamePlaylist', new_name, fb.playlistActive); } }); $('#EmptyPlaylist').click(function(e) { if (!$(this).hasClass('ui-state-disabled')) if (confirm("Empty playlist?")) command($(this).attr('id')); }); $('#RefreshPlaylist').click(function(e) { command(); }); $('#FlushQueue,#QueueRandomItems').click(function(e) { command($(this).attr('id')); }); $('#Undo,#Redo').click(function() { if (!$(this).hasClass('ui-state-disabled')) command($(this).attr('id')); }); $('#FocusOnPlaying').click(function() { if (!$(this).hasClass('ui-state-disabled')) command('FocusOnPlaying'); }); $('#pageslider').dblclick(function(e) { $('#FocusOnPlaying').click(); }); $('#QueueItems,#DequeueItems,#Del,#SetFocus').click(function() { if (!$(this).hasClass('ui-state-disabled')) { var items = selection.tostr(); command($(this).attr('id'), items); } }); // Playlist buttons $('#prevpage_btn').click(function(e){ if (!$(this).hasClass('ui-state-disabled') && fb) { e.preventDefault(); retrievestate('P', fb.playlistPage - 1); } }); $('#nextpage_btn').click(function(e){ if (!$(this).hasClass('ui-state-disabled')) { e.preventDefault(); retrievestate('P', fb.playlistPage + 1); } }); $('#searchstr,#playlist_name').blur(function() { input_has_focus = false; }).focus(function() { input_has_focus = true; }); $('#progressbar').progressbar({ value: 0 }) .resizable({ alsoResize: '#tabs', handles: 'e', resize: function(event, ui) { save_playlist_size(); } }) .hover( function(event) { }, function(event) { tooltip.hide(); }) .mousemove( function(event) { if (fb && fb.isPlaying == "1") { var t = Math.round((event.pageX-$('#progressbar').offset().left)*fb.itemPlayingLen / ($('#progressbar').width())); tooltip.show(format_time(t), event.pageX+15, $('#progressbar').offset().top-10); } }) .click( function(event) { if (fb && fb.isPlaying == "1") command('SeekSecond', (Math.round((mouse.x-$('#progressbar').offset().left)*fb.itemPlayingLen / $('#progressbar').width()))); }); $(window).bind("blur", function() { keypressed = { }; }); $(document).ajaxError(function(event, XMLHttpRequest, settings, thrownError){ if(event.type == 'ajaxError') { var rep = ''; rep += 'settings.url: ' + settings.url + '\n\n'; rep += 'XMLHttpRequest.responseText: \n' + XMLHttpRequest.responseText + '\n\n'; rep += 'XMLHttpRequest.statusText: ' + XMLHttpRequest.statusText; $('#dbg').html(rep); $('#error_dlg').dialog('open'); } }); document.onkeydown = function(evt) { keydown(evt?evt.keyCode:event.keyCode); } document.onkeyup = function(evt) { keyup(evt?evt.keyCode:event.keyCode); } retrievestate(); reopen_windows(); restore_playlist_size(); }); });