dojo.require("dojo.cookie");

// define LFM for display functions
var isLFM = '';
// value calculated in initializePage function on index.html


var allTracks = "";
var allArtists = "";
var allPlaylists = "";
var allGenres = "";
var addedTracks = new Array();
var artistTracks = "";
var currentPlaylistTracks = "";
var data = "";
var tracksPerPage = 100;
activeDisplay = "";
var activeDisplayType = "";
var currentSort = new Array();
var activePlaylist = "";
var currentPlaylist = "";
var currentPage = 0;
var totalPages = 0;
var recentTracks = new Array();
var currentArtist = "";
var currentPlaylistID = "";
var currentPlaylistName = "";
var genreMap = ["Unknown", "Alternative", "Blues", "Children’s Music", "Christian/Gospel", "Classical", "Comedy &amp; Spoken Word", "Country", "Electronica", "Easy Listening", "Americana", "Hip-Hop/Rap", "Twelve", "Jazz", "Latin", "New Age", "Pop", "R&amp;B", "Eighteen", "Rock", "Soundtrack", "Twenty-One", "World/Reggae"];
var itemMap = ["track", "album", "playlist", "playlist", "artist", "radio", "", "work"];
var mp3Map = ["MP3", "Album (MP3s)", "Playlist (MP3s)", "Playlist (MP3s)", "artist", "radio", "", "work"];
var explicitPlaylist = false;

function dumpArtistAlbums(aid,genre) {
	var arr = collection.store.getArtistAlbums(aid,genre)
	var url = "";
	if(typeof(genre) != "undefined") {
		url = 'http://home.napster.com/MyLibrary/ArtistByGenre/' + aid + '/' + genre;
	} else {
		url = 'http://home.napster.com/MyLibrary/Artist/' + aid;
	}
	var returnText = '<li><a onclick="sideBarNavigate(\'' + url + '\', this); return false;" href="javascript:;">All Tracks</a></li>';
	for(var item in arr) {
		var value = arr[item];
		if(typeof(value) == 'string') { //Make sure we don't have an array,
			url = 'http://home.napster.com/MyLibrary/Album/' + item.substring(1);
			returnText += '<li><a href="javascript:;" onclick="sideBarNavigate(\'' + url + '\', this); return false;" title="' + value + '">' + value + '</a></li>';
		}
	}
	return returnText;
}

function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	if(level > 0) { dumped_text += "<ul>"; }
	if(typeof(arr) == 'object') { //Array/Hashes/Objects
		if(level == 1) { // Get the artist names so we can sort
			var sortArr = new Array();
			var artistArr = new Array();
			var sendArr = new Array();
			for(var item in arr) {
				if(item != "toSource") {
					artistName = collection.store.getArtistName(item.substring(1));
					artistArr[artistName] = item;
					sortArr.push(artistName);
				}
			}
			sortArr.sort();
			for(var sortItem in sortArr) {
				if(sortItem != "toSource") {
					artistName = sortArr[sortItem];
					artistID = artistArr[artistName];
					// console.log("sortItem: " + sortItem + " artistName: " + artistName);
					// sendArr[artistName] = arr[artistID]
					if(typeof(artistID != 'undefined')) { sendArr[artistID] = artistName }
				}
			}
			arr = sendArr;
			sortArr = new Array();
		}
		for(var item in arr) {
			var value = arr[item];
			if(typeof(value) != 'function') {
				if(typeof(value) == 'object') { //If it is an array,
					switch(level){
						case 0: dumped_text += "<li><a href='#' id='gid_" + item + "'>" + genreMap[item] + "</a>"; break;
						case 1: dumped_text += "<li><a href='#'>" + item + "</a>"; break;
						default: dumped_text += item; break;
					}
					dumped_text += dump(value,level+1);
					dumped_text += "</li>";
				} else {
					/* if(typeof(value) == 'string') {
						if((item != "toSource") && (value != "")) { // These checks are necessary to prevent IE from writing out our toSource function as an artist. */
							dumped_text += '<li><a href="#">' + value + '</a><ul id="aid_' + item.substring(1) + '"></ul></li>';
						/* }
					} */
				}
			}
		}
	}
	if(level > 0) { dumped_text += "</ul>"; }
	return dumped_text;
} 

function createVisitorLibNav() {
	//
	dojo.byId("libraryArtists").parentNode.className = 'arrow_r';
	dojo.byId("libraryArtists").parentNode.innerHTML = '<a href="javascript:;" onclick="showVisitorPop(); return false;">View By Artists</a>';
	dojo.byId("libraryPlaylists").parentNode.className = 'arrow_r';
	dojo.byId("libraryPlaylists").parentNode.innerHTML = '<a href="javascript:;" onclick="showVisitorPop(); return false;">My Playlists</a>';
}

var libraryDisplay = {
    initialize: function(refresh_playlists) {
		// empty out any existing data
		if(typeof(refresh_playlists) == "undefined") { refresh_playlists = true; }
		allArtists = '';
		allGenres = '';
		allTracks = '';
		if(refresh_playlists) { allPlaylists = ''; }
    	// console.log("libraryDisplay.initialize running");
		// var t = new Date();
		// console.log("entering libraryDisplay initialize - " + t);
		// this.writeAllGenres();
		// t = new Date();
		// console.log("finished libraryDisplay initialize writeAllGenres() - " + t);
        this.writeAllArtists();
		// t = new Date();
		// console.log("finished libraryDisplay initialize writeAllArtists() - " + t);
        if(refresh_playlists) { this.writeAllPlaylists(); }
		// t = new Date();
		// console.log("finished libraryDisplay initialize writeAllPlaylists() - " + t);
		ntreeCreate("bar2");
		// t = new Date();
		// console.log("exiting libraryDisplay initialize - " + t);
        // rp.store.getRecentTracks(tracksPerPage,"libraryDisplay.displayRecentTracks(1,data)","libraryDisplay.appendTracks(data,\"recentTracks\")","libraryDisplay.updatePagination(\"recentTracks\",\"displayRecentTracks\")");
    },
	
	dateStringFromUTC: function(inUTCTime) {
		dateObj = new Date(inUTCTime * 1000);
		returnString = (dateObj.getMonth() + 1) + "/" + dateObj.getDate() + "/" + dateObj.getFullYear();
		return returnString;
	},

    writeAllArtists: function() {
		// console.log("in writeAllArtists");
         if(allArtists.length < 1) { 
			//console.log("in writeAllArtists - length was " + allArtists.length);
            allArtists = collection.store.getArtists();	
            var out = "";
			var r = 0;
            // for (var r = 0; r < allArtists.length; r++) {
				// setTimeout("", 2);
				// out += '<li><a href="#" title="' + allArtists[r]['n'] + '" onClick="libraryDisplay.displayArtistTracks(\'' + allArtists[r]['id'] + '\',\'' + allArtists[r]['n'] + '\')\; return false;">' + allArtists[r]['n'] + '</a></li>';
				// out += '<li><a href="#" title="' + allArtists[r]['n'] + '" onClick="libraryDisplay.displayArtistTracks(\'' + allArtists[r]['id'] + '\',\'\')\; return false;">' + allArtists[r]['n'] + '</a></li>';
				
				dojo.byId("libraryArtists").innerHTML = "<ul><li><span class='loadingMessage'>loading...</span></li></ul>";
				var artistsInterval = setInterval( function(){
					if(r < allArtists.length) {
						out += '<li><a href="#">' + allArtists[r]['n'] + '</a>';
						out += '<ul id="aid_' + allArtists[r]['id'] + '"></ul></li>'; // Blank UL (with aid_artistID) stubbed, we get albums on demand
						r++;
					} else {
						dojo.byId("libraryArtists").innerHTML = out;
						ntreeCreate("bar2");
						clearInterval(artistsInterval);
					}
				}, 1);
				/* out += '<li><a href="#">' + allArtists[r]['n'] + '</a>';
				out += '<ul id="aid_' + allArtists[r]['id'] + '"></ul></li>'; // Blank UL (with aid_artistID) stubbed, we get albums on demand */
            // }
            //console.log("library_display - out is: " + out);
            // dojo.byId("libraryArtists").innerHTML = out;
            // dojo.byId("artistOutput").style.display = !dojo.byId("artistOutput").style.display ? "none" : dojo.byId("artistOutput").style.display;
        }
    },
	
	writeAllGenres: function() {
		//console.log('in writeAllGenres');
		if(allGenres.length < 1) { 
			//console.log("in writeAllGenres loop - length was " + allGenres.length);
			collection.store.getGenreAlbums();
			/*allAlbums = collection.store.getGenreAlbums();
			artistsOut = dump(allAlbums);
			dojo.byId("libraryGenres").innerHTML = artistsOut;
			downList(dojo.byId("libraryGenres")); */
        }
	},

    displayAllArtists: function() {
		if(dojo.byId("artistOutput").innerHTML != "") {
	            dojo.byId("artistsExpandedImg").style.visibility == "visible" ? dojo.byId("artistsExpandedImg").style.visibility = "hidden" : dojo.byId("artistsExpandedImg").style.visibility = "visible";
	            dojo.byId("artistOutput").style.display == "none" ? dojo.byId("artistOutput").style.display = "block" : dojo.byId("artistOutput").style.display= "none";
		}
    },
	
    _appendActivePlaylist: function(pname, pid) {
        var selectElement = dojo.byId("activePlaylist");
        var optionElement = document.createElement("option");
        optionElement.text = pname;
            optionElement.value = 'p' + pid;

            try {
                    selectElement.add(optionElement, null); // standards compliant; doesn't work in IE
            } catch(ex) {
                    selectElement.add(optionElement); // IE only
            }
    },

    writeAllPlaylists: function() {
        if(allPlaylists.length < 1) {
            allPlaylists = collection.store.getPlaylists();
            var libraryOut = "";
			var popupOut = "";
			// popupContainerClick
			/* out += '<div class="playlistNameDisplay"><a href="#" onClick="setTimeout(\'showAddPlaylistPop()\', 50); return false;"><strong>(+) Create New Playlist</strong></a></div>';
			dojo.byId("activePlaylist").innerHTML = '<option value="">Please select a playlist</option>';
			dojo.byId("activePlaylist").innerHTML += '<option value="">------------------------</option>'; */
			
			libraryOut += '<li id="playlist0" class="dropLibrary"><a href="javascript:;" onclick="showNewPlaylistPop(); return false;">(+) Create New Playlist</a></li>';
			libraryOut += '<li><a href="javascript:;" onclick="sideBarNavigate(\'http://home.napster.com/MyLibrary/RecentlyPlayed\', this); return false;">Recently Played</a></li>';
			libraryOut += '<li><a href="javascript:;" onclick="sideBarNavigate(\'http://home.napster.com/MyLibrary/RecentlyAdded\', this); return false;">Recently Added</a></li>';
            for (var r = 0; r < allPlaylists.length; r++) {
				var playlistName = new String(allPlaylists[r]['n']);
				playlistName = html_escape(playlistName);
				// setTimeout("", 2);
                // out += '<li id="playlist' + allPlaylists[r]['id'] +'" class="dropLibrary"><a href="#" title="' + allPlaylists[r]['n'] + '" onClick="libraryDisplay.displayPlaylistTracks(\'' + allPlaylists[r]['id'] + '\',\'' + this._safeSendText(allPlaylists[r]['n']) + '\')\; return false;">' + allPlaylists[r]['n'] + '</a></li>';
				libraryOut += '<li id="playlist' + allPlaylists[r]['id'] +'" class="dropLibrary"><a href="javascript:;" onclick="sideBarNavigate(\'http://home.napster.com/MyLibrary/Playlist/' + allPlaylists[r]['id'] + '\', this); return false;">' + playlistName + '</a></li>';
				// popupOut += '<li id="playlist' + allPlaylists[r]['id'] +'" class="dropLibrary"><a href="#" onclick="libraryDisplay.addTrackToPlaylist(eval(contentIdToAdd), \'\', ' + allPlaylists[r]['id'] + '); hidePlaylistPop(); return false;">' + allPlaylists[r]['n'] + '</a></li>';
				popupOut += '<li id="playlist' + allPlaylists[r]['id'] +'"><a href="javascript:;" title="' + playlistName + '" onclick="libraryDisplay.addContentToPlaylist(eval(contentIdToAdd), eval(contentTypeToAdd), ' + allPlaylists[r]['id'] + '); hidePlaylistPop(); return false;">' + playlistName + '</a></li>';
				// this._appendActivePlaylist(allPlaylists[r]['n'], allPlaylists[r]['id']);
            }
            dojo.byId("libraryPlaylists").innerHTML = libraryOut;
			dojo.byId("addDialogPlaylists").innerHTML = popupOut;
            // dojo.byId("playlistOutput").style.display = !dojo.byId("playlistOutput").style.display ? "none" : dojo.byId("playlistOutput").style.display;
        }
		makePlaylistsDroppable();
		if( PlayerObjectReference != null ){
			PlayerObjectReference.wp_Page.playlists.setup();
		}
    },

    displayAllPlaylists: function() {
		if(dojo.byId("playlistOutput").innerHTML != "") {
			dojo.byId("playlistsExpandedImg").style.visibility == "visible" ? dojo.byId("playlistsExpandedImg").style.visibility = "hidden" : dojo.byId("playlistsExpandedImg").style.visibility = "visible";
			dojo.byId("playlistOutput").style.display == "none" ? dojo.byId("playlistOutput").style.display = "block" : dojo.byId("playlistOutput").style.display= "none";
		}
    },
    
    getPlayerPlaylists: function() {
		//alert("writePlayerPlaylists start!");
		if(allPlaylists.length < 1) {
            allPlaylists = collection.store.getPlaylists();	
        }
        return allPlaylists;
        
	},
	
	_showLibraryActions: function() {
		displayBodyLoadingMessage();
		/* dojo.byId("libraryActions").style.visibility = "visible";
		dojo.byId("addAll").style.visibility = "visible";
		dojo.byId("playlistActions").style.visibility = "hidden";
		dojo.byId("playlistSelectArea").style.visibility = "visible";
		dojo.byId("playlistDataHeader").style.display = "none";
		dojo.byId("libraryDataHeader").style.display = "block";
		dojo.byId("dataHeaderOrder").style.visibility = "hidden"; */
	},
	
	_showPlaylistActions: function() {
		displayBodyLoadingMessage();
		
		dojo.byId("content_footer").style.display = "block";
        dojo.byId("content_footer").innerHTML = "<img src=\"/images/includes/pagination_loading.gif\" alt=\"\" \/>";
		var pageStr = "";
		var pageStrPre = '<div id="playlistActions">';
		pageStrPre += '<a href="#" onclick="collection.store.updateCurrentPlaylist(1); return false;"><button class="btn_short"><span>Update Current Playlist</span></button></a>';
		pageStrPre += '<a href="#" onclick="collection.store.removePlaylistTracks(); return false;"><button class="btn_short"><span>Remove Selected</span></button></a>';
		var pageStrPost = '</div>';
		pageStr = pageStrPre + pageStr + pageStrPost;
		dojo.byId("content_footer").innerHTML = pageStr;
		
		/* dojo.byId("libraryActions").style.visibility = "hidden";
		dojo.byId("addAll").style.visibility = "hidden";
		dojo.byId("playlistActions").style.visibility = "visible";
		dojo.byId("playlistSelectArea").style.visibility = "hidden";
		dojo.byId("libraryDataHeader").style.display = "none";
		dojo.byId("playlistDataHeader").style.display = "block";
		dojo.byId("dataHeaderOrder").style.visibility = "visible"; */
	},
	
	_showPlaylistHeader: function(pid,pname) {
		dojo.byId("content_head").style.display = "block";
		var headStr = "";
		pname = new String(pname);
		/*
		headStr += '<div class="playlistHead"><div id="autoMix">';
		headStr += '<div>More like this playlist:</div>';
		headStr += '<a class="link_automix" title="Automix" onclick="Play(\'' + pid + '\', \'3\', \'1\'); return false;" href="#">Automix</a>';
		headStr += '<span class="endcap" /></div>';
		headStr += '<span>';
		headStr += '<a href="#" onclick="Play(' + pid + ', 3); return false;" title="Play" class="link_play">Play</a>';
		headStr += '</span>';
		headStr += '<h2 class="noCaps">' + html_escape(pname) + '</h2>';
		headStr += '<a href="#" title="Delete Playlist" onclick="libraryDisplay.confirmDelete(\'' + pid + '\',\'2\'); return false;">(x) Delete Playlist</a></div>';
		*/
		headStr += '<div id="playList">';
		headStr += '<div>';
		headStr += '<h2 onclick="renPlaylistPop(); return false;">' + html_escape(pname) + '</h2>';
		headStr += '<span>';
		headStr += '<a class="link_play" href="#" onclick="Play(' + pid + ', 3); return false;" title="Play">Play</a>';
		headStr += '<a class="link_add" href="#" onclick="AddActions(this, ' + pid + ', 3); return false;" title="Add">Add</a>';
		headStr += '<a class="link_share" href="#" onclick="Share(' + pid + ', 3); return false;" title="Share">Share</a>';
		//headStr += '<span>(EXPLICIT)</span>';
		headStr += '<span id="explicitHead"></span>';
		headStr += '<a class="link_delete" href="#" onclick="libraryDisplay.confirmDelete(\'' + pid + '\',\'2\'); return false;" title="Delete this playlist">(x) Delete this playlist</a>';
		headStr += '</span>';
		headStr += '</div>';
		headStr += '</div>';
		
		dojo.byId("content_head").innerHTML = headStr;
	},
	
	confirmDelete: function(id, type, deletelistReturnItems) {
		var confirmed;
		var confirmationMessage = "";
		type = parseInt(type); 
		switch(type) {
			case 0:		confirmationMessage = "Are you sure you want to delete the selected tracks? This will delete them from your playlists and your Library."; break;
			case 2: 	confirmationMessage = "Are you sure you want to delete this playlist? This will not delete any tracks from your Library."; break;
 			default:	confirmationMessage = "Are you sure you want to delete the selected items? (Message " + type + ")"; break;
		}
		confirmed = confirm(confirmationMessage);
		if(confirmed) {
			if(deletelistReturnItems) {
				collection.store.deleteListReturnItems(0);
				collection.store.deleteItem(id, type);
			} else {
				collection.store.deleteItem(id, type);
			}
		}
	},

    displayRecentTracks: function(offset,data) {
    	//alert("displayRecentTracks start");
		currentContentType = "libraryRecentTracks";
		breadcrumb = '<p>';
			breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt; My Playlists - Recently Played';
		breadcrumb += '</p>';
		breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
		dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
		// dojo.byId("content_head").innerHTML = "";
		// loadContent("http://home.napster.com/info/fragments/last_played.html", "content_head");
		// dojo.byId("actionContainerTitle").className = "title";
		this._showLibraryActions();
		// displayBodyLoadingMessage();
        //if(recentTracks.length < 1 && !data) {
        if(!data) {
            rp.get.getRecentTracks(tracksPerPage,"libraryDisplay.displayRecentTracks(1,data)","libraryDisplay.appendTracks(data,\"recentTracks\")","libraryDisplay.updatePagination(\"recentTracks\",\"libraryRecentTracks\")");
            return;
        } else {
            /* if(activeDisplay != "recentTracks") { 
				activeDisplay = "recentTracks";
				this.updatePagination("recentTracks");
			} */
            if(data) {
				activeDisplay = data;
                recentTracks = data;
				this.updatePagination(recentTracks);
                this.displayPage(offset,data);
            } else {
                data = recentTracks;
				activeDisplay = data;
				this.updatePagination(recentTracks);
                this.displayPage(offset);
            }
        }
    },

    displayAllTracks: function(offset,data,checkSize) {
		if(typeof(checkSize) == "undefined") { checkSize = true; }
		if(checkSize) {
			if((tableData.TRACKS.length > 750 && (dojo.isIE == 6)) || tableData.TRACKS.length > 1500) {
				continueAnyway = confirm("Large Napster library detected\n\nDue to the large number of tracks in your library, using this feature may result in slow browser response. Are you sure you want to use this feature?");
				if(!continueAnyway) {
					return;
				}
			}
			displayLoadingMessage();
		}
		//console.log("displayAllTracks(" + offset + "," + data + ")");
		currentContentType = "libraryAllTracks";
		breadcrumb = '<p>';
			breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt; All Tracks';
		breadcrumb += '</p>';
		breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
		dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
		dojo.byId("content_head").innerHTML = "";
		// dojo.byId("actionContainerTitle").className = "title";
		this._showLibraryActions();
		if(allTracks.length < 1 && !data && data != 0) {
			// console.log("about to getAllTracks");
            collection.store.getAllTracks(tracksPerPage,"libraryDisplay.displayAllTracks(1,data,false)","libraryDisplay.appendTracks(data,\"allTracks\")","libraryDisplay.updatePagination(allTracks,\"displayAllTracks\")");
            return;
        } else {
            /* if(activeDisplay != "allTracks") { 
				activeDisplay = "allTracks";
				this.updatePagination("allTracks");
			} */
			if(typeof(data) == "string" && tableData.TRACKS.length > 0) {
				collection.store.getAllTracks(tracksPerPage,"libraryDisplay.displayAllTracks(1,data)","libraryDisplay.appendTracks(data,\"allTracks\")","libraryDisplay.updatePagination(allTracks,\"displayAllTracks\")");
				return;
			} else {
				try {
					data == ""; // this is to catch an IE issue
				} catch(ieErr) {
					collection.store.getAllTracks(tracksPerPage,"libraryDisplay.displayAllTracks(1,data)","libraryDisplay.appendTracks(data,\"allTracks\")","libraryDisplay.updatePagination(allTracks,\"displayAllTracks\")");
					return;
				}
				if(data != 0 && tableData.TRACKS.length > 0) {
					if(typeof(data) != "undefined") {
						if(typeof(data[0]) == "undefined") { // make sure we have results in the data we pass in
							collection.store.getAllTracks(tracksPerPage,"libraryDisplay.displayAllTracks(1,data)","libraryDisplay.appendTracks(data,\"allTracks\")","libraryDisplay.updatePagination(allTracks,\"displayAllTracks\")");
							return;
						}
					}
					try {
						data.join(",");
					} catch(e) {
			            collection.store.getAllTracks(tracksPerPage,"libraryDisplay.displayAllTracks(1,data)","libraryDisplay.appendTracks(data,\"allTracks\")","libraryDisplay.updatePagination(allTracks,\"displayAllTracks\")");
			            return;
					}
					activeDisplay = data;
					allTracks = data;
					this.displayPage(offset,data);
				} else {
					data = allTracks;
					activeDisplay = data;
					if(data && tableData.TRACKS.length > 0) {
						this.displayPage(offset,data);
					} else {
						this.displayEmptyPage("MyLibrary/AllTracks");
					}
				}
			}
        }
    },

    displayAddedTracks: function(offset,data) {
		currentContentType = "libraryAddedTracks";
		// currentPage = offset;
		breadcrumb = '<p>';
			breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt; My Playlists - Recently Added';
		breadcrumb += '</p>';
		breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
		dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
		// dojo.byId("content_head").innerHTML = "";
		// loadContent("http://home.napster.com/info/fragments/last_added.html", "content_head");
		// dojo.byId("actionContainerTitle").className = "title";
		this._showLibraryActions();
        if(typeof(addedTracks) != "undefined" && !data) {
           collection.store.getAddedTracks(tracksPerPage,"libraryDisplay.displayAddedTracks(1,data)","libraryDisplay.appendTracks(data,\"addedTracks\")","libraryDisplay.updatePagination(addedTracks,\"libraryAddedTracks\")");
        } else {
            /* if(activeDisplay != "addedTracks") { 
                activeDisplay = "addedTracks";
                this.updatePagination("addedTracks");
			} */
            if(data) {
				activeDisplay = data;
                addedTracks = data;
                this.displayPage(offset,data);
            }
            else {
                data = addedTracks;
				activeDisplay = data;
                this.displayPage(offset);
            }
        }
    },

    displayArtistTracks: function(aid,aname,sort_type,key,filter_type,filter_key) {
		currentContentType = "libraryArtistTracks";
		this._initalizeContentPanes();
        artistTracks = collection.store.getArtistTracks(aid,sort_type,key,'',filter_type,filter_key);
		activeDisplay = artistTracks;
		if(!aname) {
			aname = collection.store.getArtistName(aid);
		}
		if(aname != "") {
			breadcrumb = '<p>';
				breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt;';
				if(filter_type == "genre") {
					breadcrumb += ' View by Genre - ' + genreMap[filter_key] + ' - ' + aname;
				} else {
					breadcrumb += 'Artists - ' + aname;
				}
			breadcrumb += '</p>';
			breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
			dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
			this._showLibraryActions();
	        this.updatePagination(artistTracks);
	        this.displayPageOfTracks("1");
	        currentArtist = aid;
		} else {
			this.displayEmptyPage();
		}
    },

    displayAlbumTracks: function(aid,aname,sort_type,key) {
		this._initalizeContentPanes();
        albumTracks = collection.store.getAlbumTracks(aid,sort_type,key);
		if(albumTracks[0]) {
			// console.log(albumTracks.toSource());
			breadcrumb = '<p>';
				breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt; Albums - ' + albumTracks[0]['album_name'];
			breadcrumb += '</p>';
			breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
			dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
			this._showLibraryActions();
	        this.updatePagination(albumTracks);
	        this.displayPageOfTracks("1");
	        currentArtist = aid;
		} else {
			this.displayEmptyPage();
		}
    },

    displayTracksFromPlaylist: function(pid,pname) {
		this._initalizeContentPanes();
		if(pname == "") {
			pname = new String(collection.store.getPlaylistName(pid));
		}
		currentPlaylistID = pid;
		currentPlaylistName = pname;
        currentPlaylistTracks = collection.store.getPlaylistTracks(pid);
		//dojo.byId("breadcrumb_bar").innerHTML = pname;
		breadcrumb = '<p>';
			breadcrumb += '<a href="#" onClick="navigate(\'' + documentRoot + 'ns/home/?genre_id=0\');" class="f homeIcon">Napster Home</a> &gt; <a href="#MyLibrary" onClick="navigate(\'' + documentRoot + 'MyLibrary\');" class="f">My Library</a> &gt; Playlists - ' + html_escape(pname);
		breadcrumb += '</p>';
		breadcrumb += '<a href="#" onclick="helpPop(); return false;" id="link_help" title="Help">Help</a>';
		dojo.byId("breadcrumb_bar").innerHTML = breadcrumb;
		// dojo.byId("content_head").innerHTML = "";
		this._showPlaylistHeader(pid,pname);
		// dojo.byId("actionContainerTitle").className = "editableTitle";
		this._showPlaylistActions();
        // this.updatePagination("currentPlaylistTracks");
        this.displayPlaylistTracks(currentPlaylistTracks, 1);
		currentPlaylist = pid;
        //activePlaylist = pid;
    },
	
	displayActivePlaylist: function() {
		var selectElement = dojo.byId("activePlaylist");
		var activePlaylistId = selectElement.options[selectElement.selectedIndex].value;
		activePlaylistId = activePlaylistId.slice(1);
		var activePlaylistName = selectElement.options[selectElement.selectedIndex].text;
		if(activePlaylistId) {
			this.displayTracksFromPlaylist(activePlaylistId, activePlaylistName);
		} else {
			setTimeout("showSelectPlaylistPop()", 50);
		}
	},

    displayPageOfTracks: function(offset,staticVar,data) {
		// console.log("in displayPageOfTracks: " + offset + " (current page is " + currentPage + ")");
		if(staticVar && data) {
			var update = eval(staticVar);
			update = data;
			this.displayPage(offset,data);
		}
		else {
			this.displayPage(offset);
		}
    },

    displayPage: function(offset,data) {
		if(offset != currentPage) {
			
			// if(!initialized) { alert("timeout"); setTimeout("libraryDisplay.displayPage(offset,data)", 500); return; }
			displayBodyLoadingMessage();
			currentPage = offset;
			//console.log("in displayPage: " + offset);
			if(data) { totalPages = Math.ceil(data.length / tracksPerPage); this.updatePagination(); }
			var newPage = offset;
			if((dojo.byId("paginationPrevious")) && (dojo.byId("paginationNext"))) {
				//reset active class on all page numbers
				var paginationContainer = document.getElementById ('pagination');
				if (paginationContainer) {
				  var anchors = paginationContainer.getElementsByTagName ('a');
				  if (anchors) {
					for (var i = 0; i < anchors.length; ++i) {
						if(anchors[i].className == "active") anchors[i].className = "";
					}
				  }
				}
				
				if(newPage == 1) {
					dojo.byId("paginationPrevious").className = "previous";
				} else {
					dojo.byId("paginationPrevious").className = "previous active";
				}
				
				if(newPage == totalPages){
					dojo.byId("paginationNext").className = "next";
				} else {
					dojo.byId("paginationNext").className = "next active";
				}
				
				newPageId = "page" + newPage;
				
				dojo.byId(newPageId).className = "active";
			}
			
	        var offsetIdx = (offset - 1) * tracksPerPage;
	        // if we get data passed in, then that's the array to use (we're trickling in)
	        // otherwise, use what's been set to active
			var dispData = "";
	        if(typeof(data) == "undefined") { dispData = activeDisplay; } else { dispData = data; }
			// console.log("dispData: " + dispData.toSource());
			// dispData = data ? data : activeDisplay;
	        // use either tracksPerPage or length of dispData array
			// this.updatePagination(dispData,currentContentType);
			// console.log("!!! - " + typeof(dispData));
			if(dispData) {
				var loopCount = ((offsetIdx + tracksPerPage) > dispData.length ? dispData.length : (offsetIdx + tracksPerPage));
				var outData = dispData.slice(offsetIdx,loopCount);
				this.displayLibraryTracks(outData);
				makeDroppable();
				makeDraggable();
			} else {
				this.displayEmptyPage();
			}
		} else {
			console.log("skipping displayPage: offset and currentPage match- " + offset + " " + currentPage);
		}
    },
	
	displayEmptyPage: function(dataURL) {
		var linkURL = "";
		
		if(!dataURL) {
			setTimeout('libraryDisplay.displayEmptyPage("noURL")', 100);
		} else {
			if(dataURL == "noURL") {
				linkURL = window.location.hash.substring(1);
				// console.log("displayEmptyPage('noURL') - " + linkURL);
			} else {
				// console.log("displayEmptyPage("+ dataURL +")");
				linkURL = dataURL;
			}
		}
		var out = "";
		if(linkURL.substr(0,9) == "MyLibrary") {
			var linkURLpieces = linkURL.substr(9).split('/');
			if(linkURL == "MyLibrary") { linkURLpieces[1] = "MyLibrary"; }
			switch(linkURLpieces[1]) {
				case "AllTracks":		navigate("http://home.napster.com/info/all_tracks.html", 0); break;
				case "RecentlyAdded":	navigate("http://home.napster.com/info/recently_added.html", 0); break;
				case "RecentlyPlayed":	navigate("http://home.napster.com/info/recently_played.html", 0); break;
				case "Playlist":		navigate("http://home.napster.com/info/empty_playlist.html", 0); break;
				case "Artist":			navigate("http://home.napster.com/MyLibrary", 0); break;
				case "ArtistByGenre":	navigate("http://home.napster.com/MyLibrary", 0); break;
				default:
					out = "Information for this page is no longer available. Go to <a href=\"#\" onclick=\"navigate('http://home.napster.com/ns/home/?genre_id=00'); return false;\">Napster Home</a>.";
					console.log("NEED COLD START TEXT FOR: " + linkURLpieces[1]);
					break
			}
		} else {
			out += "<div class=\"emptyPage\"><div>";
			if(dataURL) {
				if(dataURL.indexOf("type_id=videosbyletter") != -1) { out += "We're sorry, no music videos are currently available. Please try another letter."; }
				if(dataURL.indexOf("type_id=artistbyletter") != -1) { out += "We're sorry, no artists are currently available. Please try another letter."; }
			} else {
				out += "Information for this page is no longer available. Go to <a href=\"#\" onclick=\"navigate('http://home.napster.com/ns/home/?genre_id=00'); return false;\">Napster Home</a>.";
			}
			out += "</div></div>";
			dojo.byId("content_body").innerHTML = out;
			//innerSwap(dojo.byId("content_body"), out);
			dojo.byId("content_body").scrollTop = 0;
		}
		
		dojo.byId("content_body").innerHTML = out;
		//innerSwap(dojo.byId("content_body"), out);
		dojo.byId("content_body").scrollTop = 0;
	},

    displayNextPage: function() {
		if (currentPage < totalPages) {
			//currentPage++;
			this.displayPage(currentPage+1);
		} else {
			console.log("currentPage: " + currentPage + " totalPages: " + totalPages);
		}
    },

    displayPreviousPage: function() {
		if (currentPage > 1) {
			//currentPage--;
			this.displayPage(currentPage-1);
		} else {
			console.log("currentPage: " + currentPage);
		}
	},

    appendTracks: function(data,dataArr) {
		if(typeof(data[0]) != "undefined") { // make sure we have results in the data we pass in
			var appendStr = dataArr + "=" +  dataArr +  ".concat(data)";
			eval(appendStr);
			this.updatePagination(dataArr,currentContentType,0);
		}
    },
	
	_safeSendText: function(inText) {
		var inText = inText.toString(); //convert our input text to a string
		var safeText = inText.replace(/'/g, "\\\'"); //escape all single quotes
		return safeText;
	},
	
	_safeSendHTMLText: function(inText) {
		var inText = inText.toString(); //convert our input text to a string
		var safeText = inText.replace(/'/g, "&#39;"); //escape all single quotes
		return safeText;
	},
	
	_initalizeContentPanes: function() {
		dojo.byId("content_head").innerHTML = "";
        this._displayLoading;
		dojo.byId("content_footer").innerHTML = "";
	},
	
	displayPlaylistTracks: function(tdata, libraryData) {
		if(libraryData) { currentContentType = "libraryPlaylistTracks"; }
		// console.log("In displayPlaylistTracks - libraryData: " + libraryData);
		this._displayTracks(tdata, libraryData, "playlistTracks");
    },
	
	_displayPlaylistTracksOLD: function(tdata) {  // PROBABLY SAFE DELETE ME - Playlist track lists are generally the same as other track lists
        var out = "";
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="selectedCol">&nbsp;</th>';
						out += '<th class="actionCol">Action</th>';
						out += '<th class="trackCol" colspan="2">Track</th>';
						out += '<th class="artistCol">Artist</th>';
						out += '<th class="albumCol">Album/Source</th>';
						out += '<th class="timeCol">Time</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
        for (var t = 0; t < tdata.length; t++) {
			// setTimeout("", 2);
            out += '<tr id="t' + tdata[t].track_id + '" class="dragLibrary'; out += (t % 2) ? "" : " oddRow"; out += '">';
				out += '<td><input type="checkbox" name="selected" value="t' + tdata[t].track_id + '" /></td>';
				out += '<td>';
					out += '<span>';
						out += '<a href="#" onclick="Play(' + tdata[t].track_id + '); return false;" title="Play" class="link_play">Play</a>';
					out += '</span>';
				out += '</td>';
				out += '<td><a href="http://home.napster.com/cgi-bin/searchXML?type_id=albumtracks&amp;result_type=track&amp;select_by=album&amp;select_value=' + tdata[t].album_id + '&amp;format=json" title="' + tdata[t].track_name + '" onClick="">' + tdata[t].track_name + '</a></td>';
				/* out += '<td><a href="http://sms.napster.com/ns/view/artist/?id=' + tdata[t].artist_id + '" title="' + tdata[t].artist_name + '"><strong>' + tdata[t].artist_name + '</strong></a></td>'; */
				// NOTE: we don't want to link to aritst_id 10462505 (a.k.a. Various Artists)
				out += tdata[t].artist_id != 10462505 ? '<td><a href="#" onClick=\'navigate("http://home.napster.com/ns/view/artist/?artist_id=' + tdata[t].artist_id + '"); return false;\' title="' + tdata[t].artist_name + '"><strong>' + tdata[t].artist_name + '</strong></a></td>' :
					'<td><strong>' + tdata[t].artist_name + '</strong></td>';
				/* out += '<td><a href="http://www.napster.com/view/album/index.html?id=' + tdata[t].album_id + '" title="' + tdata[t].album_name + '"><em>' + tdata[t].album_name + '</em></a></td>'; */
				out += '<td><a href="#" onClick=\'navigate("http://home.napster.com/cgi-bin/searchXML?type_id=albumtracks&amp;result_type=track&amp;select_by=album&amp;select_value=' + tdata[t].album_id + '&amp;format=json"); return false;\' title="' + tdata[t].album_name + '"><em>' + tdata[t].album_name + '</em></a></td>';
				out += '<td>' + tdata[t].duration + '</td>';
				
				/* out += '<div class="trackWrapper">';
					out += '<div>';
						out += '<div class="trackListTrack"><a href="http://www.napster.com/view/album/index.html?id=' + tdata[t].album_id + '" title="' + tdata[t].track_name + '" onClick="">"' + tdata[t].track_name + '"</a></div>';
						out += '<div class="trackListArtist"><a href="http://www.napster.com/view/artist/index.html?id=' + tdata[t].artist_id + '" title="' + tdata[t].artist_name + '">' + tdata[t].artist_name + '</a></div>';
						out += '<div class="trackListAlbum"><a href="http://www.napster.com/view/album/index.html?id=' + tdata[t].album_id + '" title="' + tdata[t].album_name + '">' + tdata[t].album_name + '</a></div>';
						out += '<div class="trackListDuration">' + tdata[t].duration + '</div>';
					out += '</div>';
					out += '<div>';
						out += '<div class="rightLinks">';
							out += '<a href="#" onClick="removeTrack(\'orderBox' + (t + 1) + '\'); return false;" title="Remove \'\'' + tdata[t].track_name + '\'\' from Playlist">(x) Remove from Playlist</a>';
						out += '</div>'
					out += '</div>';
				out += '</div>';
			out += '</div>'; */
			out += '</tr>';
        }
		out += '</table>';
		out += '</div>';
        dojo.byId("content_body").innerHTML = out;
        //innerSwap(dojo.byId("content_body"), out);
		makeDraggable();
		dojo.byId("content_body").scrollTop = 0;
		
		activeDisplay = tdata;
	},
	
	displayLibraryTracks: function(tdata) {
		console.log("In displayLibraryTracks");
		this._displayTracks(tdata, 1, "tracks");
	},
	
	displayTracks: function(tdata, listType) {
		console.log("In displayTracks");
		this._displayTracks(tdata, 0, listType);
	},
	
	selectAllListReturn: function(checked) {
		var inputs = dojo.byId("listReturn").getElementsByTagName("input");
		if(checked) {
			if(inputs.length) {
			    for(var i=0; i<inputs.length; i++) {
					if(inputs[i].getAttribute("type") == "checkbox") {
						inputs[i].checked = true;
					}
				}
			}
		} else {
			if(inputs.length) {
			    for(var i=0; i<inputs.length; i++) {
					if(inputs[i].getAttribute("type") == "checkbox") {
						inputs[i].checked = false;
					}
				}
			}
		}
	},
	
	_getRightsObj: function(itemObj, itemType, returnJSON) {
		if(typeof(itemType) == "undefined") {
			switch(itemObj.type) {
				case "track":	itemType = 0;
			}
		}
		var rightsObj = {};
		switch(itemType) {
			case 0:	rightsObj.can_download = (typeof(itemObj.can_download) != "undefined")?itemObj.can_download:itemObj.downloadable;
					(rightsObj.can_download && rightsObj.can_download != "N")?rightsObj.can_download=1:rightsObj.can_download=0;
					rightsObj.can_stream = (typeof(itemObj.can_stream) != "undefined")?itemObj.can_stream:itemObj.streamable;
					(rightsObj.can_stream && rightsObj.can_stream != "N")?rightsObj.can_stream=1:rightsObj.can_stream=0;
					rightsObj.afs = (typeof(itemObj.afs) != "undefined")?itemObj.afs:itemObj.album_for_sale;
					(rightsObj.afs && rightsObj.afs != "N")?rightsObj.afs=1:rightsObj.afs=0;
					rightsObj.can_purchase = (typeof(itemObj.can_purchase) != "undefined")?itemObj.can_purchase:1;
					(rightsObj.can_purchase && rightsObj.can_purchase != "N")?rightsObj.can_purchase=1:rightsObj.can_purchase=0;
					rightsObj.album_id = (typeof(itemObj.album_id) == "undefined")?"0":itemObj.album_id; // We need the album_id if afs and !can_purchase
					rightsObj.can_burn = (typeof(itemObj.can_burn) != "undefined")?itemObj.can_burn:itemObj.burnable;
					(rightsObj.can_burn && rightsObj.can_burn != "N")?rightsObj.can_burn=1:rightsObj.can_burn=0;
					break
			case 1:	rightsObj.afs = (typeof(itemObj.afs) != "undefined")?itemObj.afs:itemObj.album_for_sale;
					(rightsObj.afs && rightsObj.afs != "N")?rightsObj.afs=1:rightsObj.afs=0;
					break
		}
		if(returnJSON) {
			return rightsObj;
		} else {
			var rightsObjTxt = runToSource(rightsObj);
			rightsObjTxt.replace(/\"/g, "'");
			return rightsObjTxt;
		}
	},
	
	_displayTrack: function(ttrack, tval, libraryList, listType) {
		// if(tval == 1) { console.log("In _displayTrack - tval: " + tval + " libraryList: " + libraryList + " listType: " + listType); }
		var playlistList = false;
		var checkBox = true;
		switch(listType) {
			case "playlistTracks":
				playlistList = true;
				break
		}
		var out = "";
		if((playlistList && typeof(ttrack.artist_id) == "undefined") || ttrack == null) {
			if(ttrack == null) {
				return;
			}
			out += '<tr id="t' + ttrack.track_id + '"';
			out += (tval % 2) ? ' class="dojoDndItem"' : ' class="dojoDndItem oddRow" '; out += '>';
			out += '<td colspan="2">&nbsp;</td>';
			out += '<td>' + tval + '</td>';
			out += '<td colspan="5" class="externalTrack">';
			out += 'Imported Track - This personal track resides on another PC';
			out += '</td>';
			out += '</tr>';
		} else {
			out += '<tr id="t' + ttrack.track_id;
			switch(libraryList) {
				// case 0: out += '" class="drag'; break
				//case 0: out += '" class="dragBoth'; break
				//case 1: out += '" class="dragLibrary'; break
				case 0: out += '" class="dojoDndItem dragBoth'; break
				case 1: out += '" class="dojoDndItem dragLibrary'; break
			}
			out += (tval % 2) ? "" : " oddRow"; out += '">';
				if(libraryList) { out += '<td><input type="checkbox" name="selected" value="t' + ttrack.track_id + '" /></td>'; }
				out += '<td>';
					out += '<span class="btnContainer">';
						out += '<a href="#" onclick="Play(' + ttrack.track_id + ', 0); return false;" title="Play" class=';
						var streamable = false;
						if(typeof(ttrack.streamable) != "undefined") {
							((ttrack.streamable && ttrack.streamable != "N") || libraryList)?streamable=true:streamable=false;
						} else {
							streamable = true;
						}
						streamable?out += '"link_play">Play</a>':out += '"link_play_clip">Play</a>';
						if (dojo.cookie('LFM') == 'Y' || dojo.cookie('SL') == 'LFM' || dojo.cookie('SL') == 'VIS') {
							ttrackRights = this._getRightsObj(ttrack, 0, 1);
							if(ttrackRights.can_purchase || libraryList) {
								out += '<a href="#" title="Buy" class="link_buy" onclick="Buy(\'' + ttrack.track_id + '\', \'0\', null,\'listView\'); return false;">Buy</a>';
							} else {
								if(ttrack.afs == 'Y') {
									out += '<a href="#" title="Buy Album Only (MP3s)" class="link_buy" onclick="Buy(\'' + ttrack.album_id + '\', \'1\', null,\'listView\'); return false;">Buy</a>';
								} else {
									out += '<a href="#" title="Unavailable" class="link_buy_disabled" onclick="Buy(\'' + ttrack.track_id + '\', \'0\'); return false;">Unavailable</a>';
								}
							}
						} else {
							switch(libraryList) {
								case 0:	out += '<a href="#" title="Open options menu" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0).replace(/\"/g, "\\'") + '\', null,\'listView\'); return false;">Open options menu</a>'; break
								case 1: out += '<a href="#" title="Open options menu" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0).replace(/\"/g, "\\'") + '\', 1, \'listView\'); return false;">Open options menu</a>'; break
								// case 0:	streamable?out += '<a href="#" title="Add" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0) + '\'); return false;">Add</a>' :out += '<a href="#" title="Open options menu" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0) + '\'); return false;">Open options menu</a>'; break
								// case 1:	streamable?out += '<a href="#" title="Add" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0) + '\', 1); return false;">Add</a>' :out += '<a href="#" title="Open options menu" class="link_add" onclick="AddActions(this,' + ttrack.track_id + ', 0, \'' + this._getRightsObj(ttrack, 0, 0) + '\', 1); return false;">Open options menu</a>'; break
							}
						}
					out += '</span>';
				out += '</td>';
				if(playlistList) {
					out += '<td>' + tval + '</td>';
				} else {
					if(listType == "billboardtrack") { out += '<td>' + ttrack.peak_position + '</td>'; }
					else {
						if(listType == "albumtracks") {
							out += '<td>'; // This is broken into multiple lines because IE6 fails at life
							out += (typeof(ttrack.trackNumber) != "undefined")?ttrack.trackNumber:ttrack.track_number;
							out += '</td>';
						} 
					}
				}
				var trackName = (typeof(ttrack.track_name) != "undefined")?ttrack.track_name:ttrack.track;
				if(ttrack.explicit && ttrack.explicit != "N") { out += '<td>'; } else { out += '<td colspan="2">'; }
				// out += '<a href="#" onclick="Play(' + ttrack.track_id + ', 0); return false;" title="Play \'' + trackName + '\'">' + trackName + '</a></td>';
				out += '<span class="noWrap">' + trackName + '</span></td>';
				if(ttrack.explicit && ttrack.explicit != "N") { out += '<td class="explicit"><a href="#" onclick="genericPop(\'http://home.napster.com/info/info_explicit_lyrics.html\', 450, 320); return false;">(EXPLICIT)</a></td>'; if(playlistList) { explicitPlaylist = true; } }
				// <a href="#" onClick=\'navigate("http://home.napster.com/ns/view/album/?album_id=' + tdata[t].album_id + '"); return false;\' title="' + trackName + '">' + trackName + '</a></td>';
				// NOTE: we don't want to link to aritst_id 10462505 (a.k.a. Various Artists)
				out += ttrack.artist_id != 10462505 ? '<td><a href="#" onClick=\'navigate("http://home.napster.com/ns/view/artist/?artist_id=' + ttrack.artist_id + '"); return false;\' title="' + ttrack.artist_name + '"><strong>' + ttrack.artist_name + '</strong></a></td>' :
					'<td><strong>' + ttrack.artist_name + '</strong></td>';
				var albumName = (typeof(ttrack.album_name) != "undefined")?ttrack.album_name:ttrack.album;
				if(listType != "albumtracks") { out += '<td><a href="#" onClick=\'navigate("http://home.napster.com/cgi-bin/searchXML?type_id=albumtracks&amp;result_type=track&amp;select_by=album&amp;select_value=' + ttrack.album_id + '&amp;format=json"); return false;\' title="' + albumName + '"><em>' + albumName + '</em></a></td>'; }
				if(listType == "billboardtrack") {
					out += '<td>' + ttrack.duration + '</td><td>' + ttrack.peak_date + '</td>';
				} else {
					out += '<td>' + ttrack.duration + '</td>';
				}
		}
		return out;
	},

	//_displayTracks: function(tdata, listType, playlistList) {
	_displayTracks: function(tdata, libraryList, listType) {
		var self = this;
		//console.log("In _displayTracks - tdata: " + tdata + " libraryList: " + libraryList + " listType: " + listType);
		// Sanity check- make sure we have stuff in tdata
		if(tdata[0] == null) {
			//return;
			tdata = 0;
		}
		if(typeof(listType) == "undefined") { listType = 0; }
		var playlistList = false;
		switch(listType) {
			case "playlistlist":	playlistList = true; break
			case "playlistTracks":	playlistList = true; break
		}
	    var out = "";
        if(tdata == '0' || tdata == "") { // if we don't have data
        	//console.log("0 or no tdata");
			if(typeof(dataURL) == "undefined" || dataURL == '') { //and don't have a JSON dataURL
				var newLocation = "";
				if(libraryList) {
					newLocation = fixedLinkFromURL(historyUrl,1);
				}
				dojo.byId("content_head").style.display = "none";
	            this.displayEmptyPage(newLocation);
			}
        } else {
        	//console.log("have tdata");
			out += '<div>';
				out += '<table cellspacing="0" id="listReturn">';
					out += '<thead>';
						out += '<tr>';
							switch(libraryList) {
								case 1: out += '<th class="selectedCol"><input type="checkbox" name="selected" value="all" id="selectAll" onclick="libraryDisplay.selectAllListReturn(this.checked);" /></th>'; break
							}
							out += '<th class="actionCol">Action</th>';
							if(listType == "albumtracks" || playlistList) {
								out += '<th class="trackNumCol">No.</td>';
							} else {
								if(listType == "billboardtrack") {
									out += '<th class="trackNumCol" onClick="libraryDisplay.sortActive(\'peak_position\'); return false;"><a href="#" title="Peak Position">Peak Pos.</th><th class="trackCol" colspan="2"><a href="#" onClick="libraryDisplay.sortActive(\'track_name\'); return false;">Track Title</a></td>';
								}
							}
							if(listType != "billboardtrack") { out += '<th class="trackCol" colspan="2"><a href="#" onClick="libraryDisplay.sortActive(\'track_name\'); return false;">Track</a></th>'; }
							out += '<th class="artistCol"><a href="#" onClick="libraryDisplay.sortActive(\'artist_name\'); return false;">Artist</a></th>';
							if(listType != "albumtracks") { out += '<th class="albumCol"><a href="#" onClick="libraryDisplay.sortActive(\'album\'); return false;">Album/Source</a></th>'; }
							if(listType == "billboardtrack") {
								out += '<th>Time</th><th>Peak Date</th>';
							} else {
								out += '<th class="timeCol">Time</th>';
							}
						out += '</tr>';
					out += '</thead>';
				out += '<tbody';
				if(playlistList) { out += ' id="listReturnBody"'; }
				out += '>';
				// dojo.byId("content_body").innerHTML = out;
			var t = 0;
			var tracksInterval = setInterval( function(){
				if(t < tdata.length) {
					//console.log(t + " of " + tdata.length);
					try {
						out += self._displayTrack(tdata[t], (t + 1), libraryList, listType);
					} catch(e) {
						console.log("tracksInterval catch: " + e.message + ", tdata.length: " + tdata.length + ", t: " + t);
					}
					t++;
				} else {
					//console.log("clearing tracksInterval - " + t + " of " + tdata.length);
					clearInterval(tracksInterval);
					if(nav.fullResultsUrl != "") {
						out += '<tr class="'; out += (t++ % 2) ? "" : " oddRow"; out += '">';
							out += '<td colspan="6" class="viewMore"><a href="#" onclick="navigate(nav.fullResultsUrl+\'&clickSource=search_view_more_tracks\'); return false">View more results for "'; out += dojo.byId("uuunq").value; out += '"</a></td>';
						out += '</tr>';
					}
					out += '</tbody>';
					out += '</table>';
					out += '</div>';
			        dojo.byId("content_body").innerHTML = out;
			        //innerSwap(dojo.byId("content_body"), out);
			        
			        //console.log("before set: " + listType);
			        //var z = (libraryList > 0) ? 1 : 0; //just in case
					var z = (listType.indexOf("playlistTracks") >= 0) ? 1 : 0;
					console.log("before md z: " + z);
					makeDraggable(z);
					
					dojo.byId("content_body").scrollTop = 0;
					if(explicitPlaylist) {
						var expHead = document.getElementById('explicitHead');
						if(expHead) { expHead.innerHTML = "(EXPLICIT)"; }
						explicitPlaylist = false;
					}
					if(libraryList) {
						appState = new ApplicationState(historyUrl);
						dojo.back.addToHistory(appState);
						if(playlistList) {
							activeDisplay = tdata;
						}
					} else {
						activeDisplay = tdata;
					}
				}
			}, 1);
	        /* for (var t = 0; t < tdata.length; t++) {
				// setTimeout(, 2);
				try {
					out += this._displayTrack(tdata[t], (t + 1), libraryList, listType)
				} catch(e) {
					console.log(e.message);
				}
	        }
			out += '</tbody>';
			out += '</table>';
			out += '</div>';
	        dojo.byId("content_body").innerHTML = out;
			makeDraggable();
			dojo.byId("content_body").scrollTop = 0;
			if(explicitPlaylist) {
				var expHead = document.getElementById('explicitHead');
				if(expHead) { expHead.innerHTML = "(EXPLICIT)"; }
				explicitPlaylist = false;
			}
			if(libraryList) {
				appState = new ApplicationState(historyUrl);
				dojo.back.addToHistory(appState);
			} */
        }
		
		// activeDisplay = tdata;
    },
	
	
	getContentType: function() {
		if((typeof(nav.jsonPage) != "undefined") && nav.jsonPage) {
			if((typeof(nav.pageData.jsonData) != "undefined") && nav.pageData.jsonData) {
				clickSource = "list_view_" + nav.pageData.jsonData.contentType;
			}
		} else {
			clickSource = "list_view_" + currentContentType;
		}
		return clickSource;
	},

    displayAlbums: function(tdata) {
		this._displayAlbums(tdata, 1);
	},

    _displayAlbums: function(tdata, listType) {
		var self = this;
		var out = "";
        if(tdata == '0' || tdata == "") {
			if(dataURL != "") {
				out = "you have no tracks in this view";
				
				dojo.byId("content_body").innerHTML = out;
				//innerSwap(dojo.byId("content_body"), out);
				makeDraggable();
				dojo.byId("content_body").scrollTop = 0;
				activeDisplay = tdata;
			}
        }
        else {
			out += '<div>';
				out += '<table cellspacing="0" id="listReturn" class="albums">';
					out += '<thead>';
						out += '<tr>';
							switch(listType) {
								case 2: out += '<th class="selectedCol">&nbsp;</th>'; break
							}
							out += '<th class="actionCol">Action</th>';
							out += '<th class="imageCol">Image</th>';
							out += '<th class="albumCol" colspan="2"><a href="#" onClick="libraryDisplay.sortActive(\'album\'); return false;">Album/Source</a></th>';
							out += '<th class="artistCol"><a href="#" onClick="libraryDisplay.sortActive(\'artist_name\'); return false;">Artist</a></th>';
							out += '<th class="dateCol"><a href="#" onClick="libraryDisplay.sortActive(\'release_date\'); return false;">Release Date</a></th>';
						out += '</tr>';
					out += '</thead>';
				out += '<tbody>';
				
	        // for (var t = 0; t < tdata.length; t++) {
			var t = 0;
			var albumsInterval = setInterval( function(){
				if(t < tdata.length) {
		            out += '<tr id="a' + tdata[t].album_id + '" class="dojoDndItem drag'; out += (t % 2) ? "" : " oddRow"; out += '">';
						switch(listType) {
							case 2: out += '<td><input type="checkbox" name="selected" value="a' + tdata[t].album_id + '" /></td>'; break
						}
						out += '<td>';
							out += '<span class="btnContainer">';
								out += '<a href="#" onclick="Play(' + tdata[t].album_id + ', 1); return false;" title="Play" class="' + ( isLFM ? 'link_play_clip': 'link_play') + '">Play</a>';
								if(isLFM) {
									out += '<a href="#" onclick="Buy(' + tdata[t].album_id + ', \'1\', null,\'listView\'); return false;" title="Buy Album (MP3s)" class="link_buy">Buy Album (MP3s)</a>';
								} else {
									out += '<a href="#" onclick="AddActions(this,' + tdata[t].album_id + ', 1, null, null,\'listView\'); return false;" title="Add" class="link_add">Add</a>';
								}
							out += '</span>';
						out += '</td>';
						var album = typeof(tdata[t].album) != "undefined"?tdata[t].album:tdata[t].album_name;
						// console.log(tdata[t].album_name);
						tdata[t].image_url = tdata[t].image_url?tdata[t].image_url:'http://home.napster.com/images/player/bg_default_album_art.gif';
						tdata[t].sm_image_url = tdata[t].sm_image_url?tdata[t].sm_image_url:'http://home.napster.com/images/includes/default_album_art_50.gif';
						out += '<td><a href="#" class="albumImage" onClick=\'navigate("http://home.napster.com/cgi-bin/searchXML?type_id=albumtracks&amp;result_type=track&amp;select_by=album&amp;select_value=' + tdata[t].album_id + '&amp;format=json&amp;clickSource=' + libraryDisplay.getContentType() + '"); return false;\' onMouseover=\'showAlbumArtPop("' + tdata[t].image_url + '");\' onMouseout=\'hideAlbumArtPop();\'title="' + album + '"><img src="' + tdata[t].sm_image_url + '" alt="" /></a></td>';
						if(tdata[t].explicit && tdata[t].explicit != "N") { out += '<td>'; } else { out += '<td colspan="2">'; }
						out += '<a href="#" onClick=\'navigate("http://home.napster.com/cgi-bin/searchXML?type_id=albumtracks&amp;result_type=track&amp;select_by=album&amp;select_value=' + tdata[t].album_id + '&amp;format=json&amp;clickSource=' + libraryDisplay.getContentType() + '"); return false;\' title="' + album + '"><em>' + album + '</em></a></td>';
						if(tdata[t].explicit && tdata[t].explicit != "N") { out += '<td class="explicit"><a href="#" onclick="genericPop(\'http://home.napster.com/info/info_explicit_lyrics.html\', 450, 320); return false;">(EXPLICIT)</a></td>'; }
						// NOTE: we don't want to link to aritst_id 10462505 (a.k.a. Various Artists)
						out += tdata[t].artist_id != 10462505 ? '<td><a href="#" onClick=\'navigate("http://home.napster.com/ns/view/artist/?artist_id=' + tdata[t].artist_id + '&amp;clickSource=' + libraryDisplay.getContentType() + '"); return false;\' title="' + tdata[t].artist_name + '"><strong>' + tdata[t].artist_name + '</strong></a></td>' :
							'<td><strong>' + tdata[t].artist_name + '</strong></td>';
						out += '<td>' + (tdata[t].release_date != null ? self.dateStringFromUTC(tdata[t].release_date) : tdata[t].release_year) + '</td>';
					out += '</tr>';
					t++;
				} else {
					clearInterval(albumsInterval);
					
					if(nav.fullResultsUrl != "") {
						out += '<tr class="'; out += (t++ % 2) ? "" : " oddRow"; out += '">';
							out += '<td colspan="6" class="viewMore"><a href="#" onclick="navigate(nav.fullResultsUrl+\'&clickSource=search_view_more_albums\'); return false">View more results for "'; out += dojo.byId("uuunq").value; out += '"</a></td>';
						out += '</tr>';
					}
					out += '</tbody>';
					out += '</table>';
					out += '</div>';
				
			        dojo.byId("content_body").innerHTML = out;
			        //innerSwap(dojo.byId("content_body"), out);
					makeDraggable();
					dojo.byId("content_body").scrollTop = 0;
					activeDisplay = tdata;
				}
	        }, 1);
        }
    },
	
	displayArtists: function(tdata) {
		this._displayArtists(tdata);
	},
	
	displayMemberArtists: function(tdata, userID) {
		this._displayArtists(tdata, userID);
	},
	
	displayUsers: function(tdata) {
		var out = "";
        if(tdata == '0' || tdata == "") {
            out = "There were no results";
        }
        else {
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn" class="users">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="userCol">User Name</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
        for (var t = 0; t < tdata.length; t++) {
            out += '<tr class="'; out += (t % 2) ? "" : " oddRow"; out += '">';
				out += '<td><a href="#" onclick="navigate(\'http://home.napster.com/cgi-bin/memberXML?result_type=artist&type=memberArtists&filter_value=' + tdata[t].user_id + '&format=json\'); return false;"  title="' + tdata[t].user_name + '">' + tdata[t].user_name + '</a></td>';
			out += '</tr>';
        }
		out += '</tbody>';
		out += '</table>';
		out += '</div>';
        }
        dojo.byId("content_body").innerHTML = out;
        //innerSwap(dojo.byId("content_body"), out);
		makeDraggable();
		dojo.byId("content_body").scrollTop = 0;
		
		activeDisplay = tdata;
	},
	
	_displayArtists: function(tdata, userID) {
		var out = "";
		if(typeof(userID) == "undefined") { userID = ""; }
        if(tdata == '0' || tdata == "") {
			if(dataURL != "") {
				out = "you have no artists in this view";
			}
        }
        else {
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn" class="artists">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="artistCol">Artist</th>';
						out += '<th class="topTracksCol">Play Top Tracks</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
        for (var t = 0; t < tdata.length; t++) {
            out += '<tr class="'; out += (t % 2) ? "" : " oddRow"; out += '">';
				// NOTE: we don't want to link to aritst_id 10462505 (a.k.a. Various Artists)
				userID ? navURL = "http://home.napster.com/cgi-bin/memberXML?result_type=track&amp;type=track&amp;type_id=memberbrowse&amp;filter_value=" + userID + "&amp;select_by=artist&amp;select_value=" + tdata[t].artist_id + "&amp;format=json" :
					navURL = "http://home.napster.com/ns/view/artist/?artist_id=" + tdata[t].artist_id + "&clickSource=" + libraryDisplay.getContentType();
				out += tdata[t].artist_id != 10462505 ? '<td><a href="#" onClick=\'navigate("' + navURL + '"); return false;\' title="' + tdata[t].artist_name + '"><strong>' + tdata[t].artist_name + '</strong></a></td><td><a href="#" onclick="PlayTopTracks(' + tdata[t].artist_id + '); return false;" title="Play Top Tracks by ' + tdata[t].artist_name + '" class="link_play">Play Top Tracks by ' + tdata[t].artist_name + '</a>&nbsp;Play&nbsp;Top&nbsp;Tracks</td>' :
					'<td><strong>' + tdata[t].artist_name + '</strong></td><td></td>';
			out += '</tr>';
        }
		if(nav.fullResultsUrl != "") {
			out += '<tr class="'; out += (t++ % 2) ? "" : " oddRow"; out += '">';
				out += '<td colspan="2" class="viewMore"><a href="#" onclick="navigate(nav.fullResultsUrl+\'&clickSource=search_view_more_artists\'); return false">View more results for "'; out += dojo.byId("uuunq").value; out += '"</a></td>';
			out += '</tr>';
		}
		out += '</tbody>';
		out += '</table>';
		out += '</div>';
        }
        dojo.byId("content_body").innerHTML = out;
        //innerSwap(dojo.byId("content_body"), out);
		makeDraggable();
		dojo.byId("content_body").scrollTop = 0;
		
		activeDisplay = tdata;
    },
	
	displayRadio: function(tdata) {
		this._displayRadio(tdata, 1);
	},

    _displayRadio: function(tdata, listType) {
		var out = "";
        if(tdata == '0' || tdata == "") {
            out = "you have no tracks in this view";
        }
        else {
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn" class="radio">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="actionCol">Action</th>';
						out += '<th class="imageCol">Radio Station</th>';
						// out += '<th class="radioCol"><a href="#" onClick="libraryDisplay.sortActive(\'artist_name\'); return false;">Station</a></th>';
						out += '<th class="descriptionCol">Description</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
        for (var t = 0; t < tdata.length; t++) {
            out += '<tr id="r' + tdata[t].station_id + '" class="'; out += (t % 2) ? "" : "oddRow"; out += '">';
				out += '<td>';
					out += '<span>';
						out += '<a href="#" onclick="Play(' + tdata[t].station_id + ', \'5\'); return false;" title="Play" class=' + ( isLFM ? '"link_play_clip">Play</a>': '"link_play">Play</a>');
					out += '</span>';
				out += '</td>';
				out += '<td><a href="#" class="radioImage" onclick="Play(' + tdata[t].station_id + ', \'5\'); return false;"><img src="' + tdata[t].image_url + '" alt="' + tdata[t].station_name + '" title="' + tdata[t].station_name + '" /></a></td>';
				// out += '<td><a href="#" onClick=\'navigate("http://home.napster.com/?station_id=' + tdata[t].station_id + '"); return false;\' title="' + tdata[t].station_name + '">' + tdata[t].station_name + '</a></td>';
				out += '<td>' + tdata[t].station_desc + '</td>';
			out += '</tr>';
        }
		out += '</tbody>';
		out += '</table>';
		out += '</div>';
        }
        dojo.byId("content_body").innerHTML = out;
        //innerSwap(dojo.byId("content_body"), out);
		makeDraggable();
		dojo.byId("content_body").scrollTop = 0;
		
		activeDisplay = tdata;
    },

    displayPlaylist: function(tdata) {
		// console.log("In displayPlaylist");
		this._displayPlaylist(tdata, 1);
	},

    _displayPlaylist: function(tdata, listType) {
		var out = "";
        if(tdata == '0' || tdata == "") {
            out = "you have no tracks in this view";
        }
        else {
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn" class="playlists">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="actionCol">Action</th>';
						out += '<th class="playlistCol">Playlist Title</th>';
						out += '<th class="descriptionCol">Description</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
       // for (var t = 0; t < tdata.length; t++) {
			var t=0;
			if(tdata) {
				var playlistInterval = setInterval( function(){
					if(t < tdata.length) {
			            out += '<tr id="r' + tdata[t].playlist_id + '" class="dojoDndItem drag'; out += (t % 2) ? "" : " oddRow"; out += '">';
							out += '<td>';
								out += '<span class="btnContainer">';
									out += '<a href="#" onclick="Play(' + tdata[t].playlist_id + ', \'2\'); return false;" title="Play" class=' + ( isLFM ? '"link_play_clip">Play</a>': '"link_play">Play</a>');  
									if(isLFM) {
										out += '<a href="#" onclick="Buy(' + tdata[t].playlist_id + ', \'2\', {}, \'listView\'); return false;" title="Buy" class="link_buy">Buy</a>';
									}
									else {
										out += '<a href="#" onclick="AddActions(this,' + tdata[t].playlist_id + ', \'2\', {}, null,\'listView\'); return false;" title="Add" class="link_add">Add</a>';
									}
								out += '</span>';
							out += '</td>';
							out += '<td><a href="#" onClick=\'navigate("http://home.napster.com/cgi-bin/playlistXML?type_id=playlist&result_type=track&select_by=playlist&select_value=MIX_' + tdata[t].playlist_id + '&format=json"); return false;\' title="' + tdata[t].playlist_name + '">' + tdata[t].playlist_name + '</a></td>';
							out += '<td>' + tdata[t].playlist_desc + '</td>';
						out += '</tr>';
						t++;
					} else {
						clearInterval(playlistInterval);
						out += '</tbody>';
						out += '</table>';
						out += '</div>';
				        dojo.byId("content_body").innerHTML = out;
				        //innerSwap(dojo.byId("content_body"), out);
						makeDraggable();
						dojo.byId("content_body").scrollTop = 0;
						
						activeDisplay = tdata;
					}
		        }, 1);
			} else {
				this.displayEmptyPage();
			}
        }
    },

    displayMemberPlaylists: function(tdata, memberID) {
		this._displayMemberPlaylists(tdata, memberID);
	},

    _displayMemberPlaylists: function(tdata, memberID) {
		var out = "";
        if(tdata == '0' || tdata == "") {
            out = "you have no tracks in this view";
        }
        else {
		out += '<div>';
			out += '<table cellspacing="0" id="listReturn" class="playlists">';
				out += '<thead>';
					out += '<tr>';
						out += '<th class="actionCol">Action</th>';
						out += '<th class="playlistCol">Playlist Title</th>';
					out += '</tr>';
				out += '</thead>';
			out += '<tbody>';
        for (var t = 0; t < tdata.length; t++) {
            out += '<tr id="r' + tdata[t].playlist_id + '" class="dojoDndItem drag'; out += (t % 2) ? "" : " oddRow"; out += '">';
				out += '<td>';
					out += '<span class="btnContainer">';
						out += '<a href="#" onclick="Play(' + tdata[t].playlist_id + ', \'6\'); return false;" title="Play" class="link_play">Play</a>';
						out += '<a href="#" onclick="AddActions(this,' + tdata[t].playlist_id + ', \'6\'); return false;" title="Add" class="link_add">Add</a>';
					out += '</span>';
				out += '</td>';
				
				out += '<td><a href="#" onClick=\'navigate("http://home.napster.com/cgi-bin/memberXML?result_type=track&amp;type=playlist&amp;type_id=memberbrowse&amp;filter_value=' + memberID + '&amp;select_by=playlist&amp;select_value=' + tdata[t].playlist_id + '&amp;playlist_name=' + html_escape(tdata[t].name) + '&amp;format=json"); return false;\' title="' + html_escape(tdata[t].name) + '">' + html_escape(tdata[t].name) + '</a></td>';
			out += '</tr>';
        }
		out += '</tbody>';
		out += '</table>';
		out += '</div>';
        }
        dojo.byId("content_body").innerHTML = out;
        //innerSwap(dojo.byId("content_body"), out);
		makeDraggable();
		dojo.byId("content_body").scrollTop = 0;
		
		activeDisplay = tdata;
    },

    displayVideos: function(tdata) {
		this._displayVideos(tdata);
	},

    _displayVideos: function(tdata) {
		var out = "";
        if(tdata == '0' || tdata == "") {
			this.displayEmptyPage();
        } else {
			out += '<div>';
				out += '<table cellspacing="0" id="listReturn" class="albums">';
					out += '<thead>';
						out += '<tr>';
							out += '<th class="actionCol">Action</th>';
							out += '<th class="imageCol"><a href="#" onClick="libraryDisplay.sortActive(\'track\'); return false;">Track</a></th>';
							out += '<th class="radioCol"><a href="#" onClick="libraryDisplay.sortActive(\'artist_name\'); return false;">Artist</a></th>';
						out += '</tr>';
					out += '</thead>';
				out += '<tbody>';
	        // for (var t = 0; t < tdata.length; t++) {
			var t = 0;
			
			var videosInterval = setInterval( function(){
				if(t < tdata.length) {
		            out += '<tr class="'; out += (t % 2) ? "" : "oddRow"; out += '">';
						out += '<td>';
							out += '<span>';
								out += '<a href="#" onclick="videoplayerPop(\''+ tdata[t].video_id + '\'); return false;" title="Play" class="link_play">Play</a>';
							out += '</span>';
						out += '</td>';
						out += '<td style="vertical-align: middle;"><a href="#" class="videoImage" onClick="videoplayerPop(\'' + tdata[t].video_id + '\'); return false;"><img src="' + tdata[t].image_url + '" alt="' + tdata[t].station_name + '" title="' + tdata[t].track + '" /></a> <a href="#" onClick="videoplayerPop(\'' + tdata[t].video_id + '\'); return false;">' + tdata[t].track + '</a></td>';
						// NOTE: we don't want to link to aritst_id 10462505 (a.k.a. Various Artists)
						out += tdata[t].artist_id != 10462505 ? '<td><a href="#" onClick=\'navigate("http://home.napster.com/ns/view/artist/?artist_id=' + tdata[t].artist_id + '"); return false;\' title="' + tdata[t].artist_name + '"><strong>' + tdata[t].artist_name + '</strong></a></td>' :
							'<td><strong>' + tdata[t].artist_name + '</strong></td>';
					out += '</tr>';
					t++;
				} else {
					out += '</tbody>';
					out += '</table>';
					out += '</div>';
					clearInterval(videosInterval);
			        dojo.byId("content_body").innerHTML = out;
			        //innerSwap(dojo.byId("content_body"), out);
					makeDraggable();
					dojo.byId("content_body").scrollTop = 0;
					
					activeDisplay = tdata;
				}
			}, 1);
        }
    },
	
	displaySearchMessage: function(search_type,search_pass,total_results) {
		var universalMessage = "";
		// var searchString = document.getElementById("hsearch").getElementsByTagName("form")[0].elements[0].value;
		var searchString = document.getElementById("searchHeader").getElementsByTagName("h2")[0].getElementsByTagName("span")[0].innerHTML;
		if(total_results) {
			numMatches = total_results < 500?total_results:"500";
			if(search_pass == "exact" || search_pass == "undefined") {
				// universalMessage = total_results < 500?total_results:"500";
				universalMessage = (nav.pageData.jsonData.num_results == numMatches ? numMatches : nav.pageData.jsonData.num_results + " of " + numMatches) + " " + search_type + " results.";
				// universalMessage += " " + search_type + " results for \"" + searchString + "\".";
			} else {
				universalMessage = (nav.pageData.jsonData.num_results == numMatches ? numMatches : nav.pageData.jsonData.num_results + " of " + numMatches) + " approximate matches.";
				// universalMessage = "No " + search_type + " matches found for \"" + searchString + "\".  Here are some approximate matches.";
			}
		} else {
			universalMessage = "No " + search_type + " results.";
			// universalMessage = "No " + search_type + " results for \"" + searchString + "\".";
		}
		displayUMessage(universalMessage, 2);
	},

    sortActive: function(key) {
		console.log("about to sort activeData: " + runToSource(activeDisplay));
		if(nav.serverSort) {
			collection.store.sortServerSide(key);
			return;
		}
        if(!activeDisplay) { return; }
		if((eval(activeDisplay) != 0)) {
			var sortedData;
			if(currentSort[key] == 1) {
				currentSort[key] = 0;
				sortedData = collection.store.sortDisplay(eval(activeDisplay),'desc',key);
			} else {
				currentSort[key] = 1;
				sortedData = collection.store.sortDisplay(eval(activeDisplay),'asc',key);
			}
			// activeDisplay = sortedData.toSource();
			activeDisplay = eval(sortedData);
			// displayList("track", activeDisplay);
			// console.log(eval(activeDisplay).toSource());
			// this.displayTracks(activeDisplay, 0);
			currentPage = 0;
			displayList(currentContentType, activeDisplay);
			// this.displayPageOfTracks(1);
		} else {
			alert("Nothing to Sort!");
		}
    },

    updatePagination: function(arr,dispMethod,completeList) {
		//console.log("in updatePagination(" + arr + "," + dispMethod + "," + completeList + ")");
		// if(!initialized) { alert("timeout"); setTimeout("libraryDisplay.updatePagination(arr,dispMethod,completeList)", 500); return; }
		var pageDataArr = "";
		if(typeof(arr) == "undefined") {
			pageDataArr = activeDisplay;
		} else {
			try {
				pageDataArr = eval(arr);
			} catch(e) {
				return;
			}
		}
		// console.log("pageDataArr - " + pageDataArr);
		if(typeof(dispMethod) == "undefined") { dispMethod = currentContentType; }
		if(typeof(completeList) == "undefined") { completeList = 1; }
		// console.log("pageDataArr: " + pageDataArr.toSource());
        pageNo = 1;
		totalPages = 0;
		dojo.byId("content_footer").style.display = "block";
        dojo.byId("content_footer").innerHTML = "<img src=\"/images/includes/pagination_loading.gif\" alt=\"\" \/>";
		var pageStr = "";
		var pageStrPre = '<div id="footerActionContainer">';
		pageStrPre += '<div class="buttonContainer">';
		pageStrPre += '<a href="#" onclick="collection.store.addListReturnItemsToPlaylist(); return false;"><button class="btn_short"><span>Add to Playlist</span></button></a>';
		pageStrPre += '<a href="#" onclick="collection.store.playListReturnItems(); return false;"><button class="btn_short"><span>Play Tracks</span></button></a>';
		if(dispMethod != "libraryRecentTracks" && dispMethod != "libraryAddedTracks") { pageStrPre += '<a href="#" onclick="libraryDisplay.confirmDelete(0,0,1); return false;"><button class="btn_short"><span>Delete Tracks</span></button></a>'; }
		pageStrPre += '</div>';
		pageStrPre += '<div id="pagination">';
		pageStrPre += '<a href="#" onClick="libraryDisplay.displayPreviousPage(); return false;" id="paginationPrevious" class="';
		if(currentPage > 1) { className = "previous active"; } else { className = "previous"; }
		pageStrPre += className + '">&lt;Prev</a>';
		var className = "";
		try { pageDataArrLength = pageDataArr.length } catch(e) { return; }
		if(pageDataArrLength) {
	        while((pageNo * tracksPerPage) <= pageDataArrLength) {	
				totalPages = pageNo;
				if(pageNo == currentPage) {
					// console.log("ACTIVE - pageNo: " + pageNo + " currentPage: " + currentPage);
					var className = "active";
				} else {
					var className = "";
					// console.log("NOT ACTIVE - pageNo: " + pageNo + " currentPage: " + currentPage);
				}
	            pageStr += '<a href="#" id="page' + pageNo +'" class="' + className + '" onClick="libraryDisplay.displayPage(\'' + pageNo + '\')\; return false;">' + pageNo + '</a>';
	            pageNo++;
	        }
		}
        if (pageDataArr.length % tracksPerPage) {
			if(pageNo == currentPage) {
				className = "active";
			} else {
				className = "";
			}
            // we've got some left over, add one more page
			totalPages = pageNo;
            pageStr += '<a href="#" id="page' + pageNo +'" class="' + className + '" onClick="libraryDisplay.displayPage(\'' + pageNo + '\')\; return false;">' + pageNo + '</a>';
        }
		if(totalPages == 1) {
			className = "next";
		} else {
			className = "next active";
		}
		
		var pageStrPost = '<a href="#" onClick="libraryDisplay.displayNextPage(); return false;" id="paginationNext" class="' + className + '">Next&gt;</a></div></div>';
		if(!completeList) { pageStrPost += "<img src=\"/images/includes/pagination_loading.gif\" alt=\"\" \/>"; }
		if(pageStr == "") {
			dojo.byId("content_footer").innerHTML = '<img src="/images/includes/pagination_loading.gif"  class="loaderImg" alt="loading..." \/> <span class="loadingText">Loading...</span>';
		} else {
			// currentPage = 1;
			if(totalPages > 1) {
				pageStr = pageStrPre + pageStr + pageStrPost;
				// alert(pageStr);
				dojo.byId("content_footer").innerHTML = pageStr;
				// dojo.byId("page1").className = "active";
			} else {
				dojo.byId("content_footer").innerHTML = pageStrPre;
			}
		}
		
		initalizePageHeight();
        activeDisplay = pageDataArr;
    },

    addNewPlaylist: function() {
        collection.store.createPlaylist(dojo.byId("addPL").value);
    },
	
    updateActivePlaylist: function(pid) {
        activePlaylist = pid;
    },
	
	addContentToPlaylist: function(cid, ctype, pid) {
		var debugThis = false;
		if(debugThis) {
			console.log("in addContentToPlaylist(cid, ctype, pid)");
			console.log(cid);
			console.log(ctype);
			console.log(pid);
		}
		var strIds = new String( cid );
		ctype = ctype - 0;
		var itemIDs = strIds.split(",");
		switch (ctype) {
			case 0:
				if(itemIDs.length > 1) {
					this.addTracksToPlaylist(itemIDs, pid);
				} else {
					this.addTrackToPlaylist(cid, "", pid);
				};
				break
			case 1:	this.addAlbumToPlaylist(cid, pid); break
			case 2:	this.addPlaylistToPlaylist(cid, pid); break
			case 3: this.addTracksToPlaylist(collection.store.getPlaylistData(cid)[0].tracks, pid); break
			case 6:	this.addMemberPlaylistToPlaylist(cid, pid); break
		}
		dojo.byId('popupListContainer').style.display = "block";
	},
	
	addContentToNewPlaylist: function(cid, ctype, pname) {
		if(ctype == "") { ctype = 0; }
		console.log("in addContentToNewPlaylist2(" + cid + "," + ctype + "," + pname + ")");
		collection.store.createPlaylist(pname, cid, ctype);
		dojo.byId('addPL').value = "";
		//MATTNOTE: are we keeping this
		//var universalMessage = "Created new playlist '" + this._safeSendHTMLText(pname) + "'.";
		var universalMessage = "New playlist added to your Library";
		displayUMessage(universalMessage, 1);
	},
	
	addTracksToPlaylist: function(tidArr, pid) {
		collection.store.addTracksToPlaylist(pid,tidArr);
		if(typeof(tidArr) == "object") { tidArr = tidArr.toString(); }
		//var universalMessage = "Added " + tidArr.split(",").length + " tracks to the selected playlist.";
		var universalMessage = "Tracks added to playlist.";
		displayUMessage(universalMessage, 1);
	},

    addTrackToPlaylist: function(tid, tname, pid) {
        collection.store.addTracksToPlaylist(pid,tid);
		var universalMessage = "Track added to playlist.";
		displayUMessage(universalMessage, 1);
    },

    addAlbumToPlaylist: function(tid, pid) {
        collection.store.addContentToPlaylist(pid,1,tid);
		var universalMessage = "Album added to playlist.";
		displayUMessage(universalMessage, 1);
    },

    addPlaylistToPlaylist: function(tid, pid) {
        collection.store.addContentToPlaylist(pid,2,tid);
		var universalMessage = "Playlist added to playlist.";
		displayUMessage(universalMessage, 1);
    },

    addMemberPlaylistToPlaylist: function(tid, pid) {
        collection.store.addContentToPlaylist(pid,6,tid);
		var universalMessage = "Playlist added to playlist.";
		displayUMessage(universalMessage, 1);
    },
    
    addWorkToPlaylist: function(tid, pid) {
        collection.store.addContentToPlaylist(pid,7,tid);
		var universalMessage = "Work added to playlist.";
		displayUMessage(universalMessage, 1);
    }
};
