//////////////////////////////////////////////////////////////////////////////////////////////////////
// TIGER REGFORM
//////////////////////////////////////////////////////////////////////////////////////////////////////

// RegForm object - create an object to store all information about the registration
function RegForm(oForm) {
	this.Form = oForm;
	this.Fields = new Array();
	this.Colleagues = new Array();
	this.MinColleagues = 0;
	this.MaxColleagues = 0;
	this.ColleaguesOnForm = false;
	this.ColleagueButtonDisplayStatusIfNotActive = eDisplayStatus.Disabled;
	this.MinIssueToAlert = eIssueLevel.Warning;
}

// AddField - add a new TigerField object
RegForm.prototype.AddField = function (cFieldName, cNiceName) {
	this.Fields[cFieldName] = new TigerField(cFieldName, cNiceName);
	this.Fields[cFieldName].parent = this;
	this.Fields[cFieldName].Form = this.Form;
	return this.Fields[cFieldName];
}

// AllAddressDataIsBlank - return whether the value of all address fields (add1/add2/town/county) are blank
RegForm.prototype.AllAddressDataIsBlank = function () {
	var lBlank = true;
	for (var Field in this.Fields) {
		var MyField = this.Fields[Field]
		if (MyField.IsAddressField && MyField.GetValue() != "") {
			lBlank = false;
			break;
		}
	}
	return lBlank;
}


// AddColleague - add a new Colleague object
RegForm.prototype.AddColleague = function (cID) {
	if (this.Colleagues.length < this.MaxColleagues || this.MaxColleagues == 0) {
		nColleague = this.Colleagues.length;
		nColleagueRef = nColleague+1;
		if (cID == undefined) {
			cID = "TRC" + nColleagueRef.toString();
		}
		this.Colleagues[nColleague] = new TigerColleague(cID);
		this.Colleagues[nColleague].ColleagueNumber = nColleagueRef;
		this.Colleagues[nColleague].parent = this;
		this.Colleagues[nColleague].Form = this.Form;
		
		if (document.getElementById(cID) == undefined) {
	
			var rowtocopy=document.getElementById("ColleagueTemplate").rows[0];
			
			var mainbody = document.getElementById("ColleagueList");
			var newrow = rowtocopy.cloneNode("true")
			var appended=mainbody.appendChild(newrow)
			appended.id = appended.id.replace(/\~CollNum\~/g, nColleagueRef);
			for (i = 0 ; i < appended.cells.length; i++) {
				var mycell=appended.cells[i];
				for (j=0; j < mycell.attributes.length; j++) {
					if (mycell.attributes[j].value.indexOf("~CollNum~")>0) {
						mycell.attributes[j].value = mycell.attributes[j].value.replace(/\~CollNum\~/g, nColleagueRef);
					}
				}
				mycell.innerHTML=mycell.innerHTML.replace(/\~CollNum\~/g, nColleagueRef);
			}
	
	
	
		} else {
			document.getElementById(cID).style.display = "";
		}
		this.Form.ColleagueCount.value = this.Colleagues.length;
		this.SetColleagueButtonDisplay();
		return this.Colleagues[nColleague];
	}
}

// RemoveLastColleague - remove the last colleague
RegForm.prototype.RemoveLastColleague = function () {
	if (this.Colleagues.length>0 && this.Colleagues.length>this.MinColleagues) {
		this.Colleagues[this.Colleagues.length-1].Remove();
		this.Colleagues.splice(this.Colleagues.length-1,1);
	}
	this.Form.ColleagueCount.value = this.Colleagues.length;
	this.SetColleagueButtonDisplay();
}


RegForm.prototype.SetColleagueButtonDisplay = function () {
		if (this.Colleagues.length <= this.MinColleagues) {
			if (this.ColleagueButtonDisplayStatusIfNotActive == eDisplayStatus.Disabled) {
				document.getElementById("RemoveColleague").disabled = true;
			}
			if (this.ColleagueButtonDisplayStatusIfNotActive == eDisplayStatus.Hidden) {
				document.getElementById("RemoveColleague").style.display = "none";
			}
		} else {
			document.getElementById("RemoveColleague").disabled = false;
			document.getElementById("RemoveColleague").style.display = "";
		}
		if (this.Colleagues.length >= this.MaxColleagues && this.MaxColleagues > 0 ) {
			if (this.ColleagueButtonDisplayStatusIfNotActive == eDisplayStatus.Disabled) {
				document.getElementById("AddColleague").disabled = true;
			}
			if (this.ColleagueButtonDisplayStatusIfNotActive == eDisplayStatus.Hidden) {
				document.getElementById("AddColleague").style.display = "none";
			}
		} else {
			document.getElementById("AddColleague").disabled = false;
			document.getElementById("AddColleague").style.display = "";
		}
}		


// SetAllClasses - loop through all fields, and call the SetClasses method
RegForm.prototype.SetAllClasses = function () {
	for (var Field in this.Fields) {
		this.Fields[Field].SetClasses();
	}
	for (var Colleague in this.Colleagues) {
		this.Colleagues[Colleague].SetAllClasses();
	}
}

// SetAllConditionals - loop through all fields, and call the SetConditionals method
RegForm.prototype.SetAllConditionals = function () {
	for (var Field in this.Fields) {
		this.Fields[Field].SetConditionals();
	}
	for (var Colleague in this.Colleagues) {
		this.Colleagues[Colleague].SetConditionals();
	}
	
}
	
// Validate - Checks for an illegal name change, then loops through each field and 
// calls its Validate method. Collates the results, and displays as appropriate in
// a box on the form and alert popup.

RegForm.prototype.Validate = function () {
	// Loop through all fields
	// If compulsory or validation required, validate. Store results in array, and keep highest issue level
	// set control classes as you go along
	// at the end, if anything to report, set main validation message and pop-up messagebox as appropriate

	var fld, nIssueLevel = 0, nErrorCount = 0, lNameChanged = false;
	var MinIssueLevelToAlert = this.MinIssueLevelToAlert;
	aErrorMessages = new Array();
	aErrorLevels = new Array();


// COMMENTED OUT UNTIL VBSCRIPT STUFF DONE FOR TESTING
	// Check for name change
	var fnfield = this.FirstnameField;
	var lnfield = this.LastnameField;
	var tnfield = this.NametitleField;
	if (fnfield && lnfield) {
		if (NameChanged(fnfield.OrigVal,lnfield.OrigVal,this.Form[fnfield.FieldName].value,this.Form[lnfield.FieldName].value)) {
			lNameChanged = true;
			nErrorCount++;
			nIssueLevel = eIssueLevel.Error;
			aErrorMessages[nErrorCount] = "Sorry, name changes are not allowed! The original name has been restored. You may make minor spelling alterations, but new people must be registered from scratch. If this is a genuine change of name for the same person, please call +44 1923 690690.";
			aErrorLevels[nErrorCount] = eIssueLevel.Error;
			fnfield.SetValue(fnfield.OrigVal);
			lnfield.SetValue(lnfield.OrigVal);
			if (tnfield) tnfield.SetValue(tnfield.OrigVal);
		}
	}

	for (var Field in this.Fields) {
		var MyField = this.Fields[Field]
		if (MyField.IsVisible && !MyField.IsDisabled) {
			MyField.ValidateOnFly(true);
			if (MyField.IssueLevel >= MinIssueLevelToAlert) {
				nErrorCount++;
				if (MyField.IssueLevel > nIssueLevel) nIssueLevel = MyField.IssueLevel;
				aErrorMessages[nErrorCount] = MyField.CurrentErrorMsg;
				aErrorLevels[nErrorCount] = MyField.IssueLevel;
			}
			if (MyField.FieldType == eFieldType.Demog) {
				for (var DemogOption in MyField.DemogOptions) {
					if (MyField.DemogOptions[DemogOption].OtherTextAllowed) {
						MyOther = MyField.DemogOptions[DemogOption].OtherText;
						if (MyOther.IsVisible && !MyOther.IsDisabled) {
							MyOther.ValidateOnFly(true);
							if (MyOther.IssueLevel >= MinIssueLevelToAlert) {
								nErrorCount++;
								if (MyOther.IssueLevel > nIssueLevel) nIssueLevel = MyOther.IssueLevel;
								aErrorMessages[nErrorCount] = MyOther.CurrentErrorMsg;
								aErrorLevels[nErrorCount] = MyOther.IssueLevel;
							}
						}
					}
				}
			}
		}
	}

	if (lNameChanged) {
		this.FirstnameField.IssueLevel = eIssueLevel.Warning;		
		this.FirstnameField.SetClasses();
		this.LastnameField.IssueLevel = eIssueLevel.Warning;		
		this.LastnameField.SetClasses();
	}

	// Colleagues
	if (this.Form.ColleaguesOnForm.value=="Y") {
		var ColleagueValidation, nColleaguesToValidate = this.MinColleagues
		// Calculate how many colleagues to validate. At least the 'minimum colleagues', then if any others have any of the compulsory fields completed, all records up to there are validated
		if (this.Colleagues.length > this.MinColleagues) {
			for (var i = this.Colleagues.length; i > this.MinColleagues; i--) {
				for (var Field in this.Colleagues[i-1].Fields) {
					var MyField = this.Colleagues[i-1].Fields[Field]
					if (MyField.IsVisible && !MyField.IsDisabled && MyField.Compulsory) {
						MyField.Validate(false);
						if (MyField.IssueLevel == eIssueLevel.None) {
							nColleaguesToValidate = i;
							break;
						}
					}
				}
			}
		}
		
		for (var k=0; k<nColleaguesToValidate; k++) {
			ColleagueValidation = this.Colleagues[k].Validate();
			for (var j = 1; j <= ColleagueValidation.ErrorCount; j++) {
				nErrorCount++;
				aErrorMessages[nErrorCount] = "Colleague "+ (k+1).toString() + " - "+ColleagueValidation.ErrorMessages[j]
				aErrorLevels[nErrorCount] = ColleagueValidation.ErrorLevels[j]
			}
			if (ColleagueValidation.IssueLevel > nIssueLevel) nIssueLevel = ColleagueValidation.IssueLevel;
	
		}
		
		for (var k=nColleaguesToValidate; k < this.Colleagues.length; k++) {
			this.Colleagues[k].ClearValidation();
		}
	}

	if (nIssueLevel > 0) {
		return this.DisplayValidationErrors(nErrorCount, nIssueLevel, aErrorMessages, aErrorLevels);
	} else {
		this.HideValidationMessage();
	}
	
	return true;


}


RegForm.prototype.Cancel = function (cRedirectPage) {
	if (confirm(this.CancelMessage+"\n")) document.location.href = cRedirectPage;
}

RegForm.prototype.DisplayValidationErrors = function (nErrorCount, nIssueLevel, aErrorMessages, aErrorLevels) {

	var msg, i

	if (nIssueLevel == 1) return true;

	if (nIssueLevel == 2) {
		if (this.AlertMessageOnValidateBeforeSubmit) {
			msg = this.GeneralValidationAlertHeaderWarning+"\n";
			for (i=1; i<=nErrorCount; i++) {
				msg = msg + "* "+aErrorMessages[i]+"\n";
			}
			msg = msg+this.GeneralValidationAlertFooterWarning+"\n";
			var answer = confirm(msg);
			if (answer) return true;
		} else {
			return true;
		}
	} else {
		if (this.AlertMessageOnValidateBeforeSubmit) {
			msg = this.GeneralValidationAlertHeaderError+"\n";
			for (i=1; i<=nErrorCount; i++) {
				msg = msg + "* "+aErrorMessages[i]+"\n";
			}
			msg = msg+this.GeneralValidationAlertFooterError+"\n";
			alert(msg);
		}	
	}

	if (this.ShowMessageOnValidateBeforeSubmit) {
		var msg = "<P>"+this.GeneralValidationMessageHeader+"</p><ul>";
		validmsg = document.getElementById("GeneralValidationMessage");
		if (validmsg != undefined) {
			for (var i=1; i<=nErrorCount; i++) {
				msg = msg + '<li class="tigerissuelevel'+ aErrorLevels[i] +'">'+aErrorMessages[i]+'</li>'
			}
			msg = msg+"</UL>"
		
			validmsg.innerHTML = msg;
			validmsg.style.display = "block";
		}
	}	

	return false;

}
	

RegForm.prototype.HideValidationMessage = function () {
	validmsg = document.getElementById("GeneralValidationMessage");
	if (validmsg != undefined) {
		validmsg.style.display = "none";
	}
}

RegForm.prototype.JumpToStep = function (page) {
	this.Form.JumpToStep.value = page;
	this.Form.submit();
}
