// -- Globals -- //
var bracket;
var bracketPicker;
var bracketDelegate;
show_alert_error = 1;

// -- Current Bracket Delegate -- //


function bracketDelegate(bracketId, o, postVars) {
	this.bracketId = bracketId;
	this.name = '';
	this._init();
	this.o = o;
	this.postVars = postVars;
}
bracketDelegate.prototype = {
	
	_init : function() {
		bracket = new bracketBrainsBracket($i('bb_bracketWrapper'), {autoBuild:false} );
		
		if (this.bracketId) {
			//Load Bracket
			bracketPicker = new bracketPicker( bracket, this.bracketId );		
		} else if (allow_create_new) {
			
			if (pops['name']) { pops['name'].kill(); }
				pops['name'] = new tr_pop( {
									type:'prompt', question:'Name your bracket:',
									hideCancelBtn: true,
									showClose: false,
									onConfirm: function(popup) {
										bracketDelegate.newBracket( popup.e.field.value );
									}
								} );
			
		} else {
			showSubscribe('create and compare multiple brackets.');	
		}
	},
	
	newBracket : function(name) {
		this.name = name;
		bracketPicker = new bracketPicker( bracket, this.bracketId );
		// Put a loading spinner???
	},
	
	setName : function(newName) {
		bracketDelegate.name = newName;
		$i('bb_bracketName').innerHTML = bracketDelegate.name;	
	}
	
}
			

// -- Bracket Builder Class -- //

function bracketBrainsBracket(wrapper, o) {
	this.wrapper = wrapper;
	
	//defaults
	this.o = {
		autoBuild		:	true,							// If markup for bracket needs to be created
		//sides			:	{left:[1,2] , right:[3,4] },	// Regions to show on each side.  Inside the set the order displays top to bottom, only one side is required
		sides			:	{left:[1] , right:[3] },	// Regions to show on each side.  Inside the set the order displays top to bottom, only one side is required
		bracketClass	:	'bb_bracket',					// class to assign to UL elements
		classNamespace	:	'bb_',							// prefix to add to classes assigned to elements
		
		bracketItemMenu	:	$i('bb_bracketItemMenu'),		// premade menu to move next to team name when clicked
		
		rounds			:	[1,2,3,4,5,6,7]	,				// round ids (in order lowest to highest)
		roundNames		:	['Round 1', 'Round 2', 'Sweet 16', 'Elite 8', 'Final 4'] //same order as rounds
	}
	
	//overwrite defaults
	for(var i in o) {
		this.o[i] = o[i];		
	}
	
	this._init();
}
bracketBrainsBracket.prototype = {
	
	_init : function() {		
		if (this.o.autoBuild) {
			this._build();
		}
	},
	
	_build : function() {
		
		if (bracketDelegate.o.defaultData) {
			this.setSelectedData( bracketDelegate.o.defaultData );
		}
		
		var s, r, g, ri, di, roundId;
		var ul, li, final, winner, finalUL;
		var sides = {'left':true , 'right':true};
		
		// Setup Global Objects
		
		// Setup Game Counters and Game Containers
		this.sideUL = [];
		this.gameCounter = [];
		this.gameByRound = [];
		this.roundMarkers = [];
		for( s in this.o.sides) {
			this.roundMarkers[s] = [];
		}
		for( ri in this.o.rounds) {
			this.gameCounter[ri*1+1] = 0;
			this.gameByRound[ri*1+1] = [];
		}
		
		// Loop : Sides -> Regions -> Rounds -> Games
		for ( s in sides ) { //LOOP Sides
			if (this.o.sides[s]) { //Is side being shown?	
						
				for (ri in this.o.sides[s]) { // LOOP Regions
				
					if (ri * 1 >= 0) { //IE json comes back with IndexOf
						r = this.o.sides[s][ri];
						
						//create UL
						this.sideUL[s] = createNodeN('UL', {region:r, 'class':this.o.bracketClass + ' ' + this.o.classNamespace + s + 'Side'});
						li = this._buildGame( this.o.rounds.length - 3, true, s ); //recursive to build out rounds and games, skipping last round which is handled differently
						this.sideUL[s].appendChild( li );
						this.wrapper.appendChild( this.sideUL[s] );	
					}
					
				}
			}			
		}
		
		// Last Round - Championship game
		ul = createNodeN('UL', {'id':this.o.classNamespace + 'bracketChampionship', 'class':this.o.classNamespace + 'bracketChampionship'});
		winner = this._buildGame( this.o.rounds.length - 1 );
		ul.appendChild( winner );
		
		finalUl = createNodeN('UL');
		final = this._buildGame( this.o.rounds.length - 2 );
		finalUl.appendChild( final );
		winner.appendChild( finalUl );
		
		this.wrapper.appendChild( ul );	
		
		this.updateSummaryBoxes();
		
	},
	
	_buildGame : function(ri, recursive, s) {
		var s = s ? s : false;
		var li, bracketLines;
		var self = this;
		
		var roundId = this.o.rounds[ri];
		var previousRoundId = this.o.rounds[ri-1];
		var gameId  = this.gameCounter[roundId];
		this.gameCounter[roundId]++; //got our id, so up the counter so other processes don't reuse ours
		
		if (roundId) { //Round exists, if not, we've gone to far deep and bracket should end
			
			var game = this.gameByRound[roundId][gameId] = {id:gameId}; 	//create game object
			
			//game data
			var topTeamName = '';
			var bottomTeamName = '';
			var topTeamId = 0;
			var bottomTeamId = 0;
			var playIn = false;
			
			if (previousRoundId) { //determine team names to show here based on previous rounds picks
				if ( this.picker.picks[ previousRoundId ] ) {
					topTeamId = this.picker.picks[ previousRoundId ][ gameId * 2 ] ? this.picker.picks[ previousRoundId ][ gameId * 2 ].pick : 0;
					bottomTeamId = this.picker.picks[ previousRoundId ][ gameId * 2 + 1 ] ? this.picker.picks[ previousRoundId ][ gameId * 2 + 1 ].pick : 0;
				}
			} else if (this.picker.picks[ roundId ][ gameId ] ) { //this should mean we are on the first round and therefore the teamA and teamB variables should be available
				topTeamId = this.picker.picks[ roundId ][ gameId ].teamA;
				
				if (this.picker.picks[ roundId ][ gameId ].playIn) {
					playIn = true;
					if (this.picker.picks[ 0 ] && this.picker.picks[ 0 ][ 0 ].pick) {
						bottomTeamId = this.picker.picks[ 0 ][ 0 ].pick;
					} else {
						this.picker.teams[ 'playIn' ] = {teamName:'Play In Winner',id:'playIn'};
						bottomTeamId = 'playIn';
					}
				} else {
					bottomTeamId = this.picker.picks[ roundId ][ gameId ].teamB;						
				}
			}
			
			if (topTeamId) {
				this.picker.teams[ topTeamId ].side = s;
				topTeamName = this.teamNameWithData(topTeamId);
			}
			if (bottomTeamId) {
				this.picker.teams[ bottomTeamId ].side = s;
				bottomTeamName = this.teamNameWithData(bottomTeamId);
			}
			
			//
			var winnerTop='';
			var winnerBtm='';
			try { winnerTop = this.picker.teams[ this.picker.picks[ playIn?0:previousRoundId ][ playIn?0:gameId * 2 ].winner ].teamName; } catch(e) {}
			try { winnerBtm = this.picker.teams[ this.picker.picks[ playIn?0:previousRoundId ][ playIn?0:gameId * 2 + 1].winner ].teamName; } catch(e) {}
			//
			
			// create game's elements
			//extra clases on LI are for fixing IE issues
			game.li = 			createNode('LI', {'class':this.o.classNamespace+'round'+roundId + ' '+this.o.classNamespace+'round'+roundId+'_'+(gameId%2==0?'even':'odd') + ' '+this.o.classNamespace+(gameId%2==0?'even':'odd'), gameId:gameId, roundId:roundId, roundDepth:ri, side:s}); 	//wrapper
			game.bracketLines = createNodeN('DIV', {'class':this.o.classNamespace+'round'+roundId+'_div'});
			game.topGame = 		createNodeN('A', {'class':this.o.classNamespace+'top '+this.pickClass(previousRoundId, gameId*2, topTeamId), 		topOrBottom:'topGame',		teamId: topTeamId,	'innerHTML':topTeamName, 'winner':winnerTop});
			game.bottomGame = 	createNodeN('A', {'class':this.o.classNamespace+'bottom '+this.pickClass(playIn?0:previousRoundId, playIn?0:gameId*2+1, bottomTeamId), 	topOrBottom:'bottomGame',	teamId: bottomTeamId,	'innerHTML':bottomTeamName, 'winner':winnerBtm});
			game.previousRoundId =	previousRoundId;
			game.topGameId = 	gameId * 2;
			game.bottomGameId = gameId * 2 + 1;
			
			//For testing
			//game.topGame = 		createNodeN('A', {'class':this.o.classNamespace+'top', 		topOrBottom:'topGame',		teamId: topTeamId,	'innerHTML':roundId + ' | ' + gameId + ' | ' + s + ' | ' + topTeamId + ' | ' + topTeamName});
			//game.bottomGame = 	createNodeN('A', {'class':this.o.classNamespace+'bottom', 	topOrBottom:'bottomGame',	teamId: bottomTeamId,	'innerHTML':roundId + ' | ' + gameId + ' | ' + s + ' | ' + bottomTeamId + ' | ' + bottomTeamName});
			
			// team name events
			if (this.o.onclickEvent) {
				game.topGame.onclick = game.bottomGame.onclick = function(e) { self.o.onclickEvent(this, self); };
			}
			if (this.o.onmouseEvent) {
				game.topGame.onmouseover = game.bottomGame.onmouseover = function(e) { 
				if (!e) var e = window.event;
				e.cancelBubble = true;
				if (e.stopPropagation) e.stopPropagation();
			
				self.o.onmouseEvent(this, self); 
				};
			}
			
			// round label
			if (s && !this.roundMarkers[s][ri] && this.o.roundNames[ri]) {
				this.roundMarkers[s][ri] = 	createNodeN('small', {'class':this.o.classNamespace+'roundLabel', 	'innerHTML':this.o.roundNames[ri]});
				game.li.appendChild( this.roundMarkers[s][ri] );
			}
			
			// add elements to LI
			game.li.appendChild( game.bracketLines );
			game.li.appendChild( game.topGame );
			game.li.appendChild( game.bottomGame );
			
			if (recursive && this.o.rounds[ri*1-1]) {
				game.subUL = createNodeN('UL');
				game.li.appendChild( game.subUL );
				
				game.subUL.appendChild( this._buildGame(ri*1-1, true, s) );
				game.subUL.appendChild( this._buildGame(ri*1-1, true, s) );
			}
			return game.li;
		}		
	},
	
	_fill : function() {
	
	},
	
	setPicker : function(picker) {
		this.picker = picker;
	},
	
	nextRound : function(roundId) {
		var readyToBreak = false;
		var i;
		if (roundId == 0) { //play in game
			return this.o.rounds[0];
		}
		for(i in this.o.rounds) {
			if (readyToBreak) { break; }
			if (this.o.rounds[i] == roundId) {
				readyToBreak = true;
			}
		}
		return (typeof this.o.rounds[i] == 'number') ? this.o.rounds[i] : false;
	},
	
	prevRound : function(roundId) {
		var readyToBreak = false;
		var i;
		for(i=this.o.rounds.length-1; i>=0; i--) {
			if (readyToBreak) { break; }
			if (this.o.rounds[i] == roundId) {
				readyToBreak = true;
			}
		}
		return this.o.rounds[i];
	},
	
	nextSpot : function(roundId, gameId) {		
		var nextRoundId = this.nextRound(roundId);
		if (nextRoundId) {
			var gameSplit = gameId / 2;
			var nextGameId = Math.floor(gameSplit);
			var topOrBottom = ( gameSplit - nextGameId == 0 && roundId != 0) ? 'topGame' : 'bottomGame';		
			var nextSpot = this.gameByRound[nextRoundId][nextGameId][topOrBottom];
			return {roundId:nextRoundId, gameId:nextGameId, topOrBottom:topOrBottom, spot:nextSpot};
		}
	},
	
	prevPick : function(spot) {		
		var nextRoundId = this.prevRound(spot.roundId);
		if (nextRoundId) {
			var nextGameId = spot.gameId * 2 + ( spot.topOrBottom == 'bottomGame' ? 1 : 0 );	
			return {roundId:nextRoundId, gameId:nextGameId};
		}
	},
	
	teamNameWithData : function(teamId) {
		var name = '';
		if (teamId && this.picker.teams[ teamId ]) {	
			name = this.picker.teams[ teamId ].teamName;
			if ( bracketDelegate.selectedData && this.picker.teams[ teamId ][bracketDelegate.selectedData] ) {
				if (this.picker.teams[ teamId ].side == 'right') {
					name = name + ' ' +  '<small class="bb_data">'+this.picker.teams[ teamId ][bracketDelegate.selectedData]+'</small>';	
				} else {
					name = '<small class="bb_data">'+this.picker.teams[ teamId ][bracketDelegate.selectedData]+'</small>' + ' ' + name;						
				}
			}
		}	
		return name;
	},
	
	showData: function(t) {
		if (t == 'teamSeed' || allow_seed_toggle) {
			this.setSelectedData(t);
			for(var r in this.gameByRound) {
				for(var g in this.gameByRound[r]) {
					
					if ( this.gameByRound[r][g].topGame ) {
						this.gameByRound[r][g].topGame.innerHTML = this.teamNameWithData( this.gameByRound[r][g].topGame.getAttribute('teamId') );
						
						this.gameByRound[r][g].bottomGame.innerHTML = this.teamNameWithData( this.gameByRound[r][g].bottomGame.getAttribute('teamId') );						
					}
					
				}
			}		
		} else {
			showSubscribe('to view brackets by RPI and power ratings.', 1);	
		}
	},
	
	setSelectedData : function(t) {
		if ($i('bb_data_'+bracketDelegate.selectedData)) {
			$i('bb_data_'+bracketDelegate.selectedData).style.fontWeight = 'normal';			
		}
		
		bracketDelegate.selectedData = t;
		
		if ($i('bb_data_'+t)) {
			$i('bb_data_'+t).style.fontWeight = 'bold';	
		}
	},
	
	pickClass : function(roundId, gameId, teamId) {
		//if (roundId > 0) {
			var right = this.pickStatus(roundId, gameId, teamId);
			if (right == 1) { return 'bb_status_right'; } else
			if (right == -1) { return 'bb_status_wrong'; } else
			{ return 'bb_status_normal'+right; }
		//}
	},
	
	pickStatus : function(roundId, gameId, teamId) {		
		if (!teamId || teamId == 'undefined') { return -10; } // if no pick set - nothing
		
		/*
		if (!this.picker.picks[ roundId ] || !this.picker.picks[ roundId ][ gameId ] || !this.picker.picks[ roundId ][ gameId ].winner) { // if pick is note set
			return this.picker.teams[ teamId ].isAlive ? -11 : -1; // if it's alive do nothing, if not, it's wrong
		} else if (this.picker.picks[ roundId ][ gameId ].winner == teamId) { // picked winner
			return 1; //only show winning pick above round 1
		} else {
			return -1;	// pick is wrong
		}	
		*/
		
		if (!this.picker.picks[ roundId ] || !this.picker.picks[ roundId ][ gameId ] || !this.picker.picks[ roundId ][ gameId ].winner) { // if pick is note set
			return 0; // if it's alive do nothing, if not, it's wrong
		} else if (this.picker.picks[ roundId ][ gameId ].winner == teamId) { // picked winner
			return 1; //only show winning pick above round 1
		} else {
			return -1;	// pick is wrong
		}
		
	},
	
	updateSummaryBoxes : function() {
		var right = 0;
		var wrong = 0;
		var picked = 0;
		var checked = 0;
		var total = 64;
		var status, r, g, i;
		var parts = ['topGame','bottomGame'];
		
		for(r in this.gameByRound) {			
			for(g in this.gameByRound[r]) {				
				
				for(i in parts) {
					
					try {
						status = this.pickStatus(this.gameByRound[r][g].previousRoundId,
												this.gameByRound[r][g][parts[i]+'Id'],
												this.gameByRound[r][g][parts[i]].getAttribute('teamId')*1);
						
						if (status == 1) {
							right++;
							picked++;
						} else if (status == -1) {
							wrong++;
							picked++;
						} else if (status != -10) {
							picked++;	
						}
						checked++;
					} catch (e) { }
				}
				
			}
		}
		
		// Play in game
		try {
			status = this.pickStatus(0,0,this.gameByRound[1][0].bottomGame.getAttribute('teamId')*1);
			
			if (status == 1) {
				right++;
				picked++;
			} else if (status == -1) {
				wrong++;
				picked++;
			} else if (status != -10) {
				picked++;	
			}
			checked++;
		} catch (e) { alert(e) }
		
		$i('bb_num_right').innerHTML = right;
		$i('bb_num_wrong').innerHTML = wrong;
	}
	
	
	
}



// -- View My Bracket Functionality -- //

function bracketPicker( bracket, currentBracketId ) {
	this.bracket = bracket;
	this.bracket.setPicker(this);
	this.bracket.o.onmouseEvent = this.menuOpen;
	this.bracket.o.onclickEvent = this.menuPick;
	
	this.currentBracketId = currentBracketId;
	
	this.savingPicks = {};
	
	this._init();
}
bracketPicker.prototype = {
	
	_init : function() {
	
		// Load Bracket
		this.A = new Ajax();
		this.A.fire('/ajax/bracket-brains/load_bracket.php', this.loadCallback, 'bracketId='+this.currentBracketId+'&name='+bracketDelegate.name + createPostVarStr(bracketDelegate.postVars));		
		
		document.onclick = this.menuClose;
		
	},
	
	loadCallback : function(r) {
	try {
		if (r) {
			var data = JSON.parse(r);
			
			if (data.status) {
				
				
				bracketPicker.teams = data.teams;
				bracketPicker.picks = data.picks;
				
				bracketDelegate.bracketId = data.bracketId;
				bracketDelegate.setName( data.name );
				
				this.currentBracketId = bracketDelegate.bracketId;
				
				// add bracket to dropdown if not already in it
				var inDrop = false;
				for(var i in $i('bb_bracket').options) {
					if 	($i('bb_bracket').options[i] && $i('bb_bracket').options[i].value == bracketDelegate.bracketId) {
						inDrop = true;
						break;
					}
				}
				
				if (!inDrop) {
					var newOpt = document.createElement('option');
					newOpt.text = bracketDelegate.name;
					newOpt.value = bracketDelegate.bracketId;
					if (document.body.className.match('ie')) {
						$i('bb_bracket').add(newOpt, 0);
					} else {
						$i('bb_bracket').add(newOpt, $i('bb_bracket').options[0]);						
					}
					$i('bb_bracket').value = newOpt.value;
				}
				
				bracketPicker.bracket._build();
				
			} else {
				//error loading bracket
			}			
		}
	} catch(e) { alerterror(e, "error loading bracket"); }
	},
	
	
	// -- Actions -- //
	
	clearPick : function(pick, ignoreInvalidPrompt) {
		
		// Confirm that user is okay with invalidating games
		if ( !ignoreInvalidPrompt && this.invalidateGame( pick , false, true ) ) {
			/*
			if (pops['invalid']) { pops['invalid'].kill(); }
			pops['invalid'] = new tr_pop( {
								type:'confirm', question:'Because you have already chosen future round winners, changing this selection will force you to re-pick at least one later round game.',
								confirmText: 'Undo pick',
								onConfirm: function(popup) {
									bracketPicker.clearPick(popup.o.pick, true);
								},						
								pick:pick
							} );
			*/
			return false;
			
		}
		
		var undoPick = this.bracket.prevPick( pick );		
		var invalid = this.invalidateGame( pick, true );
		pick.spot.className = pick.spot.className.replace(/bb_status_([0-9a-z\-])/,'');
		var A = new Ajax();
		A.fire('/ajax/bracket-brains/save_pick.php', null, 'bracketId='+bracketDelegate.bracketId+'&roundId='+undoPick.roundId+'&gameId='+undoPick.gameId+'&invalidate='+invalid + createPostVarStr(bracketDelegate.postVars));
		bracketPicker.bracket.updateSummaryBoxes();
	},
	
	invalidateGame : function(next, clearFirst, checkOnly) {
		var invalid = 0;
		if (next.spot.getAttribute('teamId') && next.spot.getAttribute('teamId')*1 != 0) {
			if (clearFirst) {
				next.spot.setAttribute('teamId', 0);
				next.spot.innerHTML = '';
			} else if (next && next.spot.getAttribute('teamId') && next.spot.getAttribute('teamId')*1 != 0 && next.spot.getAttribute('teamId') != 'undefined') {
				//invalid = 1;
				//alert(next.spot.getAttribute('teamId'));
			}
			
			//Pick already set here, so we need to trace up invalidating any games until we hit end or a blank
			var upOne = this.bracket.nextSpot(next.roundId, next.gameId);
			while(upOne && upOne.spot.getAttribute('teamId') && upOne.spot.getAttribute('teamId')*1 != 0 && upOne.spot.getAttribute('teamId') != 'undefined') {
				
				if (!checkOnly) {
					upOne.spot.setAttribute('teamId', 0);
					upOne.spot.innerHTML = ''; 
					upOne.spot.className = upOne.spot.className.replace(/bb_status_([0-9a-z\-])/,'');
					invalid = 1;
				} else { 
					return true;
				}
				
				upOne = this.bracket.nextSpot(upOne.roundId, upOne.gameId);
			}
		}
		return invalid;
	},
	
	pick : function(roundId, gameId, teamId, noInvalidation, ignoreInvalidPrompt) {
		var next = this.bracket.nextSpot(roundId, gameId);

		if (next.spot.getAttribute('teamId')*1 != teamId) { //otherwise already picked
			
			// Confirm that user is okay with invalidating games
			if ( !ignoreInvalidPrompt && this.invalidateGame( next , false, true ) ) {
				/*
				if (pops['invalid']) { pops['invalid'].kill(); }
				pops['invalid'] = new tr_pop( {
									type:'confirm', question:'Because you have already chosen future round winners, changing this selection will force you to re-pick at least one later round game.',
									confirmText: 'Make pick',
									onConfirm: function(popup) {
										bracketPicker.pick(popup.o.roundId, popup.o.gameId, popup.o.teamId, popup.o.noInvalidation, true);
									},						
									roundId:roundId,
									gameId:gameId,
									teamId:teamId,
									noInvalidation:noInvalidation
								} );
				return false;
				*/
			}
			
			// Determine invalidated Games
			var invalid = noInvalidation ? false : this.invalidateGame( next );			
			
			if (teamId >= 0) {
				// Show as pending on bracket
				next.spot.innerHTML = 'Saving...';
			} else {
				next.spot.innerHTML = '';
				next.spot.setAttribute('teamId', 0);
			}	
			
			// Send Server Request		
			var identifier = Math.random();
			this.savingPicks[identifier] = {nextSpot:next.spot, teamId:teamId};	
			
			var A = new Ajax();
			A.fire('/ajax/bracket-brains/save_pick.php', this.pickCallback, 'bracketId='+bracketDelegate.bracketId+'&roundId='+roundId+'&gameId='+gameId+'&teamId='+teamId+'&invalidate='+invalid+'&identifier='+identifier + createPostVarStr(bracketDelegate.postVars));
			
		}	
	},
	
	pickCallback : function(r) {
	try {
		if (r) {
			var data = JSON.parse(r);
			
			if (data.status) {
				
				var pick = bracketPicker.savingPicks[data.identifier];
				if (pick.teamId) {
					var nextSpot = pick.nextSpot;
					nextSpot.innerHTML = bracketPicker.bracket.teamNameWithData(data.teamId);
					nextSpot.setAttribute('teamId', data.teamId);
					nextSpot.className = nextSpot.className.replace(/bb_status_([0-9a-z\-])/,'');
					Addclass( nextSpot , bracketPicker.bracket.pickClass( data.roundId , data.gameId , data.teamId ) );
					
					// create place in array if it doesn't exist
					if (!bracketPicker.picks[data.roundId]) { bracketPicker.picks[data.roundId] = {}; }
					if (!bracketPicker.picks[data.roundId][data.gameId]) { bracketPicker.picks[data.roundId][data.gameId] = {}; }
					
					// set pick
					bracketPicker.picks[data.roundId][data.gameId].pick = data.teamId; 
					
					bracketPicker.savingPicks[data.identifier] = null; //delete
					
					bracketPicker.bracket.updateSummaryBoxes();
				}
			} else {
				//error saving pick
			}			
		}
	} catch(e) { alert('pickCallback Error: ' + e); }
	},
	
	
	// -- Menu -- //
	
	menuOpen : function(clickedElement, bracket) {
		var teamId = clickedElement.getAttribute('teamId') == 'playIn' ? 'playIn' : clickedElement.getAttribute('teamId') * 1;
		
		// hide after X seconds
		clearTimeout(bracketPicker.hideMenuTO);
		//bracketPicker.hideMenuTO = setTimeout(function(){bracketPicker.menuClose()}, 10000);
		
		if (teamId != 0 && bracketPicker.teams[ teamId ]) {
				
			// unselect current selection
			if (bracket.bracketItemSelected) {
				Removeclass(bracketPicker.bracketItemSelected, bracket.o.classNamespace + 'itemSelected');	
			}
			
			// show/move menu
			bracket.o.bracketItemMenu.style.display = 'block';
			clickedElement.parentNode.appendChild( bracket.o.bracketItemMenu );
			bracket.o.bracketItemMenu.className = (teamId != 'playIn' ? 'bb_10 ' : '') + clickedElement.className; //assigns the menu top or bottom alignment based on clicked items position
			
			// ie shifting fix
			if (bracketPicker.menuOpenFixElement) {
				Removeclass( bracketPicker.menuOpenFixElement , 'bb_menuOpenFix' );	
			}
			Addclass( clickedElement.parentNode.nextSibling , 'bb_menuOpenFix' );
			bracketPicker.menuOpenFixElement = clickedElement.parentNode.nextSibling;
			
			// Set other sides z-index to low
			Removeclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_highSide' );
			Removeclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_lowSide' );
			Removeclass( $i('bb_bracketInfo'), 'bb_lowSide' );
			Removeclass( bracket.sideUL[ 'right' ] , 'bb_lowSide' );	
			Removeclass( bracket.sideUL[ 'left' ] , 'bb_lowSide' );	
			
			if ( clickedElement.parentNode.getAttribute('side') ) {
				Addclass( bracket.sideUL[ clickedElement.parentNode.getAttribute('side') == 'right' ? 'left' : 'right' ] , 'bb_lowSide' );
				Addclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_lowSide' );
				Addclass( $i('bb_bracketInfo'), 'bb_lowSide' );	
			} else {
				Addclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_highSide' );
				Addclass( bracket.sideUL[ 'left' ] , 'bb_lowSide' );
				Addclass( bracket.sideUL[ 'right' ] , 'bb_lowSide' );
			}
			
			// update menu text to reflect current selection
			//$i('bb_bracketItemMenuTeamName').innerHTML = bracketPicker.teams[ teamId ].teamName;
					
			// select new item
			Addclass(clickedElement, bracket.o.classNamespace + 'itemSelected');
			bracketPicker.bracketItemSelected = clickedElement;
			var pick = bracketPicker.menuSelectedPick();
			if (!pick) return;
			
			// 2010 - hide menu if game does not have opponent
			if (!bracketPicker.teams[ bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId].topGame.getAttribute('teamId') ] ||
				!bracketPicker.teams[ bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId].bottomGame.getAttribute('teamId') ])
					bracket.o.bracketItemMenu.style.display = 'none';
					
			// 2010 - hide menu if game opponent is 'playin'
			if (teamId != 'playIn' && bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId].bottomGame.getAttribute('teamId') == 'playIn')
					bracket.o.bracketItemMenu.style.display = 'none';
		

			
			//$i('bb_bracketItemMenuSwitch').style.display = 'none';
			
			if (teamId != 'playIn') {
				
				
				// show hide elements based on selection
				//$i('bb_bracketItemMenuAdvance').style.display = clickedElement.parentNode.getAttribute('roundDepth')*1==bracket.o.rounds.length - 1 ? 'none' : 'block';
				$i('bb_bracketItemMenuAnalyze').style.display = 'block';
				
				if (bracketPicker.picks[ pick.roundId ] && bracketPicker.picks[ pick.roundId ][ pick.gameId ] && bracketPicker.picks[ pick.roundId ][ pick.gameId ].playIn && pick.topOrBottom == 'bottomGame') {
					//$i('bb_bracketItemMenuUndo').style.display = 'none';
					$i('bb_bracketItemMenuTeamNameSwitchPlayInName').innerHTML 	= bracketPicker.teams[ bracketPicker.picks[0][0].pick == bracketPicker.picks[0][0].teamA ? bracketPicker.picks[0][0].teamB : bracketPicker.picks[0][0].teamA  ].teamName;
					$i('bb_bracketItemMenuSwitchPlayIn').style.display = 'block';
					bracket.o.bracketItemMenu.className = clickedElement.className;
				} else {		
					if ( clickedElement.parentNode.getAttribute('roundDepth')*1!=0 ) {
						var prev = bracketPicker.bracket.prevPick( pick );
						var teamA = bracketPicker.bracket.gameByRound[prev.roundId][prev.gameId].topGame.getAttribute('teamId')*1;
						var teamB = bracketPicker.bracket.gameByRound[prev.roundId][prev.gameId].bottomGame.getAttribute('teamId')*1;
						if (teamA && teamB) {
							//$i('bb_bracketItemMenuSwitch').style.display = 'block';
							//$i('bb_bracketItemMenuTeamNameSwitch').innerHTML = bracketPicker.teams[ teamId == teamA ? teamB : teamA ].teamName;
						} else {
							//$i('bb_bracketItemMenuSwitch').style.display = 'none';
						}
						//$i('bb_bracketItemMenuUndo').style.display = 'block';
					} else {
						//$i('bb_bracketItemMenuUndo').style.display = 'none';
						//$i('bb_bracketItemMenuSwitch').style.display = 'none';							
					}
					$i('bb_bracketItemMenuSwitchPlayIn').style.display = 'none';				
								
				}
				
				// Whether or not to show advance option - more complicated
				var opponent = bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId][ pick.topOrBottom == 'topGame' ? 'bottomGame' : 'topGame' ].getAttribute('teamId') * 1;
				var nextDisplay = ( clickedElement.parentNode.getAttribute('roundDepth')*1==bracket.o.rounds.length - 1 || !opponent || opponent == 0 ) ? ' none' : 'block';
				if ( clickedElement.parentNode.getAttribute('roundDepth')*1==bracket.o.rounds.length - 1 || !opponent || opponent == 0 ) {
					//$i('bb_bracketItemMenuAnalyze').style.display = 'none';
				} else {
					//$i('bb_bracketItemMenuAnalyze').style.display = 'block';
				}
				
				//update analyze text
				if ($i('bb_bracketItemMenuAnalyze').style.display == 'block') {
					//i('bb_bracketItemMenuAanalyzeTeamClicked').innerHTML = ' for ' + bracketPicker.teams[ teamId ].teamName;
					//$i('bb_bracketItemMenuAanalyzeTeamA').innerHTML = bracketPicker.teams[ bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId].topGame.getAttribute('teamId') ].teamName+' ';
					//$i('bb_bracketItemMenuAanalyzeTeamB').innerHTML = bracketPicker.teams[ bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId].bottomGame.getAttribute('teamId') ].teamName+' ';
				}
				
				// Hide Play In Options
				//$i('bb_bracketItemMenuCaption').style.display = 'none';
				$i('bb_bracketItemMenuAdvancePlayInA').style.display = $i('bb_bracketItemMenuAdvancePlayInB').style.display = 'none';
				
			} else {
				
				$i('bb_bracketItemMenuTeamNamePlayInA').innerHTML 			= bracketPicker.teams[ bracketPicker.picks[0][0].teamA ].teamName;
				$i('bb_bracketItemMenuTeamNamePlayInB').innerHTML 			= bracketPicker.teams[ bracketPicker.picks[0][0].teamB ].teamName;				
				
				/*$i('bb_bracketItemMenuCaption').style.display = 'block';
				$i('bb_bracketItemMenuCaption').innerHTML = 'PLAY IN GAME';
				$i('bb_bracketItemMenuAdvance').style.display = 'none';
				$i('bb_bracketItemMenuAnalyze').style.display = 'block';
				$i('bb_bracketItemMenuAanalyzeTeamClicked').innerHTML = '';
				//$i('bb_bracketItemMenuAanalyzeTeamA').innerHTML = bracketPicker.teams[ bracketPicker.picks[0][0].teamA ].teamName + ' ';
				//$i('bb_bracketItemMenuAanalyzeTeamB').innerHTML = bracketPicker.teams[ bracketPicker.picks[0][0].teamB ].teamName + ' ';
				$i('bb_bracketItemMenuUndo').style.display = 'none';*/
				$i('bb_bracketItemMenuAdvancePlayInA').style.display = $i('bb_bracketItemMenuAdvancePlayInB').style.display = 'block';
				$i('bb_bracketItemMenuAnalyze').style.display = 'block';

				$i('bb_bracketItemMenuSwitchPlayIn').style.display = 'none';
				
			}
			
		}
	},
	
	menuClose : function() {
		if (!bracket || !bracket.sideUL)
			return;
		
		if (bracketPicker.bracketItemSelected) {
			Removeclass(bracketPicker.bracketItemSelected, bracketPicker.bracket.o.classNamespace + 'itemSelected');
			bracketPicker.bracketItemSelected = false;	
		}
		Removeclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_highSide' );
		Removeclass( $i(bracket.o.classNamespace + 'bracketChampionship') , 'bb_lowSide' );
		Removeclass( $i('bb_bracketInfo'), 'bb_lowSide' );
		Removeclass( bracket.sideUL[ 'right' ] , 'bb_lowSide' );	
		Removeclass( bracket.sideUL[ 'left' ] , 'bb_lowSide' );	
		bracket.o.bracketItemMenu.style.display = 'none';
		
			if (bracketPicker.menuOpenFixElement) {
				Removeclass( bracketPicker.menuOpenFixElement , 'bb_menuOpenFix' );	
			}
	},
	
	menuSelectedPick : function() 
	{		
		if (!bracketPicker.bracketItemSelected || !bracketPicker.bracketItemSelected.getAttribute)
			return;
			
		var teamId = bracketPicker.bracketItemSelected.getAttribute('teamId') * 1;
		var gameId = bracketPicker.bracketItemSelected.parentNode.getAttribute('gameId') * 1;
		var roundId = bracketPicker.bracketItemSelected.parentNode.getAttribute('roundId') * 1;
		var topOrBottom = bracketPicker.bracketItemSelected.getAttribute('topOrBottom');
		return {
				teamId:teamId,
				gameId:gameId,
				roundId:roundId,
				topOrBottom:topOrBottom,
				spot:bracketPicker.bracket.gameByRound[roundId][gameId][topOrBottom]
				};
	},
	
	menuPick : function() 
	{
		if (allow_advance_team) {
			var pick = bracketPicker.menuSelectedPick();			
			if (!pick)
				return;
			
			bracketPicker.pick(pick.roundId, pick.gameId, pick.teamId);
		} else {
			showRegister('save picks, build and analyze your bracket.');
		}
			
		bracketPicker.menuClose();
	},
	
	menuUndoPick : function() {
		var pick = this.menuSelectedPick();
			if (!pick) return;
		
		this.menuClose();
		
		this.clearPick(pick);	
	},
	
	menuSwitch: function() {
		
		var pick = this.menuSelectedPick();
			if (!pick) return;
		
		this.menuClose();
		
		var prev = bracketPicker.bracket.prevPick( pick );
		var teamA = bracketPicker.bracket.gameByRound[prev.roundId][prev.gameId].topGame.getAttribute('teamId')*1;
		var teamB = bracketPicker.bracket.gameByRound[prev.roundId][prev.gameId].bottomGame.getAttribute('teamId')*1;

		this.pick(prev.roundId, prev.gameId, pick.teamId == teamA ? teamB : teamA);
		
	},
		
	menuAnalyze : function() {
		var pick = this.menuSelectedPick();
			if (!pick) return;
		
		if ( bracketPicker.bracketItemSelected.getAttribute('teamId') != 'playIn' ) {
			
			var t1 = bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId][ 'topGame' ].getAttribute('teamId') * 1;
			var t2 = bracketPicker.bracket.gameByRound[pick.roundId][pick.gameId][ 'bottomGame' ].getAttribute('teamId') * 1;
			var g = pick.gameId;
			var r = pick.roundId;
			
		} else {
			
			var t1 = bracketPicker.picks[0][0].teamA;
			var t2 = bracketPicker.picks[0][0].teamB;
			var g = 0;
			var r = 0;
				
		}
		
		if ( (user_al < 2 && r >= 2) || show_sub_pop) {
			showSubscribe();
		} else {
			if (bracketPicker.lightbox)
				bracketPicker.lightbox.kill();
				
			bracketPicker.lightbox = new tr_pop( {
													type:'iframe',
													forceTop:20,
													url: '/bracket-brains/pop/?g='+g+'&r='+r+'&t1='+t1+'&t2='+t2,
													width:700,
													height:600,
													absolute:true
												} );
		}
	},
	
	menuPickPlayIn : function(team, invalidate) {
		noInvalidation = !invalidate;
		
		var teamId = bracketPicker.picks[0][0][team];		
		this.pick(0, 0, teamId, noInvalidation);

		this.menuClose();
		
	},
	
	menuSwitchPlayIn : function() {
		
		var pick = this.menuSelectedPick();
			if (!pick) return;
		
		// invalidate if the play in team has been advanced
		var invalidate = (bracketPicker.picks[ pick.roundId ][ pick.gameId ].pick == pick.teamId ); 
					
		this.menuPickPlayIn( bracketPicker.picks[0][0].pick == bracketPicker.picks[0][0].teamA ? 'teamB' : 'teamA' , invalidate );		
		
	}
}


function showMatchupPop()
{
	if (pops['matchup_pop']) { pops['matchup_pop'].kill(); }
	pops['matchup_pop'] = new tr_pop( {
											type:'iframe',
											forceTop:20,
											url: '/bracket-brains/pop/',
											width:700,
											height:600,
											absolute:true
										} );

}

//

function printBracket() {
	if (pops['print']) { pops['print'].kill(); }
	pops['print'] = new tr_pop( {
									type:'confirm', question:'For best results, set your printer to landscape mode and select "Scale to Fit" or "Fit to Page."',
									confirmText: 'Print',
									onConfirm: function(popup) {
										popup.e.popup.style.display = 'none';
										window.print();
									}
								} );
}

//

