var SfLastCorrectIndex = -1;
var SFLastResults = null;

function sf_isAuthenticated()
{
    if( ! UseAuthLib ) {
        return false;
    }

    return jac_isAuthenticated();
}

function sf_getHtmlAuthNo()
{
    if( UseAuthGuiLib ) {
        return jacGui_getHtmlAuthNo();
    }
    return "";
}

function sf_getLastCorrectIndex()
{
    return SfLastCorrectIndex;
}

function sf_getResultRecord(index)
{
    return SFLastResults[i];
}

function sfCheckCb(res, err)
{
    if( isSet(err) ) {
        alert( 'Communication error: ' + err + '. Please try again later.' );
        return false;
    }

    if( res["error"] ) {
        alert( 'Server error: ' + res["error"] + '. Please try again later.' );
        return false;
    }

    return true;
}

function sf_getLocalGuessStats()
{
    var stats = sf_getLocalGuessStatsDefault();
    return v_getDictionaryCookie( 'guessCountStats', stats );
}

function sf_setLocalGuessStats(stats)
{
    v_setDictionaryCookie( 'guessCountStats', stats ); 
}

function sfUpdateLocalStatsTotal(name)
{
    var stats = sf_getLocalGuessStats();
    var gct = stats[name];
    gct = parseInt(gct) + 1;
    stats[name] = gct;

    sf_setLocalGuessStats(stats);
    return stats;
}

var SFGetNextUsrCb;
function sfGetRecordsFromDatabaseCb(res, err) 
{
    if( ! sfCheckCb(res, err) ) {
        return;
    }

    if( ! sf_isAuthenticated() ) {
        var stats = sfUpdateLocalStatsTotal('guessCountTotal');

        res["result"]["guessCountTotal"] = stats["guessCountTotal"];
        res["result"]["guessCountCorrect"] = stats["guessCountCorrect"];
    }
    /* If authenticated, the actuall guess counts will already be in
     * the result. */

    /* Make a copy for later. */
    SFLastResults = res["result"]["rows"];
    
    if( isSet(SFGetNextUsrCb) ) {
        (SFGetNextUsrCb)(res["result"]);
    }
}

function sf_getNext(filterYearLis, filterGenreList, filterLevelList,
    getNextUsrCb)
{
    SFGetNextUsrCb = getNextUsrCb;
    SongFactoryService.sfps_getRecordsFromDatabase(filterYearList,
        filterGenreList, filterLevelList, sfGetRecordsFromDatabaseCb); 
}

var SFGuessClientCb;

function sf_getLocalGuessStatsDefault()
{
    var stats = {};
    stats['guessCountTotal'] = 0;
    stats['guessCountCorrect'] = 0;
    return stats;
}

function sfCbGetGuessStats(res, err) 
{ 
    if( ! sfCheckCb(res, err) ) {
        return;
    }

    if( isDefined(SFGuessClientCb) ) {
        if( ! sf_isAuthenticated() ) {
            result = sf_getLocalGuessStats();
        } else {
            result = res['result'];
        }

        (SFGuessClientCb)(result);
    }
}

function sf_getUserData(clientCb)
{
    SFGuessClientCb = clientCb;

    if( sf_isAuthenticated() ) {
        SongFactoryService.sfps_getUserData(sfCbGetGuessStats);
        return;
    }

    var result = sf_getLocalGuessStats();

    if( isDefined(SFGuessClientCb) ) {
        (SFGuessClientCb)(result);
    }
}

function sf_resetGuess(clientCb)
{
    if( ! sf_isAuthenticated() ) {
        var stats = sf_getLocalGuessStatsDefault();
        sf_setLocalGuessStats(stats);

        if( isDefined(clientCb) ) { 
            (clientCb)(stats); 
        }
        return;
    }

    SongFactoryService.sfps_resetGuessStats(sfCbGetGuessStats);
}

/* guessIdx is -1 if timed out/no guess was made. */
function sf_rememberGuess(guessIdx, clientCb)
{
    SFGuessClientCb = clientCb;

    if( ! sf_isAuthenticated() ) {
        var stats;
        if( SfLastCorrectIndex == guessIdx ) {
            sfUpdateLocalStatsTotal('guessCountCorrect');
        } else {
            sfUpdateLocalStatsTotal('guessCountTotal');
        }
    }

    var sName;
    var aName;
    if( -1 == guessIdx ) {
        cdId = null;
        trackNo = null;
    } else {
        cdId = SFLastResults[guessIdx]['cdId'];
        trackNo = SFLastResults[guessIdx]['trackNo'];
    }

    SongFactoryService.sfps_rememberGuess(
        SFLastResults[SfLastCorrectIndex]['cdId'], 
        SFLastResults[SfLastCorrectIndex]['trackNo'],
        cdId, trackNo, SfLastCorrectIndex == guessIdx, sfCbGetGuessStats);
}

var SFGetTopUsrCb;
function sfGetTopCb(res, err)
{
    if( ! sfCheckCb(res, err) ) {
        return;
    }

    if( isSet(SFGetTopUsrCb) ) {
        (SFGetTopUsrCb)(res['result']);
    }
}

function sf_getTopUsers(clientCb)
{
    SFGetTopUsrCb = clientCb;
    SongFactoryService.sfps_getTopUsers(sfGetTopCb);
}

function sf_getTopSongs(clientCb)
{
    SFGetTopUsrCb = clientCb;
    SongFactoryService.sfps_getTopSongs(sfGetTopCb);
}

function sf_getBottomSongs(clientCb)
{
    SFGetTopUsrCb = clientCb;
    SongFactoryService.sfps_getBottomSongs(sfGetTopCb);
}

function sfCbDoNothing(res, err) 
{
    jslog("sfCbDoNothing");
}

function sf_flag(flagYearValue, flagGenreValue, flagArtistValue, flagSongValue,
    flagMatureChecked, flagCopyrightChecked)
{
    SongFactoryService.sfps_flag(
        SFLastResults[SfLastCorrectIndex]['cdId'], 
        SFLastResults[SfLastCorrectIndex]['trackNo'],
        flagYearValue, flagGenreValue, flagArtistValue, flagSongValue,
        flagMatureChecked, flagCopyrightChecked, sfCbDoNothing);
}
