var modules;
var errorModule;

var startPage = 1;
var moduleCount = 9;

YAHOO.util.Event.addListener(window, "load", InitializeMultiPageForm);

function InitializeMultiPageForm()
{
	modules = new Array();

	for(index = startPage; index <= moduleCount; index++)
	{
		modules.push(InitializePage(index));
	}

	errorModule = new YAHOO.widget.Module(
		"divErrors",
		{
			visible: false
		});
	errorModule.render();

	InitializeNavigation();
	InitializeValidation();

	modules[0].show();
}

function InitializePage(
	pageIndex)
{
	var module = new YAHOO.widget.Module(
		"page" + pageIndex,
		{
			visible: false
		});

	module.render();

	return module;
}

function InitializeNavigation()
{
	for(var index = 1; index < modules.length; index++)
	{
		pageID = index + 1;

		YAHOO.util.Event.addListener(
			"page" + pageID + "Previous",
			"click",
			modules[index - 1].show,
			modules[index - 1],
			true);
		YAHOO.util.Event.addListener(
			"page" + pageID + "Previous",
			"click",
			modules[index].hide,
			modules[index],
			true);
	}

	for(var index = 0; index < modules.length - 1; index++)
	{
		pageID = index + 1;

		/*
		YAHOO.util.Event.addListener(
			"page" + pageID + "Next",
			"click",
			modules[index + 1].show,
			modules[index + 1],
			true);
		YAHOO.util.Event.addListener(
			"page" + pageID + "Next",
			"click",
			modules[index].hide,
			modules[index],
			true);
		*/
	}
}

var requiredFields = new Array();

function InitializeValidation()
{
	requiredFields.push(InitializeValidationItem(
		"page1",
		"dlAgentBroker",
		"Are you a Real Estate Broker or Agent?",
		"required"));

	requiredFields.push(InitializeValidationItem(
		"page2",
		"dlCorporate",
		"Is this purchase for personal or corporate use?",
		"required"));

	requiredFields.push(InitializeValidationItem(
		"page3",
		"dlSalutation",
		"Salutation",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"txtFirstName",
		"First Name",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"txtLastName",
		"Last Name",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"txtAddress1",
		"Address",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"dlCountry",
		"Country",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"txtCountry",
		"Country",
		"requiredWhen[dlCountry=99]"));
	requiredFields.push(InitializeValidationItem(
		"page3",
		"txtPostalCode",
		"ZIP/Postal Code",
		"required,postalCode[dlCountry]"));

	requiredFields.push(InitializeValidationItem(
		"page4",
		"txtEmail",
		"E-mail Address",
		"required,email"));
	requiredFields.push(InitializeValidationItem(
		"page4",
		"txtEmailConfirm",
		"Confirm E-mail Address",
		"required,email,match[txtEmail]"));
	requiredFields.push(InitializeValidationItem(
		"page4",
		"txtPassword",
		"Password",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page4",
		"txtPasswordConfirm",
		"Confirm Password",
		"required,match[txtPassword]"));

	requiredFields.push(InitializeValidationItem(
		"page5",
		"custom",
		"",
		"ValidatePhoneNumbers();"));

	requiredFields.push(InitializeValidationItem(
		"page5",
		"txtHABroker",
		"How did you hear about us?",
		"requiredWhen[dlHearAboutBroker=Other]"));

	requiredFields.push(InitializeValidationItem(
		"page6",
		"cbInterestedResidence",
		"I am interested in purchasing",
		"atLeastOne[cblInterested]"));
	requiredFields.push(InitializeValidationItem(
		"page6",
		"cbReasonPrimary",
		"Reason for Purchase",
		"atLeastOne[cblReason]"));
	requiredFields.push(InitializeValidationItem(
		"page6",
		"dlWhenPurchase",
		"How soon are you planning to purchase",
		"required"));

	requiredFields.push(InitializeValidationItem(
		"page7",
		"chkHotelRoomsStudio",
		"Type of property",
		"atLeastOne[cblRoom]"));

	requiredFields.push(InitializeValidationItem(
		"page8",
		"chkAmenityHotelHousekeeping",
		"Amenities and Services",
		"atLeastOne[cblAmenity]"));

	requiredFields.push(InitializeValidationItem(
		"page9",
		"dlVisitFrequency",
		"How often do you visit Toronto",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page9",
		"dlHowHear",
		"How did you hear about us",
		"required"));
	requiredFields.push(InitializeValidationItem(
		"page9",
		"txtHAConsumer",
		"How did you hear about us",
		"requiredWhen[dlHowHear=Other]"));

}

function InitializeValidationItem(
	pageName,
	elementName,
	friendlyName,
	validators)
{
	return {
		pageName: pageName,
		elementName: elementName,
		friendlyName: friendlyName,
		validators: validators
	};
}

function ValidatePage(pageName)
{
	var errors = "";

	for(var itemIndex = 0; itemIndex < requiredFields.length; itemIndex++)
	{
		var validationItem = requiredFields[itemIndex];

		// alert("Comparing " + validationItem.pageName + " to " + pageName);
		isValid = true;

		if(validationItem.pageName == pageName)
		{
			if(validationItem.elementName == "custom")
			{
				// alert("Custom validator");
				eval("errors = errors + " + validationItem.validators);

				continue;
			}

			var itemValue = GetItemValue(validationItem.elementName);

			var validators = validationItem.validators.split(",");

			for(var validatorIndex = 0; validatorIndex < validators.length; validatorIndex++)
			{
				var validator = validators[validatorIndex];

				if(isValid)
				{
					if(validator.indexOf("requiredWhen") == 0)
					{
						var validatorArguments = validator.split("[");
						validatorArguments = validatorArguments[1].split("]");
						validatorArguments = validatorArguments[0].split("&");

						for(var argumentIndex = 0; argumentIndex < validatorArguments.length; argumentIndex++)
						{
							var validatorArgument = validatorArguments[argumentIndex];
							var keyValue = validatorArgument.split("=");
							var conditionalValue = GetItemValue(keyValue[0]);

							// alert("Comparing '" + conditionalValue + "' to '" + keyValue[1] + "'");
							// alert((conditionalValue == keyValue[1]) + "\n" + (trim(itemValue) == ""));

							if(conditionalValue == keyValue[1] && trim(itemValue) == "")
							{
								// alert("Conditional requirement error");
								errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is required.</li>";
								isValid = false;
							}
						}
					}
					else if(validator.indexOf("required") == 0)
					{
						if(trim(itemValue) == "")
						{
							errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is required.</li>";
							isValid = false;
						}
					}
					else if(validator.indexOf("postalCode") == 0)
					{
						var validatorArguments = validator.split("[");
						validatorArguments = validatorArguments[1].split("]");
						validatorArguments = validatorArguments[0].split("&");

						for(var argumentIndex = 0; argumentIndex < validatorArguments.length; argumentIndex++)
						{
							var validatorArgument = validatorArguments[argumentIndex];
							var keyValue = validatorArgument.split("=");
							var conditionalValue = GetItemValue(keyValue[0]);

							switch(conditionalValue)
							{
								case "CA":
									if(!itemValue.match(/^([A-Za-z]\d[A-Za-z]( |-|)\d[A-Za-z]\d)$/))
									{
										errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is not a valid Canadian Postal Code.</li>";
										isValid = false;
									}

									break;

								case "US":
									if(!itemValue.match(/^(\d{5}(( |-)\d{4})?)$/))
									{
										errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is not a valid American ZIP Code.</li>";
										isValid = false;
									}

									break;
							}
						}
					}
					else if(validator.indexOf("email") == 0)
					{
						if(!itemValue.match(/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/))
						if(!itemValue.match(/^([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b)$/))
						//if(!itemValue.match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-].)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/))
						{
							errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is not a valid e-mail address.</li>";
							isValid = false;
						}
					}
					else if(validator.indexOf("match") == 0)
					{
						var validatorArguments = validator.split("[");
						validatorArguments = validatorArguments[1].split("]");
						validatorArguments = validatorArguments[0].split("&");

						for(var argumentIndex = 0; argumentIndex < validatorArguments.length; argumentIndex++)
						{
							var validatorArgument = validatorArguments[argumentIndex];
							var keyValue = validatorArgument.split("=");
							var conditionalValue = GetItemValue(keyValue[0]);

							if(conditionalValue !== itemValue)
							{
								errors = errors + "<li><b>" + validationItem.friendlyName + "</b> must match.</li>";
								isValid = false;
							}
						}
					}
					else if(validator.indexOf("atLeastOne") == 0)
					{
						var validatorArguments = validator.split("[");
						validatorArguments = validatorArguments[1].split("]");

						selectedCount = 0;

						for(var optionIndex = 0; optionIndex < document.frm[validatorArguments[0] + "[]"].length; optionIndex++)
						{
							option = document.frm[validatorArguments[0] + "[]"][optionIndex];

							if(option.checked) selectedCount++;
						}

						if(selectedCount <= 0)
						{
							errors = errors + "<li><b>" + validationItem.friendlyName + "</b> is required.</li>";
							isValid = false;
						}
					}
				}
			}
		}
	}

	return errors;
}

function ValidateCompletePhoneNumber(prefix, friendlyName)
{
	var errors = "";

	itemsProvided = PhoneNumberItemsProvided(prefix);

	if(itemsProvided > 0 && itemsProvided < 3)
	{
		errors = errors + "<li>Provide your full <b>" + friendlyName + "</b> with area code.</li>";
	}

	return errors;
}

function ValidatePhoneNumbers()
{
	var errors = "";

	// alert("ValidatePhoneNumbers start");

	errors = errors + ValidateCompletePhoneNumber("PhOf", "Office Phone Number");
	errors = errors + ValidateCompletePhoneNumber("PhHo", "Home Phone Number");
	errors = errors + ValidateCompletePhoneNumber("PhFa", "Fax Number");
	errors = errors + ValidateCompletePhoneNumber("PhCe", "Cell Phone Number");

	if(PhoneNumberItemsProvided("PhOf") + PhoneNumberItemsProvided("PhHo") + PhoneNumberItemsProvided("PhFa") + PhoneNumberItemsProvided("PhCe") <= 0)
	{
		errors = errors + "<li>At least one <b>Phone Number</b> is required.</li>";
	}

	// alert("ValidatePhoneNumbers fin");

	return errors;
}

function PhoneNumberItemsProvided(prefix)
{
	areaCode = document.getElementById(prefix + "AC");
	exchange = document.getElementById(prefix + "3d");
	number = document.getElementById(prefix + "4d");

	// alert(trim(areaCode.value).length);

	hasAreaCode = trim(areaCode.value).length > 0 ? 1 : 0;
	hasExchange = trim(exchange.value).length > 0 ? 1 : 0;
	hasNumber = trim(number.value).length > 0 ? 1 : 0;

	return hasAreaCode + hasExchange + hasNumber;
}

function GetItemValue(elementName)
{
	var item = document.getElementById(elementName);
	var itemValue = "";

	if(!item)
	{
		alert("Cannot find element " + elementName);
	}

	switch(item.type)
	{
		case "select-one":
			itemValue = item.options[item.selectedIndex].value;
			break;

		case "text":
		case "password":
		case "checkbox":
			itemValue = item.value;
			break;

		default:
			alert("Unsupported type " + item.type + " for " + elementName);
	}

	return itemValue;
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function NextPage(pageName)
{
	var errors = ValidatePage(pageName);

	// alert("'" + errors.length + "'");

	if(errors.length > 0)
	{
		document.getElementById("errors").innerHTML = errors;
		errorModule.show();
	}
	else
	{
		// Broker submissions end at page 5.
		// Consumer submissions continue on to page 9.
		if(pageName == "page5" && GetItemValue("dlAgentBroker") == "Yes")
		{
			SubmitForm(pageName);
		}

		errorModule.hide();

		pageIndex = pageName.replace("page", "");
		modules[pageIndex].show();
		modules[pageIndex - 1].hide();
	}
}

function SubmitForm(pageName)
{
	var errors = ValidatePage(pageName);

	// alert("'" + errors.length + "'");

	if(errors.length > 0)
	{
		document.getElementById("errors").innerHTML = errors;
		errorModule.show();
	}
	else
	{
		document.frm.submit();
	}
}

function ToggleBrokerHearAbout(dropdown)
{
	// alert(dropdown.options[dropdown.selectedIndex].value);

	if(dropdown.options[dropdown.selectedIndex].value == "Yes")
	{
		// alert("Showing broker hear about");
		document.getElementById("brokerHearAbout").style.visibility = "visible";
		document.getElementById("brokerHearAbout").style.display = "block";
	}
	else
	{
		// alert("Hiding broker hear about");
		document.getElementById("brokerHearAbout").style.visibility = "hidden";
		document.getElementById("brokerHearAbout").style.display = "none";
	}
}

