/*
 * Competition.js 
 * Following is need to edit competitions entrants as a starter 
 */
var dialogNodeId = 'editCompetitionEntrantsDialogId';
var dialogTitle = 'Edit Entrants';
var dialogW = 450;
var dialogH = 300;

var currentEntrantId = 'input[name=currentEntrantId]';
var currentCompetitionId = 'input[name=currentCompetitionId]';
var currentTeeTimeId = 'input[name=currentEntrantTeeTimeId]';
var currentEntrantIndexId = 'input[name=currentEntrantIndexId]';

var RESERVED_ENTRANT_NULL = 'Reserved Entrant cannot be null';
var addNewentrantDiv = 'div.addNewentrantDiv';
var entrantInfoDiv = 'div.entrantInfoDiv';

var reservationListTableId = 'table#reservationListTableId';
var entrantInfoTableId = 'table#entrantInfoTableId';

var starterEditEntrantDialog = null;

var entrantInfoURL = '/starter/competition/entrant/info.do';
var cancelEntrantURL = '/starter/competition/entrant/cancel.do';
var addEntrantFromReservListURL = '/starter/competition/entrant/replace.do';

var ENTRANT_TEXT = "Entrant:";
var TEE_TIME_TEXT = "TeeTime:";
var CANCEL_TEXT = "Remove";
var ADD_ENTRANT_TEXT = "Add";
var EMPTY_CELL_TEXT = "Click to enter";

 
function editEntrant(compId, entrantId, teeTime, index){
	$(currentEntrantId).val(entrantId);
	$(currentCompetitionId).val(compId);
	$(currentTeeTimeId).val(teeTime);
	$(currentEntrantIndexId).val(index);
	retreiveCompetitionInfo(compId, entrantId);
}

function retreiveCompetitionInfo(compId, entrantId){
	$.post(entrantInfoURL, {'compId': compId, 'entrantId': entrantId}, function(data){
		if (data.status == ERROR){
			NotifyDialog.error(data.trace);
			return;
		}
		if (data.reservedList.length < 1){
			addEntrant();
			return false;
		}
		
		//entrant info
		var en = createEntrantInfo(data);
		toggleAddEntrantLink(en);
		if (!isNull(en)){
			$(entrantInfoTableId).html(en);
		}
		//reserved list
		var list = createReservationList(data);
		$(reservationListTableId).html(list);
		openEditEntrantDialog();
		
	}, 'json');
}

function removeEntrant(){
	if (!confirmDialog()){
		return;
	}
	var currEntrantId = $(currentEntrantId).val();
	var compId = $(currentCompetitionId).val();
	var teeTime = $(currentTeeTimeId).val();
	var index = $(currentEntrantIndexId).val();
	if (isNull(currEntrantId)){
		NotifyDialog.error(RESERVED_ENTRANT_NULL);
		return;
	}
	$.post(cancelEntrantURL, {'compId': compId, 'entrantId': currEntrantId}, function(data){
		if (data.status == ERROR){
			NotifyDialog.error(data.trace);
			return;
		}
		//reserved list
		var list = createReservationList(data);
		$(reservationListTableId).html(list);
		toggleAddEntrantLink('');
		updateCell('', '');
	}, 'json');
}

/**
 * Replaces a current player with an entrant which is on the list of reservation
 * */
function addEntrantFromReserverdList(reservedEntrantId){
	if (!confirmDialog()){
		return;
	}
	if (isNull(reservedEntrantId)){
		NotifyDialog.error(RESERVED_ENTRANT_NULL);
		return;
	}
	var currEntrantId = $(currentEntrantId).val();
	var currTeeTime = $(currentTeeTimeId).val();
	var compId = $(currentCompetitionId).val();
	
	var params = {'compId': compId, 'entrantId': currEntrantId, 'reservedId': reservedEntrantId, 'teeTime': currTeeTime};
	$.post(addEntrantFromReservListURL, params, function(data){
		if (data.status == ERROR){
			NotifyDialog.error(data.trace);
			return;
		}
		//entrant info
		var en = createEntrantInfo(data);
		if (!isNull(en)){
			toggleAddEntrantLink(en);
			$(entrantInfoTableId).html(en);
			updateCell(data.entrant.id, data.entrant.name);
		}
		//reserved list
		var list = createReservationList(data);
		$(reservationListTableId).html(list);
		
	}, 'json');
}

/**
 * Redirects to the competition app to take an entrant
 * */
function addEntrant(){
	var compId = $(currentCompetitionId).val();
	var teeTime = $(currentTeeTimeId).val();
	redirectTo('/competition/starterAddEntrant.do?compId='+compId+'&pTeeTime='+teeTime);
}

/**
 * Creates a HTML table of entrants
 * */
function createReservationList(data){
	if (isNull(data.reservedList)){
		return null;
	}
	var list = data.reservedList;
	var html = '';
	for (var i=0; i<list.length; i++){
		var item = list[i];
		html += tr( td(item.name) + td(imageArrowUp(item.id)) );
	}
	return tbody(html);
}


function toggleAddEntrantLink(entrantId){
	if (isNull(entrantId)){
		$(addNewentrantDiv).show();
		$(entrantInfoDiv).hide();	
	}else{
		$(addNewentrantDiv).hide();
		$(entrantInfoDiv).show();
	}
}

function closeEditEntrantDialog(){
	$(starterEditEntrantDialog).dialog('close');
}

function openEditEntrantDialog(){
	$(starterEditEntrantDialog).dialog('open');
}

function updateCell(entrantId, entrantName){
	var compId = $(currentCompetitionId).val();
	var teeTime = $(currentTeeTimeId).val();
	var index = $(currentEntrantIndexId).val();
	var aId = teeTime.replace(/:/gi,'') +'_'+index;
	var link = $('a#'+aId);
	var cssClass = 'competition_slots_link';
		
	entrantName = isNull(entrantName) ? EMPTY_CELL_TEXT : entrantName;
	$(link).attr('href', onClickOnCellLink(compId, "'"+entrantId+"'", teeTime, index));
	$(link).text(entrantName);
	$(link).addClass(cssClass);
	if (!isNull(entrantId)){
		$(link).removeClass(cssClass);
	}
	
}

function onClickOnCellLink(compId, entrantId, teeTime, index){
	entrantId = isNull(entrantId) ? '' : entrantId;
	return "javascript:editEntrant("+compId+", "+entrantId+", '"+teeTime+"', "+index+")";
}

function createEntrantInfo(data){
	if (isNull(data.entrant)){
		return null;
	}
	var en = data.entrant;
	return tbody( tr( td(ENTRANT_TEXT) + td(en.name) + td(TEE_TIME_TEXT) + td(en.teeTime) + td(imageCancelEntrant()) ) );
}

function tbody(text){
	return '<tbody>'+text+'</tbody>';
}

function tr(text){
	return '<tr>'+text+'</tr>';
}

function td(text){
	return '<td>'+text+'</td>';
}

function imageCancelEntrant(){
	return '<img src="/media/images/cancel.png" onclick="removeEntrant()" class="cancelBtn" title="'+CANCEL_TEXT+'"/>';
}

function imageArrowUp(entrantId){
	return '<img src="/media/images/arrow_up.png" onclick="addEntrantFromReserverdList('+entrantId+')" class="cancelBtn"  title="'+ADD_ENTRANT_TEXT+'"/>';
}


$(function() {
	starterEditEntrantDialog = createPopupDialog(dialogNodeId, dialogTitle, dialogW, dialogH);
});

