/**
 * The main Scoreboard object
 */
var Scoreboard = {
		
    id: "scoreboard01",

init: function(container) {

        var attributes = {
            id: Scoreboard.id,
            name: Scoreboard.id,
            styleclass: "scoreboardContainer",
            align: "right",
            scale: "noscale",
            wmode: "transparent",
            FlashVars : "pageURL=" + document.URL

        };
        var prms = {
            wmode: "transparent"
        };

        swfobject.embedSWF(nhlScoreboard, container, "655", "65", "9.0.0", null, null, prms, attributes);


    },

getObj: function() {

        return swfobject.getObjectById(Scoreboard.id);


    },
selectGame: function(id) {
        Scoreboard.getObj().selectGame(id);

    },

unselectGame: function() {
        Scoreboard.getObj().unselectGame();

    },

reinit: function() {
        Scoreboard.getObj().reinit();

    },

gameSelected: function(id) {
        Scoreboard.gameSelected_callBack(id);

    },

setGames: function(json) {
        Scoreboard.getObj().setGames(json);


    },

ready: function() {
        Scoreboard.ready_callBack();

    },

ready_callBack: null,

gameSelected_callBack: null

}

function openWindow(pageUrl, win, tracking, gameId) {
	Scoreboard.getObj().openWindowFromSwf(pageUrl, win, tracking);
}

var minimumInterval = 30;
var firstPass = false;
var nextUpdate = null;
var isUpdating = false;
var lastUpdate;
var json;
var hasFavoriteTeam = false;
var gameInProgress = false;
var nextLiveGame = null;
var hasStateChanged = false;

// Used for game state detection
var prevInProgressGames = new Array();
var prevFutureGames = new Array();
				
var nhlScoreboard = '/league/swf/nhl_playoff_scoreboard.swf';

jQuery(document).ready(function() {
	jQuery.ajaxSetup({
		  cache: false
	});
	Scoreboard.init('scoreboard');
	Scoreboard.ready_callBack = pingDataSource;
	firstPass = true;
});

function pingDataSource() {
	jQuery.getJSON(dataSource, loadScoreboard);
}

function parseGameDate(date) {
	gameDate = new Array();
	gameDate['mon'] = (date.substring(0, 2) - 1); gameDate['day'] = (date.substring(3, 5));
	gameDate['year'] = (date.substring(6, 10)); gameDate['hour'] = (date.substring(11, 13));
	gameDate['min'] = (date.substring(14, 16));
	return gameDate;
}

function arrayMerge(arr) {
	 var merged = arr;
	 for (var i = 1; i < arguments.length; i++) {
		 merged = merged.concat(arguments[i]);
	 }
	 return merged;
}

function loadScoreboard(json) {
	
	// Reset
	gameInProgress = false;
	nextLiveGame = null;
	
	lastNightGames = new Array();
	inProgressGames = new Array();
	finalGames = new Array();
	futureGames = new Array();

	if (json) {
	
	// Clear the update
	if (nextUpdate) clearTimeout(nextUpdate);
	// For debugging purposes
	this.json = json;
	dynamicInterval = json.refreshInterval;
	isUpdating = true;
		if (RegisteredFan.getFavoriteTeam()) {
			hasFavoriteTeam = true;
			favoriteTeam = RegisteredFan.getFavoriteTeam();
		}
		
		jQuery.each(json.games, function(game) {

			// Mark favorite team
			if (hasFavoriteTeam) {
				if (teamsMap[json.games[game].homeTeamName] == favoriteTeam || teamsMap[json.games[game].awayTeamName] == favoriteTeam) {
					json.games[game].isFavorite = true;
				}
			}
			
			if (json.games[game].gameState == 3 && json.games[game].isToday == 1) {
				json.games[game].gameState = 2;
			}
				
			// Future games
			if (json.games[game].gameState == 0) {
				futureGames.push(json.games[game]);
				if (!nextLiveGame) nextLiveGame = json.games[game];
				if (json.games[game].isToday == 1) json.games[game].startDate = "TODAY";
			}
			
			// In Progress games
			if (json.games[game].gameState == 1) {
				inProgressGames.push(json.games[game]);
				gameInProgress = true;
			}
			
			// Final games
			if (json.games[game].gameState == 2) {
				finalGames.push(json.games[game]);
			}
			
			// Hidden games
			if (json.games[game].gameState == 3 && json.games[game].isToday == 0) {
				lastNightGames.push(json.games[game]);
			} 
			
		});
		
		if (!gameInProgress) {
			// Calculate next ping
			if (nextLiveGame) {
				now = new Date();
				gameDate = parseGameDate(nextLiveGame.longStartTime);
				next = new Date();
				next.setFullYear(gameDate['year'],gameDate['mon'],gameDate['day']); 
				next.setHours(gameDate['hour']); 
				next.setMinutes(gameDate['min']);
				dynamicInterval = Math.ceil(next.getTime() - now.getTime()) / 1000;
				if (dynamicInterval >  minimumInterval) {
					dynamicInterval = minimumInterval;
					gameInProgress = true;
				}
			}
		}
		
		// Calculate game state changes for Scoreboard.reset()
		if (firstPass) {
			prevInProgressGames = inProgressGames;
			prevFutureGames = futureGames;
			firstPass = false;
		} else {
			if (prevInProgressGames.length != inProgressGames.length || prevFutureGames.length != futureGames.length) {
				// console.log("Detected state change");
				Scoreboard.reset();
				prevInProgressGames = inProgressGames;
				prevFutureGames = futureGames;
				hasStateChanged = true;
			}
		}
				
		// Set the games
		Scoreboard.setGames('{"games":' + jQuery.toJSON(arrayMerge(lastNightGames, inProgressGames, finalGames, futureGames)) + '}');
		isUpdating = false;
		
		// Set the update
		if (dynamicInterval < 1) dynamicInterval = minimumInterval;
		nextUpdate = setInterval("pingDataSource()", dynamicInterval * 1000);
	}
}
