/*
 * Competition Validation
 */

// These constants must be defined somewhere in your page
//
//COMP_ERROR_MESSAGE_TOP = "Please correct the following problems before submitting:";
//COMP_EMAIL_ERROR_MESSAGE = " is not a valid";
//COMP_NOT_NULL_ERROR_MESSAGE = " cannot be empty";
//COMP_AGREE_T_C = "You must agree to the terms and conditions";

function validate_competition(compContainerId) {
	var compContainer = document.getElementById(compContainerId);
	removeHighlights(compContainerId);
	var errorArray = new Array();
	var questionCounter = 0;
	
	/*
	 * validate texts and email addresses
	 */
	var inputElements = compContainer.getElementsByTagName("input");
	for (var i=0; i<inputElements.length; i++) {
		var dniRequired = inputElements[i].getAttribute("dnirequired");
		var dniId = inputElements[i].getAttribute("id");
		if (dniRequired == "COMP_EMAIL_ADDRESS") {
			if(!checkEmail(inputElements[i].value)){
				var dniLabel = inputElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_EMAIL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		} else if (dniRequired == "COMP_TEXT") {
			if(!checkNotNull(inputElements[i].value)){
				var dniLabel = inputElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		} else if (dniRequired == "TERM_CONDITION") {
			if(inputElements[i].checked == false) {
				var dniLabel = COMP_AGREE_T_C;
				errorArray.push({errorMessage: COMP_AGREE_T_C, field: "", errorId: dniId, termCondition: "true"});
			}
		}else if (dniRequired == "COMP_QUESTION") {
            if(!checkNotNull(inputElements[i].value.trim())){
                var dniLabel = inputElements[i].getAttribute("dnilabel");
                errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
            }
        }else if(dniRequired == "COMP_CAPTCHA") {
			if(!checkNotNull(inputElements[i].value.trim())){
				var dniLabel = inputElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: incorrectCaptchaSolution, field: "", errorId:dniId});
			}
		}
	}
	
	/* 
	 * Validate DOB and options
	 */
	var fieldsetElements = compContainer.getElementsByTagName("fieldset");
	for (var i=0; i< fieldsetElements.length; i++) {
		var dniRequired = fieldsetElements[i].getAttribute("dnirequired");
		var dniId = ("comp-field-set-" + i);
		fieldsetElements[i].id = dniId;
		if (dniRequired == "COMP_DDMMYYYY") {
			var dateSelects = fieldsetElements[i].getElementsByTagName("select");
			var datesOK = true;
			for (var j=0; j<dateSelects.length; j++) {
				if (!checkNotNull(dateSelects[j].value)) {
					datesOK = false;
				}
			}
			if (!datesOK) {
				var dniLabel = fieldsetElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		} else if(dniRequired == "COMP_OPTIONS" || dniRequired == "COMP_QUESTION") {
			var radioFields = fieldsetElements[i].getElementsByTagName("input");
			var radioSet = false;
			for (var j=0; j<radioFields.length; j++) {
				if (radioFields[j].checked) {
					radioSet = true;
				}
			}
			if (!radioSet) {
				var dniLabel = fieldsetElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		}
	}
	
	/*
	 * Validate for textareas
	 */
	var textareaElements = compContainer.getElementsByTagName("textarea");
	for (var i=0; i<textareaElements.length; i++) {
		var dniRequired = textareaElements[i].getAttribute("dnirequired");
		var dniId = textareaElements[i].getAttribute("id");
		if (dniRequired == "COMP_QUESTION") {
			if(!checkNotNull(textareaElements[i].value.trim())){
				var dniLabel = textareaElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		}
	}
	
	/*
	 * Validate General Selects
	 */
	var selectElements = compContainer.getElementsByTagName("select");
	for (var i=0; i<selectElements.length; i++) {
		var dniRequired = selectElements[i].getAttribute("dnirequired");
		var dniId = selectElements[i].getAttribute("id");
		if (dniRequired == "COMP_DROPDOWN") {
			if(!checkNotNull(selectElements[i].value.trim())) {
				var dniLabel = selectElements[i].getAttribute("dnilabel");
				errorArray.push({errorMessage: COMP_NOT_NULL_ERROR_MESSAGE, field: dniLabel, errorId: dniId});
			}
		}
	}
	
	/*
	 * build error strings and return fail, or return validation successful
	 */
	if (errorArray.length > 0) {
		buildErrorStrings(errorArray);
		return false;
	} else {
		return true;
	}
	
}

function buildErrorStrings (errorArray) {
	/* This variable is used to ensure that the terms and conditions error message
	 * is only displayed once in the case of multiple terms and conditions
	 * failing to validate.
	 */
	var termsMessageSet = false;
	
	var errorArea = document.getElementById("competition-form-errors");
	clearElementOfChildren(errorArea);
	
	var errorMessage = document.createElement("p");
	errorMessage.innerHTML = COMP_ERROR_MESSAGE_TOP;
	errorArea.appendChild(errorMessage);
	
	var errorList = document.createElement("ul");
	errorList.className = "comp-error-list";
	
	for (var i=0; i<errorArray.length; i++) {
		var errorString = errorArray[i].field;
		if (errorArray[i].termCondition == "true" && !termsMessageSet) {
			errorString += errorArray[i].errorMessage;
			errorList.appendChild(buildErrorListItem(errorString));
			termsMessageSet = true;
		} else if (errorArray[i].termCondition != "true") {
			errorString += errorArray[i].errorMessage;
			errorList.appendChild(buildErrorListItem(errorString));		
		}
		highlightErrorItem(errorArray[i].errorId);
	}
	
	errorArea.appendChild(errorList);
}

function buildErrorListItem(errorString) {
	var listItem = document.createElement("li");
	listItem.className = "comp-error-list-element";
	listItem.innerHTML = errorString;
	return listItem;
}

function highlightErrorItem(errorId) {
	if (errorId != null) {
		var errorElement = document.getElementById(errorId);
		errorElement.style.border = "1px solid red";
		if (errorElement.type == "text") {
			errorElement.style.padding = "1px";
		} else if (errorElement.tagName == "FIELDSET") {
			errorElement.style.padding = "5px"
		}
			
	}
}

function removeHighlights(containerId) {
	
	var container = document.getElementById(containerId);
	var inputList = container.getElementsByTagName("input");
	for (var i=0; i<inputList.length; i++) {
		if (inputList[i].type == "text") {
			inputList[i].style.border = "1px solid #7F9DB9";
		}
	}
	
	var fieldSetList = container.getElementsByTagName("fieldset");
	for (var i=0; i<fieldSetList.length; i++) {
		fieldSetList[i].style.border = "0px";
		fieldSetList[i].style.padding = "0px";
	}
	
	var textAreaList = container.getElementsByTagName("textarea");
	for (var i=0; i<textAreaList.length; i++) {
		textAreaList[i].style.border = "1px solid #7F9DB9";
	}
	
	var selectsList = container.getElementsByTagName("select");
	for (var i=0; i<selectsList.length; i++) {
		selectsList[i].style.border = "1px solid #7F9DB9";
	}
	
}

function checkNotNull(elementString) {
	if (elementString.length > 0 || elementString == null) {
		return true;
	} else {
		return false;
	}
}

var invalid = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;
var valid = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
function checkEmail(emailString) {
	if (!invalid.test(emailString) && valid.test(emailString)) {
		return true;
	} else {
		return false;
	}
}

function clearElementOfChildren(element) {
	while (element.hasChildNodes()) {
		if (element.firstChild.hasChildNodes()) {
			clearElementOfChildren(element.firstChild);
		} else {
			element.removeChild(element.firstChild);
		}
	}
}