var currTimestamp = 0;
var currentCalendar = null;
var cookieIdentifier = null;
var isInitialRendering = true;
var myGamesWnd = null;
var masterGamesArrayTemp = null;
var masterGamesArrayFinal = null;
var myGamesArray = null;
var log;
var timerId = 0;

function scoreboardsInitialPageLoad(sportId, path, feedName) 
{
    log = new logClass();
    log.create();

    ajaxGetNewFeed();

    setupPollingTimer(INTERVAL);
}

function setupPollingTimer(interval)
{
    // if setInterval was already done, clear it.
    if (timerId > 0)
        window.clearInterval(timerId);

    ////log.write("Setting interval: " + interval);
    timerId = window.setInterval("ajaxGetNewFeed();", interval);
}

function sendGamesToController(feedData, splitMe)
{
    var feedDataArray;
    var indexStartOfGameData;    
    
    ////log.write("PROCESSING STEP: sendGamesToController()");
            
    if (splitMe)
        feedDataArray = stripInvalidRows(feedData.split(FEED_ROW_DELIMITER));
    else
        feedDataArray = stripInvalidRows(feedData);

    if (isInitialRendering)
    {
        if (METADATA)
        {
            processMetaData(feedDataArray[0]);
            feedDataArray.splice(0, DATA_INDEX);
        }
            
        dumpFeedDataArray(feedDataArray);
            
        buildMasterArrayTemp(feedDataArray);
    
        sortGameData();
    
        buildMasterArrayFinal();

        if (isViewcast)
        {
           buildViewCastGameAnchorCells(feedDataArray.length); 
           feedDataArray = null;
           renderViewCastGames();
        }
        else
        {
            applyMyGamesFilter();

            dumpMasterGamesArray();    
            buildGameAnchorCells(feedDataArray.length);
            feedDataArray = null;            
            renderFullScoreboard();
        }
        isInitialRendering = false;
    }
    else 
    {
        if (isViewcast)
            processViewCastUpdate(feedDataArray);
        else
            processFeedUpdateRows(feedDataArray);
    }
}

function buildMasterArrayTemp(feedDataArray)
{
    var isMyGame;
    var singleGameString;
    var contestObj;

    ////log.write("PROCESSING STEP: buildMasterArrayTemp()");
    
    // instantiate global varible        
    // detailed comments below, on how the arrays are used 
    masterGamesArrayTemp = new Array(0);
            
    // Loop for each row in the FEED data file
    for (i = 0; i < feedDataArray.length; i++ )
    {    
        contestObj = populateContestFromString(feedDataArray[i]);        
        contestObj.isMyGame = 0; 

        ////log.write("Pushing data for contestID " + contestObj.contestID + " into masterGamesArrayTemp");
        
        masterGamesArrayTemp.push(contestObj);

        // after processing first game on the list, set cookie identifier.
        if (i == 0)
            cookieIdentifier = SPORTID + "_" + SCOREBOARD_ID + "_" + contestObj.seasonYear + "_" + contestObj.stageID + "_" + contestObj.weekNum;

        contestObj = null;
    }
    ////log.write("Cookie identifier: " + cookieIdentifier);
}


function dumpFeedDataArray(feedDataArray)
{
    ////log.write("Dump of feedDataArray (before proccessing)..... array length is " + feedDataArray.length);
    
    // For each FEED file in the master list
    for (var i = 0; i < feedDataArray.length; i++ )
    {
        ////log.write(feedDataArray[i]);
    }
}


function sortGameData()
{
    ////log.write("PROCESSING STEP: sortGameData()");
    
    masterGamesArrayTemp.sort(function(a,b)
    {    
        var retVal;

        retVal = (a.gameState.gameOrder - b.gameState.gameOrder);        
        return retVal;
    })
}

function populateContestFromString(contestStr)
{
    var isInprogress = false;
    var isFinal = false;
    
    var masterRow = null;
    var contestObj = new Object();
    var tO = null;    
    var tk = null;
    var tStr = null;
    
    contestObj.rawFeed = contestStr;
    masterRow = contestStr.split(TOP_LEVEL_DELIMITER);

    if (masterRow.length < MASTER_ARRAY_LENGTH)
    {
        ////log.write("WARNING: Master Row appears to be missing some fields: " + masterRow.length);
    }   
        
    contestObj.contestID   = trimString(masterRow[CONTEST_ID]);
    contestObj.vendorContestID   = trimString(masterRow[STATSINC_CONTEST_ID]);
    contestObj.seasonYear  = trimString(masterRow[SEASON_YEAR]);
    contestObj.stageID     = trimString(masterRow[STAGE_ID]);
    contestObj.substageID  = trimString(masterRow[SUBSTAGE_ID]);
    contestObj.weekNum     = trimString(masterRow[WEEK]);
    contestObj.statusInd   = trimString(masterRow[STATUS]);
    contestObj.gameDateUrl = trimString(masterRow[DATE_URL]);
    contestObj.gameDateStr = trimString(masterRow[DATE_STR]);

    // Set all flags associated with game status
    if (contestObj.statusInd == "" || contestObj.statusInd == "PRE" || contestObj.statusInd == "SCHE")
    {
        contestObj.isPregame = true;
        contestObj.isFinal = false;
        contestObj.isInprogress = false;
    }
    else if (contestObj.statusInd == "SUSP" || contestObj.statusInd == "CANC" || contestObj.statusInd == "FINA")
    {
        contestObj.isPregame = false;
        contestObj.isFinal = true;
        contestObj.isInprogress = false;
    }
    // this leaves out PROG, END- and DELA status
    else 
    {
        contestObj.isPregame = false;
        contestObj.isFinal = false;
        contestObj.isInprogress = true;
    }
    
    // GAMESTATE
    tStr = trimString(masterRow[GAMESTATE]);
    
    if (tStr != null && tStr != "")
    {
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO = parseGamestate(tk);
        tk = null;
        tStr = null;
        contestObj.gameState = tO;

        if (contestObj.isPregame || contestObj.isFinal)
        {
            contestObj.gameState.possInd = "";
            contestObj.gameState.isRedZone = false;
        }

       tO = null;
    }

    // VENUE
    tStr = trimString(masterRow[VENUE]);
    
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO.stadium = trimString(tk[STADIUM]);
        tO.city = trimString(tk[CITY]);
        tO.state = trimString(tk[STATE]);
        tO.bowlName = trimString(tk[BOWL_NAME]);
        
        tk = null;
        tStr = null;
        if (tO.stadium == "" && tO.city == "" && (tO.bowlName == null || tO.bowlName == ""))
            tO = null;
        contestObj.venue = tO;
        tO = null;
    }
    
    // WEATHER
    tStr = trimString(masterRow[WEATHER]);
    
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(SECOND_LEVEL_DELIMITER);

        tO.zipCode = trimString(tk[ZIP]);
        tO.weatherCode = trimString(tk[WEATHER_CODE]);
        tO.temperature = trimString(tk[TEMPERATURE]);
        tO.forecast = trimString(tk[FORECAST]);
        
        if (tO.weatherCode == "" && tO.temperature == "" && tO.forecast =="")
            tO = null;
        tk = null;
        tStr = null;
        contestObj.weather = tO;
        tO = null;
    }
    
    // PICKS
    tStr = trimString(masterRow[PICKS]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO.pickInd = trimString(tk[PICK]);
        tO.consensusInd = trimString(tk[CONSENSUS]);
        tO.percentage = trimString(tk[PERCENTAGE]);
        
        if (tO.pickInd == "")
            tO = null;
        tk = null;
        tStr = null;
        contestObj.picks = tO;
        tO = null;
    }
    
    // LINKS
    tStr = trimString(masterRow[LINKS]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO.previewInd = trimString(tk[PREVIEW]);
        tO.boxscoreInd = trimString(tk[BOXSCORE]);
        tO.playbyplayInd = trimString(tk[PLAYBYPLAY]);
        tO.recapInd = trimString(tk[RECAP]);
        tO.gameblogInd = trimString(tk[GAMEBLOG]);

        if (tO.gameblogInd == undefined || tO.gameblogInd == null)
            tO.gameblogInd = "F";
        
        tk = null;
        tStr = null;
        contestObj.links = tO;
        tO = null;
    }
    
    // HOME TEAM
    tStr = trimString(masterRow[HOME_TEAM]);
    if (tStr != null && tStr != "")
    {
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO = parseTeamInfo(tk);
        tk = null;
        tStr = null;
        contestObj.homeTeam = tO;
        //log.write("Home Team Pts per game: " + contestObj.homeTeam.ptsPerGame);
        tO = null;
    }
    
    // VISITING TEAM
    tStr = trimString(masterRow[VSTR_TEAM]);
    if (tStr != null && tStr != "")
    {
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO = parseTeamInfo(tk);
        tk = null;
        tStr = null;
        contestObj.visitingTeam = tO;    
        //log.write("Visiting Team Pts per game: " + contestObj.visitingTeam.ptsPerGame);
        tO = null;
    }
    
    // LAST GAME INFO
    tStr = trimString(masterRow[LAST_GAME]);
    
    if (tStr != null && tStr != "")
    {
        tk = tStr.split(SECOND_LEVEL_DELIMITER);
        tO = new Object();
        
        tO.dateStr = tk[LG_DATE];
        tO.visitorName = tk[LG_VSTR_NM];
        tO.visitorScore = tk[LG_VSTR_SCORE];
        tO.homeName = tk[LG_HOME_NM];
        tO.homeScore = tk[LG_HOME_SCORE];

       // Empty scores are the only thing that gives out invalid last game
        if (tO.dateStr == "" ||
            (tO.visitorScore == "0" && tO.homeScore == "0"))
            tO = null;
        tk = null;
        tStr = null;
        contestObj.lastGame = tO;
        tO = null;
    }

    // setting a flag for full boxscore or not
    //log.write("contestObj.homeTeam.apRank: " + contestObj.homeTeam.apRank + "," +
              //"contestObj.visitingTeam.apRank: " + contestObj.visitingTeam.apRank + ", " +
              //"contestObj.homeTeam.conferenceId: " + contestObj.homeTeam.conferenceId + ", " +
              //"contestObj.visitingTeam.conferenceId: " + contestObj.visitingTeam.conferenceId);
    if (contestObj.stageID == '2')
        contestObj.isFullGame = true;
    else if (contestObj.homeTeam.apRank != "" && contestObj.homeTeam.apRank != "0")
        contestObj.isFullGame = true;
    else if (contestObj.visitingTeam.apRank != "" && contestObj.visitingTeam.apRank != "0")
        contestObj.isFullGame = true;
    else if (contestObj.homeTeam.conferenceId == 'acc' ||
             contestObj.homeTeam.conferenceId == 'big10' ||
             contestObj.homeTeam.conferenceId == 'big12' ||
             contestObj.homeTeam.conferenceId == 'pac10' ||
             contestObj.homeTeam.conferenceId == 'sec' ||
             contestObj.homeTeam.conferenceId == 'cusa' ||
             contestObj.homeTeam.conferenceId == 'bige')
        contestObj.isFullGame = true;
    else if (contestObj.visitingTeam.conferenceId == 'acc' ||
             contestObj.visitingTeam.conferenceId == 'big10' ||
             contestObj.visitingTeam.conferenceId == 'big12' ||
             contestObj.visitingTeam.conferenceId == 'pac10' ||
             contestObj.visitingTeam.conferenceId == 'sec' ||
             contestObj.visitingTeam.conferenceId == 'cusa' ||
             contestObj.visitingTeam.conferenceId == 'bige')
        contestObj.isFullGame = true;
    else
        contestObj.isFullGame = false;
    
    return contestObj;
}

function parseGamestate(tk)
{
    tO = null;

    if (tk.length > 0)
    {
        tO = new Object();

        tO.gameOrder     = trimString(tk[GAME_ORDER]);
        tO.clock         = trimString(tk[CLOCK]);
        tO.period        = trimString(tk[PERIOD]);
        tO.possInd       = trimString(tk[POSSESSION]);
        tO.down          = trimString(tk[DOWN]);
        tO.yardline      = trimString(tk[YARDLINE]);
        tO.ballonInd     = trimString(tk[BALLON]);
        tO.yardsFromGoal = trimString(tk[YARDS_FROM_GOAL]);
        tO.distance      = trimString(tk[DISTANCE]);
        tO.activeInd     = trimString(tk[ACTIVE]);

        if (tO.activeInd == "F" && tO.period == "2")
             tO.isHalftime = true;
        else
             tO.isHalftime = false;


        if (tO.possInd != '' && tO.ballonInd != '' &&
            tO.possInd != tO.ballonInd && parseInt(tO.yardline) <= 20)
        {
            tO.isRedZone = true;
            if (parseInt(tO.yardline) <= parseInt(tO.distance))
            {
                tO.distance = "Goal";
            }
        }
        else
        {
              tO.isRedZone = false;
        }
        if (tO.isHalftime)
        {
            tO.possInd = "";
            tO.isRedZone = false;
        }
    }
    return tO;
}

// return complete team object with leaders and linescore and next game information
function parseTeamInfo(st)
{
    var teamObj = new Object();
    var tO = null;
    var tStr = null;
    var tk = null;
    var hasStats = false;
    
    teamObj.id         = trimString(st[TEAM_ID]);
    teamObj.name       = trimString(st[TEAM_NAME]);
    teamObj.nickname   = trimString(st[TEAM_NICKNAME]);
    teamObj.abrv       = trimString(st[TEAM_ABRV]);
    teamObj.urlName    = trimString(st[TEAM_URL]);
    teamObj.totalScore = trimString(st[TOTAL_SCORE]);
    teamObj.wins       = trimString(st[WINS]);
    teamObj.ties       = trimString(st[TIES]);
    teamObj.losses     = trimString(st[LOSSES]);        

    teamObj.ptsPerGame = trimString(st[PTSPERGAME]);
    //log.write("Pts/Gm: " + teamObj.ptsPerGame);

    if (teamObj.ptsPerGame != "" && teamObj.ptsPerGame != "0")
        hasStats = true;

    teamObj.ptsAllowedPerGame = trimString(st[PTSALLOWEDPERGAME]);
    //log.write("Pts/Allw/Gm: " + teamObj.ptsAllowedPerGame);

    if (teamObj.ptsAllowedPerGame != "" && teamObj.ptsAllowedPerGame != "0")
        hasStats = true;
    
    teamObj.ydsPerGame = trimString(st[YDSPERGAME]);
    //log.write("Yds/Gm: " + teamObj.ydsPerGame);

    if (teamObj.ydsPerGame != "" && teamObj.ydsPerGame != "0")
        hasStats = true;
    
    teamObj.ydsAllowedPerGame = trimString(st[YDSALLOWEDPERGAME]);
    //log.write("Yds/Allw/Gm: " + teamObj.ydsAllowedPerGame);

    if (teamObj.ydsAllowedPerGame != "" && teamObj.ydsAllowedPerGame != "0")
        hasStats = true;
    
    teamObj.hasStats = hasStats;
    hasStats = false;

    tStr = trimString(st[LINESCORE]);
    if (tStr != null && tStr != "")
    {
        tk = tStr.split(THIRD_LEVEL_DELIMITER);
        teamObj.linescore  = tk;
    }

    tStr = null;
    tk = null;

    tStr = trimString(st[PASSINGLDR]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(THIRD_LEVEL_DELIMITER);
        tO.id         = tk[LDR_ID];
        tO.name       = tk[LDR_NM];
        tO.linkable   = tk[LDR_LINK];        
        tO.position   = tk[LDR_POS];        
        tO.yards      = tk[LDR_YDS];
        tO.touchdowns = tk[LDR_TD];
        tO.made       = tk[LDR_MD];
        tO.attempted  = tk[LDR_ATT];
        
        tStr = null;
        tk = null;
        if (tO.name == "")
            tO = null;
        teamObj.passingLeader = tO;
        tO = null;
    }
    
    tStr = trimString(st[RUSHINGLDR]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(THIRD_LEVEL_DELIMITER);
        tO.id         = tk[LDR_ID];
        tO.name       = tk[LDR_NM];
        tO.linkable   = tk[LDR_LINK];        
        tO.position   = tk[LDR_POS];        
        tO.yards      = tk[LDR_YDS];
        tO.touchdowns = tk[LDR_TD];
        tO.rushes     = tk[LDR_MD];    
        
        tStr = null;
        tk = null;

        if (tO.name == "")
            tO = null;
        teamObj.rushingLeader = tO;
        tO = null;
    }
    
    tStr = trimString(st[RECEIVINGLDR]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(THIRD_LEVEL_DELIMITER);
        tO.id         = tk[LDR_ID];
        tO.name       = tk[LDR_NM];
        tO.linkable   = tk[LDR_LINK];        
        tO.position   = tk[LDR_POS];        
        tO.yards      = tk[LDR_YDS];
        tO.touchdowns = tk[LDR_TD];
        tO.receptions = tk[LDR_MD];    
        
        tStr = null;
        tk = null;

        if (tO.name == "")
            tO = null;
        teamObj.receivingLeader = tO;
        tO = null;
    }
    
    tStr = trimString(st[NEXT_GAME]);
    if (tStr != null && tStr != "")
    {
        tO = new Object();
        tk = tStr.split(THIRD_LEVEL_DELIMITER);
        tO.oppUrlName  = tk[NG_OPP_URL];
        tO.oppAbrv     = tk[NG_OPP_ABRV];
        tO.oppWins     = tk[NG_OPP_WINS];
        tO.oppLosses   = tk[NG_OPP_LOSSES];
        tO.dateStr     = tk[NG_DATE];    
        tO.homeAwayInd = tk[NG_VH_IND];    
        
        tStr = null;
        tk = null;

        if (tO.oppAbrv == "")
            tO = null;
        teamObj.nextGame = tO;    
    }
    tStr = trimString(st[DIV_ID]);
    if (tStr != null && tStr != "")
    {
        teamObj.divisionId = tStr;    

       if (teamObj.divisionId == 'divia' || teamObj.divisionId == 'diviaa')
           teamObj.linkable = true;
       else
           teamObj.linkable = false;
    }

    tStr = trimString(st[CONF_ID]);
    if (tStr != null && tStr != "")
        teamObj.conferenceId = tStr;    

    tStr = trimString(st[AP_RANK]);
    if (tStr != null && tStr != "")
    {
        if (tStr == "0")
            tStr = "";
        teamObj.apRank = tStr;    
    }

    return teamObj;
}

function buildMasterArrayFinal()
{
    var contestObj;

    masterGamesArrayFinal = new Array(0);
    
    for (i = 0; i < masterGamesArrayTemp.length; i++) 
    {
        contestObj = masterGamesArrayTemp[i];

        masterGamesArrayFinal.push(contestObj);
        contestObj = null;            
    }
    masterGamesArrayTemp = null;
}


function applyMyGamesFilter() 
{
    var selectedGamesArray;
    var myContestID;
    var rowIndex;
    var newFirstRow;
    var rowToCopyFrom;

    selectedGamesArray = getMyGamesFromCookie(); 
        
    for (var i = selectedGamesArray.length - 1; i >= 0; i--) 
    {
        myContestID = selectedGamesArray[i];

        rowIndex = getRowNumFromGameId(myContestID);
        if (rowIndex != null) 
        {
            // copy object into a new holder
            newFirstRow = masterGamesArrayFinal[rowIndex];

            // set myGame flag
            newFirstRow.isMyGame = 1;

            // push copied object in the beginning of the array
            masterGamesArrayFinal.unshift(newFirstRow);

            // find new index for old game location
            rowToCopyFrom = rowIndex + 1;
            
            // cut it out
            masterGamesArrayFinal.splice(rowToCopyFrom, 1);
        }
    }            
    selectedGamesArray = null;
}


function getRowNumFromGameId(myContestID) 
{
    for (var i = 0; i < masterGamesArrayFinal.length; i++) 
    {
        if (masterGamesArrayFinal[i].contestID == myContestID) 
        {
            ////log.write(".... found contestID in row number " + i);
            return i;
        }
    }
    return null;
}


function dumpMasterGamesArray() 
{
    var contestObj;
    
    for (i = 0; i < masterGamesArrayFinal.length; i++)
    {    
        contestObj = masterGamesArrayFinal[i];
        
        ////log.write(contestObj.contestID + " ..... " + contestObj.contestID  + " ..... " + contestObj.isMyGame  + " ..... " +contestObj.homeTeam + " ..... " + contestObj.visitingTeam + " ..... ");
        contestObj = null;
    }
}

function setSpecialFlags(oldO, newO)
{
    // Find if anyone has new scores. If scores haven't changed, reset.
    // The games that haven't changed at all won't be processed, so until they are, new score flag will stay same.
    // This logic might be faulty, TODO: verify
    if (! (newO.isFinal || newO.isActiveInd == "false" || newO.homeTeam.totalScore == "" || oldO.homeTeam.totalScore == "") &&
        ! (newO.homeTeam.totalScore == "0") &&
        newO.homeTeam.totalScore != oldO.homeTeam.totalScore)
        newO.homeTeam.isNewScore = true;
    else
        newO.homeTeam.isNewScore = false;
    if (! (newO.isFinal || newO.isActiveInd == "false" || newO.visitingTeam.totalScore == "" || oldO.visitingTeam.totalScore == "") &&
        ! (newO.visitingTeam.totalScore == "0") &&
        newO.visitingTeam.totalScore != oldO.visitingTeam.totalScore)
        newO.visitingTeam.isNewScore = true;
    else
        newO.visitingTeam.isNewScore = false;

    // reset possession indicator when game is inactive
    if (newO.isFinal || newO.gameState.isHalftime)
        newO.gameState.possInd = "";

    return newO;
}

function processFeedUpdateRows(feedDataArray)
{
    var feedRow;
    var fieldArray;
    var domIdSequence;
    var newContestObj;
    var oldContestObj;
    var contestID;

    var tempFeedDataArray = feedDataArray.slice(0,feedDataArray.length);

    if (METADATA)
    {
        if (processMetaData(feedDataArray[0]) == false)
            return;
        feedDataArray.splice(0, DATA_INDEX);
    }

    // if there is a difference in size between old and new feed array, that means
    // there were deleted games or added games. We need to force reload the entire page.
    if (feedDataArray.length != masterGamesArrayFinal.length)
    {
        isInitialRendering = true;
        sendGamesToController(tempFeedDataArray, false);
        return;
    }

    for (i = 0; i < feedDataArray.length; i++)
    {
        feedRow = trimString(feedDataArray[i]);

        ////log.write("processing data row (is it an Update row?): " + feedRow);

        fieldArray = feedRow.split(TOP_LEVEL_DELIMITER);

        contestID = trimString(fieldArray[CONTEST_ID]);

        for (j = 0; j < masterGamesArrayFinal.length; j++) 
        {            
            if (masterGamesArrayFinal[j].contestID == contestID) 
            {                
                oldContestObj = masterGamesArrayFinal[j];
                newContestObj = populateContestFromString(feedRow);        
                
                if (oldContestObj.rawFeed != newContestObj.rawFeed)
                {
                    newContestObj = setSpecialFlags(oldContestObj, newContestObj);
                    masterGamesArrayFinal[j] = newContestObj;
                    
                    domIdSequence = j + 1;                
                    
                    buildMiniscoreboard(domIdSequence, masterGamesArrayFinal[j]);
                }            
                else
                {
                    ////log.write(oldContestObj.rawFeed);
                }
                break;
            }        
        }        
        fieldArray = null;
    }
}

function processViewCastUpdate(feedDataArray)
{
    var feedRow;
    var fieldArray;
    var domIdSequence;
    var newContestObj;
    var oldContestObj;
    var contestID;

    var tempFeedDataArray = feedDataArray.slice(0,feedDataArray.length);

    if (METADATA)
    {
        if (processMetaData(feedDataArray[0]) == false)
            return;
        feedDataArray.splice(0, DATA_INDEX); 
    }

    // if there is a difference in size between old and new feed array, that means
    // there were deleted games or added games. We need to force reload the entire page.
    if (feedDataArray.length != masterGamesArrayFinal.length)
    {
        isInitialRendering = true;
        sendGamesToController(tempFeedDataArray, false);
        return;
    }

    for (i = 0; i < feedDataArray.length; i++)
    {
        feedRow = trimString(feedDataArray[i]);
        fieldArray = feedRow.split(TOP_LEVEL_DELIMITER);

        contestID = trimString(fieldArray[CONTEST_ID]);

        for (j = 0; j < masterGamesArrayFinal.length; j++)
        {
            if (masterGamesArrayFinal[j].contestID == contestID)
            {
                oldContestObj = masterGamesArrayFinal[j];
                newContestObj = populateContestFromString(feedRow);

                if (oldContestObj.rawFeed != newContestObj.rawFeed)
                {
                    newContestObj = setSpecialFlags(oldContestObj, newContestObj);
                    masterGamesArrayFinal[j] = newContestObj;

                    domIdSequence = j + 1;

                    buildViewCastMiniscoreboard(domIdSequence, masterGamesArrayFinal[j]);
                }
                else
                {
                    ////log.write(oldContestObj.rawFeed);
                }
                break;
            }
        }
        fieldArray = null;
    }
}

function renderFullScoreboard() 
{    
    var domIdSequence;
    var gameTime;
    var isMyGame;
    var feedData;

    for (var i = 0; i < masterGamesArrayFinal.length; i++) 
    {
        domIdSequence = i + 1;

        gameTime = masterGamesArrayFinal[i].dateString;
        isMyGame = Number(masterGamesArrayFinal[i].isMyGame);
        buildMiniscoreboard(domIdSequence, masterGamesArrayFinal[i]);
    }
}

function renderViewCastGames()
{
    var domIdSequence;
    var gameTime;
    var feedData;

    for (var i = 0; i < masterGamesArrayFinal.length; i++)
    {
        domIdSequence = i + 1;
        gameTime = masterGamesArrayFinal[i].dateString;
        buildViewCastMiniscoreboard(domIdSequence, masterGamesArrayFinal[i]);
    }
}

function reloadViewCast(dropdownSelectedValue)
{
    if (dropdownSelectedValue == "")
        return;

    var values = dropdownSelectedValue.split(TOP_LEVEL_DELIMITER);
    if (values[0] != "")
        PATH = values[0];
    else
        return;
    if (values[1] != "")
        VIEWCAST_NAME = values[1];
    else
        return;

    isInitialRendering = true;
    scoreboardsInitialPageLoad(SPORTID,PATH,FEEDNAME);
}


function newScoreboardAfterMyGamesSelected() 
{
    applyMyGamesFilter();

    buildGameAnchorCells(masterGamesArrayFinal.length, false);

    setupPollingTimer(INTERVAL);

    renderFullScoreboard();
}

function backToScoreboard()
{
    buildGameAnchorCells(masterGamesArrayFinal.length);

    setupPollingTimer(INTERVAL);

    renderFullScoreboard();
}

