var BOARDS;

/* Reimplementation of the value property for select objects, which is 
 * not supported by IE
 */
function selectedValue(control) {
	var option = control.options[control.selectedIndex];
	return option.value || option.text;
}

function isblank(string) {
	if (string.length == 0) return true;
	for (var i = 0; i < string.length; i++) {
		var c = string.charAt(i);
		if (' \n\t'.indexOf(c) == -1) return false;
	}
	return true;
}

function validEmail(address) {
	var lastDot = -1;
	var atPosition = -1;

	for (var i = 0; i < address.length; i++) {
		var c = address.charAt(i);
		
		if (' \n\t'.indexOf(c) != -1) {
			return false;
		} else if (c == '.') {
			if (lastDot == i - 1) return false;
			if (atPosition == i - 1) return false;
			lastDot = i;
		} else if (c == '@') {
			if (atPosition != -1) return false;
			if (lastDot == i - 1) return false;
			atPosition = i;
		}
	}
	
	if (atPosition == -1) return false;
	if (lastDot < atPosition) return false;
	// ensure TLD at least two chars long
	if (lastDot >= address.length - 2) return false;
	
	return true;
}

function validHeader(form) {
	// Identity of submitter
	if (isblank(form.submitting_person.value)) {
		alert("Please enter your name.");
		form.submitting_person.focus();
		return false;
	}
	if (form.submitting_club.options[0].selected) {
		alert("Please select your club.");
		form.submitting_club.focus();
		return false;
	}
	if (isblank(form.email.value)) {
		alert ("Please enter an email address.");
		form.email.focus();
		return false;
	} else if (!validEmail(form.email.value)) {
		alert ("Email address poorly formed.");
		form.email.focus();
		form.email.select();
		return false;
	}
	
	// Home and away teams and division/cup
	if (form.home_club.options[0].selected) {
		alert("Please select the home club.");
		form.home_club.focus();
		return false;
	}
	if (form.away_club.options[0].selected) {
		alert("Please select the away club.");
		form.away_club.focus();
		return false;
	}
	if (form.Division.options[0].selected) {
		if (form.Division.options[1].value.substring(0, 3) == 'Div') {
			alert("Please select the division.");
		} else {
			alert("Please select the cup.");
		}
		form.Division.focus();
		return false;
	}
	
	// Match date
	if (form.day.options[0].selected) {
		alert("Please select the day.");
		form.day.focus();
		return false;
	}
	if (form.month.options[0].selected) {
		alert("Please select the month.");
		form.month.focus();
		return false;
	}
	
	// Totals
	if (form.home_total.options[0].selected) {
		alert("Please select the home total.");
		form.home_total.focus();
		return false;
	}
	if (form.away_total.options[0].selected) {
		alert("Please select the away total.");
		form.away_total.focus();
		return false;
	}
	
	// Passed all checks
	return true;
}

function checkMissingPlayersSP(form, grades) {
	//var selectors = document.getElementsByTagName("select");
	var validSoFar = true;

	for (var bd = 1; bd <= BOARDS && validSoFar; bd++) {
		if (form['bd ' + bd + ' result'].selectedIndex == 0) {
			validSoFar = expectBlank(form, bd);
		} else {
			validSoFar = expectPlayers(form, bd)
			if (grades && validSoFar) validSoFar = expectGrades(form, bd);
		}
	}
	return validSoFar;
}

// Result 'unused' - expect both blanks, or possibly a double default (?)
function expectBlank(form, bd) {
	var home = form['bd ' + bd + ' home'].selectedIndex;
	var away = form['bd ' + bd + ' away'].selectedIndex;

	if (home == away && (home == 0 || home == 2)) {
		return true;
	} else {
		alert('Please select the result for board ' + bd + '.');
		form['bd ' + bd + ' result'].focus();
		return false;
	}
}

/* Any other result - expect both filled in, and any new player named in the
 * comments box
 */
function expectPlayers(form, bd) {
	var home = form['bd ' + bd + ' home'].selectedIndex;
	var away = form['bd ' + bd + ' away'].selectedIndex;

	if (home == 0) {
		alert('Please select the home player for board ' + bd + '.');
		form['bd ' + bd + ' home'].focus();
		return false;
	} else if (away == 0) {
		alert('Please select the away player for board ' + bd + '.');
		form['bd ' + bd + ' away'].focus();
		return false;
	} else if ((home == 1 || away == 1) && isblank(form.comments.value)) {
		alert('Please enter the names of any new players in the comments box.');
		form.comments.focus();
		return false;
	}
	return true;
}

function expectGrades(form, bd) {
	var home = form['bd ' + bd + ' homegrade'].value;
	var away = form['bd ' + bd + ' awaygrade'].value;

	if (isblank(home) || parseInt(home, 10) != home) {
		alert('Please enter the grade of the home player for board ' + bd + '.');
		form['bd ' + bd + ' homegrade'].focus();
		return false;
	} else if (isblank(away) || parseInt(away, 10) != away) {
		alert('Please enter the grade of the away player for board ' + bd + '.');
		form['bd ' + bd + ' awaygrade'].focus();
		return false;
	}
	return true;
}


function Totals(h, a) {
	this.home = h;
	this.away = a;
	
	this.add = function(field) {
		switch (field.selectedIndex) {
			case 1: this.home++; break;  // 1-0
			case 2: this.away++; break;  // 0-1
			case 3: this.home += 0.5; this.away += 0.5;  // drawn
		}
	}
}

function calcTotalsSP(form) {
	var totals = new Totals(0, 0);
	
	for (var bd = 1; bd <= BOARDS; bd++) {
		totals.add(form['bd ' + bd + ' result']);
	}
	
	return totals;
}

