/* utils.js
 *	- serves both gameflash pages and section front scorebords
 *	
 *	1. DATA MAPPING
 *		holds sport-specific data mapping for the scoreboard.dat file
 *	2. CONVENIENT UTILITY FUNCTIONS
 *		contains utility functions
 *	3. SECTION FRONT SPECIFIC FUNCTIONS
 *		contains sport-specific function to create the contest object for section front scoreboards
 *	4. DEBUG LOG CLASS
 *		creates a debug log in a new pop-up window
 */

/*************************************
	1. DATA MAPPING
*************************************/
var METADATA = true;
var DEBUG = false;
var INTERVAL = 10000;
var VIEWCAST_PATH = null;

var VIEWCAST_ACTIVE = true;

// keep cookie for ~8-1/2 months of season.
var COOKIE_LIFE = 1000 * 60 * 60 * 24 * 250;

var TIMESTAMP = 0;
var SETINTERVAL = 1;
var DATA_INDEX = 1;

var FEED_ROW_DELIMITER = "\n";
var TOP_LEVEL_DELIMITER = "|";
var SECOND_LEVEL_DELIMITER = ";";
var THIRD_LEVEL_DELIMITER = "#";
var FOURTH_LEVEL_DELIMITER = "$";

var IMG_SERVER = "http://i.cdn.turner.com/si";
var IMG_PATH = "/.e1d/img/3.0/sect/hockey/nhl";
var LOGO_PATH = "/.e1d/img/3.0/sect/hockey/nhl/logos/";

var GAMES_IN_ROW = 2;

// top-level game fields
var CONTEST_ID = 0;
var STATSINC_CONTEST_ID = 1;
var SEASON_YEAR = 2;
var STAGE_ID = 3;
var SUBSTAGE_ID = 4;
var STATUS = 5;
var DATE_URL = 6;
var DATE_STR = 7;
var GAMESTATE = 8;
var VENUE = 9;
var LINKS = 10;
var HOME_TEAM = 11;
var VSTR_TEAM = 12;

// 2nd-level status
var GAME_ORDER = 0;
var CLOCK = 1;
var PERIOD = 2;
var ACTIVE = 3;

// 2nd-level venue
var STADIUM = 0;
var CITY = 1;
var STATE = 2;

// 2nd-level links
var PREVIEW = 0;
var BOXSCORE = 1;
var RECAP = 2;
var GAMEBLOG = 3;
var TICKETCITY = 4;

// 2nd-level team info
var TEAM_ID = 0;
var VENDOR_ID = 1;
var TEAM_NAME = 2;
var TEAM_NICKNAME = 3;
var TEAM_ABRV = 4;
var TEAM_URL = 5;
var TOTAL_SCORE = 6;
var WINS = 7;
var LOSSES = 8;
var TIES = 9;
var PTSLDR = 10;
var GOALSLDR = 11;
var ASSTLDR = 12;
var GAALDR = 13;
var SCORING_SUMMARY = 14;

// 3rd-level leader info
var LDR_ID = 0;
var LDR_NM = 1;
var LDR_LINK = 2;
var LDR_POS = 3;
var LDR_STAT = 4;

// 3rd/4th level scoring summary
var SCORE_PERIOD = 0;
var SCORE_PLAYER_ID = 1;
var SCORE_PLAYER_LASTNAME = 2;
var SCORE_PLAYER_LINKABLE = 3;
var SCORE_PLAYER_GOALS = 4;

var YEAR_IN_PATH 			= 4;
var MONTH_IN_PATH 			= 5;
var DATE_IN_PATH 			= 6;
/*************************************
	end: 1. DATA MAPPING
*************************************/

/*************************************
	2. CONVENIENT UTILITY FUNCTIONS
*************************************/
function trimString(str) {
	if (str != null && str.length > 0) {
		str = str.replace( /^\s+/g, "" );            // strip leading
		return str.replace( /\s+$/g, "" );            // strip trailing
	}
	return "";
}


function isNumber(strData) {
	var dataAsNumber;

	if (strData.length == 0)
		return false;

	// fastest way to convert to a number type
	dataAsNumber = (+strData);

	if ((isNaN(dataAsNumber) == false) && dataAsNumber >= 0 ) {
		return true;
	}
	return false;
}

function createImageElement(src,height,width,border,alt,alignment,myClass) {
	var iElem = document.createElement("img");
	iElem.setAttribute("src", src);
	iElem.setAttribute("height", height);
	iElem.setAttribute("witdh", width);
	iElem.setAttribute("border", border);

	if (alignment != null && ! alignment == "")
		iElem.setAttribute("align", alignment);
	iElem.alt = alt;
	if (myClass != null && ! myClass == "")
		iElem.className = myClass;

	return iElem;
}

function setMyAttribute(myName, myValue) {
	var tempA = document.createAttribute(myName);
	tempA.value = myValue;
	return tempA;
}

function createTeamRecord(wins,losses,ties,isInParenthesis) {
	var w = parseInt(wins), l = parseInt(losses), t = parseInt(ties);
	var record = (w >= 0 ? w : 0) + "-" + (l >= 0 ? l : 0) + "-" + (t >= 0 ? t : 0);
    
	if (isInParenthesis)
		record = "(" + record + ")";
	return record;
}

function createLinkElement(linkWhat, linkWhere, target, isImage, className) {
	var linkElem = null;

	if (linkWhere == null || linkWhere == "") {
		if (isImage)
			return linkWhat;
		else
			return document.createTextNode(linkWhat);
	}
	else {
		linkElem = document.createElement("a");
		linkElem.href = linkWhere;
		if (target != null && !target == "")
			linkElem.target = target;
		if (isImage)
			linkElem.appendChild(linkWhat);
		else
			linkElem.appendChild(document.createTextNode(linkWhat));

		if (className != null)
			linkElem.className = className;
			
		return linkElem;
	}
}

function ordinalize(number) {
	var num = parseInt(number);
	
	return num + (
		(num % 10 == 1 && num % 100 != 11) ? 'st' :
		(num % 10 == 2 && num % 100 != 12) ? 'nd' :
		(num % 10 == 3 && num % 100 != 13) ? 'rd' : 'th'
	);
}
/******************************************
	end: 2. CONVENIENT UTILITY FUNCTIONS
*******************************************/

/*************************************
	3. SECTION FRONT SPECIFIC FUNCTIONS
 ************************************/
 
 function populateContestObjectFromString(contestStr){
	var isInprogress = false;
	var isFinal = false;

	var masterRow 	= contestStr.split(TOP_LEVEL_DELIMITER);
	var contestObj	= {};
	var firstLevel	= null;
	var secondLevel	= null;
	var thirdLevel	= null;    
	
	contestObj.rawFeed = contestStr;
	masterRow = contestStr.split(TOP_LEVEL_DELIMITER);


	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.statusInd   		= trimString(masterRow[STATUS]);
	contestObj.gameDateUrl 		= trimString(masterRow[DATE_URL]);
	contestObj.gameDateStr 		= trimString(masterRow[DATE_STR]);

	if (contestObj.gameDateStr.indexOf("TBD") == -1)
		contestObj.gameDateStr = contestObj.gameDateStr + " ET";

	// 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;
	} else  {	// this leaves out PROG, END- and DELA status
		contestObj.isPregame = false;
		contestObj.isFinal = false;
		contestObj.isInprogress = true;
	}

	// GAMESTATE
	firstLevel = trimString(masterRow[GAMESTATE]);

	if (firstLevel != null && firstLevel != "") {
		secondLevel	= firstLevel.split(SECOND_LEVEL_DELIMITER);
		thirdLevel = assignGamestate(secondLevel);
		secondLevel = null;
		firstLevel = null;
		contestObj.gameState = thirdLevel;
		thirdLevel = null;
	}

	// VENUE
	firstLevel = trimString(masterRow[VENUE]);

	if (firstLevel != null && firstLevel != "") {
		thirdLevel = new Object();
		secondLevel = firstLevel.split(SECOND_LEVEL_DELIMITER);
		thirdLevel.stadium = trimString(secondLevel[STADIUM]);
		thirdLevel.city = trimString(secondLevel[CITY]);
		thirdLevel.state = trimString(secondLevel[STATE]);
		
		secondLevel = null;
		firstLevel = null;
		if (thirdLevel.stadium == "" && thirdLevel.city == "")
			thirdLevel = null;
		contestObj.venue = thirdLevel;
		thirdLevel = null;
	}

	// LINKS
	firstLevel = trimString(masterRow[LINKS]);
	if (firstLevel != null && firstLevel != "") {
		thirdLevel = new Object();
		secondLevel = firstLevel.split(SECOND_LEVEL_DELIMITER);
		thirdLevel.previewInd = trimString(secondLevel[PREVIEW]);
		thirdLevel.previewInd = trimString(secondLevel[PREVIEW]);
		thirdLevel.boxscoreInd = trimString(secondLevel[BOXSCORE]);
		thirdLevel.recapInd = trimString(secondLevel[RECAP]);
				thirdLevel.gameblog = trimString( secondLevel[GAMEBLOG]);
				thirdLevel.ticketcityurl = secondLevel[TICKETCITY];
		
		secondLevel = null;
		firstLevel = null;
		contestObj.links = thirdLevel;
		thirdLevel = null;
	}

	contestObj.teams = {};
	
	// HOME TEAM
	firstLevel = trimString(masterRow[HOME_TEAM]);
	if (firstLevel != null && firstLevel != "") {
		secondLevel = firstLevel.split(SECOND_LEVEL_DELIMITER);
		thirdLevel = assignTeamInfo(secondLevel);
		secondLevel = null;
		firstLevel = null;
		contestObj.teams.home = thirdLevel;
		thirdLevel = null;
	}

	// VISITING TEAM

	firstLevel = trimString(masterRow[VSTR_TEAM]);
	if (firstLevel != null && firstLevel != "") {
		secondLevel = firstLevel.split(SECOND_LEVEL_DELIMITER);
		thirdLevel = assignTeamInfo(	secondLevel	);
		secondLevel = null;
		firstLevel = null;
		contestObj.teams.vstr = thirdLevel;
		thirdLevel = null;
	} 

	// Once for all, figure out if this is an All-star Game

	if (contestObj.teams.vstr.nickname == "All-Stars" || contestObj.teams.home.nickname == "All-Stars")
		contestObj.isAllstarGame = true;
	else
		contestObj.isAllstarGame = false;
	
	return contestObj;
}

function assignGamestate(gameStateArr)
{
	gameStateObj = null;

	if (gameStateArr.length > 0)
	{
		gameStateObj = new Object();

		gameStateObj.gameOrder	= trimString(gameStateArr[GAME_ORDER]);
		gameStateObj.clock		= trimString(gameStateArr[CLOCK]);
		gameStateObj.period		= trimString(gameStateArr[PERIOD]);
		gameStateObj.activeInd	= trimString(gameStateArr[ACTIVE]);

		if (gameStateObj.period == "2" && (gameStateObj.activeInd == "F" || gameStateObj.clock == "0:00"))
			 gameStateObj.isHalftime = true;
		else
			 gameStateObj.isHalftime = false;
	}
	return gameStateObj;
}

// return complete team object with leaders and linescore and next game information
function assignTeamInfo(team)
{
	var teamObj 		= {};
	var statsLeader	= null;

	teamObj.id  = trimString(team[TEAM_ID]);

	//if the vendor id is available, set it; if not, set it to the team id
	teamObj.vendorID = ( trimString(team[VENDOR_ID]) != "" || trimString(team[VENDOR_ID]) != null) ? trimString(team[VENDOR_ID]) : teamObj.id;

	//team name
	teamObj.name       		= trimString(team[TEAM_NAME]);
	teamObj.nickname	= trimString(team[TEAM_NICKNAME]);
	teamObj.abrv       		= trimString(team[TEAM_ABRV]);
	
	if (teamObj.nickname == "All-Stars")
		teamObj.urlName = teamObj.name.toLowerCase() + "_" + teamObj.nickname.toLowerCase();
	else
		teamObj.urlName = trimString(team[TEAM_URL]);
	
	//team record
	teamObj.totalScore = trimString(team[TOTAL_SCORE]);
	teamObj.wins       = trimString(team[WINS]);
	teamObj.losses     = trimString(team[LOSSES]);        
	teamObj.ties     = trimString(team[TIES]);        

	teamObj.leaders = {};
	
	//assign points leader
	if (trimString(team[PTSLDR]) != null && trimString(team[PTSLDR]) != ""){
		teamObj.leaders.points = assignStatsValues( trimString(team[PTSLDR]) );
	}
	
	//assign goals leader
	if (trimString(team[GOALSLDR]) != null && trimString(team[GOALSLDR]) != ""){
		teamObj.leaders.goals = assignStatsValues( trimString(team[GOALSLDR]) );
	}
	
	//assign assist leader
	if (trimString(team[ASSTLDR]) != null && trimString(team[ASSTLDR]) != ""){
		teamObj.leaders.assists = assignStatsValues( trimString(team[ASSTLDR]) );
	}
	
	//assign rebound leader
	if (trimString(team[GAALDR]) != null && trimString(team[GAALDR]) != ""){
		teamObj.leaders.goalsAgainstAvg = assignStatsValues( trimString(team[GAALDR]) );
	}
	
	return teamObj;
}

function assignStatsValues(statStr){
	
	var statLeader = {};
	var statArray = statStr.split(THIRD_LEVEL_DELIMITER);
	statLeader.id       		= statArray[LDR_ID];
	statLeader.name     		= statArray[LDR_NM];
	statLeader.linkable 	= statArray[LDR_LINK];        
	statLeader.position 	= statArray[LDR_POS];
	statLeader.stat		= statArray[LDR_STAT];
	
	// the assumption here is that there are always "leaders", even if stats are zero, so we need to filter those out.
	if (statLeader.name == "" || statLeader.stat == "" || statLeader.stat == "0" || statLeader.stat == "0.0")
		statLeader = null;
	
	return statLeader;
}

 /*************************************
	end: 3. SECTION FRONT SPECIFIC FUNCTIONS
 ************************************/
/********************************************
	4. DEBUG LOG CLASS
*********************************************/
/*    Debug Log Class
 *         Started with the example at this URL:  http://ajaxcookbook.org/javascript-debug-log/
 *         But this example needed many enhancements to get it to work properly.  I ended 
 *         up encapsulating the log in its own class.
*/
function logClass() {

    this.logWindow = null;
    
    this.create = function() {
        if (DEBUG) {
            this.logWindow = window.open("", null, "width=400,height=400," +
                                      "scrollbars=yes,resizable=yes,status=no," +
                                      "location=no,menubar=no,toolbar=no");
            if (!this.logWindow)
                return;
            
            this.logWindow.document.write("<html><head><title>Debug Log</title></head><body></body></html>");
            this.logWindow.document.close();
        }
        else
            return;
    }
    
    this.write = function(text) {
        
        var newDiv;
        var newTextLine;
    
        if (DEBUG) {
            if (this.logWindow != null && !this.logWindow.closed) {
                newDiv = this.logWindow.document.createElement("div");
                newTextLine = this.logWindow.document.createTextNode(text);
                newDiv.appendChild(newTextLine);
            
                this.logWindow.document.body.appendChild(newDiv);
            }
        }
        else
            return;
    }      
}
/********************************************
	end: 4. DEBUG LOG CLASS
*********************************************/
