

function bracketPredictor( o ) {
	this.selectedTeam = {'1':{}, '2':{}};
	
	this.selectedStats = [];
	this.selectedStatsTemp = [];
	this.o = o;

	this.staticMsg = 'Please choose stats and teams.';
	this.reset(true);
	this._init();
}

bracketPredictor.prototype = {

	_init : function() {
		
		// Add Click Events to Team Names
		var teams = $i('container-teams').getElementsByTagName('li');
		for(var i=0; i<teams.length; i++) {
			if (teams[i]) {
				teams[i].onclick = this.selectTeam;
			}
		}
		
		// Add Click Events to Stats
		var stats = $i('statList').getElementsByTagName('li');
		for(var i=0; i<stats.length; i++) {
			if (stats[i]) {
				stats[i].onclick = this.selectStat;
			}
		}
		
		// Add Mouseevents to team chooser
		$i('container-teams').onmouseout = function(e) {
			if (!e) var e = window.event;
			var relTarg = e.relatedTarget || e.toElement;
			if (relTarg == $i('containers_wrapper')) {
				$i('container-teams').style.display = 'none';
				$i('containers_wrapper').style.display = 'none';	
			}
		}
		
		// Allow clicking 'start predicting'
		$i('btn_start_predicting').onclick = $i('btn_start_predicting_close').onclick = this.showApp;
		
	},
	
	preselected : function() {		
		// Preselected Items
		if (this.o) {
			if ( this.o.team1 ) {
				this.selectTeam( false, 1, this.o.team1 );
			}
			if ( this.o.team2 ) {
				this.selectTeam( false, 2, this.o.team2 );
			}
			if ( this.o.selectedStats && this.o.selectedStats.length > 0 ) {
				this.selectedStatsTemp = this.o.selectedStats;
				this.saveStats();
			}
			if ( this.o.tournamentId ) {
				bracketPredictor.tournamentId = this.o.tournamentId;
			}
		}
	},
	
	oneClickPick: function() {
		if (this.o.oneClickPick) {
			if ( this.o.oneClickPick.selectedStats && this.o.oneClickPick.selectedStats.length > 0 ) {
				var newStats = [];
				this.cancelStats(true);
				for(var i in this.o.oneClickPick.selectedStats) {
					newStats.push( this.o.oneClickPick.selectedStats[i] );
				}
				this.selectedStatsTemp = newStats;
				this.saveStats();
			}
		}
	},
	
	showApp : function() {
		Addclass( $i('main'), 'show' );
	},
	
	// -- //
	
	changeChooser : function( teamNum , stats) {
		$i('containers_wrapper').style.display = 'block';
		$i('container-teams').style.display = teamNum ? 'block' : 'none';
		$i('container-stats').style.display = stats ? 'block' : 'none';
		
		if (teamNum) {
			Removeclass( $i('container-teams') , 'selectTeam'+(teamNum==1?2:1) );
			Addclass( $i('container-teams') , 'selectTeam'+teamNum );		
		}
	},
	
	chooseTeam : function(num) {		
		bracketPredictor.changeChooser( num );
		bracketPredictor.teamChooserId = num;
		$i('bb_teamNumh2').innerHTML = num;
	},
	
	selectTeam : function(e, num, teamId) {
		
		obj = (num && teamId) ? $i('teamId_'+teamId) : this;
		
		// Get the number of team we are picking
		var num = num ? num : bracketPredictor.teamChooserId;
		var teamId = teamId ? teamId : obj.id.replace('teamId_', '')
		var other = num==1?2:1;
		var otherTeamId = bracketPredictor.selectedTeam[other]['id'];
		var bothSetAlready = (otherTeamId && bracketPredictor.selectedTeam[num]['id']);
		
		/*if (bothSetAlready && !confirm('Changing a team will reload predictions, are you sure you want to change?')) {
			$i('container-teams').style.display = 'none';
			$i('containers_wrapper').style.display = 'none';
			return false;
		}*/
		
		if (teamId != otherTeamId || !otherTeamId) {
		
			// Clear Previous Pick
			if ( bracketPredictor.selectedTeam[num]['item'] ) {
				Removeclass( bracketPredictor.selectedTeam[num]['item'], 'disabled'+num );	
				//bracketPredictor.selectedTeam[num]['item'].getElementsByTagName('a')[0].innerHTML = 
					//bracketPredictor.selectedTeam[num]['item'].getElementsByTagName('a')[0].innerHTML.replace(' (Team '+num+')','');
			}
			
			// Update Pick
			bracketPredictor.selectedTeam[num]['item'] = obj;
			bracketPredictor.selectedTeam[num]['id'] = teamId;
			Addclass( bracketPredictor.selectedTeam[num]['item'], 'disabled'+num );
			
			// Update Button Display
			var teamName = bracketPredictor.selectedTeam[num]['item'].getElementsByTagName('a')[0].innerHTML;
			//bracketPredictor.selectedTeam[num]['item'].getElementsByTagName('a')[0].innerHTML += ' (Team '+num+')';
			$i('bp_team'+num+'_name').innerHTML = teamName;
			$i('btn_team_'+num).style.backgroundImage = 'url(http://a.espncdn.com/i/teamlogos/ncaa/sml/'+obj.getAttribute('logoId')+'.gif)';
			
			//Hide Chooser
			$i('container-teams').style.display = 'none';
			$i('containers_wrapper').style.display = 'none';
			
			if (num == 1 && !bothSetAlready) {
				Addclass( $i('col_cover_team1') , 'col_cover_done' );
				Addclass( $i('btn_team_2') , 'active' );
				$i('step_2_message').innerHTML = $i('step_3_message').innerHTML = bracketPredictor.staticMsg;
			}
			if (num == 2 && !bothSetAlready) {
				Addclass( $i('col_cover_team2') , 'col_cover_done' );
				Addclass( $i('btn_select_stats') , 'active' );
				$i('step_2_message').innerHTML = $i('step_3_message').innerHTML = bracketPredictor.staticMsg;
			}
			
			bracketPredictor.getFactors();
			
			// activate clear button
			Removeclass( $i('btn_clear_entry'), 'dim');
		}
		
	},
	
	// -- //
	
	chooseStats : function() {	
		if ( $i('btn_select_stats').className.match('active') ) { //only show if it's available to view yet
			
			bracketPredictor.changeChooser( null, true );
			
			// Load Currently selected stats
			for(var i=0; i<bracketPredictor.selectedStats.length; i++) {
				bracketPredictor.selectedStatsTemp[i] = bracketPredictor.selectedStats[i];
			}
			for(var i=0; i<bracketPredictor.selectedStatsTemp.length; i++) {			
				$i('bp_stat'+i+'_slot').innerHTML = $i('stat_'+bracketPredictor.selectedStatsTemp[i]).getElementsByTagName('a')[0].innerHTML;
				Addclass( $i('bp_stat'+i+'_slot').parentNode, 'filled');
				Addclass( $i('stat_'+bracketPredictor.selectedStatsTemp[i]) , 'disabled' );	
			}
			
			//  Show window
			bracketPredictor.buttonVis();
			
			if (bracketPredictor.selectedStatsTemp.length == 0) {
				 setTimeout('bracketPredictor.clearStat(0)',5); //IE still shows X's after reset, this removes them
			}
		}		
	},
	
	selectStat : function() {
		
		var nextSlot = bracketPredictor.selectedStatsTemp.length;
		var statName = this.getElementsByTagName('a')[0].innerHTML;
		var statId = this.id.replace(/stat_/, '');
		
		// Check not already a selected stat
		if (!this.className.match(/disabled/)) {
		
			// Check under 5
			if (nextSlot >= 5) {
				
				if (pops['statMax']) { pops['statMax'].kill(); }
				pops['statMax'] = new tr_pop( {
									type:'confirm', question:'You can only select up to 5 stats at a time, remove one before adding anymore',
									hideCancelBtn: true,
									showClose:false,
									confirmText: 'Okay',									
									forceTop: 150
								} );
				
				return false;
			}
			
			// Select It
			Addclass( this , 'disabled' );
			
			// Add it to stat slots
			$i('bp_stat'+nextSlot+'_slot').innerHTML = statName;
			Addclass( $i('bp_stat'+nextSlot+'_slot').parentNode , 'filled');
			
			// Add it to set
			bracketPredictor.selectedStatsTemp.push( statId );
			bracketPredictor.statsChanged = true;
			
			bracketPredictor.buttonVis();	
			
		} else {
			
			// Find what slot it is
			for(var i in bracketPredictor.selectedStatsTemp) {
				if (bracketPredictor.selectedStatsTemp[i] == statId) {
					return bracketPredictor.clearStat(i);
				}
			}
		}	
		
	},
	
	buttonVis : function() {
		$i('btns_generate').style.display = 'block';
		
		if (bracketPredictor.selectedStatsTemp.length > 0) {
			if (bracketPredictor.selectedStats.length > 0 && !bracketPredictor.statsChanged) { //already set, coming back to update
				//$i('btns_generate').style.display = 'none';
				//$i('btn_generate_new').style.display = 'none';	
				//$i('btn_generate_update').style.display = 'block';
				Addclass( $i('btn_generate_picks') , 'dim' );
			} else {
				//$i('btns_generate').style.display = 'block';
				//$i('btn_generate_new').style.display = 'none';	
				//$i('btn_generate_update').style.display = 'none';
				Removeclass( $i('btn_generate_picks') , 'dim' );
			}
		} else {
			//$i('btns_generate').style.display = 'none';
			//$i('btn_generate_new').style.display = 'block';	
			//$i('btn_generate_update').style.display = 'none';	
			Addclass( $i('btn_generate_picks') , 'dim' );
		}
	},
	
	clearStat : function(num) {
	
		// move slots over
		for(var i=num; i<4; i++) {			
			$i('bp_stat'+i+'_slot').innerHTML = $i('bp_stat'+(i*1+1)+'_slot').innerHTML;
			$i('bp_stat'+i+'_slot').parentNode.className = $i('bp_stat'+(i*1+1)+'_slot').parentNode.className;	
		}
		
		// clear last slot
		$i('bp_stat4_slot').innerHTML = 'Choose Stat Below';
		Removeclass( $i('bp_stat4_slot').parentNode , 'filled');
		
		// deselect item from list	
		Removeclass( $i('stat_'+bracketPredictor.selectedStatsTemp[num]) , 'disabled' );
		
		// remove from set
		bracketPredictor.selectedStatsTemp.splice(num,1);	
		bracketPredictor.statsChanged = true;
		
		bracketPredictor.buttonVis();
		
	},
	
	saveStats : function() {
		
		// overwrite existing stats
		bracketPredictor.selectedStats = bracketPredictor.selectedStatsTemp;
		bracketPredictor.statsChanged = false;
		
		// Add stats to table
		/*for(var i=0; i<5; i++) {
			$i('bp_stat'+(i+1)+'_name').innerHTML = '<a onclick="bracketPredictor.chooseStats()">' + (bracketPredictor.selectedStats[i] ? $i('stat_'+bracketPredictor.selectedStats[i]).getElementsByTagName('a')[0].innerHTML : 'Click to add') + '</a>';
		}*/
		Addclass( $i('col_cover_stats') , 'col_cover_done' );
		
		// update count
		Addclass( $i('btn_select_stats') , 'num' );
		$i('btn_select_stats_num').innerHTML = bracketPredictor.selectedStats.length + '/5';
		
		// put up spinners
		
		// close window
		$i('container-stats').style.display = 'none';
		$i('containers_wrapper').style.display = 'none';
		
		bracketPredictor.getFactors();
	},
	
	paramStr : function() {
		// make params str
		var params = 'tournamentId='+bracketPredictor.tournamentId+'&team1='+bracketPredictor.selectedTeam[1]['id']+'&team2='+bracketPredictor.selectedTeam[2]['id'];
		for(var i in bracketPredictor.selectedStats) {
			params += '&stat'+i+'='+bracketPredictor.selectedStats[i];
		}
		return params;
	},
	
	getFactors : function() {
		
		// Cover Message		
		var bothSetAlready = (bracketPredictor.selectedTeam[1]['item'] && bracketPredictor.selectedTeam[2]['item']);
		if (this.selectedStats.length > 0) {
			if (bothSetAlready) {
				$i('stats_cover_msg').innerHTML = 'Please choose stats';				
			} else if (bracketPredictor.selectedTeam[1]['item']) { 
				$i('stats_cover_msg').innerHTML = 'Please choose team 2';
			} else if (bracketPredictor.selectedTeam[2]['item']) { 
				$i('stats_cover_msg').innerHTML = 'Please choose team 1';
			} else {
				$i('stats_cover_msg').innerHTML = 'Please choose teams';	
			}
		} else {
			if (bothSetAlready) {
				$i('stats_cover_msg').innerHTML = 'Please choose stats';						
			} else {
				if (bracketPredictor.selectedTeam[1]['item']) { 
					$i('stats_cover_msg').innerHTML = 'Please choose stats and team 2';
				} else if (bracketPredictor.selectedTeam[2]['item']) { 
					$i('stats_cover_msg').innerHTML = 'Please choose stats and team 1';
				} else {
					$i('stats_cover_msg').innerHTML = 'Please choose stats and teams above.';							
				}
			}
		}
	
		if (bracketPredictor.selectedStats.length > 0 && bracketPredictor.selectedTeam[1]['id'] &&  bracketPredictor.selectedTeam[2]['id']) {
			
			
			// activate generate button
			Removeclass( $i('btn_generate_prediction'), 'dim');			
			Removeclass( $i('step_2') , 'loaded' );
			Removeclass( $i('step_3') , 'loaded' );
			Addclass( $i('step_2') , 'unload' );
			Addclass( $i('step_3') , 'unload' );
			
			Addclass( $i('step_1') , 'show_factors' );
			
			if ($i('loading_container').innerHTML.length == 0) {
				$i('step_2_message').innerHTML = $i('step_3_message').innerHTML = 'Click to <a onclick="bracketPredictor.reload()">generate predictions</a>.';
			} else {
				$i('step_2_message').innerHTML = $i('step_3_message').innerHTML = '<div>You have changed teams or stats.</div><div>Click to <a onclick="bracketPredictor.reload()">generate new predictions</a>.</div>';
			}
				
			
			var A = new Ajax();
			A.fire('/ajax/espn/load_factors.php', bracketPredictor.callbackFactors, this.paramStr());		
			
		}
	},
	
	callbackFactors : function(r) {
		//$i('teams_factors').innerHTML  = r;
		//try {
		ieTableInnerHTML( $i('teams_factors') , r );
		//} catch(e) { alert(e); }
	},
	
	reload : function() {
		
		if (!$i('btn_generate_prediction').className.match('dim')) {
			
			var params = this.paramStr();
			
			//spinner
			Addclass( $i('step_2') , 'loading' );
			Addclass( $i('step_3') , 'loading' );
			
			Addclass( $i('btn_generate_prediction') , 'dim');
			
			// get new content
			var A = new Ajax();
			A.fire('/ajax/espn/load_all.php', bracketPredictor.callbackData, params);
			
		}
		
	},
	
	callbackData : function(r) {
		$i('loading_container').innerHTML = r;
		
		// Swap markup
		$i('view_predictions_wrapper').innerHTML = $i('load_picks').innerHTML;
		$i('sim_games_wrapper').innerHTML = $i('load_sim_games').innerHTML;
		
		$i('sim_games_wrapper').style.display = $i('view_predictions_wrapper').style.display = 'block';
		
		// Remove Spinners
		Addclass( $i('step_2') , 'loaded' );
		Addclass( $i('step_3') , 'loaded' );
		Removeclass( $i('step_2') , 'unload' );
		Removeclass( $i('step_3') , 'unload' );
		Removeclass( $i('step_2') , 'loading' );
		Removeclass( $i('step_3') , 'loading' );
	},
	
	cancelStats : function(f) {
		
		if (!f) {
			if (pops['changes']) { pops['changes'].kill(); }
				pops['changes'] = new tr_pop( {
									type:'confirm', question:'This will cancel any changes you\'ve made to your selected stats, are you sure you want to continue?',
									confirmText: 'Continue',
									forceTop: 150,
									showClose:false,
									onConfirm: function() { bracketPredictor.cancelStats(true); }
								} );
		} else {
			
			// Hide Window
			$i('container-stats').style.display = 'none';
			$i('containers_wrapper').style.display = 'none';
			
			// Remove Selections
			for(var i=0; i<bracketPredictor.selectedStatsTemp.length; i++) {
				if ( bracketPredictor.selectedStatsTemp[i] ) {			
					$i('bp_stat'+i+'_slot').innerHTML = 'Choose Stat Below';
					Removeclass( $i('bp_stat'+i+'_slot').parentNode, 'filled');
					Removeclass( $i('stat_'+bracketPredictor.selectedStatsTemp[i]) , 'disabled' );	
				}
			}
			
			bracketPredictor.selectedStatsTemp = [];
			
		}
	},
	
	reset : function(f) {
		
		if (f || !$i('btn_clear_entry').className.match('dim')) {
			
			if (this.selectedTeam[1]) {
				Removeclass( this.selectedTeam[1]['item'], 'disabled' );
				if( this.selectedTeam[1]['item'] ) {
					//this.selectedTeam[1]['item'].getElementsByTagName('a')[0].innerHTML = 
						//this.selectedTeam[1]['item'].getElementsByTagName('a')[0].innerHTML.replace(' (Team 1)','');
				}
			}
			if (this.selectedTeam[2]) {
				Removeclass( this.selectedTeam[2]['item'], 'disabled' );
				if( this.selectedTeam[2]['item'] ) {
					//this.selectedTeam[2]['item'].getElementsByTagName('a')[0].innerHTML = 
						//this.selectedTeam[2]['item'].getElementsByTagName('a')[0].innerHTML.replace(' (Team 2)','');
				}
			}
			
			
			this.selectedTeam = {'1':{}, '2':{}};
			if (bracketPredictor.selectedStatsTemp) { this.cancelStats(true); }
			this.selectedTeam
			this.selectedStats =  [];
			this.selectedStatsTemp = [];
			
			Removeclass( $i('btn_select_stats') , 'num' );
			Addclass( $i('btn_select_stats') , 'active' );
			//Removeclass( $i('btn_select_stats') , 'active' );
			$i('btn_team_1').style.backgroundImage = '';
			$i('btn_team_2').style.backgroundImage = '';
			$i('bp_team1_name').innerHTML = 'None Selected';
			$i('bp_team2_name').innerHTML = 'None Selected';
			//Removeclass( $i('btn_team_2') , 'active' );
			
			$i('loading_container').innerHTML = '';
			
			Addclass( $i('btn_clear_entry') , 'dim' );
			Addclass( $i('btn_generate_prediction') , 'dim' );
			
			Removeclass( $i('step_1') , 'show_factors' );
			Removeclass( $i('col_cover_team1') , 'col_cover_done' );
			Removeclass( $i('col_cover_team2') , 'col_cover_done' );
			Removeclass( $i('col_cover_stats') , 'col_cover_done' );
			
			Removeclass( $i('step_2') , 'loaded' );
			Removeclass( $i('step_3') , 'loaded' );
			Addclass( $i('step_2') , 'unload' );
			Addclass( $i('step_3') , 'unload' );
			
			$i('step_2_message').innerHTML = $i('step_3_message').innerHTML = this.staticMsg;
			$i('stats_cover_msg').innerHTML = 'Please choose stats and teams above.';
			
		}
		
	}	
	
	

}



// --- Ajax --- //
function Ajax() {}
Ajax.prototype = {
	
	GetXmlHttp : function () {
		{var ajax=null;try{ajax=new XMLHttpRequest();}
		catch(e){ajax=null;}
		try{if(!ajax)ajax=new ActiveXObject("Msxml2.XMLHTTP");}
		catch(e){ajax=null;}
		try{if(!ajax)ajax=new ActiveXObject("Microsoft.XMLHTTP");}
		catch(e){ajax=null;}
		return ajax;}
	},
	
	fire : function (uri, callback, parameters) {
		this.callback = callback;
		this.transport = this.GetXmlHttp();
		this.osc(this);
		this.transport.open("POST",uri,true);
		this.transport.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.transport.send(parameters);
	},
	
	osc : function (ajaxObj) {
		ajaxObj.transport.onreadystatechange = function() {
			try {
				switch(ajaxObj.transport.readyState) {
					case(4): ajaxObj.callback(ajaxObj.transport.responseText );
				}
			}
			catch( e ) { //server error
			}
		}	
	},
	
	abort : function() {
		if (this.transport && this.transport.readyState != 0) { //abort current run and overwrite
			this.transport.onreadystatechange = function(){};
			this.transport.abort();
		}
	}
}


function bb_BestStats() {
	if (pops['help_with_stats']) { pops['help_with_stats'].kill(); }
	pops['help_with_stats'] = new tr_pop( {
						type:'confirm', content:$i('how_to_choose_stats').innerHTML,
						confirmText:'Close',
						width: 500,
						forceTop: 100,
						hideCancelBtn: true,
						showClose:false
					} );
	return false;
}

function bb_help_1() {
	if (pops['bb_help_1']) { pops['bb_help_1'].kill(); }
	pops['bb_help_1'] = new tr_pop( {
						type:'confirm', content:$i('help_1').innerHTML,
						confirmText:'Close',
						width: 500,
						forceTop: 100,
						hideCancelBtn: true,
						showClose:false
					} );
	
	return false;
}
function bb_help_2() {
	if (pops['bb_help_2']) { pops['bb_help_2'].kill(); }
	pops['bb_help_2'] = new tr_pop( {
						type:'confirm', content:$i('help_2').innerHTML,
						confirmText:'Close',
						width: 700,
						forceTop: 100,
						hideCancelBtn: true,
						showClose:false
					} );
	
	return false;
}
function bb_help_3() {
	if (pops['bb_help_3']) { pops['bb_help_3'].kill(); }
	pops['bb_help_3'] = new tr_pop( {
						type:'confirm', content:$i('help_3').innerHTML,
						confirmText:'Close',
						width: 500,
						forceTop: 100,
						hideCancelBtn: true,
						showClose:false
					} );
	
	return false;
}




function $i(id) { return document.getElementById(id); }

function Addclass(obj, c) {
	if (obj != null && !obj.className.match(c)) {
		obj.className += ' ' + c;
	}
}
function Removeclass(obj, c) {
	if (obj != null) {
		obj.className = obj.className.replace(c, '');
	}
}


function ieTableInnerHTML(target, rowHTML) {

/* Remove all existing rows */
while (target.rows.length > 0) {
target.deleteRow(0);
}

/* Create temporary table */
var tempDiv = document.createElement("div");
document.body.appendChild(tempDiv);
tempDiv.innerHTML = '<table id="tempTable" style="display: none">' + rowHTML + '</table>';
var tt = $i("tempTable");

/* Copy temporary table's rows to target */
for (var i = 0; i < tt.rows.length; i++) {
target.appendChild(tt.rows[i].cloneNode(true));
}

/* Remove temporary table */
tt.parentNode.removeChild(tt);
}
function clone(s) {

for(var p in s)

this[p] = (typeof(s[p]) == 'object')? new clone(s[p]) : s[p];

}
