/* Copyright 2003-2008 Emergent Music LLC  All rights reserved.
$Id$
*/

// NYI - should combine with tracklistcell - the only difference should be that this uses FLYFI.playerControls

FLYFI.PlayerTrackCell_onSoundFinishedCallback = function() {
    var nextTrackWidget = FLYFI.playerControls.nextTrackWidget(); // voting up may move the tracks, so remember where the next one was
    FLYFI.playerControls.setNotPlaying();
    FLYFI.playerControls._onVoteUpTrackFinished(false);
    if (nextTrackWidget.length > 0) {
        FLYFI.playerControls.playWidget_TrackList(nextTrackWidget);
    }
};

FLYFI.onClick_delete_playerTrackCell = function(widget, playerControls) {
    if (!playerControls) {
        playerControls = FLYFI.playerControls;
    }
    if (!playerControls.playlistDict) { // user may have deleted the library
        return;
    }
    
    var trackCell = widget.hasClass('trackcell') ? widget : widget.parents('.trackcell');
    var itemDict;
    if (FLYFI.isContestCreation()) {
        itemDict = playerControls.contestEntryDictForID(FLYFI.contestEntryIDFromWidget(trackCell));
    } else {
        itemDict = playerControls.trackDictForID(FLYFI.trackIDFromWidget(trackCell));
    }

    var addPlaylistToWidget = false;
    if (FLYFI.isCustomRadioPlayer() && playerControls.playlistDict.libraryID &&
            !FLYFI.playlistInRadioPlayer(playerControls.playlistDict.libraryID)) {
        if (confirm('The playlist is not yet part of the widget. Add this playlist to the widget?')) {
            addPlaylistToWidget = true; // do it AFTER the track is gone - avoids problems.
        } else {
            return;
        }
    }
    
    var prompt = 'Remove "' + itemDict.title + '" by "' + itemDict.artist + '" from this playlist? (this will not affect your taste profile)';
    if (FLYFI.isContestCreation()) {
        prompt = 'Remove "' + itemDict.nominee + (itemDict.artist ? '" by "' + itemDict.artist : '') + '" from this category?';
    }
    var answer = confirm(prompt);
    if (!answer) {
        return;
    }
    
    var wasPlaying = false;
    if (trackCell.hasClass('playingtrack')) {
        FLYFI.playingTrack.stop();
        wasPlaying = true;
    }
    
    FLYFI._deleteItem(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget);
};
FLYFI._removeDeletedRow = function(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget) {
    var nextTrackCell = playerControls.nextTrackWidget();
    if (trackCell.hasClass('last')) {
        trackCell.prev().addClass('last');
    }
    var wasActiveTrack = trackCell.hasClass('activetrack');
    trackCell.remove();
    if (wasActiveTrack) {
        if (wasPlaying) {
            nextTrackCell.click();
        } else {
            var nextItemDict;
            if (FLYFI.isContestCreation()) {
                nextItemDict = playerControls.contestEntryDictForID(FLYFI.contestEntryIDFromWidget(nextTrackCell));
            } else {
                nextItemDict = playerControls.trackDictForID(FLYFI.trackIDFromWidget(nextTrackCell));
            }
            playerControls.selectTrack(nextItemDict);
        }
    }
    if (!itemDict.approved) {
        if (playerControls == FLYFI.playerControls) {
            FLYFI.ensureEnoughRecs(FLYFI.currentPlaylistDict.libraryID);
        } else {
            if (playerControls.playlistDict.deleteCallback) {
                playerControls.playlistDict.deleteCallback(itemDict);
            }
        }
    }
        
    if (addPlaylistToWidget && playerControls.playlistDict.libraryID) { // not supported for contests
        FLYFI.addPlaylistToRadioPlayer(playerControls.playlistDict.libraryID);
    }
};
FLYFI.onServer_deleteTrack = function(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget) {
    FLYFI.removePlayerTrackDict(itemDict.trackID, playerControls.playlistDict ? playerControls.playlistDict.tracks : null);
    FLYFI._removeDeletedRow(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget);
};
FLYFI.onServer_deleteContestEntry = function(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget) {
    FLYFI.removePlayerContestEntryDict(itemDict.contestEntryID, playerControls.playlistDict ? playerControls.playlistDict.tracks : null);
    FLYFI._removeDeletedRow(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget);
    FLYFI.playerControls.selectFirstTrack(); // NYI - should select NEXT rather than FIRST
};

FLYFI._deleteItem = function(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget) {
    if (playerControls.playlistDict.libraryID) {
        FLYFI.server.deleteTrack(playerControls.playlistDict.libraryID, itemDict.trackID, '', 
                                    function (json) {
                                        FLYFI.onServer_deleteTrack(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget);
                                    }, 
                                    FLYFI.showJSONError);
    } else {
        FLYFI.server.deleteContestEntry(itemDict.contestEntryID, '', 
                                    function (json) {
                                        FLYFI.onServer_deleteContestEntry(playerControls, trackCell, itemDict, wasPlaying, addPlaylistToWidget);
                                    }, 
                                    FLYFI.showJSONError);

    }
};

FLYFI.pendingScrollWidget = null;
FLYFI.scrollForBigVideo = function() {
    if (!FLYFI.pendingScrollWidget) {
        return;
    }
    FLYFI.scrollListToRow(FLYFI.pendingScrollWidget.parent('.tracklist'), FLYFI.pendingScrollWidget, FLYFI.scrollExtraInList);
};

FLYFI.PlayerTrackCell_widget = function(trackDict, isMyPlaylist) {
    var approved = trackDict.approved ? " approved" : "";
    var voted = (typeof(trackDict.vote) != 'undefined' && trackDict.vote !== null) ? (trackDict.vote === 0 ? " voteddown" : " votedup") : "";
    var free = trackDict.free ? " free" : " nonfree";
    var owned = trackDict.owned ? " owned" : "";
    var blacklisted = trackDict.blacklisted ? " blacklisted" : "";
    var trackIDclass = " track-" + trackDict.trackID;

    var a = [];
    a.push('<ul class="trackcell track'  + trackIDclass + approved + voted + free + owned + blacklisted + '">');
    a.push('    <li class="tracktype">');
    if (isMyPlaylist || FLYFI.isContestCreation()) { // && FLYFI.isCustomRadioPlayer()) {
        a.push('    <span class="delete"><a href="#" title="Delete This Track">&nbsp;</a></span>');
    }
    if (trackDict.free) {
        a.push('<img src="/static/dev/flyfi/images/ff_bug_blue.png" class="ff_bug_bluebug" />');
    } else if (trackDict.videoYouTubeIDs && trackDict.videoYouTubeIDs.length > 0) {
        a.push('<img src="/static/dev/flyfi/images/ff_bug_ytube_blue.png" />');
    } else {
        a.push('<img style="visibility:hidden;" src="/static/dev/flyfi/images/ff_bug_ytube_blue.png" />'); // for spacing only
    }
    a.push('    </li>');
    a.push('    <li class="artisttitle">' + FLYFI.textOrNbsp(trackDict.artist) + '</li>');
    a.push('    <li class="tracktitle">' +  FLYFI.textOrNbsp(trackDict.title) + '</li>');
    a.push('    <li class="albumtitle">' + FLYFI.textOrNbsp(trackDict.album) + '</li>');
    a.push('    <li class="tracktime">'  + FLYFI.textOrNbsp(trackDict.duration) + '</li>');
    a.push('</ul>');

    return $(a.join("\n"));
};

FLYFI.PlayerTrackCell_newWidget = function(trackDict, isWritablePlaylist, hide_recs) {
    var approved = trackDict.approved ? " approved" : " isrec";
    var voted = (typeof(trackDict.vote) != 'undefined' && trackDict.vote !== null) ? (trackDict.vote === 0 ? " voteddown" : " votedup") : "";
    var free = trackDict.free ? " free" : " nonfree";
    var owned = trackDict.owned ? " owned" : "";
    var blacklisted = trackDict.blacklisted ? " blacklisted" : "";
    var trackIDclass = trackDict.trackID ? ' track-' + trackDict.trackID : '';
    var displayNone = hide_recs && !trackDict.approved ? 'style="display:none"' : '';
    var contestEntryClass = trackDict.contestEntryType ? ' contestEntry contestEntry-' + trackDict.contestEntryID : '';
    var contestArtistCategory = trackDict.contestEntryType == 'artist';
    var contestAlbumCategory = trackDict.contestEntryType == 'album';
    var contestTrackCategory = trackDict.contestEntryType == 'track';

    var a = [];
    a.push('<ul class="trackcell track'  + trackIDclass + contestEntryClass + approved + voted + free + owned + blacklisted + '" ' + displayNone + '>');
    a.push('    <li class="tracktype">');
    if (isWritablePlaylist || FLYFI.isContestCreation()) { // && FLYFI.isCustomRadioPlayer()) {
        a.push('    <span class="delete"><a href="" title="Delete This Track">&nbsp;</a></span>');
    }
    if (trackDict.free) {
        a.push('<span class="download" title="Download This Track for Free">');
        if (trackDict.download_url) {
            a.push('<a class="download_link" href="' + trackDict.download_url + '">');
        }
        a.push('<img src="/static/dev/flyfi/images/ff_download.png" />');
        if (trackDict.download_url) {
            a.push('</a>');
        }
        a.push('</span>');
    } else if (trackDict.videoYouTubeIDs && trackDict.videoYouTubeIDs.length > 0) {
        a.push('<span class="yt_bug" title="Video"><img src="/static/dev/flyfi/images/s.gif" width="12" height="10" /></span>');
    } else {
        a.push('<span class="yt_bug novid" title="Un-vetted Video For This Track"><img src="/static/dev/flyfi/images/s.gif" width="12" height="10" /></span>'); // for spacing only
    }
    a.push('    </li>');
    a.push('    <li>');    
	if (!FLYFI.isContestCreation ()){
        if (FLYFI.isContest ()){
            a.push('<span class="votestatus">&#8730;</span>');
		}            
	}          
    if (contestArtistCategory) {
        a.push('        <span class="artisttitle nominee">' + FLYFI.textOrNbsp(trackDict.nominee) + '</span>');
        if (trackDict.title && trackDict.title.length > 0) {
            a.push('        <span class="tracktitle"><i class="label">smpl track:</i>' +  FLYFI.textOrNbsp(trackDict.title) + '</span>');
        } else {
            a.push('        <span class="tracktitle">&nbsp;</span>');
        }
    } else if (contestAlbumCategory) {
        a.push('        <span class="artisttitle">' + FLYFI.textOrNbsp(trackDict.artist) + '</span>');
        a.push('        <span class="albumtitle nominee">' + FLYFI.textOrNbsp(trackDict.nominee) + '</span>');
        if (trackDict.title){a.push('        <span class="tracktitle"><i class="label">smpl track:</i> ' +  FLYFI.textOrNbsp(trackDict.title) + '</span>');}        
    } else if (contestTrackCategory) {
        a.push('        <span class="artisttitle">' + FLYFI.textOrNbsp(trackDict.artist) + '</span>');
        a.push('        <span class="tracktitle nominee">' + FLYFI.textOrNbsp(trackDict.nominee) + '</span>');
    }else { // 'normal' track
        a.push('        <span class="artisttitle">' + FLYFI.textOrNbsp(trackDict.artist) + '</span>');
        a.push('        <span class="tracktitle">' +  FLYFI.textOrNbsp(trackDict.title) + '</span>');
    }
    a.push('    </li>');    
    a.push('</ul>');

    return $(a.join("\n"));
};

FLYFI.RecDivider_widgetCallback = function(libraryDict) {
    var showRecsClass = !libraryDict || !libraryDict.hide_recs ? 'show_recs' : '';
    return '<ul class="tracklisting trackcell rec_divider ' + showRecsClass + '"><li><p>RECOMMENDED TRACKS <span class="refresh_recs"><a href="">Refresh Recommendations</a></span></p></li></ul>';
};

FLYFI.PlayerTrackCell_playerControlsCallback = function(widget) {
    return FLYFI.playerControls;
};
    
FLYFI.PlayerTrackCell = function(trackDict, isMyPlaylist, playerControls) {
    // the class for a single track display in the player, including playing
    // There can be a lot of these, so keep this small
    
    var self = this;
    
    self.trackCell = new FLYFI.TrackCell(trackDict);
    self.trackDict = null; // filled later
    self.isMyPlaylist = isMyPlaylist;
    self.playerControls = playerControls;
    self.newPlayer = playerControls && playerControls.newPlayer;
    
    self.html = function () {
        return self.trackCell.html(self.widgetCallback, self.eventCallback, self.playerControlsCallback);
    };
    
    self.widgetCallback = function(trackDict) {
        // called by trackCell.html() to get the widget to use in the trackcell
        self.trackDict = trackDict;
        var widget = self.newPlayer ? FLYFI.PlayerTrackCell_newWidget(trackDict, self.isMyPlaylist, self.playerControls.playlistDict.hide_recs) : 
                                        FLYFI.PlayerTrackCell_widget(trackDict, self.isMyPlaylist);
        return widget;
    };
    
    self.eventCallback = function(widget) {
        // No longer using track level event handlers - see playercontrols.js self.onClick_PlayerTrackList
    };
    
    self.playerControlsCallback = function() {
        return self.playerControls ? self.playerControls : FLYFI.PlayerTrackCell_playerControlsCallback();
    };

};

FLYFI.targetToCell = function(target) {
    // return the trackcell for the supplied target, which may be the cell or a subitem in the cell
    if (target.hasClass('trackcell')) {
        return target;
    } else {
        return target.parents('.trackcell');
    }
};

FLYFI.onKeep_playerTrackCell = function(event) {
    // allow default behavior, which starts the download
    var trackID = FLYFI.trackIDFromWidget($(event.target).parents('.track'));
    var libraryID = FLYFI.currentPlaylistDict ? FLYFI.currentPlaylistDict.libraryID : null;
    setTimeout("FLYFI.server_ReportDownload(" + trackID + (libraryID ? "," + libraryID : "") + ")", 250);
}; 

$(document).ready(function() {
    FLYFI.initPlayerControls();
});

