var NIET_ALLE_VELDEN_INGEVULD = 'Niet alle velden zijn ingevuld';
var ONGELDIGE_NUMERIEKE_WAARDE = 'Ongeldige numerieke waarde';
var ONGELDIGE_DATUM = 'Ongeldige datum';
var VOORWAARDEN = 'U dient akkoord te gaan met de algemene voorwaarden';
var AL_INGEVULD = 'U heeft deze vragenlijst al ingevuld op ';
var FORWARD_URL = 'http://www.staatsloterij.nl';
var VRAGENLIJST_FORM = 'vragenlijstForm';
var POLL_FORM = 'pollForm';

function submitPoll() {
	var form = document.forms[POLL_FORM];
	if (form == null) {
		alert('Form ' + POLL_FORM + ' niet gevonden');
	}
	else {
		if (controleerAntwoordenVragenlijst(form)) {
			createCookie('POLL_' + form.code.value, new Date(), 365);
			form.submit();
		}
	}
}

function controleerMeegespeeld() {
	var form = document.forms[VRAGENLIJST_FORM];
	if (form != null) {
		var ingevuld = readCookie('VRAGENLIJST_' + form.code.value);
		if (ingevuld != null) {
			alert(AL_INGEVULD + ingevuld);
			document.location = FORWARD_URL;
		}
	}
}

function controleerAntwoorden() {
	var form = document.forms[VRAGENLIJST_FORM];
	if (form != null) {
		if (controleerAntwoordenVragenlijst(form)) {
			createCookie('VRAGENLIJST_' + form.code.value, new Date(), 365);
			form.submit();
		}
	}
}

function controleerAntwoordenVragenlijst(vragenlijstForm) {
	var elementen = vragenlijstForm.elements;
	var aantalElementen = elementen.length;

	// Vul hidden fields in voor bepaalde typen antwoorden
	var isValid = validateVoorwaarden(vragenlijstForm);
	
	for (var i = 0; i < aantalElementen && isValid; i++) {
		var element = elementen[i];
		var elementNaam = element.name;
		if (elementNaam != null) {
			if (elementNaam.indexOf('num') == 0) {
				// Numeriek antwoord
				isValid = validateNumeric(vragenlijstForm, element);
			}
			else if (elementNaam.indexOf('cb') == 0) {
				isValid = validateCheckbox(vragenlijstForm, element);
			}
			else if (elementNaam.indexOf('dtm') == 0) {
				// Datum, slechts eenmaal valideren, dus extra controle op dag
				if (elementNaam.indexOf('dag') > 0) {
					isValid = validateDatum(vragenlijstForm, element);
				}
			}
			else if (elementNaam.indexOf('antwoord') == 0 || elementNaam.indexOf('volgorde') == 0) {
				if (element.type == 'radio') {
					// Radio button
					isValid = validateRadio(vragenlijstForm, element);
				}
				else if (element.type != 'hidden') {
					// Normaal antwoord, alleen controleren indien niet hidden
					isValid = validateRequired(element);
				}
			}
		}
	}
	
	return isValid;
}

function validateVoorwaarden(form) {
	var isValid = false;
	var akkoord = form['akkoord'];
	if (akkoord == null) {
		// geen akkoord checkbox? ook goed!
		isValid = true;
	}
	else {
		if (akkoord.checked) {
			isValid = true;
		}
		else {
			alert(VOORWAARDEN);
		}
	}
	
	return isValid;
}

function validateNumeric(form, field) {
	var isValid = validateNumericOnly(form, field);
	if (isValid) {
		setHiddenField(form, field, field.value, 4);
	}
	
	return isValid;
}

function validateNumericOnly(form, field) {
	var isValid = false;
	
	if (validateRequired(field)) {
		var value = trim(field.value);
		
		var iValue = parseInt(value);
		isValid = !(isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767));
		if (!isValid) {
			alert(ONGELDIGE_NUMERIEKE_WAARDE + ': ' + value);
			field.focus();
		}
	}
	
	return isValid;
}

function validateRadio(form, field) {
	var isValid = false;
	
	var radioGroup = form[field.name];
	if (radioGroup == null) {
		alert('Onverwachte fout: Verwacht radio group met naam: ' + field.name);
	}
	else {
		var aantal = radioGroup.length;
		if (aantal == null) {
			alert('Onverwachte fout: Verwacht radio group met naam: ' + field.name);
		}
		else {
			var selectedElement;
			for (var i = 0; i < aantal && !isValid; i++) {
				var element = radioGroup[i];
				if (element.checked) {
					selectedElement = element;
					isValid = true;
				}
			}
			
			if (!isValid) {
				alert(NIET_ALLE_VELDEN_INGEVULD);
				field.focus();
			}
		}
	}
	
	return isValid;
}

function validateCheckbox(form, field) {
	var resultaat = field.checked ? 'J' : 'N';
	setHiddenField(form, field, resultaat, 3);
	return true;
}

function validateDatum(form, dag) {
	var isValid = true;
	
	var deelNaam = dag.name.substring(0, dag.name.length - 3);
	var maand = form[deelNaam + 'maand'];
	var jaar = form[deelNaam + 'jaar'];
	
	if (maand == null) {
		alert("Text veld verwacht met naam: " + deelNaam + 'maand');
		isValid = false;
	}
	
	if (jaar == null) {
		alert("Text veld verwacht met naam: " + deelNaam + 'jaar');
		isValid = false;
	}
	
	if (isValid) {
		isValid = validateNumericOnly(form, dag);
	}
	
	if (isValid) {
		isValid = validateNumericOnly(form, maand);
	}

	if (isValid) {
		isValid = validateNumericOnly(form, jaar);
	}
	
	if (isValid) {
		var waarde = dag.value + '-' + maand.value + '-' + jaar.value;
		
		if (isValidDate(dag.value, maand.value, jaar.value)) {
			setHiddenField(form, dag, waarde, 4, 4);
		}
		else {
			alert(ONGELDIGE_DATUM + ': ' + waarde);
		}
	}
	
	return isValid;
}

function validateRequired(field) {
	var isValid = true;
	var i = 0;
	var fields = new Array();

	if (field.type == 'text' || field.type == 'textarea' || field.type == 'file' || field.type == 'select-one' || field.type == 'radio' || field.type == 'password') {
		var value = '';

		// get field's value
		if (field.type == "select-one") {
			var si = field.selectedIndex;
			if (si >= 0) {
				value = field.options[si].value;
			}
		}
		else {
			value = field.value;
		}

		if (trim(value).length == 0) {
			isValid = false;
		}
	}
	
	if (!isValid) {
		alert(NIET_ALLE_VELDEN_INGEVULD);
		field.focus();
	}
	
	return isValid;
}

function setHiddenField(form, field, value, beginIdx, endIdx) {
	var naam = field.name;
	if (endIdx == null) {
		endIdx = naam.length;
	}
	else {
		endIdx = naam.length - endIdx;
	}
	
	var hiddenNaam = naam.substring(beginIdx, endIdx);
	var hiddenVeld = form[hiddenNaam];
	if (hiddenVeld == null) {
		alert('Onverwachte fout: Hidden field verwacht met naam: ' + hiddenNaam);
	}
	else {
		hiddenVeld.value = value;
	}
}

function trim(s) {
	return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

function isValidDate(day, month, year) {
	if (month < 1 || month > 12) {
		return false;
	}
	if (day < 1 || day > 31) {
		return false;
	}
	if ((month == 4 || month == 6 || month == 9 || month == 11) &&
		(day == 31)) {
		return false;
	}
	if (month == 2) {
		var leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day == 29 && !leap)) {
			return false;
		}
	}
	return true;
}