
/*
if (!window.console || !console.firebug)
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}
*/

	//Global variable to detect if an element is being dragged.  Jquery currently does not allow for the detection of dragging
	var draftMachineNFLIsDragging = 0;
	/*
		Initializes the draft machine controls, preloads images
	*/
	var init = function() {
		// reset the form values when we come back to this page
		$('#draftContent form input[type=hidden]').val('');
		var aTeams = [
			"arizona", "atlanta", "baltimore", "buffalo", "carolina", "chicago", "cincinnati", "cleveland",
			"dallas", "denver", "detroit", "greenbay", "houston", "indianapolis", "jacksonville", "kansascity",
			"miami", "minnesota", "newengland", "neworleans", "newyorkgiants", "oakland", "philadelphia", "pittsburgh",
			"sandiego", "sanfrancisco", "seattle", "stlouis", "tampabay", "tennessee", "washington"
		];
		var imageSizes = ['-on','-off'];
		var imgPath = 'http://assets.espn.go.com/i/nfl/draft09/teams/';
		var img = new Image(); //document.createElement('img'); // create an image tag
		// do the image preload after the document loads
		var count = 0;
		var gap = 14;
		$(window).bind('load',function() {

			for(var i=0; i<aTeams.length; i++) {
				var src = imgPath + '/' + aTeams[i] + imageSizes[0] +'.gif';
				$('<img/>').attr('src',src);
			}

			showPage(); // show the page when the loop finishes
		});

	};

	var showPage = function() {
		$('#loadingDataImage').hide();
		$('#playerscoldiv').show();
		$('window').unbind('load');
		$('#loadingMockImage').hide();
		$('#draftContent').show();
		// add click/drag handlers to the players
		$('.moduleplayer').each(function() {
			var p = $(this);
			makePlayerDraggable(p);
			makePlayerClickable(p);
			p.bind('mouseenter',function(evt) {
				handlePlayerMouseOver(evt,$(this));
			});
		});
		// teams are droppable by default
		$('.moduleteam').droppable({
			'accept':'*',
			'tolerance':'pointer',
			drop: function(e,ui) {
				move(ui);
				$(this).css('opacity','1');
			},
			'over': function(e,ui) {
				$(this).css('opacity','0.5');
			},
			'out': function(e,ui) {
				$(this).css('opacity','1');
			}
		});
		$('.playersdiv').droppable({
			'accept':'*',
			'tolerance':'pointer',
			drop: function(e,ui) {
				move(ui);
			}
		});
	};



var makePlayerClickable = function(player) {
	if(player.hasClass('moduleplayer') || player.hasClass('moduleplayeroff')) {
		player.bind('click',function(e) {
			handlePlayerClick(e, $(this));
		});
	}
};

var makePlayerDraggable = function(player) {
	player.draggable({
		'zIndex':9000, // rise above
		'opacity':'0.7',
		'revert':100,
		//'revertDuration':100, in a future verision revertDuration might need to be used instead ot setting the revert timing in the revert parameter
		'distance':2,
		'start': function() {
			draftMachineNFLIsDragging = 1;
			$('#playerCard:visible').empty().hide();
			$(this).unbind('click');
			//Disables all other dragging
			$('.moduleplayer').draggable('disable');
			$('.moduleteamon').draggable('disable');
		},
		'drag' : function () {
			draftMachineNFLIsDragging = 1;
			$('#playerCard:visible').empty().hide();
		},
		'stop':function() {
			draftMachineNFLIsDragging = 0;
			//player.find('div.teamSelector').hide();
			//Enables all other dragging
			$('.moduleplayer').draggable('enable');
			$('.moduleteamon').draggable('enable');
			$(this).css('zIndex', '1');
			makePlayerClickable($(this));
		}
	});
};

var makePlayerDroppable = function(player) {
	turnOffPlayer(player);
	// This code is used if you want to drop a player on a specific player box rather than the playersDiv
	/*
	player.droppable({
		'accept':function(d) {
			// only accept the draggable if the Player Names match
			return $(d).find('dt').html() === $(this).find('dt p').html();
		},
		'tolerance':'intersect',
		drop: function(e,ui) {
			move(ui);
		}
	});
	*/
};

var makePlayerDroppableNoPlayerOff = function(player) {
	player.droppable({
		'accept':function(d) {
			// only accept the draggable if the Player Names match
			return $(d).find('dt').html() === $(this).find('dt p').html();
		},
		'tolerance':'pointer',
		drop: function(e,ui) {
			move(ui);
		}
	});
};

var makeTeamDraggable = function(team) {
	team.draggable({
		'zIndex':9000, // rise above
		'opacity':'0.7',
		'revert':100,
		//'revertDuration':100, in a future verision revertDuration might need to be used instead ot setting the revert timing in the revert parameter
		'distance':5,
		'start': function() {
			draftMachineNFLIsDragging = 1;
			$(this).unbind('click');
			//Disables all other dragging
			$('.moduleteamon').draggable('disable');
			$('.moduleplayer').draggable('disable');
		},
		'drag': function() {
			draftMachineNFLIsDragging = 1;
		},
		'stop':function() {
			draftMachineNFLIsDragging = 0;
			//Enables all other dragging
			$('.moduleteamon').draggable('enable');
			$('.moduleplayer').draggable('enable');
			$(this).css('zIndex', '1');
			if($(this).hasClass('moduleteamon')) {
				makeTeamClickable($(this));
			}
		}
	});
};

var makeTeamClickable = function(team) {
	team.bind('click',function() {
		handleTeamClick($(this));
	});
};

var move = function(ui) {
	// we need to determine the type of move we're making
	var drag = $(ui.draggable);
	var drop = $(ui.element);
	if(drag.hasClass('moduleteamon') && drop.hasClass('moduleteamon')) {
		// TEAM ON -> TEAM ON
		moveTeamOnTeamOn(drag,drop);
	} else if(drag.hasClass('moduleplayer') && drop.hasClass('moduleteam')) {
		// we have a player on to team off
		movePlayerOnTeamOff(drag,drop);
	} else if(drag.hasClass('moduleplayer') && drop.hasClass('moduleteamon')) {
		// we have a player on -> team on [ add new player, revert old player]
		movePlayerOnTeamOn(drag,drop);
	} else if(drag.hasClass('moduleteamon') && drop.hasClass('moduleteam')) {
		// TEAM ON -> TEAM OFF
		moveTeamOnTeamOff(drag,drop);
	} else if(drag.hasClass('moduleteamon') && drop.hasClass('moduleplayeroff')) {
		// TEAM ON -> PLAYER OFF
		moveTeamOnPlayerOff(drag,drop);
	} else if(drag.hasClass('moduleteamon') && drop.hasClass('playersdiv')) {
		// TEAM ON -> PLAYER OFF on the playersdiv
		playerId = getPlayerIdFromForm(drag);
		player = $('#'+playerId).parents('div.moduleplayeroff');
		moveTeamOnPlayerOff(drag,player);
	}
};

var movePlayerOnTeamOff = function(player,team) {
	turnOnTeam(team,player);
	makePlayerDroppable(player);
	setForm(player,team);
};

var movePlayerOnTeamOn = function(player,team) {
	// ok, we need to swap the players on the teams
	var outPlayerId = getPlayerIdFromForm(team);
	var outPlayer = $('#'+outPlayerId).parents('div.moduleplayeroff');
	turnOnPlayer(outPlayer);
	turnOffPlayer(player);
	turnOnTeam(team,player);
	// This function is used if you want to drop a player on a specific player box rather than the playersDiv
	//makePlayerDroppableNoPlayerOff(player); //A different makePlayerDroppableNoPlayerOff has to be used to fix an issue where players that were off were made draggable again.
	setForm(player,team);
};

var moveTeamOnTeamOff = function(team1,team2) {
	var team1PlayerId = getPlayerIdFromForm(team1);
	var player = $('#'+team1PlayerId).parents('div.moduleplayeroff');
	turnOnTeam(team2,player);
	turnOffTeam(team1);
	resetForm(team1);
	setForm(player,team2);
	player.droppable('destroy');
	// This function is used if you want to drop a player on a specific player box rather than the playersDiv
	//makePlayerDroppableNoPlayerOff(player); //A different makePlayerDroppableNoPlayerOff has to be used to fix an issue where players that were off were made draggable again.
};

var moveTeamOnTeamOn = function(team1,team2) {
	var team1PlayerId = getPlayerIdFromForm(team1);
	var player1 = $('#'+team1PlayerId).parents('div.moduleplayeroff');
	var team2PlayerId = getPlayerIdFromForm(team2);
	var player2 = $('#'+team2PlayerId).parents('div.moduleplayeroff');
	// swap the player names
	var player1Name = team1.find('dt').html();
	var player2Name = team2.find('dt').html();
	team1.find('dt').html(player2Name);
	team2.find('dt').html(player1Name);
	// set the form data
	setFormWithPlayerId(team2PlayerId,team1);
	setFormWithPlayerId(team1PlayerId,team2);
};

var moveTeamOnPlayerOff = function(team,player) {
	turnOffTeam(team);
	turnOnPlayer(player);
	resetForm(team);
};

var turnOnPlayer = function(player) {
	player.droppable('destroy')
		.removeClass('moduleplayeroff')
		.addClass('moduleplayer');
	makePlayerDraggable(player);
	//makePlayerClickable(player);
};

var turnOffPlayer = function(player) {
	player.draggable('destroy')
		.removeClass('moduleplayer')
		.addClass('moduleplayeroff')
		.css('z-index',1);
};

var turnOnTeam = function(team,player) {
	team.removeClass('moduleteam')
		.addClass('moduleteamon')
		.css({'background-image':team.css('background-image').replace('-off','-on')})
		.find('dt').html(player.find('dt p').html()); // add player's name to the team widget
	makeTeamDraggable(team);
	makeTeamClickable(team);
};

var turnOffTeam = function(team) {
	team.removeClass('moduleteamon').addClass('moduleteam')
		.css({'background-image':team.css('background-image').replace('-on','-off')}) // turn off the background
		.draggable('destroy')
		.unbind('click')
		.find('dt').html('')
		.css('z-index',1);
};

var setForm = function(player, team) {
	var playerId = player.find('dt').attr('id').split('-')[1];
	var teamId = team.attr('id').split('-')[1];
	$('#player-'+teamId).val(playerId);
};

var setFormWithPlayerId = function(playerId, team) {
	var playerId = playerId.split('-')[1]
	var teamId = team.attr('id').split('-')[1];
	$('#player-'+teamId).val(playerId);
};

var getPlayerIdFromForm = function(team) {
	// return the player id
	var teamId = team.attr('id').split('-')[1];
	var playerId = 'pid-' + $('#player-'+teamId).val();
	return playerId;
};

var resetForm = function(team) {
	// remove a player from the form
	var teamId = team.attr('id').split('-')[1];
	$('#player-'+teamId).val('');
};

var handlePlayerClick = function(evt, player) {
	// we're going to move the player to the next available slot
	//console.log(evt.target.tagName);
	evt.preventDefault();
	evt.returnValue = false;

	$('#playerCard').empty().hide();
	if(evt.target.tagName == 'A') {
		// we clicked on the team link
		evt.preventDefault();
		evt.returnValue = false;
		handleAddToTeamClick($(evt.target));
		evt.returnValue = false;
		return false;
	} else {
		if(player.hasClass('moduleplayer')) {
			var firstSlot = $('#draftContent form input[value=""]:first');
			if(firstSlot[0]) {;
				player.find('div.teamSelector').hide();
				var team = firstSlot.parents('div.moduleteam');
				var obj = {
					'draggable': player,
					'element': team
				};
				move(obj);
			}
		} else {
			playerId = player.find('dt').attr('id').split('-')[1];
			if(playerId != null && playerId != -1) {
				var teamSlot = $('#draftContent form input[value="' + playerId  +'"]:first');
				if(teamSlot[0]) {
					var team = teamSlot.parents('div.moduleteamon');
					var obj = {
						'draggable': team,
						'element': player
					};
					move(obj);
				}
			}
		}

	}

};

var handlePlayerMouseOver = function(evt,player) {
	if(draftMachineNFLIsDragging == 0) {
		if(player.hasClass("moduleplayer")) {
			var div = player.find('div.teamSelector');
			div.show();
		}
		var playerCardDisplayTimeout = 0;
		var playerCardAjaxTimeout = 0;

		if(playerCardAjaxTimeout != 0) {
			clearTimeout(playerCardAjaxTimeout);
		}
		if(playerCardDisplayTimeout != 0) {
			clearTimeout(playerCardDisplayTimeout);
		}

		/*The timeouts below are used for the preloading playcard information when a user hovers over a player
		The first timeout is used to preload the data before the div is shown the second timeout is used to give both
		a buffer and make sure that the data come back from the ajax call*/
		playerCardAjaxTimeout = self.setTimeout(function() {
			//Starts ajax to preload playcard data while hover timeout is ticking
			playerId = player.find('dt').attr('id').split('-')[1];
			if(playerId != null && playerId != -1) {
				var url = 'playerCardContent';
				var paramString="?id="+playerId;
				if(draftMachineNFLIsDragging == 0) {
					$("#playerCard").load(url + paramString, function(){
						playerCardDisplayTimeout = self.setTimeout(function() {
							if($("#playerCard").html().length > 0 && $('#addToTeams').html().length == 0) { // Fixes an issue if a user clicks while the timeout is running
								$('#playerCard:hidden').slideDown(200);
							}
							playerCardDisplayTimeout = 0;
						}, 225);
					});
				}
			}
			playerCardAjaxTimeout = 0;
		}, 475);

		player.one('mouseleave',function(e) {
			if(playerCardDisplayTimeout != 0) {clearTimeout(playerCardDisplayTimeout);}
			if(playerCardAjaxTimeout != 0) {clearTimeout(playerCardAjaxTimeout);}
			handlePlayerMouseOut(e,$(this));
		});

	}
};


var handlePlayerMouseOut = function(evt,player) {

	evt.stopPropagation();
	$('#playerCard:visible').empty().slideUp(200)
	player.unbind('mouseenter');
	player.find('div.teamSelector').hide();
	player.bind('mouseenter',function(e) {
		handlePlayerMouseOver(e,$(this));
	});
};

var handleTeamClick = function(team) {
	var playerId = team.find('input').val();
	var player = $('#pid-'+playerId).parents('div.moduleplayeroff');
	if(player.hasClass('moduleplayeroff')) { //Player is not currently being shown on the page so only the team needs to be turned off and the form reset
		var obj = {
			'draggable': team,
			'element': player
		};
		move(obj);
	} else {
		turnOffTeam(team);
		resetForm(team);
	}

};

var handleAddToTeamClick = function(link) {
	var teams = $('.teamcolumn > div');
	var count = 0;
	var teamDiv = $('#addToTeams').empty();
	var player = link.parents('.moduleplayer');
	var playerName = player.find('dl:first dt').text();
	var playerStats = player.find('dl:first dd').text();

	var teamList = $('<ul></ul>');
	teams.each(function() {
		var thisTeam = $(this);
		var linkClass = thisTeam.hasClass('moduleteamon') ? 'off' : '';
		if(count%8 == 0 && count > 0) {
			teamDiv.append(teamList);
			teamList = $('<ul></ul>');
		}

		var team = $('<li><a href="#">'+$(this).find('dd').html()+'</a></li>');
		team.addClass(linkClass);
		team.find('a').bind('click',function(e) {
			e.returnValue = false;
			e.preventDefault();
			// bind the move functionality
			var player = $(link).parents('.moduleplayer');
			var ui = {
				'draggable': player,
				'element': thisTeam
			};
			$('#addToTeams:visible').empty().hide();
			move(ui);
		});
		teamList.append(team);
		count++;
	});
	teamDiv.append(teamList); // put the final team list up
	var tOffset = player.offset();
	teamDiv.css({
		'top':(tOffset.top)+'px',
		'left':(tOffset.left+player.width()-teamDiv.width())+'px'
	});
	teamDiv.one('mouseleave', function(e) {
		$('#addToTeams:visible').empty().hide();
	});
	teamDiv.show();
	offTeams = onTeams = null; // dump memory
	return false; // stop link from processing
};

$(function() {
	init();
	$('body').bind('mouseenter',function(e) {
		var t = $(e.target);
		if(t.parents('#addToTeams').length==0 && $('#addToTeams:visible')) {
			$('#addToTeams:visible').empty().hide();
		}
	});
});

var loadPlayerContent = function (page, pos, season, playersPerPage) {
	$('#playerscoldiv:visible').empty().hide();
	$('#playerCard:visible').empty().hide()
	$('#loadingDataImage').show();
	var url = 'draftPlayerContent';
	var paramString="?page="+page;
	paramString += "&pos="+pos;
	paramString += "&season="+season;
	paramString += "&playersPerPage="+playersPerPage;
	$("#playerContent").load(url + paramString, function(){
		selectedPlayers = checkSelectedPlayers();
		$('.moduleplayer').each(function() {
			var p = $(this);
			if(selectedPlayers.indexOf(p.attr('id').split('-')[1]) == -1) {
				makePlayerDraggable(p);
				makePlayerClickable(p);
				p.bind('mouseenter',function(evt) {
					handlePlayerMouseOver(evt,$(this));
				});
			} else {
				p.draggable('destroy');
				p.bind('mouseenter',function(evt) {
					handlePlayerMouseOver(evt,$(this));
				});
				makePlayerClickable(p);
				makePlayerDroppable(p);
			}

		});
	//This code makes the entire playerDiv droppable rather than specific players
	$('.playersdiv').droppable({
		'accept':'*',
		'tolerance':'pointer',
		drop: function(e,ui) {
			move(ui);
		}
	});
	$('#loadingDataImage').hide();
	$('#playerscoldiv').show();
	});
	return false;
};


var checkSelectedPlayers = function () {
	var teams = $('.teamcolumn > div');
	var selectedPlayers = ""
	teams.each(function() {
		var thisTeam = $(this);
		tempPlayereCheck = getPlayerIdFromForm(thisTeam);
		if(tempPlayereCheck != "-pid" && tempPlayereCheck.length > 4) {
			selectedPlayers = selectedPlayers + tempPlayereCheck.split('-')[1] + ","
		}
	});
	return selectedPlayers;
}

var submitDraft = function(form) {
	tenpicked = true;
	for (x=1;x<11;x++) {
		var playerValue = $('#player-'+x).val();
		if (playerValue == null || playerValue == '') {
			tenpicked = false;
		}
	}
	if (tenpicked) {
		form.submit();
		return true;
	} else {
		alert("You must set the first 10 picks to continue.  Please try again.");
	}
};