FD.playerpicker = {}

FD.playerpicker.isTeamBoxInitialized = false;

FD.playerpicker.ICON_PROBABLEPITCHER = 1;
FD.playerpicker.ICON_INJURED = 2;

function Player(id, position, fullname, fixtureId, teamId, rank, salary, ppg, played, url, icons, injText) {
	this.id = id; 
	this.position = position;
	this.fullname = fullname;
	this.fixtureId = fixtureId;
	this.teamId = teamId;
	this.rank = rank;
	this.salary = salary;
	this.ppg = ppg;
	this.played = played;
	this.url = url;
	this.icons = icons;
	this.injText = injText;
}


FD.playerpicker.isPlayerInTeam = function(playerId) {
	for (i= 0; i < FD.playerpicker.teamPlayersData.length; i++) {
		if (playerId == FD.playerpicker.teamPlayersData[i][1])
			return true;
	}
	return false;
}

FD.playerpicker.canAddPlayer = function(playerId) {
	if (FD.playerpicker.useSalaryCap) {
		var player = FD.playerpicker.getPlayerByPlayerId(playerId);
		if (player.salary > FD.playerpicker.salaryCapRemaining) {
			return false;
		}
	}
	// Fire off the kissmetrics event for a player being added.
	if (FD.kissmetrics && FD.kissmetrics.kmSignupAddPlayer) {
		FD.kissmetrics.kmSignupAddPlayer();
	}
	if (FD.kissmetrics && FD.kissmetrics.kmSignupAddPlayerFFFC) {
		FD.kissmetrics.kmSignupAddPlayerFFFC();
	}
	return !FD.playerpicker.isPlayerInTeam(playerId);
}
FD.playerpicker.addPlayer = function(playerId) {
	if (!FD.playerpicker.canAddPlayer(playerId)) return false;
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	var player = FD.playerpicker.getPlayerByPlayerId(playerId);
	var position = player.position;
	fixtureId = player.fixtureId;
	teamId = player.teamId;
	// find the position at which they can be added
	for (i = 0; i < teamPlayersData.length; i++) {
		if ((position == teamPlayersData[i][0]) && (teamPlayersData[i][1] == 0)) {
			teamPlayersData[i][1] = playerId;
			teamPlayersData[i][2] = fixtureId;
			teamPlayersData[i][3] = teamId;
			FD.playerpicker.updateDisplay();
			return true;
		}
	}
	return false;
}
FD.playerpicker.removePlayer = function(playerId) {
	// remove from team
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	// find them and remove them
	for (i = 0; i < teamPlayersData.length; i++) {
		if (teamPlayersData[i][1] == playerId) {
			teamPlayersData[i][1] = 0;
			FD.playerpicker.updateDisplay();
			return true;
		}
	}
	return false;
}
FD.playerpicker.removeAll = function() {
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	// find them and remove them
	for (i = 0; i < teamPlayersData.length; i++) {
			teamPlayersData[i][1] = 0;
	}
	FD.playerpicker.updateDisplay();
	return true;
}
FD.playerpicker.getPlayersDataByFilter = function(filter) { 
	playersData = FD.playerpicker.getAllPlayersFullData();
	// Fullname search 
	if (filter.fullname) {
		filteredPlayersData = new Array();
		for (id in playersData) {
			playerData = playersData[id]; 
			if (playerData[1].toLowerCase().indexOf(filter.fullname) >= 0)
				filteredPlayersData[id] = playerData; 
		}
		playersData = filteredPlayersData; 
	}
	// Position
	if (filter.position) {
		filteredPlayersData = new Array();
		for (id in playersData) {
			playerData = playersData[id]; 
			if (playerData[0] == filter.position)
				filteredPlayersData[id] = playerData; 
		}
		playersData = filteredPlayersData; 
	}
	// Fixture
	if (filter.fixtureId) {
		filteredPlayersData = new Array();
		for (id in playersData) {
			playerData = playersData[id]; 
			if (playerData[2] == filter.fixtureId)
				filteredPlayersData[id] = playerData; 
		}
		playersData = filteredPlayersData; 
	}
	// Probable players
	if (filter.probablePlayersOnly) {
		filteredPlayersData = new Array();
		for (id in playersData) {
			playerData = playersData[id]; 
			if (FD.playerpicker.isProbableByPlayerData(playerData))
				filteredPlayersData[id] = playerData; 
		}
		playersData = filteredPlayersData; 
	}
	return playersData;
}
FD.playerpicker.isProbableByPlayerData = function(playerData) {
	if (playerData[0] == 'P')
		return (playerData[9] & FD.playerpicker.ICON_PROBABLEPITCHER) ? true : false;
	else
		return true;
}
FD.playerpicker.getFilter = function() {
	filter = {};
	// Search box
	if (_('playerSearchBox').value.length > 0)
		filter.fullname = _('playerSearchBox').value.toLowerCase();
	else
		filter.fullname = false;
		
	// Position
	positionDropdownValue = _('positionDropdown').options[_('positionDropdown').selectedIndex].value;
	if (positionDropdownValue != 'All')
		filter.position = positionDropdownValue;
	else
		filter.position = false;
		
	// Fixture
	fixtureIdDropdownValue = _('fixtureIdDropdown').options[_('fixtureIdDropdown').selectedIndex].value;
	if (fixtureIdDropdownValue != 'All')
		filter.fixtureId = fixtureIdDropdownValue;
	else
		filter.fixtureId = false;
	
	// Probable players only
	if (_('probablePlayersOnlyCheckbox') && _('probablePlayersOnlyCheckbox').checked)
		filter.probablePlayersOnly = true;
	else
		filter.probablePlayersOnly = false;
	
	return filter;
}
FD.playerpicker.playerSearch = function() {
	FD.playerpicker.drawPlayersBox();
}
FD.playerpicker.filterOnPosition = function() {
	FD.playerpicker.drawPlayersBox();
}
FD.playerpicker.filterOnFixtureId = function() {
	FD.playerpicker.drawPlayersBox();
}
FD.playerpicker.filterOnProbablePlayersOnly = function() {
	FD.playerpicker.drawPlayersBox();
}

FD.playerpicker.drawTeamBox = function() {
	if (!FD.playerpicker.isTeamBoxInitialized) FD.playerpicker.initTeamBox();
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	rows = FD.playerpicker.getTeamBoxRows();
	teamPlayersDataIndex = 0;
	
	// make first team quotas
	positions = FD.playerpicker.getPositions();
	positionQuota = new Array();
	for (i = 0; i < positions.length; i++) {
		pos = positions[i];
		positionQuota[pos] = (typeof positionQuota[pos] == 'undefined' ? 1 : positionQuota[pos]+1); 
	} 
	for (rowKey in rows) {
		row = rows[rowKey];
		
		playerData = teamPlayersData[teamPlayersDataIndex++];
		if (!FD.playerpicker.getPlayerByPlayerId(playerData[1]))
			playerData[1]=0; //kill non-existent players
		if (playerData) {
			isBackup = true;
			
			row.position = playerData[0];
			row.playerId = playerData[1]; 
			row.fixtureId = playerData[2]; 
			row.teamId = playerData[3]; 
			if (positionQuota[row.position] > 0) {
				positionQuota[row.position]--;
				isBackup = false;
			}
			
			if (row.playerId != 0) { 
				FD.playerpicker.drawPlayerTeamTableRow(row, isBackup);
			} else {
				FD.playerpicker.drawAutopickTeamTableRow(row, isBackup); 
			}
		}
	}
}
FD.playerpicker.initTeamBox = function() {
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	html = '';
	for (i = 0; i < teamPlayersData.length; i++) {
		html += '<div class="teamBoxRowDragDropContainer">';
		html += '<div class="number">'+(i+1)+'</div>';
		html += '<div id="teamBoxRow_'+i+'" class="teamBoxRow">';
		html += '</div>';
		html += '</div>';
	}
	_('teamBox').innerHTML = html;
	FD.playerpicker.isTeamBoxInitialized = true;
}
FD.playerpicker.getTeamBoxRows = function() {
	rows = new Array();
	rowCandidates = _('teamBox').getElementsByTagName('div');
	for (i = 0; i<rowCandidates.length; i++) {
		rowCandidate = rowCandidates[i];
		//if (rowCandidate.className=='teamBoxRow') rows.push(rowCandidate);
		if (rowCandidate.id.substring(0,10)=="teamBoxRow") rows.push(rowCandidate);
	}
	return rows;
}
FD.playerpicker.drawAutopickTeamTableRow = function(row, isBackup) {
	html = '<div class="position">'+row.position+(isBackup ? ' (backup)' : '')+'</div>';
	if (!FD.playerpicker.useSalaryCap) html += '<div class="fullname" style="font-style:italic; color: #999;">Auto select best available</div>'; 
	row.innerHTML = html; 
	
	if (isBackup) row.className = "teamBoxRow teamBoxRowBackup";
	else row.className = "teamBoxRow";
	
	if (!FD.playerpicker.useSalaryCap) Dom.addClass(row, 'moveable');
}
FD.playerpicker.drawPlayerTeamTableRow = function(row, isBackup) {
	var player = FD.playerpicker.getPlayerByPlayerId(row.playerId); 
	var fixtureText = FD.playerpicker.getFixtureCompactStringByTeamId(player.teamId);
	html = '';
	html += '<div class="position">'+player.position+(isBackup ? ' (backup)' : '')+'</div>';
	html += '<div class="fullname">'+player.fullname+'</div>';
	html += '<div class="fixture">'+fixtureText+'</div>';
	if (FD.playerpicker.useSalaryCap) { 
		html += '<div class="salary">'+formatDollars(player.salary)+'</div>'; 
	} else {
		html += '<div class="rank">'+(player.rank == 1000 ? "" : player.rank)+'</div>'; 
	}
	html += '<div class="removeButton"><a href="#" onClick="FD.playerpicker.removePlayer('+row.playerId+'); return false;"></a></div>';
	
	row.innerHTML = html;
	
	if (isBackup) row.className = "teamBoxRow teamBoxRowBackup";
	else row.className = "teamBoxRow"; 
	
	if (!FD.playerpicker.useSalaryCap) Dom.addClass(row, 'moveable');
}
FD.playerpicker.drawPlayersBox = function() {
	filter = FD.playerpicker.getFilter();
	playersData = FD.playerpicker.getPlayersDataByFilter(filter);
	html = '<table>';
	html += '<tr><td>Pos</td><td>Name</td>';
	html += '<td style="width:50px;">PPG (<a href="#" onClick="return false;" title="Avg. fantasy points per game (by FanDuel scoring)">?</a>)</td>';
	html += '<td>Played&nbsp;</td>';
	html += '<td>Game</td>';
	//html += '<tr><td>Pos</td><td>Name</td><td>Game</td>';
	if (FD.playerpicker.useSalaryCap) {
		html += '<td>Salary</td>';
	} else {
		html += '<td>Rank</td>';
	}
	html += '<td></td></tr>';
	for(spi = 0; spi < FD.playerpicker.sortedPlayerIds.length; spi++) {
		playerId = FD.playerpicker.sortedPlayerIds[spi]; 
		if (playersData[playerId] != null && !FD.playerpicker.isPlayerInTeam(playerId)) { 
			html += FD.playerpicker.getPlayerTableRow(playerId);
		}
	}
	html += '</table>';
	_('playersBox').innerHTML = html;
}

FD.playerpicker.selectDashSeparatedTeam = function(team) {
	var lastEmpty = -1;

	var oldPlayersData = FD.playerpicker.getTeamPlayersData();

	function findRow(playerId) {
		if (playerId == 0) return nextEmpty();
		for(var index = 0; index < oldPlayersData.length; index++) {
			if (!oldPlayersData[index]) continue;
			if (oldPlayersData[index][1] == playerId) {
				return oldPlayersData[index];
			}
		}
		return null;
	};

	function nextEmpty() {
		while(++lastEmpty < oldPlayersData.length) {
			if (oldPlayersData[lastEmpty][1] == 0) {
				return oldPlayersData[lastEmpty];
			}
		}
	}

	var members = team.split('-');
	FD.playerpicker.removeAll();
	// Use add even though we rebuild, as it ensures we run through
	for(var index = 0; index < members.length; index++) {
		FD.playerpicker.addPlayer(members[index]);
	}

	// Rebuild playersData array to reflect previous ordering (for autopicks).
	var newPlayersData = new Array();
	for(var index = 0; index < members.length; index++) {
		newPlayersData.push(findRow(members[index]));
	}
	FD.playerpicker.setTeamPlayersData(newPlayersData);
    FD.playerpicker.drawTeamBox();
	FD.playerpicker.hideUseExistingBox();
	return false;
};
FD.playerpicker.showUseExistingBox = function() {
	FD.playerpicker.useExistingLightbox =
		showLightbox({divId: 'lightboxUseExisting'},
			'Use an existing team', 670, true);
};
FD.playerpicker.hideUseExistingBox = function() {
	if (FD.playerpicker.useExistingLightbox) {
		FD.playerpicker.useExistingLightbox.destroy();
		FD.playerpicker.useExistingLightbox = null;
	}
};
FD.playerpicker.getPlayerTableRow = function(playerId) {
	var player = FD.playerpicker.getPlayerByPlayerId(playerId);
	fixtureText = FD.playerpicker.getFixtureCompactStringByTeamId(player.teamId);
	var name = player.fullname;
	if (player.url)
		name = '<a href="'+player.url+'" title="Stats on Yahoo" target="_blank" class="playerLink">'+name+'</a>';
	html = "<tr><td>"+player.position+'</td><td>'+name+FD.playerpicker.getIconsHTML(player)+'</td><td>'+(player.ppg ? player.ppg : '-')+'</td><td>'+(player.played ? player.played : '-')+'</td><td>'+fixtureText+'</td>'; 
	//html = "<tr><td>"+player.position+'</td><td>'+player.fullname+'</td><td>'+fixtureText+'</td>';
	if (FD.playerpicker.useSalaryCap) {
		html += '<td>'+formatDollars(player.salary)+'</td>'; 
	} else {
		html += '<td>'+(player.rank == 1000 ? "" : player.rank)+'</td>';
	}
	html += '<td class="td_add"><a href="#" onClick="FD.playerpicker.addPlayer('+playerId+'); return false;">Add</a></td>';
	html += '</tr>';
	return html;
}
FD.playerpicker.getIconsHTML = function(player) {
	var icons = player.icons;
	var html = '';
	if (icons & FD.playerpicker.ICON_PROBABLEPITCHER) html += ' <img src="/images/edition/pp/icon_probpitch.gif" alt="Probable pitcher" title="Probable pitcher">';
	if (icons & FD.playerpicker.ICON_INJURED) {
		var injText = "Injured";
		if (player.injText)
			injText += " (" + player.injText + ")";
		html += ' <img src="/images/edition/pp/icon_injured.gif" alt="'+injText+'" title="'+injText+'">';
	}
	return html;
}
FD.playerpicker.getFixtureCompactStringByTeamId = function(teamId) {
	return FD.playerpicker.teamIdToFixtureCompactString[teamId];
}
FD.playerpicker.updateDisplay = function() {
	FD.playerpicker.drawTeamBox();
	FD.playerpicker.drawPlayersBox();
	if (FD.playerpicker.useSalaryCap) FD.playerpicker.updateSalaryCapRemaining();
	FD.playerpicker.populateFormPlayerData(); 
}
FD.playerpicker.updateSalaryCapRemaining = function() {
	var salaryCapRemaining = FD.playerpicker.salaryCap;
	teamPlayersData = FD.playerpicker.getTeamPlayersData();
	for (i = 0; i < teamPlayersData.length; i++) {
		var playerId = teamPlayersData[i][1];
		if (playerId != 0) {
			var player = FD.playerpicker.getPlayerByPlayerId(playerId);
			if (player) salaryCapRemaining -= player.salary;
		}
	}
	FD.playerpicker.salaryCapRemaining = salaryCapRemaining;
	_('salaryCapRemaining').innerHTML = formatDollars(salaryCapRemaining);
}

FD.playerpicker.init = function() {
	// draw team box and players box
	FD.playerpicker.updateDisplay();
	FD.playerpicker.captureTeamDataFromUI();
	if (!FD.playerpicker.useSalaryCap) FD.playerpicker.makeReorderable();
}

FD.playerpicker.getPlayerByPlayerId = function(playerId) {
	var data = FD.playerpicker.getPlayerFullDataByPlayerId(playerId);
	if (data)
		return new Player(playerId, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8], data[9], data[10]);
	else return false;
}
FD.playerpicker.getPlayerFullDataByPlayerId = function(playerId) {
	allPlayersFullData = FD.playerpicker.getAllPlayersFullData();
	return allPlayersFullData[playerId];
}

FD.playerpicker.getTeamPlayersData = function() {
	return FD.playerpicker.teamPlayersData;
}
FD.playerpicker.setTeamPlayersData = function(teamPlayersData) {
	FD.playerpicker.teamPlayersData = teamPlayersData;
}
										
FD.playerpicker.getAllPlayersFullData = function() {
	return FD.playerpicker.allPlayersFullData;
}
FD.playerpicker.getPositions = function() {
	return FD.playerpicker.positions;
}
FD.playerpicker.populateFormPlayerData = function() {
	playerDataControl = _('playerData');
	if (playerDataControl) 
		playerDataControl.value = JSON.stringify(FD.playerpicker.getTeamPlayersData());
}
FD.playerpicker.captureTeamDataFromUI = function() {
	rows = FD.playerpicker.getTeamBoxRows();
	teamPlayersData = new Array();
	for (i = 0; i < rows.length; i++) {
		row = rows[i];
		playerData = [row.position, row.playerId, row.fixtureId ? row.fixtureId : 0, row.teamId ? row.teamId : 0];
		teamPlayersData.push(playerData);
	}
	FD.playerpicker.setTeamPlayersData(teamPlayersData);
	FD.playerpicker.populateFormPlayerData();
}
 
var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
var DDM = YAHOO.util.DragDropMgr;

YAHOO.example.DDApp = {
    init: function() {
        new YAHOO.util.DDTarget("teamBox");
        var rows = FD.playerpicker.teamPlayersData.length; 
        for (i = 0; i < rows; i++) {
            var q = new YAHOO.example.DDList("teamBoxRow_"+i);
            q.setXConstraint(0,0);
        } 
		this.hasDragged = false;
    }
};

YAHOO.example.DDList = function(id, sGroup, config) {
    YAHOO.example.DDList.superclass.constructor.call(this, id, sGroup, config);
    var el = this.getDragEl();
    Dom.setStyle(el, "opacity", 0.67);
    this.goingUp = false;
    this.lastY = 0;
     
    //if (Dom.get(id+'_handle')) this.setHandleElId(id+'_handle'); 
};

// Make the rows drag and droppable if the game is not salary cap

FD.playerpicker.makeReorderable = function () {
	YAHOO.extend(YAHOO.example.DDList, YAHOO.util.DDProxy, {
	
	    startDrag: function(x, y) {
	        // make the proxy look like the source element
	        var dragEl = this.getDragEl();
	        var clickEl = this.getEl();
	        Dom.setStyle(clickEl, "visibility", "hidden");
	
	        dragEl.innerHTML=clickEl.innerHTML;
	        dragEl.className=clickEl.className;
	    },
	
	    endDrag: function(e) {
	        var srcEl = this.getEl();
	        var proxy = this.getDragEl();
	        // Show proxy and animate it to the src element's location 
	        Dom.setStyle(proxy, "visibility", "");
	        var a = new YAHOO.util.Motion( 
	            proxy, {
	                points: { 
	                    to: Dom.getXY(srcEl)
	                }
	            }, 
	            0.2, 
	            YAHOO.util.Easing.easeOut 
	        )
	        var proxyid = proxy.id;
	        var thisid = this.id;
	        // Hide proxy and show the src element when animation finished
	        a.onComplete.subscribe(function() {
	                Dom.setStyle(proxyid, "visibility", "hidden");
	                proxy.innerHTML = '';
	                Dom.setStyle(thisid, "visibility", "");
	                updateOrders(); 
	            });
	        a.animate();
	        
	        FD.playerpicker.captureTeamDataFromUI();
	        FD.playerpicker.drawTeamBox();
	        
	        YAHOO.example.DDApp.hasDragged = true;
	        
	    },
	
	    onDrag: function(e) {
	        // Keep track of the direction of the drag for use during onDragOver
	        var y = Event.getPageY(e);
	
	        if (y < this.lastY) this.goingUp = true;
	        else if (y > this.lastY) this.goingUp = false;
	
	        this.lastY = y;
	    },
	
	    onDragOver: function(e, id) {
	    
	        var srcEl = this.getEl();
	        var destEl = Dom.get(id);
	
	        // We are only concerned with list items, we ignore the dragover
	        // notifications for the list.
	        if (destEl.id.substring(0,10) == "teamBoxRow") {
	        	// swap over source and destination
	            var p = destEl.parentNode;
	            var p2 = srcEl.parentNode;
	            p.appendChild(srcEl);
	            p2.appendChild(destEl);
	            
	            DDM.refreshCache();
	        }
	    }
	});
	
	// Event.onDOMReady(YAHOO.example.DDApp.init, YAHOO.example.DDApp, true);
	YAHOO.example.DDApp.init();
}

Event.onDOMReady(FD.playerpicker.init);