var validatedFields;

var freeSimAddressList = new AddressList('freeSim', getFreeSimForm());

function getFreeSimForm() {
	return getElement('FreeSimForm');
}

function submitForm() {
	var result = validateForm();
	if (result && freeSimAddressList.visible && freeSimAddressList.search && (freeSimAddressList.searchChanged || (!freeSimAddressList.list && !freeSimAddressList.editable))) {
		freeSimAddressSearch();
		result = false;
	}
	return result;
}

function validateForm() {
	var isValid = true;
	var form = getFreeSimForm();

	clearFreeSimValidationErrorMessages();

	if (!isNotBlank(form.name) && isNotBlank(form.id)) {
		form.name = form.id;
	}
	// Further validation and submit details.
	isValid = _validateFreeSimForm(form);

	if (!validateNoneOfTheseSelected(freeSimAddressList)) {
		removeFieldEntry(freeSimAddressList.fields.getListSelected().name);
		isValid = false;
	}

	if (!isValid && validatedFields.length > 0) {
		showFreeSimErrorMessages();
	}

	return isValid;
}

//
// Overriding of Struts generated method
//
function _validateFreeSimForm(form) {
	if (bCancel) return true;
	var formValidationResult = validateValidWhenIfNotNull(form);
	formValidationResult = validateRequiredIfNotNull(form) && formValidationResult;
	formValidationResult = validateMinLength(form) && formValidationResult;
	formValidationResult = validateMaxLength(form) && formValidationResult;
	formValidationResult = validateMask(form) && formValidationResult;
	formValidationResult = validateEmail(form) && formValidationResult;
	formValidationResult = validateMaskForNonSpace(form) && formValidationResult;
	formValidationResult = validateRequired(form) && formValidationResult;
	formValidationResult = validateInteger(form) && formValidationResult;

    return (formValidationResult == 1);
}

/**
 * Sets address search flags and performs an address search.
 */
function performAddressSearch() {
	freeSimAddressList.business = true;	// Business addresses should be included to a search result.
	addressSearch(freeSimAddressList, freeSimAddressListHandler, freeSimAddressTimeoutHandler);
}

function freeSimAddressSearch() {
	if (freeSimAddressList.visible) {
		if (validateAddressDetails(freeSimAddressList)) {
			performAddressSearch();
		} else {
			freeSimAddressList.setTooManyMatches();
			freeSimAddressList.draw();
		}
	}
}

/**
 * Show freeSim details errors section
 */
function showFreeSimErrorMessages() {
	drawErrorsList(true, 'freeSimDetailsErrors');
	showValidationErrorMessages();
}
/**
 *  Shows/hides validation messages and errors for form fields.
 */
function showValidationErrorMessages() {
	var fieldName;
	for (var f in validatedFields) {
		// Validation failed for the field
		fieldName = validatedFields[f][0];	// Name of the validated field

		// Show error for field with non valid value
		showError(fieldName, validatedFields[f][1]);
	}
	validatedFields = new Array();		// Clear the fields array
}

function freeSimAddressTimeoutHandler() {
	addressTimeoutHandler(freeSimAddressList);
	freeSimAddressList.draw();
}

/**
 * Shows Free SIM address field group(isVisible = true) or hides (isVisible = false)
 *
 * @param isVisible Flag for showing/hiding a free sim address group.
 */
function drawFreeSimAddress(isVisible) {
	freeSimAddressList.visible = isVisible;
	freeSimAddressList.draw();
}

function switchFreeSimPoscodeUnknown() {
	clearFreeSimValidationErrorMessages();
	freeSimAddressList.switchPostcodeUnknown();
}

/**
 * Sets a step name to the appropriate field and submits the form.
 *
 * @param stepName A step name to set.
 */
function submitWithStep(stepName) {
	var form = getFreeSimForm();
	form["stepName"].value = stepName;
	form.submit();
}

/**
 * AJAX response handler.
 */
function freeSimAddressListHandler() {
	processAddressList(freeSimAddressList);
}

/**
 * Updates address preview when address selected from the list.
 */
function updateFreeSimAddress() {
	freeSimAddressList.update();
}

function clearFreeSimValidationErrorMessages() {
	// Hide freeSim details errors section
	drawErrorsList(false, 'freeSimDetailsErrors');
	// Hide struts errors if javascript errors present in freeSim details section
	drawErrorsList(false, 'freeSimDetailsStruts');
	clearValidationErrorMessages(getFreeSimForm());
}