var MODELS={couch:new CouchDB("playlick"),couch_up:true,next_playlist_id:0,next_playlist_track_id:0,stat_couch:function(){try{var version=CouchDB.getVersion("/");MODELS.couch_up_handler("stat",version)}catch(result){MODELS.couch_down_handler("stat",result)}},couch_down_handler:function(action,result){MODELS.couch_up=false;if(MODELS.onCouchDown){MODELS.onCouchDown.apply(this,arguments)}},couch_up_handler:function(action,response){MODELS.couch_up=true;if(MODELS.onCouchUp){MODELS.onCouchUp.apply(this,arguments)}}};(function(){function Track(doc){this.name=doc.name;this.artist=doc.artist||"";this.album=doc.album||"";this.url=doc.url||"";this.spotifyUrl=doc.spotifyUrl||"";this.duration=doc.duration;this.size=doc.size;this.mimetype=doc.mimetype;this.bitrate=doc.bitrate}Track.prototype={get_duration_string:function(){if(this.duration){return Playdar.Util.mmss(this.duration)}return""},toString:function(){var duration=this.get_duration_string();if(duration){duration=" ("+duration+")"}return this.name+" - "+this.artist+duration},toHTML:function(){var duration=this.get_duration_string();if(duration){duration=' (<span class="duration">'+duration+"</span>)"}return'<span class="haudio"><span class="fn">'+this.name+'</span> - <span class="contributor">'+this.artist+"</span>"+duration},get_doc:function(){var doc={name:this.name,artist:this.artist,album:this.album,url:this.url,spotifyUrl:this.spotifyUrl,duration:this.duration,size:this.size,mimetype:this.mimetype,bitrate:this.bitrate};return doc},getDiffKey:function(){return this.url||(this.artist+this.album+this.name)},diff:function(track){return this.getDiffKey()!=track.getDiffKey()}};function Playlist(options){this.saved=false;this.persisted=false;this.tracks=[];this.options=options||{};if(this.set_doc_ref(this.options._id,this.options._rev)){this.persisted=true}else{if(MODELS.couch_up){try{this.set_id(CouchDB.newUuids(1)[0])}catch(result){MODELS.couch_down_handler("uuid",result)}}if(!MODELS.couch_up){this.set_id(MODELS.next_playlist_id++)}}this.date=this.options.date?new Date(this.options.date):new Date();this.lastSync=this.options.lastSync?new Date(this.options.lastSync):"";this.setOption("type","playlist");this.setOption("unplayed",false);this.setOption("artist");this.setOption("album");this.setOption("title");this.setOption("image");this.setOption("subtitle");this.setOption("description");this.setOption("url");this.setOption("copyright");this.setOption("source");this.setOption("subscription");this.addOptions(Playlist.DefaultOptions);this.set_element()}Playlist.DefaultOptions={};Playlist.prototype={setOption:function(optionName,defaultValue){if(defaultValue===undefined){defaultValue=""}this[optionName]=this.options[optionName]||defaultValue},addOptions:function(options){$.extend(this.options,options)},add_track:function(track,options,prepend){var playlist_track=new PlaylistTrack(this,track,options);if(prepend){this.tracks.unshift(playlist_track)}else{this.tracks.push(playlist_track)}return playlist_track},remove_track:function(playlist_track){var i=$.inArray(playlist_track,this.tracks);this.tracks.splice(i,1);playlist_track.element.remove();this.save()},reset_tracks:function(playlist_tracks){this.tracks=playlist_tracks;this.save()},isAlbum:function(){return this.type=="album"},isSubscription:function(){return this.type=="subscription"&&this.subscription},isSynced:function(){return this.isSubscription()&&this.subscription.synced===true},setLastSyncDate:function(){this.lastSync=new Date()},isEditable:function(){return !this.isAlbum()&&!this.isSubscription()},albumToString:function(){return this.artist+" - "+this.album},toString:function(){if(this.title){return this.title}if(this.isAlbum()){return this.albumToString()}return"Playlist: "+this.date.toLocaleString()},fetchTracks:function(){if(!this.tracks.length){try{var response=MODELS.couch.view("playlist/all",{key:this._id});MODELS.couch_up_handler("fetchTracks",response);var row=response.rows[0];var value=row.value;var playlist=this;var elements=$.map(value.tracks,function(track_data,i){var playlist_track=playlist.add_track(new MODELS.Track(track_data.track),{unplayed:track_data.unplayed});return playlist_track.element.get()});return elements}catch(result){MODELS.couch_down_handler("fetchTracks",result)}}},getTrackHash:function(){this.fetchTracks();var hash={};var track,key;$.each(this.tracks,function(i,playlist_track){hash[playlist_track.track.getDiffKey()]=playlist_track});return hash},load:function(){var elements;if(!this.tracks.length){elements=this.fetchTracks()}else{elements=this.loadDom()}return elements},loadDom:function(){var elements=$.map(this.tracks,function(playlist_track,i){return playlist_track.load().get()});return elements},unload:function(){$.each(this.tracks,function(i,playlist_track){playlist_track.unload()});if(this.options.onUnload){this.options.onUnload.call(this)}},reload:function(){this.unload();this.load()},set_element:function(element_name){element_name=element_name||"li";this.element=$("<"+element_name+' class="p">').attr("id",this.get_dom_id()).data("playlist",this).html(this.toHTML());if(this.unplayed){this.element.addClass("unplayed")}return this.element},get_dom_id:function(){return"p_"+this.get_id()},toHTML:function(){return this.toString()},toApplescript:function(){var track_records=$.map(this.tracks,function(playlist_track,i){return'{artist: "'+playlist_track.track.artist.replace(/"/g,'\\"')+'",track: "'+playlist_track.track.name.replace(/"/g,'\\"')+'"}'});var applescript='set playlist_name to "'+this.toString()+'"\ntell application "iTunes"\n    set new_playlist to (make playlist with properties {name:playlist_name})\n    set l to source "Library"\n    set tracks_to_search to {'+track_records.join(",")+"}\n    repeat with t in tracks_to_search\n        duplicate (every file track of l whose artist contains (artist of t) and name contains (track of t)) to new_playlist\n    end repeat\n    reveal new_playlist\n    activate\nend tell";return"applescript://com.apple.scripteditor?action=new&script="+encodeURIComponent(applescript)},get_track_by_id:function(playlist_track_id){var that=this;$.each(this.tracks,function(i,playlist_track){if(playlist_track.id==playlist_track_id){return false}});return playlist_track},get_track_at_position:function(position){var i=position-1;return this.tracks[i]},onSave:function(){if(!this.persisted&&this.options.onCreate){this.options.onCreate.call(this)}if(this.options.onSave){this.options.onSave.call(this)}this.saved=true},save:function(){if(MODELS.couch_up){try{var result=MODELS.couch.save(this.get_doc());if(result.ok){this.set_doc_ref(result.id,result.rev);this.onSave();this.persisted=true}}catch(result){MODELS.couch_down_handler("save",result)}}if(!MODELS.couch_up&&!this.persisted){this.onSave()}},onRemove:function(){this.element.remove();if(this.options.onDelete){this.options.onDelete.call(this)}},remove:function(){if(MODELS.couch_up){try{var result=MODELS.couch.deleteDoc(this.get_doc_ref());if(result.ok){this.onRemove();this.persisted=false}}catch(result){MODELS.couch_down_handler("delete",result)}}if(!MODELS.couch_up&&!this.persisted){this.onRemove()}},set_id:function(id){this._id=id;return id},get_id:function(){return this._id},set_rev:function(rev){this._rev=rev;return rev},get_rev:function(){return this._rev},set_doc_ref:function(id,rev){return this.set_id(id)&&this.set_rev(rev)},get_doc_ref:function(){var doc_ref={_id:this.get_id(),_rev:this.get_rev()};return doc_ref},get_doc:function(){this.fetchTracks();var unplayed=false;var doc=$.extend(this.get_doc_ref(),{date:this.date.getTime(),type:this.type,title:this.title,artist:this.artist,album:this.album,image:this.image,subtitle:this.subtitle,description:this.description,url:this.url,copyright:this.copyright,source:this.source,subscription:this.subscription,lastSync:this.lastSync?this.lastSync.getTime():"",tracks:$.map(this.tracks,function(playlist_track,i){if(playlist_track.unplayed){unplayed=true}return playlist_track.get_doc()})});doc.unplayed=unplayed;this.element.toggleClass("unplayed",unplayed);return doc},diffTracks:function(playlist){var trackDiffs={};var anyChanges=false;var thisTracks=this.getTrackHash();var playlistTracks=playlist.getTrackHash();var trackKey;for(trackKey in thisTracks){var change;if(!playlistTracks[trackKey]){change=false}else{change=thisTracks[trackKey].get_position()-playlistTracks[trackKey].get_position();if(change===0){continue}}anyChanges=true;trackDiffs[trackKey]={change:change,track:thisTracks[trackKey].get_doc()}}for(trackKey in playlistTracks){if(!thisTracks[trackKey]){anyChanges=true;trackDiffs[trackKey]={change:true,track:playlistTracks[trackKey]}}}if(anyChanges){return trackDiffs}},hasUnplayed:function(){return this.unplayed}};Playlist.fetchAll=function(callback){try{var response=MODELS.couch.view("playlist/all");MODELS.couch_up_handler("Playlist.fetchAll",response);var playlists=$.map(response.rows,function(row,i){var data=row.value;var playlist=new Playlist(row.value);if(callback){callback(playlist)}return playlist});return playlists}catch(result){MODELS.couch_down_handler("Playlist.fetchAll",result)}};function PlaylistTrack(playlist,track,options){this.id=MODELS.next_playlist_track_id++;this.playlist=playlist;this.track=track;this.options=options||{};this.unplayed=this.options.unplayed||false;this.playdar_qid=null;this.playdar_result=null;this.playdar_response=null;this.load()}PlaylistTrack.prototype={load:function(){return this.set_element()},unload:function(){this.element.remove()},remove:function(){this.playlist.remove_track(this)},set_track_duration:function(duration){if(duration){this.track.duration=duration}},set_element:function(element_name){element_name=element_name||"li";this.element=$("<"+element_name+' class="p_t">').attr("id",this.get_dom_id()).data("playlist_track",this).html(this.track.toHTML());if(this.unplayed){this.element.addClass("unplayed")}return this.element},get_dom_id:function(){return"p_t_"+this.playlist.get_id()+"_"+this.id},get_position:function(){return $.inArray(this,this.playlist.tracks)+1},get_doc:function(){var doc={position:this.get_position(),track:this.track.get_doc(),unplayed:this.unplayed};return doc},toString:function(){return this.get_position()+": "+this.track.toString()},setResult:function(result){this.playdar_result=result},setPlayed:function(){this.unplayed=false;this.element.removeClass("unplayed");this.playlist.save()},setUnplayed:function(){this.unplayed=true;this.element.addClass("unplayed");this.playlist.save()},play:function(){if(this.playdar_result){Playdar.player.play_stream(this.playdar_result.sid);this.setPlayed();return true}},stop:function(){if(this.playdar_result){Playdar.player.stop_stream(this.playdar_result.sid);return true}}};MODELS.Track=Track;MODELS.Playlist=Playlist;MODELS.PlaylistTrack=PlaylistTrack})();var VIEWS={};(function(){})();var CONTROLLERS={};(function(){function Playlist(){this.playlistSidebarLists=$(".playlists");this.playlistsSidebarList=$("#playlists");this.albumsSidebarTitleElem=$("h1#albumsTitle");this.albumsSidebarList=$("#albums");this.subscriptionsSidebarTitleElem=$("h1#subscriptionsTitle");this.subscriptionsSidebarList=$("#subscriptions");this.syncedSidebarTitleElem=$("h1#syncedTitle");this.syncedSidebarList=$("#synced");this.loadingPlaylistsElem=$("#loading_playlists");this.createTitleElem=$("#createPlaylist");this.headerElem=$("#playlistHeader");this.copyrightElem=$("span#playlistCopyright");this.sourceElem=$("#playlistSource");this.sourceLink=$("a#playlistSourceLink");this.trackListElem=$("#playlist");this.tracksLoadingElem=$("#tracksLoading");this.tracksErrorElem=$("#tracksError");this.footerElem=$("#listFooter");this.actionsElem=$("#listActions");this.applescriptLink=$("a#playlistApplescript");this.createLink=$("#create_playlist");this.addTrackButton=$("a#addTrackButton");this.addTrackCancel=$("a#addTrackCancel");this.addTrackTable=$("table#addTrackTable");this.addTrackForm=$("form#addTrackForm");this.addTrackSearchInput=$("input#addTrackSearchInput");this.mainImporters=$("#mainImporters");this.current=null;this.playingTrack=null;this.fetchAllDone=false}Playlist.prototype={register:function(playlist){playlist.save()},couchDownHandler:function(action,result){if(PLAYLICK.debug){var message="couchdb unavailable";if(result.error&&result.error!="unknown"){message=result.error+": "+result.reason}console.warn("["+action+"] "+message);console.warn(result)}this.loadingPlaylistsElem.addClass("unavailable").html('<b>Database unavailable.</b><br>Your changes will not be saved. <a href="#" onclick="CONTROLLERS.Playlist.retryCouch(); return false;">retry</a>').show()},couchUpHandler:function(action,response){this.loadingPlaylistsElem.hide();this.tracksErrorElem.hide()},retryCouch:function(){this.loadingPlaylistsElem.removeClass("unavailable").html(STRINGS.loading_playlists_text).show();this.fetchAll()},showCreateTitle:function(){this.headerElem.hide();this.createTitleElem.show()},create:function(){PLAYDAR.cancel_playdar_resolve();this.setCurrent();this.hideMetadata();this.addTrackTable.show()},onCreate:function(playlist){if(playlist.isAlbum()){this.albumsSidebarList.append(playlist.element);this.albumsSidebarTitleElem.show()}else{if(playlist.isSynced()){this.syncedSidebarList.append(playlist.element);this.syncedSidebarTitleElem.show()}else{if(playlist.isSubscription()){this.subscriptionsSidebarList.append(playlist.element);this.subscriptionsSidebarTitleElem.show()}else{this.playlistsSidebarList.append(playlist.element)}}}},fetchAll:function(){if(this.fetchAllDone){MODELS.stat_couch()}else{var playlistElements=[];var albumElements=[];var syncedElements=[];var subscriptionElements=[];var that=this;var playlists=MODELS.Playlist.fetchAll(function callback(playlist){that.checkSubscription(playlist);var element=playlist.element.get()[0];if(playlist.isAlbum()){albumElements.push(element)}else{if(playlist.isSynced()){syncedElements.push(element)}else{if(playlist.isSubscription()){subscriptionElements.push(element)}else{playlistElements.push(element)}}}});if(playlistElements.length){this.playlistsSidebarList.append(playlistElements)}if(subscriptionElements.length){this.subscriptionsSidebarTitleElem.show();this.subscriptionsSidebarList.append(subscriptionElements)}if(syncedElements.length){this.syncedSidebarTitleElem.show();this.syncedSidebarList.append(syncedElements)}if(albumElements.length){this.albumsSidebarTitleElem.show();this.albumsSidebarList.append(albumElements)}if(playlists===undefined){this.fetchAllDone=true}}},setCurrent:function(playlist){if(this.current&&this.current!=playlist){this.current.unload()}var playlistItem;if(playlist){this.current=playlist;playlistItem=playlist.element;this.loadMetadata();this.updateSidebarTitle(playlist)}else{this.current=new MODELS.Playlist();playlistItem=this.createLink.parent("li")}this.playlistSidebarLists.find("li").removeClass("current");playlistItem.addClass("current")},setPlaying:function(playlist_track){this.playingTrack=playlist_track;this.playlistSidebarLists.find("li.p").removeClass("playing");if(playlist_track){playlist_track.playlist.element.addClass("playing")}},loadItem:function(playlistItem){this.load(playlistItem.data("playlist"))},load:function(playlist){if(this.current==playlist){PLAYDAR.resolve_current_playlist();return}PLAYDAR.cancel_playdar_resolve();this.setCurrent(playlist);this.addTrackTable.hide();this.hideFooter();this.addTrackForm.hide();this.loadTracks();this.showFooter();if(playlist.isEditable()){this.addTrackForm.show()}},loadMetadata:function(){this.loadHeader();this.loadFooter();this.mainImporters.hide()},hideMetadata:function(){this.showCreateTitle();this.hideFooter();this.addTrackForm.show();this.mainImporters.show()},loadHeader:function(){this.createTitleElem.hide();this.buildHeaderElem()},buildHeaderElem:function(){this.headerElem.html(this.buildEditElem());this.headerElem.append(this.buildMetadataElem());this.headerElem.append(this.buildEditForm());this.headerElem.show()},buildEditElem:function(){var that=this;var editButton=$('<a href="#">').append($("<img>").attr("src","pencil.png").attr("width",16).attr("height",16).attr("alt","Edit")).click(function(e){e.preventDefault();that.toggleEditForm()});var deleteButton=$('<a href="#">').append($("<img>").attr("src","bin_closed.png").attr("width",16).attr("height",16).attr("alt","Delete")).click(function(e){e.preventDefault();that.removeCurrent()});this.editButtons=$('<div id="playlistEdit">').append(editButton).append(" ").append(deleteButton);return this.editButtons},buildMetadataElem:function(){this.metadataElem=$('<div id="playlistMetadata">');if(this.current.image){this.metadataElem.append($('<img class="image">').attr("src",this.current.image))}var title=$("<h1>");var titleText=this.current.toString();if(this.current.url){title.append($("<a>").attr("href",this.current.url).text(titleText))}else{title.text(titleText)}this.metadataElem.append(title);if(this.current.subtitle){this.metadataElem.append($('<p class="subtitle">').text(this.current.subtitle))}if(this.current.description){var escapedDescription=$("<div>").html(this.current.description).text();var description=$('<p class="description">').html(UTIL.autoLink(escapedDescription));this.metadataElem.append(description)}return this.metadataElem},buildEditField:function(inputId,name,label,value,textarea){var field=$('<p class="field">').append($("<label>").attr("for",inputId).text(label)).append("<br>");if(textarea){field.append($("<textarea>").attr("rows",5).attr("id",inputId).attr("name",name).text(value))}else{field.append($('<input type="text">').attr("id",inputId).attr("name",name).val(value))}return field},buildEditForm:function(){var that=this;this.editForm=$('<form id="playlistEditForm">').hide().submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);that.current.title=params.title;that.current.url=params.url;that.current.subtitle=params.subtitle;that.current.description=params.description;that.current.image=params.image;that.current.copyright=params.copyright;that.current.save()}).keydown(function(e){if(e.keyCode==27){that.toggleEditForm()}});var editSave=$('<p class="submit">').append($('<input type="submit">').val("Save")).append(" or ").append($('<a href="#">').text("Cancel").click(function(e){e.preventDefault();that.toggleEditForm()}));this.editForm.append(this.buildEditField("playlistEditTitle","title","Title",this.current.toString())).append(this.buildEditField("playlistEditUrl","url","Info URL",this.current.url)).append(this.buildEditField("playlistEditSubtitle","subtitle","Subtitle",this.current.subtitle)).append(this.buildEditField("playlistEditDescription","description","Description",this.current.description,true)).append(this.buildEditField("playlistEditImage","image","Image URL",this.current.image)).append(this.buildEditField("playlistEditCopyright","copyright","Copyright",this.current.copyright)).append(editSave);return this.editForm},loadFooter:function(){this.loadCopyright();this.loadSource();this.footerElem.show();this.loadAppleScript();this.actionsElem.show()},hideFooter:function(){this.footerElem.hide();this.actionsElem.hide()},showFooter:function(){this.footerElem.show();this.actionsElem.show()},loadCopyright:function(){var escapedCopyright=$("<div>").html(this.current.copyright).text();var copyright=UTIL.autoLink(escapedCopyright);this.copyrightElem.html(copyright?"© "+copyright:"")},loadSource:function(){if(this.current.source){this.sourceLink.attr("href",this.current.source).text(Playdar.Util.location_from_url(this.current.source).host);this.sourceElem.show()}else{this.sourceElem.hide()}},loadAppleScript:function(){this.applescriptLink.attr("href",this.current.toApplescript())},loadTracks:function(){this.tracksLoadingElem.show();this.tracksErrorElem.hide();var elements=this.current.load();this.tracksLoadingElem.hide();if(elements){this.trackListElem.append(elements);setTimeout(function(){var nowPlayingSound=Playdar.player.getNowPlaying();if(nowPlayingSound){PLAYDAR.updatePlaybackProgress.call(nowPlayingSound);PLAYDAR.updateLoadProgress.call(nowPlayingSound)}});if(this.current.isEditable()){this.trackListElem.sortable("enable")}else{this.trackListElem.sortable("disable")}PLAYDAR.resolve_current_playlist()}else{this.tracksErrorElem.show()}},toggleSidebarEditName:function(playlist_item){playlist_item.find("a.playlist").toggle();playlist_item.find("form.edit_playlist_form").toggle();var button=playlist_item.find("a.edit_playlist");if(button.html()==STRINGS.cancel_edit_playlist_text){button.html(STRINGS.edit_playlist_text)}else{button.html(STRINGS.cancel_edit_playlist_text);var edit_input=playlist_item.find("input.playlist_name");edit_input.val(playlist_item.data("playlist").toString());setTimeout(function(){edit_input.focus().select()})}},toggleEditForm:function(){this.metadataElem.toggle();this.editForm.toggle();setTimeout(function(){$("#playlistEditTitle").focus().select()})},updateSidebarTitle:function(playlist){playlist.element.find("a.playlist span").text(UTIL.truncateString(playlist.toString()))},addTrack:function(artistName,trackName,albumName,url){var track=new MODELS.Track({artist:artistName,name:trackName,album:albumName,url:url});var playlist_track=this.current.add_track(track);if(albumName&&playlist_track.get_position()==1){var playlistName=albumName;if(artistName){playlistName=artistName+" - "+playlistName}this.current.title=playlistName}this.current.save();this.trackListElem.append(playlist_track.element);PLAYDAR.resolve_track(playlist_track)},onSave:function(playlist){if(playlist==this.current){this.setCurrent(playlist)}},subscriptionQueue:0,syncedQueue:0,queueSync:function(playlist){if(playlist.isSynced()){this.syncedQueue++;this.syncedSidebarTitleElem.addClass("progress")}else{this.subscriptionQueue++;this.subscriptionsSidebarTitleElem.addClass("progress")}},consumeSyncQueue:function(playlist){if(playlist.isSynced()){this.syncedQueue--;if(!this.syncedQueue){this.syncedSidebarTitleElem.removeClass("progress")}}else{this.subscriptionQueue--;if(!this.subscriptionQueue){this.subscriptionsSidebarTitleElem.removeClass("progress")}}},checkSubscription:function(playlist){if(!playlist.isSubscription()){return}var sub=playlist.subscription;var args=sub.arguments.slice();var that=this;args.push(function callback(newPlaylist){var diff=playlist.diffTracks(newPlaylist);var added=[];for(var field in diff){if(diff[field].change===true){added.push(diff[field].track)}}if(added.length){playlist.setLastSyncDate();if(playlist.isSynced()){playlist.reset_tracks(newPlaylist.tracks);playlist.reload()}else{UTIL.sortByMethod(added,"get_position",true);$.each(added,function(i,playlist_track){playlist.add_track(playlist_track.track,{unplayed:true},true)});playlist.save()}playlist.element.find(".playlist").effect("highlight",{color:"#6ea31e"},100)}that.consumeSyncQueue(playlist)});args.push(function exceptionHandler(exception){exception.diagnose();that.consumeSyncQueue(playlist)});this.queueSync(playlist);IMPORTERS[sub.namespace][sub.method].apply(this,args)},onUnload:function(playlist){PLAYDAR.resetSM2Container()},remove:function(playlist){if(confirm("Are you sure you want to delete this playlist:\n\n"+playlist.toString())){playlist.remove();return true}return false},removeCurrent:function(){return this.remove(this.current)},onDelete:function(playlist){if(this.playingTrack&&playlist==this.playingTrack.playlist){PLAYDAR.stopPlaySession()}if(playlist.isAlbum()){if(!this.albumsSidebarList.find("li").size()){this.albumsSidebarTitleElem.hide()}}else{if(playlist.isSynced()){if(!this.syncedSidebarList.find("li").size()){this.syncedSidebarTitleElem.hide()}}else{if(playlist.isSubscription()){if(!this.subscriptionsSidebarList.find("li").size()){this.subscriptionsSidebarTitleElem.hide()}}}}if(playlist==this.current){this.create()}}};var Playlist=new Playlist();MODELS.onCouchDown=function(){Playlist.couchDownHandler.apply(Playlist,arguments)};MODELS.onCouchUp=function(){Playlist.couchUpHandler.apply(Playlist,arguments)};MODELS.Playlist.DefaultOptions={onSave:function(){Playlist.onSave(this)},onCreate:function(){Playlist.onCreate(this)},onUnload:function(){Playlist.onUnload(this)},onDelete:function(){Playlist.onDelete(this)}};CONTROLLERS.Playlist=Playlist})();IMPORTERS={YQL_URL:"http://query.yahooapis.com/v1/public/yql?callback=?",YQL_SELECT_XML:"select * from xml where url=@url",getJson:function(url,params,callback,exception,exceptionHandler){params=params||{};exceptionHandler=exceptionHandler||IMPORTERS.defaultExceptionHandler;var hasTimedOut=false;var callTimeout=setTimeout(function(){hasTimedOut=true;exceptionHandler(exception("Request timed out",{url:url,params:params}))},4000);$.getJSON(url,params,function(json){if(hasTimedOut){return}clearTimeout(callTimeout);try{IMPORTERS.checkResponse.call(this,json,exception);callback.call(this,json,url,params)}catch(e){exceptionHandler(e)}})},getJsonFomXml:function(url,callback,exception,exceptionHandler){IMPORTERS.getJson(IMPORTERS.YQL_URL,{url:url,q:IMPORTERS.YQL_SELECT_XML,format:"json"},function(json,requestUrl,requestParams){if(!json.query||!json.query.results){throw exception("Invalid URL",json)}callback.call(this,json,requestUrl,requestParams)},exception,exceptionHandler)},autocompleteFromXml:function(element,url,params,parse,formatItem){element.autocomplete(IMPORTERS.YQL_URL,{multiple:false,delay:200,dataType:"jsonp",extraParams:{url:function(){var queryUrl=url;if(params){queryUrl+="?"+Playdar.Util.toQueryString(params())}return queryUrl},q:IMPORTERS.YQL_SELECT_XML,format:"json"},cacheLength:1,parse:parse,formatItem:formatItem})},getAbsoluteUrl:function(url,base){base=base||window.location.href;if(url&&!url.match(/^https?:\/\//)&&base.match(/^https?:\/\//)){if(url.indexOf("/")===0){var baseLocation=Playdar.Util.location_from_url(base);url=baseLocation.protocol+"//"+baseLocation.host+url}else{url=base.replace(/(\/[^\/]*)$/,"")+"/"+url}}return url},createPlaylistFromJspf:function(source,jspf,metadata,callback,exception){if(!jspf.trackList||!jspf.trackList.track){throw exception("No tracks in JSPF response",jspf)}metadata=metadata||{};var trackList=$.makeArray(jspf.trackList.track);if(!trackList.length){throw exception("No tracks in JSPF",jspf.trackList)}var title=metadata.title||jspf.title||jspf.info;var url=metadata.url||jspf.info;var description=metadata.description||jspf.annotation||jspf.info;if(description==title||description==url){description=""}var playlist=new MODELS.Playlist({type:metadata.type,title:title,artist:metadata.artist,album:metadata.album,image:IMPORTERS.getAbsoluteUrl(metadata.image||jspf.image,source),description:description,url:IMPORTERS.getAbsoluteUrl(url,source),source:source,subscription:metadata.subscription});$.each(trackList,function(i,data){if(data.title){var trackDoc={name:data.title,artist:data.creator,album:data.album};if(data.duration){trackDoc.duration=Math.round(data.duration/1000)}if(data.location){trackDoc.url=IMPORTERS.getAbsoluteUrl(data.location,source)}playlist.add_track(new MODELS.Track(trackDoc))}});if(callback){callback(playlist)}return playlist},getStringItem:function(field){var fields=$.makeArray(field);var string=$.grep(fields,function(value,i){return typeof value=="string"})[0];if(!string){string=$.grep(fields,function(value,i){return value&&value.content})[0]||"";if(string){string=string.content}}return string},createPlaylistFromPodcast:function(source,podcast,metadata,callback,exception){if(!podcast.item){throw exception("No tracks in Podcast response",podcast)}var trackList=$.makeArray(podcast.item);if(!trackList.length){throw exception("No tracks in Podcast",podcast.item)}var image=podcast.image?podcast.image.href:(podcast.thumbnail?podcast.thumbnail.url:"");var subtitle=IMPORTERS.getStringItem(podcast.subtitle);var description=IMPORTERS.getStringItem(podcast.description||podcast.summary);if(description==subtitle){description=""}var playlist=new MODELS.Playlist({type:metadata.type,subscription:metadata.subscription,title:IMPORTERS.getStringItem(podcast.title),subtitle:subtitle,description:description,copyright:IMPORTERS.getStringItem(podcast.copyright),image:IMPORTERS.getAbsoluteUrl(image,source),url:IMPORTERS.getStringItem(podcast.link),source:source});$.each(trackList,function(i,data){var trackDoc={name:data.title,artist:data.author?(data.author.name||IMPORTERS.getStringItem(data.author)):IMPORTERS.getStringItem(podcast.author)};if(data.enclosure&&data.enclosure.url){trackDoc.url=data.enclosure.url;trackDoc.size=data.enclosure.length;trackDoc.mimetype=data.enclosure.type}playlist.add_track(new MODELS.Track(trackDoc))});if(callback){callback(playlist)}return playlist},createPlaylistFromAtomPodcast:function(source,podcast,metadata,callback,exception){if(!podcast.entry){throw exception("No tracks in Atom Podcast response",podcast)}var trackList=$.makeArray(podcast.entry);if(!trackList.length){throw exception("No tracks in Atom Podcast",podcast.entry)}var image=podcast.image?podcast.image.href:podcast.logo;var subtitle=IMPORTERS.getStringItem(podcast.subtitle);var description=IMPORTERS.getStringItem(podcast.description||podcast.summary);if(description==subtitle){description=""}var linkObject=$.grep(podcast.link,function(value,i){return value&&(value.rel=="alternate")})[0];var link=linkObject?linkObject.href:"";var playlist=new MODELS.Playlist({type:metadata.type,subscription:metadata.subscription,title:IMPORTERS.getStringItem(podcast.title),subtitle:subtitle,description:description,copyright:IMPORTERS.getStringItem(podcast.copyright),image:IMPORTERS.getAbsoluteUrl(image,source),url:link,source:source});$.each(trackList,function(i,data){var trackDoc={name:data.title,artist:data.author?(data.author.name||IMPORTERS.getStringItem(data.author)):IMPORTERS.getStringItem(podcast.author)};var trackLinks=$.makeArray(data.link);var trackLink=$.grep(trackLinks,function(value,i){return value&&value.rel&&(value.rel=="enclosure")})[0];if(trackLink){trackDoc.url=trackLink.href;trackDoc.size=trackLink.length;trackDoc.mimetype=trackLink.type}playlist.add_track(new MODELS.Track(trackDoc))});if(callback){callback(playlist)}return playlist},defaultExceptionHandler:function(exception){if(PLAYLICK.debug){exception.diagnose()}},checkResponse:function(json,exception){if(!json){throw exception("No JSON",this.url)}if(json.error){throw exception(json.error.description||json.error.message||json.message,json)}}};(function(){function Exception(message,diagnostics){this.message=message;this.diagnostics=diagnostics}Exception.prototype={name:"Exception",toString:function(){return this.name+": "+this.message},diagnose:function(){if(!PLAYLICK.debug){return false}console.warn(this.toString());if(!this.diagnostics){return}if(typeof this.diagnostics=="string"){console.log(this.diagnostics)}else{console.dir(this.diagnostics)}}};function partialException(exception){if(!exception.message){return function finalise(message,diagnostics){exception.message=message;exception.diagnostics=diagnostics;return exception}}return exception}var Url={};Url.Exception=function(url,message,diagnostics){this.url=url;this.message=message;this.diagnostics=diagnostics;return partialException(this)};Url.Exception.prototype=new Exception;Url.Exception.prototype.name="UrlException";Url.Exception.prototype.toString=function(){return this.name+": "+this.message+" ("+this.url+")"};Url.XspfException=Url.Exception;Url.XspfException.prototype.name="UrlXspfException";Url.PodcastException=Url.Exception;Url.PodcastException.prototype.name="UrlPodcastException";Url.AtomPodcastException=Url.Exception;Url.AtomPodcastException.prototype.name="UrlAtomPodcastException";Url.url=function(source,callback,exceptionHandler){var exception=new Url.XspfException(source);IMPORTERS.getJsonFomXml(source,function(json,requestUrl,requestParams){var root=json.query.results;var podcast=root.rss?root.rss.channel:"";var atom=root.feed;var jspf=root.lfm?root.lfm.playlist:root.playlist;if(!podcast&&!atom&&!jspf){throw exception("Invalid Podcast/XSPF",root)}var playlist;var metadata={type:"subscription",subscription:{namespace:"Url",method:"url",arguments:[source],synced:false}};if(jspf){metadata.subscription.synced=true;playlist=IMPORTERS.createPlaylistFromJspf(source,jspf,metadata,callback,new Url.XspfException(source))}else{if(podcast){playlist=IMPORTERS.createPlaylistFromPodcast(source,podcast,metadata,callback,new Url.PodcastException(source))}else{if(atom){playlist=IMPORTERS.createPlaylistFromAtomPodcast(source,atom,metadata,callback,new Url.AtomPodcastException(source))}}}},exception,exceptionHandler)};var Spotify={LOOKUP_ROOT:"http://ws.spotify.com/lookup/1/",SEARCH_ROOT:"http://ws.spotify.com/search/1/"};Spotify.Exception=function(url,message,diagnostics){this.url=url;this.message=message;this.diagnostics=diagnostics;return partialException(this)};Spotify.Exception.prototype=new Exception;Spotify.Exception.prototype.name="SpotifyException";Spotify.Exception.prototype.toString=function(){return this.name+": "+this.message+" ("+this.url+")"};Spotify.UrlException=Spotify.Exception;Spotify.UrlException.prototype.name="SpotifyUrlException";Spotify.AlbumException=Spotify.Exception;Spotify.AlbumException.prototype.name="SpotifyAlbumException";Spotify.TrackException=Spotify.Exception;Spotify.TrackException.prototype.name="SpotifyTrackException";Spotify.getLookupUrl=function(queryParams){var lookupUrl=Spotify.LOOKUP_ROOT+"?"+Playdar.Util.toQueryString(queryParams);return lookupUrl};Spotify.convertUrlToHttp=function(url){var httpUrl=url.replace(/(?:spotify:\/+)?spotify:(track|album):(.*)/,"http://open.spotify.com/$1/$2");return httpUrl};Spotify.url=function(url,callback,exceptionHandler){if(url.indexOf("track")!==-1){return Spotify.track(url,callback,exceptionHandler)}else{if(url.indexOf("album")!==-1){return Spotify.album(url,callback,exceptionHandler)}else{exceptionHandler(new Spotify.UrlException(url,"Only spotify album or track URLs supported"))}}};Spotify.addTrack=function(playlist,trackData){var trackDoc={name:trackData.name,artist:trackData.artist.name||trackData.artist[0].name,album:trackData.album.name,duration:Math.round(trackData.length)};if(trackData.href){trackDoc.spotifyUrl=Spotify.convertUrlToHttp(trackData.href)}playlist.add_track(new MODELS.Track(trackDoc))};Spotify.album=function(url,callback,exceptionHandler){url=Spotify.convertUrlToHttp(url);var albumLookupUrl=Spotify.getLookupUrl({uri:url,extras:"trackdetail"});var exception=new Spotify.AlbumException(url);IMPORTERS.getJsonFomXml(albumLookupUrl,function(json,requestUrl,requestParams){if(!json.query.results.album){throw exception("No album",json)}var album=json.query.results.album;if(!album.artist||!album.name){throw exception("Invalid album",album)}var trackList=album.tracks.track;if(trackList.href){trackList=[trackList]}if(!trackList.length){throw exception("No tracks",album)}var playlist=new MODELS.Playlist({type:"album",artist:album.artist.name||album.artist[0].name,album:album.name,url:url,source:albumLookupUrl,image:LastFm.getAlbumArt(album.artist.name||album.artist[0].name,album.name,"large")});$.each(trackList,function(i,trackData){if(trackData.artist&&trackData.name){trackData.album=album;Spotify.addTrack(playlist,trackData)}});if(callback){callback(playlist)}},exception,exceptionHandler)};Spotify.track=function(url,callback,exceptionHandler){url=Spotify.convertUrlToHttp(url);var trackLookupUrl=Spotify.getLookupUrl({uri:url});var exception=new Spotify.TrackException(url);IMPORTERS.getJsonFomXml(trackLookupUrl,function(json,requestUrl,requestParams){if(!json.query||!json.query.results||!json.query.results.track){throw exception("No track",json)}var trackData=json.query.results.track;if(!trackData.artist||!trackData.name){throw exception("Invalid track",album)}var playlist=new MODELS.Playlist({title:(trackData.artist.name||trackData.artist[0].name)+" - "+trackData.name,url:url,source:trackLookupUrl});trackData.href=url;Spotify.addTrack(playlist,trackData);if(callback){callback(playlist)}},exception,exceptionHandler)};var LastFm={API_KEY:"b25b959554ed76058ac220b7b2e0a026",WS_ROOT:"http://ws.audioscrobbler.com"};LastFm.Exception=function(signature,message,diagnostics){this.signature=signature;this.message=message;this.diagnostics=diagnostics;return partialException(this)};LastFm.Exception.prototype=new Exception;LastFm.Exception.prototype.name="LastFmException";LastFm.Exception.prototype.toString=function(){return this.name+": "+this.message+" ("+this.signature+")"};LastFm.getJson=function(method,params,callback,exception,exceptionHandler){params=params||{};params.method=method;IMPORTERS.getJson(LastFm.WS_ROOT+"/2.0/?callback=?",$.extend(params,{api_key:LastFm.API_KEY,format:"json"}),callback,exception,exceptionHandler)};LastFm.generateSignature=function(method,params){var signature=method;params=params||{};for(k in params){signature+=" --"+k+"="+encodeURIComponent(params[k])}return signature};LastFm.getPlaylist=function(url,metadata,callback,exceptionHandler){var method="playlist.fetch";var params={playlistURL:url};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){var playlist=IMPORTERS.createPlaylistFromJspf(this.url,json.playlist,metadata,callback,exception)},exception,exceptionHandler)};LastFm.getUserPlaylist=function(data,callback,exceptionHandler){var url="lastfm://playlist/"+data.id;var metadata={type:"subscription",url:data.url,subscription:{namespace:"LastFm",method:"getUserPlaylist",arguments:[data],synced:true}};var image=$.grep(data.image,function(value,i){return value.size=="medium"});if(image[0]){metadata.image=image[0]["#text"]}LastFm.getPlaylist(url,metadata,callback,exceptionHandler)};LastFm.userPlaylists=function(user,callback,noPlaylistHandler,exceptionHandler){var method="user.getplaylists";var params={user:user};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){if(!json.playlists){throw exception("No playlists in response",json)}if(!json.playlists.playlist){return noPlaylistHandler()}var playlists=$.makeArray(json.playlists.playlist);callback(playlists)},exception,exceptionHandler)};LastFm.lovedTracks=function(user,callback,exceptionHandler){var method="user.getLovedTracks";var params={user:user};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){if(!json.lovedtracks||!json.lovedtracks.track){throw exception("No loved tracks in response",json)}var trackList=$.makeArray(json.lovedtracks.track);if(!trackList.length){throw exception("No loved tracks",jspf.trackList)}var playlist=new MODELS.Playlist({type:"subscription",title:"Loved tracks for "+json.lovedtracks["@attr"].user,subscription:{namespace:"LastFm",method:"lovedTracks",arguments:[user],synced:true}});$.each(trackList,function(i,data){var trackDoc={name:data.name,artist:data.artist.name};playlist.add_track(new MODELS.Track(trackDoc))});if(callback){callback(playlist)}},exception,exceptionHandler)};LastFm.album=function(artist,album,callback,exceptionHandler){var method="album.getInfo";var params={artist:artist,album:album};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){if(!json.album){throw exception("No album data",json)}var albumUrl="lastfm://playlist/album/"+json.album.id;var description="";if(json.album.wiki){description=$("<div/>").html(json.album.wiki.summary).text()+""}var metadata={type:"album",artist:json.album.artist,album:json.album.name,description:description,url:json.album.url};var image=$.grep(json.album.image,function(value,i){return value.size=="medium"});if(image[0]){metadata.image=image[0]["#text"]}LastFm.getPlaylist(albumUrl,metadata,callback,exceptionHandler)},exception,exceptionHandler)};LastFm.getTopTracks=function(artist,callback,exceptionHandler){var method="artist.getTopTracks";var params={artist:artist};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){if(!json.toptracks||!json.toptracks.track){throw exception("No top tracks for "+artist,json)}callback(json.toptracks.track)},exception,exceptionHandler)};LastFm.generateUsersPlaylist=function(userA,userB,callback,exceptionHandler){var method="tasteometer.compare";var params={type1:"user",value1:userA,type2:"user",value2:userB,limit:20};var exception=new LastFm.Exception(LastFm.generateSignature(method,params));LastFm.getJson(method,params,function(json,requestUrl,requestParams){if(!json.comparison||!json.comparison.result||!json.comparison.result.artists||!json.comparison.result.artists.artist){throw exception("No shared artists found",json)}var artists=UTIL.shuffle(json.comparison.result.artists.artist);var playlist=new MODELS.Playlist({title:userA+" and "+userB,description:"A playlist based on your shared artists"});var playlistTracks={};function randomTopTrackDone(processedArtist,tracks){for(artist in playlistTracks){if(playlistTracks[artist]===false){return}}if(!playlist.tracks.length){return exceptionHandler(exception("No valid tracks found for artists",playlistTracks))}if(callback){callback(playlist)}}$.each(artists,function(i,artist){var artist_name=artist.name;playlistTracks[artist_name]=false;LastFm.getTopTracks(artist_name,function callback(tracks){tracks=UTIL.shuffle(tracks);var track=tracks[0];var trackDoc={name:track.name,artist:track.artist.name};playlist.add_track(new MODELS.Track(trackDoc));playlistTracks[artist_name]=track;randomTopTrackDone(artist_name,tracks)},function exceptionHandler(exception){playlistTracks[artist_name]=exception;randomTopTrackDone(artist_name,exception)})})},exception,exceptionHandler)};LastFm.getAlbumArt=function(artist,album,size){size=size||"small";return LastFm.WS_ROOT+"/2.0/?"+$.param({artist:artist,album:album,method:"album.imageredirect",size:size,api_key:LastFm.API_KEY})};IMPORTERS.Url=Url;IMPORTERS.Spotify=Spotify;IMPORTERS.LastFm=LastFm})();var UTIL={shuffle:function(array){var copy=$.makeArray(array);copy.sort(function(){return 0.5-Math.random()});return copy},truncateString:function(name,length,truncation){length=length||30;if(truncation===undefined){truncation="…"}if(name.length>length){return name.slice(0,length-truncation.length)+truncation}return String(name)},serializeForm:function(form){var params={};$.each($(form).serializeArray(),function(i,item){params[item.name]=item.value});return params},compareString:function(a,b){a=a||"";b=b||"";return a.toUpperCase()==b.toUpperCase()},getHashParts:function(){var hash_sections=window.location.hash.replace(/^#(.*)/,"$1").split(";");var hash_parts={};$.each(hash_sections,function(i,section){var kv=section.split("=");if(kv[0]&&kv[1]){hash_parts[decodeURIComponent(kv[0])]=decodeURIComponent(kv[1])}});return hash_parts},autolink_regexp:/\b([\w-]+:\/+|www[.])[^\s()<>]+(?:\([\w\d]+\)|(?:[^.,;'">\:\s\<\>\)\]\!]|\/))/g,autoLink:function(word){word=word||"";return word.replace(UTIL.autolink_regexp,function(match,protocol,index,full){var url=match;if(protocol=="www."){url="http://"+url}var text=match.replace(/^http:\/\//,"").replace(/\/$/,"");return'<a href="'+url+'">'+text+"</a>"})},sortBy:function(list,property,callable,descending){list.sort(function(a,b){var aSort=callable?a[property]():a[property];var bSort=callable?b[property]():b[property];if(aSort>bSort){return descending?-1:1}if(aSort<bSort){return descending?1:-1}return 0})},sortByProperty:function(list,property,descending){UTIL.sortBy(list,property,false,descending)},sortByMethod:function(list,method,descending){UTIL.sortBy(list,method,true,descending)}};var STRINGS={edit_playlist_text:"edit",cancel_edit_playlist_text:"cancel",loading_flash_text:$("#playdarStatus").html(),loading_flash_error_text:"Flash player unavailable",loading_playdar_text:"Checking for Playdar…",connect_to_playdar_text:"Connect",connected_to_playdar_text:"Connected",disconnect_from_playdar_text:"Disconnect",playdar_unavailable_text:"Can't find Playdar",download_playdar_text:'<a href="http://www.playdar.org/download/" title="Download Playdar">Download</a>',loading_playlists_text:CONTROLLERS.Playlist.loadingPlaylistsElem.html()};var PLAYDAR={sm2Container:$("#sm2-container"),maxVideoWidth:556,soundmanager_ready:function(status){if(status.success){Playdar.client.go();PLAYLICK.checkUrlHash();CONTROLLERS.Playlist.fetchAll()}else{PLAYDAR.update_status(STRINGS.loading_flash_error_text)}},playdar_listeners:{onStartStat:function(){PLAYDAR.update_status(STRINGS.loading_playdar_text)},onStat:function(detected){if(detected){if(!detected.authenticated){var connect_link=Playdar.client.get_auth_link_html(STRINGS.connect_to_playdar_text);PLAYDAR.update_status("<strong>"+connect_link+"</strong>")}}else{PLAYDAR.update_status(STRINGS.playdar_unavailable_text+" "+Playdar.client.get_stat_link_html()+" "+STRINGS.download_playdar_text)}},onAuth:function(){var disconnect_link=Playdar.client.get_disconnect_link_html(STRINGS.disconnect_from_playdar_text);PLAYDAR.update_status("<strong>"+STRINGS.connected_to_playdar_text+"</strong> "+disconnect_link);PLAYDAR.resolve_current_playlist()},onResolveIdle:function(){if(CONTROLLERS.Playlist.current&&PLAYLICK.batch_save){CONTROLLERS.Playlist.current.save();PLAYLICK.batch_save=false}}},update_status:function(message){$("#playdarStatus").html(message)},loadTrackResults:function(playlist_track,response){playlist_track.playdar_qid=response.qid;playlist_track.playdar_response=response;PLAYDAR.buildResultsTable(playlist_track,response)},buildResultsTable:function(playlist_track,response){var listItem=playlist_track.element;listItem.removeClass("scanning");if(!response.results.length){listItem.addClass("noMatch");return false}listItem.addClass("match");var resultsForm=$("<form>");var resultsTable=$('<table cellspacing="0"></table>');var foundPerfect=false;UTIL.sortByProperty(response.results,"score",true);$.each(response.results,function(i,result){var mimetype=result.mimetype||"";var video=mimetype.match(/^video/);Playdar.player.register_stream(result,{chained:true,video:video,onload:PLAYDAR.onResultLoad,onmetadata:PLAYDAR.onResultMetadata,onplay:PLAYDAR.onResultStart,onpause:PLAYDAR.onResultPause,onresume:PLAYDAR.onResultPlay,onstop:PLAYDAR.onResultStop,onfinish:PLAYDAR.onResultFinish,whileplaying:PLAYDAR.updatePlaybackProgress,whileloading:PLAYDAR.updateLoadProgress});var scoreCell=$('<td class="score">');var choiceRadio=$('<input type="radio" name="choice">').val(result.sid);var perfectMatch=result.score>0.99;if(perfectMatch){scoreCell.text("★").addClass("perfect")}else{if(result.score>0){scoreCell.text(result.score.toFixed(3))}else{scoreCell.html("&nbsp;")}}var nameCell=$('<td class="name" colspan="5">');var artistAlbum=result.artist;if(result.album){artistAlbum+=" - "+result.album;var albumArt=IMPORTERS.LastFm.getAlbumArt(result.artist,result.album);nameCell.append($('<img width="34" height="34">').attr("src",albumArt))}nameCell.append($("<span>").text(result.track));nameCell.append("<br>"+artistAlbum);var trackRow=$('<tr class="track">').append($('<td class="choice">').append(choiceRadio)).append(nameCell);var duration=result.duration?Playdar.Util.mmss(result.duration):"";var size=result.size?((result.size/1000000).toFixed(1)+"MB"):"";var bitrate=result.bitrate?(result.bitrate+" kbps"):"";var source=result.source||"";var sourceCell=$('<td class="source">');if(result.url){sourceCell.append($("<a>").attr("href",result.url).text(source))}else{sourceCell.text(source)}var infoRow=$('<tr class="info">').append(scoreCell).append(sourceCell).append($('<td class="time">').text(duration)).append($('<td class="size">').text(size)).append($('<td class="mimetype">').text(mimetype)).append($('<td class="bitrate">').text(bitrate));var resultTbody=$("<tbody>").attr("id","s_"+result.sid).append(trackRow).append(infoRow).data("result",result).data("track_item",listItem).addClass("result");if(video){resultTbody.addClass("video");listItem.addClass("video")}resultsTable.append(resultTbody);if(perfectMatch&&!foundPerfect){foundPerfect=resultTbody}});resultsForm.append(resultsTable);var sources=listItem.children(".sources");sources.html(resultsForm);if(foundPerfect){PLAYDAR.selectSource(playlist_track,foundPerfect)}},buildUrlResponse:function(playlist_track){var urlResponse={qid:Playdar.Util.generate_uuid(),results:[{score:1,preference:80,url:playlist_track.track.url,artist:playlist_track.track.artist,album:playlist_track.track.album,track:playlist_track.track.name,source:Playdar.Util.location_from_url(playlist_track.track.url).host,duration:playlist_track.track.duration,size:playlist_track.track.size,mimetype:playlist_track.track.mimetype}]};return urlResponse},track_handler:function(playlist_track){var uuid=Playdar.Util.generate_uuid();Playdar.client.register_results_handler(function(response,final_answer){if(final_answer){PLAYDAR.loadTrackResults(playlist_track,response)}},uuid);return uuid},recheck_track:function(playlist_track){if(Playdar.client&&Playdar.client.isAvailable()&&Playdar.client.is_authed()){if(playlist_track.playdar_qid){playlist_track.element.addClass("scanning");Playdar.client.recheck_results(playlist_track.playdar_qid)}}},resolve_track:function(playlist_track,force){var track=playlist_track.track;if(!force&&playlist_track.playdar_response){PLAYDAR.loadTrackResults(playlist_track,playlist_track.playdar_response)}else{if(track.url){PLAYDAR.loadTrackResults(playlist_track,PLAYDAR.buildUrlResponse(playlist_track))}else{var qid=PLAYDAR.track_handler(playlist_track);if(Playdar.client&&Playdar.client.isAvailable()&&Playdar.client.is_authed()){playlist_track.element.removeClass("noMatch match perfectMatch video");playlist_track.element.addClass("scanning");Playdar.client.resolve(track.artist,track.name,track.album,qid)}else{playlist_track.element.removeClass("noMatch match perfectMatch video");playlist_track.element.addClass("scanning");PLAYDAR.aolResolve(track.artist,track.name,track.album,qid)}}}},aolResolve:function(artist,track,album,qid){var response={qid:qid,query:{artist:artist,track:track,album:album},solved:false,results:[]};if(!artist||!track){Playdar.client.handleResultsCallback(response,true);return}var aolUrl="http://music.aol.com/api/audio/search?c=?";$.getJSON(aolUrl,{start:0,count:5,artistName:artist,songTitle:track},function(json){if(json.response.data){response.results=$.map(json.response.data.assets,function(result,i){var score=0.8;if(UTIL.compareString(result.artistname,artist)&&UTIL.compareString(result.songtitle,track)){score=1;response.solved=true}return{artist:result.artistname,track:result.songtitle,album:result.albumname,duration:result.duration-0,url:result.enclosure,source:Playdar.Util.location_from_url(result.enclosure).host,score:score,preference:80}})}Playdar.client.handleResultsCallback(response,true)})},resolve_current_playlist:function(){if(CONTROLLERS.Playlist.current){$.each(CONTROLLERS.Playlist.current.tracks,function(i,playlist_track){PLAYDAR.resolve_track(playlist_track)})}},cancel_playdar_resolve:function(){if(Playdar.client){Playdar.client.cancel_resolve()}CONTROLLERS.Playlist.trackListElem.find("li").removeClass("scanning")},onResultLoad:function(){if(this.duration){PLAYDAR.updateStreamDuration(this.sID,this.duration)}var trackSource=$("#"+this.sID);var track_item=trackSource.data("track_item");if(this.readyState==2||!this.duration){if(track_item){trackSource.addClass("error");if(PLAYDAR.playNextSource(trackSource)){return track_item}track_item.addClass("error");if(PLAYDAR.playNextTrack(track_item)){return track_item}}PLAYDAR.stopPlaySession()}return track_item},onResultMetadata:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item){track_item.removeClass("loading");PLAYDAR.positionVideo.call(this)}},onResultStart:function(){var track_item=PLAYDAR.onResultPlay.call(this);if(track_item){track_item.addClass("loading");var playlist_track=track_item.data("playlist_track");CONTROLLERS.Playlist.setPlaying(playlist_track);PLAYDAR.updatePlaybackProgress.call(this)}},onResultPause:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item){track_item.removeClass("playing");track_item.addClass("paused")}return track_item},onResultPlay:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item){track_item.removeClass("paused");track_item.removeClass("error")}return track_item},positionVideo:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item&&this.width&&this.height){var videoShim=track_item.find(".videoShim");if(videoShim.size()&&!videoShim.is(":visible")){var width=this.width;var height=this.height;if(width>PLAYDAR.maxVideoWidth){var aspectRatio=height/width;width=PLAYDAR.maxVideoWidth;height=aspectRatio*width}videoShim.width(width).height(height).show();var position=videoShim.offset();videoShim.width("100%");PLAYDAR.positionSM2Container(position,width,height)}}},positionSM2Container:function(position,width,height){var contentOffset=$("#content").offset();PLAYDAR.sm2Container.width(width).height(height).css({top:position.top-contentOffset.top-1,left:position.left-contentOffset.left})},resetSM2Container:function(){CONTROLLERS.Playlist.trackListElem.find(".videoShim").hide();PLAYDAR.sm2Container.width(PLAYDAR.originalSM2Width).height(PLAYDAR.originalSM2Height).css({top:PLAYDAR.originalSM2Top,left:PLAYDAR.originalSM2Left})},resetResult:function(){this.width=this.height=null;var track_item=$("#"+this.sID).data("track_item");if(track_item){var playlist_track=track_item.data("playlist_track");PLAYDAR.resetSM2Container();track_item.removeClass("playing").removeClass("paused").removeClass("loading").css("background-position","0 0");var progress=track_item.find(".elapsed");progress.text(playlist_track.track.get_duration_string());var loading=track_item.find(".loading");loading.width(0)}return track_item},onResultStop:function(){var track_item=PLAYDAR.resetResult.call(this);return track_item},stopPlaySession:function(){Playdar.player.stop_current(true);CONTROLLERS.Playlist.setPlaying()},onResultFinish:function(){var track_item=PLAYDAR.resetResult.call(this);if(track_item){if(PLAYDAR.playNextTrack(track_item)){return true}}PLAYDAR.stopPlaySession();return track_item},updatePlaybackProgress:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item){var playlist_track=track_item.data("playlist_track");PLAYDAR.positionVideo.call(this);var progress=track_item.find(".elapsed");var elapsed="";if(this.position){elapsed+="<strong>"+Playdar.Util.mmss(Math.round(this.position/1000))+"</strong>";if(playlist_track.track.duration){elapsed+=" / "}}if(playlist_track.track.duration){elapsed+=playlist_track.track.get_duration_string()}progress.html(elapsed);var duration;if(this.readyState==3){duration=this.duration}else{duration=this.durationEstimate}var portion_played=this.position/duration;track_item.css("background-position",Math.round(portion_played*track_item.width())+"px 0");track_item.addClass("playing")}return track_item},updateLoadProgress:function(){var track_item=$("#"+this.sID).data("track_item");if(track_item){var playlist_track=track_item.data("playlist_track");if(!playlist_track.playdar_result.video){track_item.removeClass("loading")}var loading=track_item.find(".loading");var loaded=this.bytesLoaded/this.bytesTotal*100;loading.width(loaded+"%");PLAYDAR.updateStreamDuration(this.sID,this.durationEstimate,loaded<100)}},updateStreamDuration:function(sid,duration,estimate){var track_item=$("#"+sid).data("track_item");if(track_item){var progress=track_item.find(".elapsed");if(estimate){progress.addClass("estimate")}else{progress.removeClass("estimate")}var playlist_track=track_item.data("playlist_track")}return track_item},playTrack:function(playlist_track){if(playlist_track&&playlist_track.play()){playlist_track.element.effect("highlight",{color:"#6ea31e"},100)}},playNextTrack:function(track_item){var next_playlist_track=track_item.nextAll("li.perfectMatch").data("playlist_track");if(next_playlist_track){PLAYDAR.playTrack(next_playlist_track);return true}return false},playPreviousTrack:function(track_item){var next_playlist_track=track_item.prevAll("li.perfectMatch").data("playlist_track");if(next_playlist_track){PLAYDAR.playTrack(next_playlist_track);return true}return false},selectSource:function(playlist_track,tbody){var radio=tbody.find("input[name=choice]");radio.attr("checked",true);tbody.siblings().removeClass("choice");tbody.addClass("choice");playlist_track.element.addClass("perfectMatch");var result=tbody.data("result");playlist_track.set_track_duration(result.duration);playlist_track.element.find(".elapsed").text(playlist_track.track.get_duration_string());if(playlist_track.playdar_result&&(playlist_track.playdar_result.sid!=result.sid)){playlist_track.stop()}playlist_track.playdar_result=result},playSource:function(playlist_track,trackSource){PLAYDAR.selectSource(playlist_track,trackSource);if(!Playdar.player.is_now_playing()){PLAYDAR.playTrack(playlist_track)}},playNextSource:function(trackSource){var track_item=trackSource.data("track_item");var nextSource=trackSource.nextAll("tbody:not(.error):first");if(nextSource.size()){PLAYDAR.playSource(track_item.data("playlist_track"),nextSource);return true}return false},playPreviousSource:function(trackSource){var track_item=trackSource.data("track_item");var previousSource=trackSource.prevAll("tbody:not(.error):first");if(previousSource.size()){PLAYDAR.playSource(track_item.data("playlist_track"),previousSource);return true}return false}};PLAYDAR.originalSM2Width=PLAYDAR.sm2Container.width();PLAYDAR.originalSM2Height=PLAYDAR.sm2Container.height();PLAYDAR.originalSM2Top=PLAYDAR.sm2Container.css("top");PLAYDAR.originalSM2Left=PLAYDAR.sm2Container.css("left");var PLAYLICK={init:function(){CONTROLLERS.Playlist.create();PLAYLICK.createAppLauncherFrame()},appLauncherId:"appLauncher",createAppLauncherFrame:function(){var iframe=$('<iframe width="0" height="0" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" scrolling="no" allowtransparency="true">').attr("id",PLAYLICK.appLauncherId).attr("name",PLAYLICK.appLauncherId);$("body").append(iframe);iframe.attr("src","about:blank")},checkUrlHash:function(){var hash_parts=UTIL.getHashParts();if(hash_parts.xspf){PLAYLICK.fetchUrl(hash_parts.xspf,"xspf")}if(hash_parts.podcast){PLAYLICK.fetchUrl(hash_parts.podcast,"podcast")}if(hash_parts.lastfm_playlists){PLAYLICK.fetchLastFmUserPlaylists(hash_parts.lastfm_playlists)}if(hash_parts.lastfm_loved){PLAYLICK.fetchLastFmLovedTracks(hash_parts.lastfm_loved,function callback(playlistId,playlist){CONTROLLERS.Playlist.load(playlist)})}if(hash_parts.artist&&hash_parts.album){PLAYLICK.fetchLastFmAlbum(hash_parts.artist,hash_parts.album)}if(hash_parts.lastfm_you&&hash_parts.lastfm_they){PLAYLICK.generateLastFmUsersPlaylist(hash_parts.lastfm_you,hash_parts.lastfm_they,true)}if(hash_parts.artist&&hash_parts.track){CONTROLLERS.Playlist.create();CONTROLLERS.Playlist.addTrack(hash_parts.artist,hash_parts.track)}if(hash_parts.spotify_album){IMPORTERS.Spotify.album(hash_parts.spotify_album,CONTROLLERS.Playlist.load)}if(hash_parts.spotify_track){IMPORTERS.Spotify.track(hash_parts.spotify_track,CONTROLLERS.Playlist.load)}},importSetup:function(type){$("p.messages").hide();$("#"+type+"_loading").show();$("#"+type+"_error").empty()},fetchUrl:function(url,type){PLAYLICK.importSetup(type);IMPORTERS.Url.url(url,function callback(playlist){$("p.messages").hide();$("#"+type+"_title").text(playlist.toString());$("#"+type+"_count").text(playlist.tracks.length);$("#"+type+"_done").show();CONTROLLERS.Playlist.register(playlist);CONTROLLERS.Playlist.load(playlist)},function exceptionHandler(exception){$("#"+type+"_input").val(url);$("p.messages").hide();var escapedUrl=$("<b>").text("URL: "+url);var errorMessage=$("<p>").text(exception.message);errorMessage.append("<br>").append(escapedUrl);$("#"+type+"_error").html(errorMessage.html());$("#"+type+"_error").show()})},fetchSpotify:function(url){PLAYLICK.importSetup("spotify");IMPORTERS.Spotify.url(url,function callback(playlist){$("p.messages").hide();$("#spotify_title").text(playlist.toString());$("#spotify_done").show();CONTROLLERS.Playlist.register(playlist);CONTROLLERS.Playlist.load(playlist)},function exceptionHandler(exception){$("#spotify_input").val(url);$("p.messages").hide();var escapedUrl=$("<b>").text("URL: "+url);var errorMessage=$("<p>").text(exception.message);errorMessage.append("<br>").append(escapedUrl);$("#spotify_error").html(errorMessage.html());$("#spotify_error").show()})},fetchLastFmAlbum:function(artist,album){PLAYLICK.importSetup("album");IMPORTERS.LastFm.album(artist,album,function callback(playlist){$("p.messages").hide();var escapedAlbum=$("<b>").text(playlist.toString());$("#album_name").html(escapedAlbum);$("#album_done").show();CONTROLLERS.Playlist.register(playlist);CONTROLLERS.Playlist.load(playlist)},function exceptionHandler(exception){$("p.messages").hide();var escapedAlbum=$("<b>").text("Artist: "+artist+" Album: "+album);var escapedSignature=$("<small>").text(exception.signature);var errorMessage=$("<p>").text(exception.message);errorMessage.append("<br>").append(escapedAlbum).append("<br>").append(escapedSignature);$("#album_error").html(errorMessage.html());$("#album_error").show()})},lastFmImportDone:function(processedUrl,playlist){for(playlistUrl in PLAYLICK.importedPlaylists){if(PLAYLICK.importedPlaylists[playlistUrl]===false){return}}$("p.messages").hide();$("#lastfm_imported").show()},fetchLastFmLovedTracks:function(username,callback){var playlistId="loved_"+username;PLAYLICK.importedPlaylists[playlistId]=false;IMPORTERS.LastFm.lovedTracks(username,function lovedTracksCallback(playlist){PLAYLICK.importedPlaylists[playlistId]=playlist;CONTROLLERS.Playlist.register(playlist);callback(playlistId,playlist)},function exceptionHandler(exception){PLAYLICK.importedPlaylists[playlistId]=exception;callback(playlistId,exception)})},importLastfmUserPlaylists:function(data,callback){var playlistId=data.id;PLAYLICK.importedPlaylists[playlistId]=false;IMPORTERS.LastFm.getUserPlaylist(data,function playlistCallback(playlist){PLAYLICK.importedPlaylists[playlistId]=playlist;CONTROLLERS.Playlist.register(playlist);callback(playlistId,playlist)},function playlistExceptionHandler(exception){PLAYLICK.importedPlaylists[playlistId]=exception;callback(playlistId,exception)})},fetchLastFmUserPlaylists:function(username){PLAYLICK.importSetup("lastfm");$("#lastfm_playlists li.playlist").remove();PLAYLICK.playlistsToImport={};function addPlaylist(title,tracks,name){var listItem=$("<li>").append($("<input>").attr("type","checkbox").attr("checked",true).attr("name",name)).append(" ").append($("<span>").append(tracks)).append(UTIL.truncateString(title)).addClass("playlist selected").attr("title",title);$("#lastfm_playlists").append(listItem)}function addLovedTracks(){addPlaylist("Loved Tracks",'<img src="lastfm_loved.png" width="11" height="9">',"loved_"+username)}IMPORTERS.LastFm.userPlaylists(username,function callback(playlists){$("p.messages").hide();$("#lastfm_done").show();var s=(playlists.length===1)?"":"s";$("#lastfm_playlists_count").text(playlists.length+" Playlist"+s+" found");addLovedTracks();$.each(playlists,function(i,data){PLAYLICK.playlistsToImport[data.id]=data;addPlaylist(data.title,data.size,data.id)});$("#lastfm_playlists_form").show()},function noPlaylistHandler(){$("p.messages").hide();$("#lastfm_error_no_playlists").show();addLovedTracks();$("#lastfm_playlists_form").show()},function exceptionHandler(exception){$("#lastfm_input").val(username);$("p.messages").hide();var escapedName=$("<b>").text("Username: "+username);var escapedSignature=$("<small>").text(exception.signature);var errorMessage=$("<p>").text(exception.message);errorMessage.append("<br>").append(escapedName);if(PLAYLICK.debug){errorMessage.append("<br>").append(escapedSignature)}$("#lastfm_error").html(errorMessage.html());$("#lastfm_error").show()})},generateLastFmUsersPlaylist:function(you,they){PLAYLICK.importSetup("generate");IMPORTERS.LastFm.generateUsersPlaylist(you,they,function callback(playlist){$("p.messages").hide();$("#generate_done").show();CONTROLLERS.Playlist.register(playlist);CONTROLLERS.Playlist.load(playlist)},function exceptionHandler(exception){$("#generate_input_you").val(you);$("#generate_input_they").val(they);$("p.messages").hide();var escapedInput=$("<b>").text("You: "+you+" They: "+they);var escapedSignature=$("<small>").text(exception.signature);var errorMessage=$("<p>").text(exception.message);errorMessage.append("<br>").append(escapedInput).append("<br>").append(escapedSignature);$("#generate_error").html(errorMessage.html());$("#generate_error").show()})}};(function(){function trackToHtml(){var loading=$('<div class="loading">');var remove_link=$('<a href="#" class="remove" title="Remove from playlist">').text("╳");var source_link=$('<a href="#" class="show_sources" title="Show track sources">').text("sources");var item_name=$('<span class="haudio">').append($('<span class="contributor">').text(UTIL.truncateString(this.artist)).attr("title",this.artist)).append($('<strong class="fn">').text(UTIL.truncateString(this.name,(this.artist?30:50))).attr("title",this.name));var elapsed=$('<span class="elapsed">').text(this.get_duration_string());var status=$('<span class="status">');var item_link=$('<a href="#" class="item">').append(elapsed).append(status).append(item_name);var videoShim=$('<div class="videoShim">').hide();var sources=$('<div class="sources">');var wrapper=$("<div>").append(loading).append(remove_link);if(this.spotifyUrl){var spotifyLink=$('<a class="spotifyLink">').attr("target",PLAYLICK.appLauncherId).attr("href",this.spotifyUrl).append('<img src="/spotify_icon.gif" width="16" height="16">');wrapper.append(spotifyLink)}wrapper.append(source_link).append(item_link).append(videoShim).append(sources);return wrapper.html()}function playlistToHtml(){var wrapper=$("<div>");var play_indicator=$('<a href="#" class="playlist_playing" title="Playing">');wrapper.append(play_indicator);var delete_link=$('<a href="#" class="delete_playlist" title="Delete playlist">').text("╳");wrapper.append(delete_link);var edit_link=$('<a href="#" class="edit_playlist">').text(STRINGS.edit_playlist_text);wrapper.append(edit_link);var title=$('<a href="#" class="playlist">').attr("title",this.toString()).append($("<span>").text(UTIL.truncateString(this.toString())));if(this.isAlbum()){var albumArt=IMPORTERS.LastFm.getAlbumArt(this.artist,this.album);title.prepend($('<img width="24" height="24" class="art">').attr("src",albumArt))}wrapper.append(title);var edit_form=$('<form style="display: none;" class="edit_playlist_form">').append('<input type="text" name="name" class="playlist_name">').append('<input type="submit" value="save">');wrapper.append(edit_form);return wrapper.html()}MODELS.Track.prototype.toHTML=trackToHtml;MODELS.Playlist.prototype.toHTML=playlistToHtml})();CONTROLLERS.Playlist.trackListElem.sortable({axis:"y",cursor:"move",opacity:0.5,delay:100,placeholder:"placeholder",forcePlaceholderSize:true,update:function(e,ui){var tracks=$.map($("#playlist li"),function(playlist_item,i){return $(playlist_item).data("playlist_track")});CONTROLLERS.Playlist.current.reset_tracks(tracks)}});CONTROLLERS.Playlist.trackListElem.click(function(e){var target=$(e.target);var track_item=target.closest("li.p_t");if(track_item.size()){var playlist_track=track_item.data("playlist_track");var tbody=target.closest("tbody.result");if(tbody.size()){track_item.removeClass("open");PLAYDAR.playSource(playlist_track,tbody)}if(target.is("a.remove")){playlist_track.remove();return false}if(target.is("a.show_sources")){track_item.toggleClass("open");return false}var track_link=target.closest("li.p_t a.item");if(track_link.size()){e.preventDefault();if(track_item.is("li.open")){track_item.removeClass("open")}else{if(track_item.is("li.perfectMatch")){PLAYDAR.playTrack(playlist_track)}else{if(track_item.is("li.match")){track_item.toggleClass("open")}else{if(playlist_track.playdar_qid){PLAYDAR.recheck_track(playlist_track)}else{PLAYDAR.resolve_track(playlist_track,true)}}}}}}});CONTROLLERS.Playlist.addTrackButton.click(function(e){e.preventDefault();if(CONTROLLERS.Playlist.current&&!CONTROLLERS.Playlist.current.persisted){CONTROLLERS.Playlist.addTrackTable.show();CONTROLLERS.Playlist.addTrackSearchInput.focus().select()}else{CONTROLLERS.Playlist.addTrackTable.toggle()}});CONTROLLERS.Playlist.addTrackCancel.click(function(e){e.preventDefault();CONTROLLERS.Playlist.addTrackTable.hide()});CONTROLLERS.Playlist.addTrackSearchInput.autocomplete(IMPORTERS.LastFm.WS_ROOT+"/2.0/?callback=?",{multiple:false,delay:200,dataType:"jsonp",extraParams:{method:"track.search",track:function(){return CONTROLLERS.Playlist.addTrackSearchInput.val()},api_key:IMPORTERS.LastFm.API_KEY,format:"json"},cacheLength:1,parse:function(json){var parsed=[];if(json&&json.results&&json.results.trackmatches&&json.results.trackmatches.track){var tracks=$.makeArray(json.results.trackmatches.track);$.each(tracks,function(i,track){parsed.push({data:track,value:track.name,result:track.artist+" - "+track.name})})}return parsed},formatItem:function(track,position,length,value){return track.artist+" - "+track.name}});CONTROLLERS.Playlist.addTrackSearchInput.result(function(e,track,formatted){CONTROLLERS.Playlist.addTrackTable.show();$("#addTrackTrackInput").val(track.name).focus().select();$("#addTrackArtistInput").val(track.artist);$("#addTrackSearchInput").val("")});CONTROLLERS.Playlist.addTrackForm.submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);if(params.trackName){if(params.albumName){$("#addTrackTrackInput").focus().select()}else{$("#addTrackArtistInput").focus().select()}CONTROLLERS.Playlist.addTrack(params.artistName,params.trackName,params.albumName,params.url)}});CONTROLLERS.Playlist.createLink.click(function(e){e.preventDefault();CONTROLLERS.Playlist.create()});CONTROLLERS.Playlist.playlistSidebarLists.keydown(function(e){var target=$(e.target);if(target.is("input.playlist_name")&&e.keyCode==27){CONTROLLERS.Playlist.toggleSidebarEditName(target.parents("li.p"))}});CONTROLLERS.Playlist.playlistSidebarLists.click(function(e){var target=$(e.target);var playlist_item=target.closest("li.p");if(target.is("li.p a.playlist, li.p a.playlist span, li.p a.playlist img")){e.preventDefault();target.blur();CONTROLLERS.Playlist.loadItem(playlist_item)}if(target.is("li.p a.delete_playlist")){e.preventDefault();CONTROLLERS.Playlist.remove(playlist_item.data("playlist"))}if(target.is("li.p a.playlist_playing")){e.preventDefault();target.blur();PLAYDAR.playTrack(CONTROLLERS.Playlist.playingTrack)}if(target.is("li.p a.edit_playlist")){e.preventDefault();target.blur();CONTROLLERS.Playlist.toggleSidebarEditName(playlist_item)}if(target.is("li.p form.edit_playlist_form input[type=submit]")){e.preventDefault();var form=target.parents("form");var params=UTIL.serializeForm(form);var playlist=playlist_item.data("playlist");playlist_item.data("playlist").title=params.name;playlist_item.data("playlist").save();CONTROLLERS.Playlist.toggleSidebarEditName(playlist_item)}});$("#lastfm_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#lastfm_input").val("").focus().select();PLAYLICK.fetchLastFmUserPlaylists(params.username)});$("#lastfm_playlists").click(function(e){var target=$(e.target);var playlist_item=target.closest("li.playlist");var checkbox=playlist_item.children("input[type=checkbox]");if(playlist_item.size()){playlist_item.toggleClass("selected");if(!target.is("input[type=checkbox]")){checkbox.attr("checked",!checkbox.attr("checked"))}}});$("#lastfm_playlists_form").submit(function(e){e.preventDefault();PLAYLICK.importSetup("lastfm");PLAYLICK.importedPlaylists={};var params=UTIL.serializeForm(this);for(var k in params){var lovedMatches=k.match(/loved_(.*)/);if(lovedMatches){PLAYLICK.fetchLastFmLovedTracks(lovedMatches[1],PLAYLICK.lastFmImportDone)}else{PLAYLICK.importLastfmUserPlaylists(PLAYLICK.playlistsToImport[k],PLAYLICK.lastFmImportDone)}}});$("#lastfm_playlists_all").click(function(e){e.preventDefault();$("#lastfm_playlists li.playlist").addClass("selected");$("#lastfm_playlists input[type=checkbox]").attr("checked",true)});$("#lastfm_playlists_none").click(function(e){e.preventDefault();$("#lastfm_playlists li.playlist").removeClass("selected");$("#lastfm_playlists input[type=checkbox]").attr("checked",false)});$("#album_import_input").autocomplete(IMPORTERS.LastFm.WS_ROOT+"/2.0/?callback=?",{multiple:false,delay:200,dataType:"jsonp",extraParams:{method:"album.search",album:function(){return $("#album_import_input").val()},api_key:IMPORTERS.LastFm.API_KEY,format:"json"},cacheLength:1,parse:function(json){var parsed=[];if(json&&json.results&&json.results.albummatches&&json.results.albummatches.album){var albums=$.makeArray(json.results.albummatches.album);$.each(albums,function(i,album){parsed.push({data:album,value:album.name,result:album.artist+" - "+album.name})})}return parsed},formatItem:function(album,position,length,value){return album.artist+" - "+album.name}});$("#album_import_input").result(function(e,album,formatted){$("#album_import_name").val(album.name);$("#album_import_artist").val(album.artist);$("#album_import_input").submit()});$("#album_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#album_import_artist").val("");$("#album_import_name").val("");$("#album_import_input").val("").focus().select();PLAYLICK.fetchLastFmAlbum(params.artist_name,params.album_name)});$("#xspf_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#xspf_input").val("").focus().select();PLAYLICK.fetchUrl(params.url,"xspf")});$("#podcast_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#podcast_input").val("").focus().select();PLAYLICK.fetchUrl(params.url,"podcast")});$("#spotify_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#spotify_input").val("").focus().select();PLAYLICK.fetchSpotify(params.url)});$("#lastfm_battle_form").submit(function(e){e.preventDefault();var params=UTIL.serializeForm(this);$("#lastfm_battle_input_they").val("");$("#lastfm_battle_input_you").val("").focus().select();PLAYLICK.generateLastFmUsersPlaylist(params.you,params.they)});$(document).keydown(function(e){var target=$(e.target);if(target.is("input[type=text], textarea, select")){return true}if(e.metaKey||e.altKey||e.ctrlKey){return true}var current_track,previous_track,next_track;switch(e.keyCode){case 80:e.preventDefault();current_track=CONTROLLERS.Playlist.playingTrack;if(!current_track){current_track=$("#playlist li.perfectMatch").data("playlist_track")}PLAYDAR.playTrack(current_track);break;case 219:e.preventDefault();if(CONTROLLERS.Playlist.playingTrack){if(e.shiftKey){PLAYDAR.playPreviousSource(CONTROLLERS.Playlist.playingTrack.element.find("tbody.choice"))}else{PLAYDAR.playPreviousTrack(CONTROLLERS.Playlist.playingTrack.element)}}break;case 221:e.preventDefault();if(CONTROLLERS.Playlist.playingTrack){if(e.shiftKey){PLAYDAR.playNextSource(CONTROLLERS.Playlist.playingTrack.element.find("tbody.choice"))}else{PLAYDAR.playNextTrack(CONTROLLERS.Playlist.playingTrack.element)}}break}});