/* 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. NCAA CONFERENCES JSON
 *		key: conference id, value: conference name
 *	5. DEBUG LOG CLASS
 *		creates a debug log in a new pop-up window
 */

/*************************************
	1. DATA MAPPING
*************************************/
METADATA = true;
DEBUG = false;
INTERVAL = 15000;

VIEWCAST_ACTIVE = true;

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

MASTER_ARRAY_LENGTH = 13;

TIMESTAMP = 0;
SETINTERVAL = 1;
DATA_INDEX = 1;
VIEWCAST_NAME = "Top 25";

FEED_ROW_DELIMITER = "\n";
TOP_LEVEL_DELIMITER = "|";
SECOND_LEVEL_DELIMITER = ";";
THIRD_LEVEL_DELIMITER = "#";

IMG_SERVER = "http://i.cdn.turner.com/si";
IMG_PATH = "/.e1d/img/3.0/sect/football/nfl";
LOGO_PATH = "/.e1d/img/4.0/global/basketball/ncaa/logos/";
BLANK_IMG = IMG_SERVER + "/.e1d/img/4.0/global/basketball/ncaa/logos/null_50.gif";
//BLANK_IMG = IMG_SERVER + "/images/misc/spacer.gif";

GAMES_IN_ROW = 2;
CONTEST_ID = 0;
STATSINC_CONTEST_ID = 1;
SEASON_YEAR = 2;
STAGE_ID = 3;
SUBSTAGE_ID = 4;
STATUS = 5;
DATE_URL = 6;
DATE_STR = 7;
GAMESTATE = 8;
VENUE = 9;
LINKS = 10;
HOME_TEAM = 11;
VSTR_TEAM = 12;
POST_SESN_REGION = 13;
SUBSTAGE_NM = 14;

GAME_ORDER = 0;
CLOCK = 1;
PERIOD = 2;
ACTIVE = 3;

STADIUM = 0;
CITY = 1;
STATE = 2;

PREVIEW = 0;
BOXSCORE = 1;
//PLAYBYPLAY = 2;
RECAP = 2;
GAMEBLOG = 3;
TICKETCITY = 4;

TEAM_ID = 0;
VENDOR_ID = 1;
TEAM_NAME = 2;
TEAM_NICKNAME = 3;
TEAM_ABRV = 4;
TEAM_URL = 5;
TOTAL_SCORE = 6;
WINS = 7;
LOSSES = 8;
PTSLDR = 9;
RBNDLDR = 10;
ASSTLDR = 11;
PTSLDR1 = 12;
PTSLDR2 = 13;
PTSLDR3 = 14;
DIV_ID = 15;
CONF_ID = 16;
AP_RANK = 17;

LDR_ID = 0;
LDR_NM = 1;
LDR_LINK = 2;
LDR_POS = 3;
LDR_STAT = 4;

var YEAR_IN_PATH 			= 6;
var MONTH_IN_PATH 			= 7;
var DATE_IN_PATH 			= 8;
/*************************************
	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.homeTeam = thirdLevel;
		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.visitingTeam = thirdLevel;    
		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]);        

	//team rank
	teamObj.rank = trimString(team[AP_RANK]);
	
	//team leaders
	teamObj.leaders = {};
	
	//assign points leader
	if (trimString(team[PTSLDR]) != null && trimString(team[PTSLDR]) != ""){
		teamObj.leaders.points = assignStatsValues( trimString(team[PTSLDR]) );
	}
	
	//assign rebound leader
	if (trimString(team[RBNDLDR]) != null && trimString(team[RBNDLDR]) != ""){
		teamObj.leaders.rebounds = assignStatsValues( trimString(team[RBNDLDR]) );
	}

	//assign assist leader
	if (trimString(team[ASSTLDR]) != null && trimString(team[ASSTLDR]) != ""){
		teamObj.leaders.assists = assignStatsValues( trimString(team[ASSTLDR]) );
	}
	
	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. CONFERENCES JSON
 ************************************/
 var NCAA_conferences = {
	"top25":"Top 25",
	"divia":"Division I",
	"acc":"ACC",
	"big12":"Big 12",
	"bige":"Big East",
	"bsky":"Big Sky",
	"bsou":"Big South",
	"big10":"Big Ten",
	"caa":"CAA",
	"cusa":"C-USA",
	"indp":"Independents",
	"gate":"Gateway",
	"gwest":"Great West",
	"ivy":"Ivy",
	"maac":"MAAC",
	"midam":"MAC",
	"meac":"MEAC",
	"mwest":"MWC",
	"nec":"Northeast",
	"ovc":"Ohio Valley",
	"pac10":"Pac-10",
	"patr":"Patriot",
	"pio":"Pioneer",
	"sec":"SEC",
	"south":"Southern",
	"sland":"Southland",
	"swac":"SWAC",
	"sbelt":"Sun Belt",
	"wac":"WAC"
};
 /*************************************
	end: 4. CONFERENCES JSON
 ************************************/
 
/********************************************
	5. 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: 5. DEBUG LOG CLASS
*********************************************/
