//////////////////////////////////////////////////////////////////////////////////////////////////////
// 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.DataHasChanged = 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;
}


RegForm.prototype.ConfirmNavigate = function(cURL) {
	if (this.DataHasChanged) {
		
	}
	
	// If datachanged, show a confirmation box before navigating, otherwise, just navigate.
	// try to ensure that this will still navigate even if JS disabled! (prob need to write the page differently based on previous knowledge about the browser)
	
}


RegForm.prototype.DataChanged = function () {
	this.DataHasChanged = true;
}

// 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)) {
			if (this.UserRole <= eRole.OnsiteUser) {
				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 contact us.";
				aErrorLevels[nErrorCount] = eIssueLevel.Error;
				fnfield.SetValue(fnfield.OrigVal);
				lnfield.SetValue(lnfield.OrigVal);
				if (tnfield) tnfield.SetValue(tnfield.OrigVal);
			} else {
				var answer = confirm("Name changes are usually not allowed. \nIf someone is coming in place of the original person, you should add a new record.\n\nAre you sure you wish to continue with this name change?");
				if (!answer) {
					fnfield.SetValue(fnfield.OrigVal);
					lnfield.SetValue(lnfield.OrigVal);
					if (tnfield) tnfield.SetValue(tnfield.OrigVal);
					lNameChanged = false;
					return false;
				}
			}
		}
	}

	for (var Field in this.Fields) {
		var MyField = this.Fields[Field]
		if (MyField.IsVisible && !MyField.IsDisabled) {
			MyField.Validate(true);
			MyField.SetClasses();
			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) {
							if (nColleaguesToValidate < i) 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) {
		if (this.DisplayValidationErrors(nErrorCount, nIssueLevel, aErrorMessages, aErrorLevels)) {
	document.getElementById("Submit-Forward").disabled = true;
//			document.getElementById("Submit-Back").disabled=true;
//			document.getElementById("Submit-Cancel").disabled=true;
			return true;
		} else {
			return false;
		}
	} else {
		this.HideValidationMessage();
	}
	
	document.getElementById("Submit-Forward").disabled = true;
//	document.getElementById("Submit-Back").disabled=true;
//	document.getElementById("Submit-Cancel").disabled=true;
	return true;


}

RegForm.prototype.confirmSubmit = function(cRedirectPageSuccess,cRedirectPageFail)
{
				
		var agree=confirm("Are you sure you wish to reset this users password?");
		var sTargetURL = ""
		if (agree){
			var sTargetURL = cRedirectPageSuccess	
		}
		else
		{			
			var sTargetURL = cRedirectPageFail
		}
		document.location.href = sTargetURL
}

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();
}

