// $Id$
// JS-LINT ran: 09/02/2008 gene

/////////////////////////////////////////////////////////////////////
// OnlineBorrowerRegistrationView
/////////////////////////////////////////////////////////////////////

OnlineBorrowerRegistrationView = function(divId) {

	var formData;
	var printFrame = null;
	var refreshTimeout = null;

	var constants = {
		invalidSelectValue: '-1'
	};
	var fieldNames = {
		title: 'Title',
		firstName: 'First Name',
		middleName: 'Middle Name',
		lastName: 'Last Name',
		suffix: 'Suffix',
		streetAddress: 'Street Address',
		city: 'City',
		state: 'State',
		zipCode: 'Zip Code',
		dateOfBirth: 'Date Of Birth',
		gender: 'Gender',
		desiredHomeLocation: 'Desired Home Location',
		phone: 'Phone',
		secondaryPhone: 'Secondary Phone',
		email: 'E-Mail',
		confirmEmail: 'Confirm E-Mail',
		sendAConfirmationEmail: 'Send a confirmation e-mail',
		pin: 'PIN',
		confirmPin: 'Confirm PIN',
		iWillPickUpMyCard: 'I will pick up my card.',
		sendMeMyCard: 'Send me my card.',
		jcap: 'Enter the code as it is shown (required):'
	};
	var ids = {
		wrapper: 'wrapper',
		content: 'content',
		banner: 'banner',
		banner2: 'banner2',
		titleLabel: 'titleLabel',
		titleText: 'titleText',
		firstNameLabel: 'firstNameLabel',
		firstNameText: 'firstNameText',
		middleNameLabel: 'middleNameLabel',
		middleNameText: 'middleNameText',
		lastNameLabel: 'lastNameLabel',
		lastNameText: 'lastNameText',
		suffixLabel: 'suffixLabel',
		suffixText: 'suffixText',
		streetAddressLabel: 'streetAddressLabel',
		streetAddressText: 'streetAddressText',
		cityLabel: 'cityLabel',
		cityText: 'cityText',
		stateLabel: 'stateLabel',
		stateText: 'stateText',
		zipcodeLabel: 'zipcodeLabel',
		zipcodeText: 'zipcodeText',
		dateOfBirthLabel: 'dateOfBirthLabel',
		dateOfBirthMonthSelect: 'dateOfBirthMonthSelect',
		dateOfBirthDaySelect: 'dateOfBirthDaySelect',
		dateOfBirthYearSelect: 'dateOfBirthYearSelect',
		genderLabel: 'genderLabel',
		genderSelect: 'genderSelect',
		desiredHomeLocationLabel: 'desiredHomeLocationLabel',
		desiredHomeLocationSelect: 'desiredHomeLocationSelect',
		phoneLabel: 'phoneLabel',
		phoneText1: 'phoneText1',
		phoneText2: 'phoneText2',
		phoneText3: 'phoneText3',
		secondaryPhoneLabel: 'secondaryPhoneLabel',
		secondaryPhoneText1: 'secondaryPhoneText1',
		secondaryPhoneText2: 'secondaryPhoneText2',
		secondaryPhoneText3: 'secondaryPhoneText3',
		eMailLabel: 'eMailLabel',
		eMailText: 'eMailText',
		eMailConfirmLabel: 'eMailConfirmLabel',
		eMailConfirmText: 'eMailConfirmText',
		eMailNotifyCheck: 'eMailNotifyCheck',
		eMailNotifyLabel: 'eMailNotifyLabel',
		pinLabel: 'pinLabel',
		pinText: 'pinText',
		pinConfirmLabel: 'pinConfirmLabel',
		pinConfirmText: 'pinConfirmText',
		iWillPickUpMyCardLabel: 'iWillPickUpMyCardLabel',
		sendMeMyCardLabel: 'sendMeMyCardLabel',
		iWillPickUpMyCardRadio: 'iWillPickUpMyCardRadio',
		sendMeMyCardRadio: 'sendMeMyCardRadio',
		jcapLabel: 'jcapLabel'
	};
	var classes = {
		searchform: 'searchform',
		searchformselect: 'searchformselect',
		banner: 'banner',
		banner2: 'banner2',
		lineWrapper: 'lineWrapper',
		title: 'obr_title',
		firstname: 'firstname',
		middlename: 'middlename',
		lastname: 'lastname',
		suffix: 'suffix',
		street: 'street',
		city: 'city',
		state: 'state',
		zip: 'zip',
		dob: 'dob',
		gender: 'gender',
		homeLocation: 'homeLocation',
		phone: 'phone',
		phoneText1: 'phoneText1',
		phoneText2: 'phoneText2',
		phoneText3: 'phoneText3',
		email: 'email',
		pin: 'pin',
		mailMyCard: 'mailMyCard',
		iWillPickUpMyCard: 'iWillPickUpMyCard',
		sendMeMyCard: 'sendMeMyCard',
		obr_submit: 'obr_submit',
		jcap: 'jcap'
	};
	var mappedParams = [
		{id: ids.firstNameText, varName: 'firstName'},
		{id: ids.lastNameText, varName: 'lastName'},
		{id: ids.streetAddressText, varName: 'address1'},
		{id: ids.cityText, varName: 'city'},
		{id: ids.stateText, varName: 'state'},
		{id: ids.zipcodeText, varName: 'zipcode'},
		{id: ids.desiredHomeLocationSelect, varName: 'homeBranch'},
		{id: ids.middleNameText, varName: 'middleName'},
		{id: ids.titleText, varName: 'nameTitle'},
		{id: ids.suffixText, varName: 'nameSuffix'},
		{id: ids.genderSelect, varName: 'gender'},
		{id: ids.eMailText, varName: 'email'},
		{id: ids.pinText, varName: 'pin'}
	];

	this.init = function() {
		var _this = this;
		onlineBorrowerRegistrationManagerDwr.getFormData(function(data) {
			formData = data;
			sortBranches(formData.allBranches);

			loadPacHeaderImg();

			var mainDiv = $j('#' + divId);

			var wrapperDiv = $j('<div></div>').attr('id', ids.wrapper);

			var contentDiv = $j('<div></div>').attr('id', ids.content);
			contentDiv.append($j('<div align="center"></div>').attr('id', ids.banner).addClass(classes.banner).append('Online Borrower Registration'));

			var lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
			lineWrapper.append(
				$j('<div></div>').addClass(classes.title)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.title).attr('id', ids.titleLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.titleText).attr('maxlength', '20').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.firstname)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.firstName).attr('id', ids.firstNameLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.firstNameText).attr('maxlength', '50').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.middlename)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.middleName).attr('id', ids.middleNameLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.middleNameText).attr('maxlength', '50').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.lastname)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.lastName).attr('id', ids.lastNameLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.lastNameText).attr('maxlength', '50').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.suffix)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.suffix).attr('id', ids.suffixLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.suffixText).attr('maxlength', '20').attr('size', '2').addClass(classes.searchform))
					)
			);
			contentDiv.append(lineWrapper);

			lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
			lineWrapper.append(
				$j('<div></div>').addClass(classes.street)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.streetAddress).attr('id', ids.streetAddressLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.streetAddressText).attr('maxlength', '50').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.city)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.city).attr('id', ids.cityLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.cityText).attr('maxlength', '30').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.state)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.state).attr('id', ids.stateLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.stateText).attr('maxlength', '30').addClass(classes.searchform))
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.zip)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.zipCode).attr('id', ids.zipcodeLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="text"></input>').attr('id', ids.zipcodeText).attr('maxlength', '10').attr('size', '8').addClass(classes.searchform))
					)
			);
			contentDiv.append(lineWrapper);

			lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
			lineWrapper.append(
				$j('<div></div>').addClass(classes.dob)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.dateOfBirth).attr('id', ids.dateOfBirthLabel))
					)
					.append($j('<select></select>').addClass(classes.searchformselect).attr('id', ids.dateOfBirthMonthSelect)
						.append($j('<option></option>').val('-1').text('Month'))
						.append($j('<option></option>').val('01').text('January'))
						.append($j('<option></option>').val('02').text('February'))
						.append($j('<option></option>').val('03').text('March'))
						.append($j('<option></option>').val('04').text('April'))
						.append($j('<option></option>').val('05').text('May'))
						.append($j('<option></option>').val('06').text('June'))
						.append($j('<option></option>').val('07').text('July'))
						.append($j('<option></option>').val('08').text('August'))
						.append($j('<option></option>').val('09').text('September'))
						.append($j('<option></option>').val('10').text('October'))
						.append($j('<option></option>').val('11').text('November'))
						.append($j('<option></option>').val('12').text('December'))
					)
					.append($j('<select></select>').addClass(classes.searchformselect).attr('id', ids.dateOfBirthDaySelect)
						.append($j('<option></option>').val('-1').text('Day'))
					)
					.append($j('<select></select>').addClass(classes.searchformselect).attr('id', ids.dateOfBirthYearSelect)
						.append($j('<option></option>').val('-1').text('Year'))
					)
			);

			var daySelect = $j('#' + ids.dateOfBirthDaySelect, lineWrapper);
			for(var dayIndex = 1; dayIndex <= 31; ++dayIndex) {
				daySelect.append($j('<option value="' + ((dayIndex < 10) ? '0' : '') + dayIndex + '">' + dayIndex + '</option>'));
			}

			var yearSelect = $j('#' + ids.dateOfBirthYearSelect, lineWrapper);
			for(var yearIndex = new Date().getFullYear(); yearIndex >= 1900; --yearIndex) {
				yearSelect.append($j('<option value="' + yearIndex + '">' + yearIndex + '</option>'));
			}

			lineWrapper.append(
				$j('<div></div>').addClass(classes.gender)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.gender).attr('id', ids.genderLabel))
					)
					.append($j('<div></div>')
						.append($j('<select></select>').addClass(classes.searchformselect).attr('id', ids.genderSelect)
							.append($j('<option></option>').val('Unspecified').text('Unspecified'))
							.append($j('<option></option>').val('Female').text('Female'))
							.append($j('<option></option>').val('Male').text('Male'))
						)
					)
			);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.homeLocation)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.desiredHomeLocation).attr('id', ids.desiredHomeLocationLabel))
					)
					.append($j('<div></div>')
						.append($j('<select></select>').addClass(classes.searchformselect).attr('id', ids.desiredHomeLocationSelect)
							.append($j('<option ></option>').val('-1').text('Please select a location'))
						)
					)
			);

			var locationSelect = $j('#' + ids.desiredHomeLocationSelect, lineWrapper);
			for(var locationIndex = 0; locationIndex < formData.allBranches.length; ++locationIndex) {
				locationSelect.append($j('<option value="' + formData.allBranches[locationIndex].identifier + '">' + formData.allBranches[locationIndex].displayName + '</option>'));
			}
			contentDiv.append(lineWrapper);

			lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
			lineWrapper.append(
				$j('<div></div>').addClass(classes.phone)
					.append($j('<div></div>')
						.append($j('<div></div>')
							.append($j('<label></label>').text(fieldNames.phone).attr('id', ids.phoneLabel))
						)
						.append($j('<div></div>')
							.append('(')
							.append($j('<input type="text"></input>').addClass(classes.phoneText1).attr('id', ids.phoneText1).attr('maxlength', '3').attr('size', '3').addClass(classes.searchform))
							.append(')')
							.append($j('<input type="text"></input>').addClass(classes.phoneText2).attr('id', ids.phoneText2).attr('maxlength', '3').attr('size', '3').addClass(classes.searchform))
							.append('-')
							.append($j('<input type="text"></input>').addClass(classes.phoneText3).attr('id', ids.phoneText3).attr('maxlength', '4').attr('size', '4').addClass(classes.searchform))
						)
						.append($j('<div></div>')
							.append($j('<label></label>').text(fieldNames.secondaryPhone).attr('id', ids.secondaryPhoneLabel))
						)
						.append($j('<div></div>')
							.append('(')
							.append($j('<input type="text"></input>').addClass(classes.phoneText1).attr('id', ids.secondaryPhoneText1).attr('maxlength', '3').attr('size', '3').addClass(classes.searchform))
							.append(')')
							.append($j('<input type="text"></input>').addClass(classes.phoneText2).attr('id', ids.secondaryPhoneText2).attr('maxlength', '3').attr('size', '3').addClass(classes.searchform))
							.append('-')
							.append($j('<input type="text"></input>').addClass(classes.phoneText3).attr('id', ids.secondaryPhoneText3).attr('maxlength', '4').attr('size', '4').addClass(classes.searchform))
						)
					)
			);

			var emailDiv = $j('<div></div>').addClass(classes.email);
			emailDiv
				.append($j('<div></div>')
					.append($j('<label></label>').text(fieldNames.email).attr('id', ids.eMailLabel))
				)
				.append($j('<div></div>')
					.append($j('<input type="text"></input>').attr('id', ids.eMailText).attr('maxlength', '100').addClass(classes.searchform))
				)
				.append($j('<div></div>')
					.append($j('<label></label>').text(fieldNames.confirmEmail).attr('id', ids.eMailConfirmLabel))
				)
				.append($j('<div></div>')
					.append($j('<input type="text"></input>').attr('id', ids.eMailConfirmText).attr('maxlength', '100').addClass(classes.searchform))
				);
			if((formData.emailActive === true) && (formData.obrConfigDwr.allowSendEmailConfirmation === true)) {
				emailDiv.append($j('<input type="checkbox"></input>').attr('id', ids.eMailNotifyCheck).addClass(classes.searchform));
				emailDiv.append($j('<label></label>').text(fieldNames.sendAConfirmationEmail).attr('id', ids.eMailNotifyLabel))
			}
			lineWrapper.append(emailDiv);

			lineWrapper.append(
				$j('<div></div>').addClass(classes.pin)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.pin + ' (8 character max)').attr('id', ids.pinLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="password"></input>').attr('id', ids.pinText).attr('maxlength', '8').addClass(classes.searchform))
					)
					.append($j('<div></div>')
						.append($j('<label></label>').text(fieldNames.confirmPin).attr('id', ids.pinConfirmLabel))
					)
					.append($j('<div></div>')
						.append($j('<input type="password"></input>').attr('id', ids.pinConfirmText).attr('maxlength', '8').addClass(classes.searchform))
					)
			);
			contentDiv.append(lineWrapper);

			if(formData.obrConfigDwr.allowCardToBeMailed === true) {
				lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
				lineWrapper.append(
					$j('<div></div>').addClass(classes.mailMyCard)
						.append($j('<div></div>').addClass(classes.iWillPickUpMyCard)
							.append($j('<input type="radio" name="mailMyCard"></input>').attr('id', ids.iWillPickUpMyCardRadio).attr('checked', true).change(onMailMyCardCheck))
							.append($j('<label></label>').text(fieldNames.iWillPickUpMyCard).attr('id', ids.iWillPickUpMyCardLabel))
						)
						.append($j('<div></div>').addClass(classes.sendMeMyCard)
							.append($j('<input type="radio" name="mailMyCard"></input>').attr('id', ids.sendMeMyCardRadio).attr('checked', false).change(onMailMyCardCheck))
							.append($j('<label></label>').text(fieldNames.sendMeMyCard).attr('id', ids.sendMeMyCardLabel))
						)
				);
				contentDiv.append(lineWrapper);
			}

			lineWrapper = $j('<div></div>').addClass(classes.lineWrapper);
			if(formData.obrConfigDwr.jcapCaptchasOn === true) {
				var jcapInfo = sjcap();
				lineWrapper.append(
					$j('<div></div>').addClass(classes.jcap)
						.append($j('<div></div>')
							.append($j('<label></label>').text(fieldNames.jcap).attr('id', ids.jcapLabel))
						)
						.append($j('<div></div>')
							.append($j('<input type="text"></input>').attr('id', jcapVars.jfldid).addClass(classes.searchform))
						)
						.append($j('<div></div>')
							.append($j('<img></img>').attr('src', jcapInfo.src).attr('width', jcapInfo.width).attr('height', jcapInfo.height))
						)
				);
			}

			lineWrapper.append(
				$j('<div></div>').addClass(classes.obr_submit)
					.append($j('<input type="button"></input>').addClass('searchform button clickable submit').val('Submit').click(registerBorrower))
			);
			contentDiv.append(lineWrapper);

			wrapperDiv.append(contentDiv);

			mainDiv.append(wrapperDiv);

			addValidationDecoration();

			initAutoRefresh();
		});
	};

	this.update = function() {
	};

	var addValidationDecoration = function() {
		var labelsToDecorate = [];
		if(formData.obrConfigDwr.titleRequired === true) {
			labelsToDecorate.push(ids.titleLabel);
		}
		if(formData.obrConfigDwr.firstNameRequired === true) {
			labelsToDecorate.push(ids.firstNameLabel);
		}
		if(formData.obrConfigDwr.middleNameRequired === true) {
			labelsToDecorate.push(ids.middleNameLabel);
		}
		if(formData.obrConfigDwr.lastNameRequired === true) {
			labelsToDecorate.push(ids.lastNameLabel);
		}
		if(formData.obrConfigDwr.suffixRequired === true) {
			labelsToDecorate.push(ids.suffixLabel);
		}
		// if(formData.obrConfigDwr.genderRequired === true) { // Currently, gender can not be required
		// 	labelsToDecorate.push(ids.genderLabel);
		// }
		if(formData.obrConfigDwr.streetAddressRequired === true) {
			labelsToDecorate.push(ids.streetAddressLabel);
		}
		if(formData.obrConfigDwr.cityRequired === true) {
			labelsToDecorate.push(ids.cityLabel);
		}
		if(formData.obrConfigDwr.stateRequired === true) {
			labelsToDecorate.push(ids.stateLabel);
		}
		if(formData.obrConfigDwr.zipcodeRequired === true) {
			labelsToDecorate.push(ids.zipcodeLabel);
		}
		if(formData.obrConfigDwr.phoneRequired === true) {
			labelsToDecorate.push(ids.phoneLabel);
		}
		if(formData.obrConfigDwr.desiredHomeBranchRequired === true) {
			labelsToDecorate.push(ids.desiredHomeLocationLabel);
		}
		if(formData.obrConfigDwr.dateOfBirthRequired === true) {
			labelsToDecorate.push(ids.dateOfBirthLabel);
		}
		if(formData.obrConfigDwr.emailRequired === true) {
			labelsToDecorate.push(ids.eMailLabel);
			labelsToDecorate.push(ids.eMailConfirmLabel);
		}
		if(formData.obrConfigDwr.secondaryPhoneRequired === true) {
			labelsToDecorate.push(ids.secondaryPhoneLabel);
		}
		if(formData.obrConfigDwr.pinRequired === true) {
			labelsToDecorate.push(ids.pinLabel);
			labelsToDecorate.push(ids.pinConfirmLabel);
		}

		for(var index = 0; index < labelsToDecorate.length; ++index) {
			var control = $j('#' + labelsToDecorate[index]);
			var controlText = control.text();
			controlText += '*';
			control.text(controlText);
		}
	};

	var registerBorrower = function() {
		if(validateFormData()) {
			var borrower = getBorrowerFromForm();
			var isChecked = $j('#' + ids.eMailNotifyCheck).is(':checked');
			var sendEmail = (isChecked && (borrower.email.length > 0));
			onlineBorrowerRegistrationManagerDwr.registerBorrower(sendEmail, borrower, getJcapWord(), getJcapHash(), function(result) {
				if(result === null) {
					alert('Your registration was unsuccessful please try again later or contact the library for assistance.');
					return;
				}
				if(result.duplicate === true) {
					alert(formData.obrConfigDwr.duplicateBorrowerMessage);
					return;
				}
				displayConfirmationPage(borrower, result.barcode);
			});
		}
	};

	var getBorrowerFromForm = function() {
		var borrower = {};
		for(var index = 0; index < mappedParams.length; ++index) {
			var control = $j('#' + mappedParams[index].id);
			borrower[mappedParams[index].varName] = control.val();
		}

		var phone = '';
		var phone1 = $j('#' + ids.phoneText1).val();
		var phone2 = $j('#' + ids.phoneText2).val();
		var phone3 = $j('#' + ids.phoneText3).val();
		if((phone1.length > 0) && (phone2.length > 0) && (phone3.length > 0)) {
			phone = '(' + phone1 + ')' + phone2 + '-' + phone3;
		}
		borrower.phone = phone;

		var secondaryPhone = '';
		var secondaryPhone1 = $j('#' + ids.secondaryPhoneText1).val();
		var secondaryPhone2 = $j('#' + ids.secondaryPhoneText2).val();
		var secondaryPhone3 = $j('#' + ids.secondaryPhoneText3).val();
		if((secondaryPhone1.length > 0) && (secondaryPhone2.length > 0) && (secondaryPhone3.length > 0)) {
			secondaryPhone = '(' + secondaryPhone1 + ')' + secondaryPhone2 + '-' + secondaryPhone3;
		}
		borrower.altPhone = secondaryPhone;

		var dateOfBirth = '';
		var dateOfBirthMonth = $j('#' + ids.dateOfBirthMonthSelect).val();
		var dateOfBirthDay = $j('#' + ids.dateOfBirthDaySelect).val();
		var dateOfBirthYear = $j('#' + ids.dateOfBirthYearSelect).val();
		if((dateOfBirthMonth != constants.invalidSelectValue) && (dateOfBirthDay != constants.invalidSelectValue) && (dateOfBirthYear != constants.invalidSelectValue)) {
			dateOfBirth = dateOfBirthMonth + dateOfBirthDay + dateOfBirthYear;
		}
		borrower.dateOfBirth = dateOfBirth;

		return borrower;
	};

	var validateFormData = function() {
		var type = {
			txt: 1,
			select: 2,
			phone: 3,
			dob: 4,
			email: 5,
			emailNotifyCheck: 6,
			pin: 7
		};
		var fieldsToValidate = [];
		if(formData.obrConfigDwr.titleRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.titleText, fieldName: fieldNames.title});
		}
		if(formData.obrConfigDwr.firstNameRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.firstNameText, fieldName: fieldNames.firstName});
		}
		if(formData.obrConfigDwr.middleNameRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.middleNameText, fieldName: fieldNames.middleName});
		}
		if(formData.obrConfigDwr.lastNameRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.lastNameText, fieldName: fieldNames.lastName});
		}
		if(formData.obrConfigDwr.suffixRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.suffixText, fieldName: fieldNames.suffix});
		}
		if(formData.obrConfigDwr.streetAddressRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.streetAddressText, fieldName: fieldNames.streetAddress});
		}
		if(formData.obrConfigDwr.cityRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.cityText, fieldName: fieldNames.city});
		}
		if(formData.obrConfigDwr.stateRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.stateText, fieldName: fieldNames.state});
		}
		if(formData.obrConfigDwr.zipcodeRequired === true) {
			fieldsToValidate.push({type: type.txt, id: ids.zipcodeText, fieldName: fieldNames.zipCode});
		}
		fieldsToValidate.push({type: type.dob, id1: ids.dateOfBirthMonthSelect, id2: ids.dateOfBirthDaySelect, id3: ids.dateOfBirthYearSelect, required: formData.obrConfigDwr.dateOfBirthRequired, fieldName: fieldNames.dateOfBirth});
		// if(formData.obrConfigDwr.genderRequired === true) { // there is no validation for gender right now.
		if(formData.obrConfigDwr.desiredHomeBranchRequired === true) {
			fieldsToValidate.push({type: type.select, id: ids.desiredHomeLocationSelect, fieldName: fieldNames.desiredHomeLocation});
		}
		fieldsToValidate.push({type: type.phone, id1: ids.phoneText1, id2: ids.phoneText2, id3: ids.phoneText3, required: formData.obrConfigDwr.phoneRequired, fieldName: fieldNames.phone});
		fieldsToValidate.push({type: type.phone, id1: ids.secondaryPhoneText1, id2: ids.secondaryPhoneText2, id3: ids.secondaryPhoneText3, required: formData.obrConfigDwr.secondaryPhoneRequired, fieldName: fieldNames.secondaryPhone});
		fieldsToValidate.push({type: type.email, id1: ids.eMailText, id2: ids.eMailConfirmText, required: formData.obrConfigDwr.emailRequired, fieldName1: fieldNames.email, fieldName2: fieldNames.confirmEmail});
		fieldsToValidate.push({type: type.emailNotifyCheck, id1: ids.eMailNotifyCheck, id2: ids.eMailText, fieldName1: fieldNames.sendAConfirmationEmail, fieldName2: fieldNames.email});
		fieldsToValidate.push({type: type.pin, id1: ids.pinText, id2: ids.pinConfirmText, required: formData.obrConfigDwr.pinRequired, fieldName1: fieldNames.pin, fieldName2: fieldNames.confirmPin});

		var errors = [];
		var focusControl = null;
		for(var index = 0; index < fieldsToValidate.length; ++index) {
			switch(fieldsToValidate[index].type) {
				case type.txt:
					var control = $j('#' + fieldsToValidate[index].id);
					if(control.val().length < 1) {
						errors.push('The required field ' + fieldsToValidate[index].fieldName + ' is missing.');
						makeInvalid(control);
						if(focusControl === null) { focusControl = control; }
					} else {
						makeValid(control);
					}
					break;
				case type.select:
					control = $j('#' + fieldsToValidate[index].id);
					if(control.val() == constants.invalidSelectValue) {
						errors.push('The required field ' + fieldsToValidate[index].fieldName + ' has not been selected.');
						makeInvalid(control);
						if(focusControl === null) { focusControl = control; }
					} else {
						makeValid(control);
					}
					break;
				case type.phone:
					if(!validatePhone(fieldsToValidate[index].id1, fieldsToValidate[index].id2, fieldsToValidate[index].id3, fieldsToValidate[index].required, fieldsToValidate[index].fieldName, errors)) {
						if(focusControl === null) { focusControl = $j('#' + fieldsToValidate[index].id1); }
					}
					break;
				case type.dob:
					if(!validateDateOfBirth(fieldsToValidate[index].id1, fieldsToValidate[index].id2, fieldsToValidate[index].id3, fieldsToValidate[index].required, fieldsToValidate[index].fieldName, errors)) {
						if(focusControl === null) { focusControl = $j('#' + fieldsToValidate[index].id1); }
					}
					break;
				case type.email:
					if(!validateEmail(fieldsToValidate[index].id1, fieldsToValidate[index].id2, fieldsToValidate[index].required, fieldsToValidate[index].fieldName1, fieldsToValidate[index].fieldName2, errors)) {
						if(focusControl === null) { focusControl = $j('#' + fieldsToValidate[index].id1); }
					}
					break;
				case type.emailNotifyCheck:
					if(!validateEmailNotifyCheck(fieldsToValidate[index].id1, fieldsToValidate[index].id2, fieldsToValidate[index].fieldName1, fieldsToValidate[index].fieldName2, errors)) {
						if(focusControl === null) { focusControl = $j('#' + fieldsToValidate[index].id1); }
					}
					break;
				case type.pin:
					if(!validatePin(fieldsToValidate[index].id1, fieldsToValidate[index].id2, fieldsToValidate[index].required, fieldsToValidate[index].fieldName1, fieldsToValidate[index].fieldName2, errors)) {
						if(focusControl === null) { focusControl = $j('#' + fieldsToValidate[index].id1); }
					}
					break;
			}
		}

		if(errors.length > 0) {
			var msg = '';
			for(var errorIndex = 0; errorIndex < errors.length; ++errorIndex) {
				var currMsg = errors[errorIndex];
				if(currMsg !== null) {
					if(msg.length > 0) {
						msg += '\r\n';
					}
					msg += errors[errorIndex];
				}
			}
			alert(msg);
			focusControl.focus();
			return false;
		}

		if(formData.obrConfigDwr.jcapCaptchasOn === true) {
			if(jcap() === false) {
				return false;
			}
		}

		return true;
	};

	var validatePhone = function(phoneText1, phoneText2, phoneText3, required, fieldName, errors) {
		var control1 = $j('#' + phoneText1);
		var control2 = $j('#' + phoneText2);
		var control3 = $j('#' + phoneText3);
		var val1 = control1.val();
		var val2 = control2.val();
		var val3 = control3.val();
		if((val1.length === 0) && (val2.length === 0) && (val3.length === 0) && (required === true)) {
			errors.push('The required field ' + fieldName + ' is missing.');
			makeInvalid(control1);
			makeInvalid(control2);
			makeInvalid(control3);
			return false;
		}
		if((val1.length > 0) || (val2.length > 0) || (val3.length > 0)) {
			if(!isNumeric(val1, 3) || !isNumeric(val2, 3) || !isNumeric(val3, 4)) {
				errors.push('The' + ((required === true) ? ' required ' : ' ') + 'field ' + fieldName + ' is malformed.');
				makeInvalid(control1);
				makeInvalid(control2);
				makeInvalid(control3);
				return false;
			}
		}
		makeValid(control1);
		makeValid(control2);
		makeValid(control3);
		return true;
	};

	var validateDateOfBirth = function(monthText, dayText, yearText, required, fieldName, errors) {
		var controlMonth = $j('#' + monthText);
		var controlDay = $j('#' + dayText);
		var controlYear = $j('#' + yearText);
		var valMonth = controlMonth.val();
		var valDay = controlDay.val();
		var valYear = controlYear.val();
		if((valMonth == constants.invalidSelectValue) && (valDay == constants.invalidSelectValue) && (valYear == constants.invalidSelectValue) && (required === true)) {
			errors.push('The required field ' + fieldName + ' is missing.');
			makeInvalid(controlMonth);
			makeInvalid(controlDay);
			makeInvalid(controlYear);
			return false;
		}
		if((valMonth != constants.invalidSelectValue) || (valDay != constants.invalidSelectValue) || (valYear != constants.invalidSelectValue)) {
			if((valMonth == constants.invalidSelectValue) || (valDay == constants.invalidSelectValue) || (valYear == constants.invalidSelectValue)) {
				errors.push('The' + ((required === true) ? ' required ' : ' ') + 'field ' + fieldName + ' is malformed.');
				makeInvalid(controlMonth);
				makeInvalid(controlDay);
				makeInvalid(controlYear);
				return false;
			}
		}
		makeValid(controlMonth);
		makeValid(controlDay);
		makeValid(controlYear);
		return true;
	};

	var validateEmail = function(emailText, emailConfirmText, required, emailFieldName, emailConfirmFieldName, errors) {
		var emailControl = $j('#' + emailText);
		var emailConfirmControl = $j('#' + emailConfirmText);
		var email = emailControl.val();
		var emailConfirm = emailConfirmControl.val();

		if((email.length === 0) && (required === true)) {
			errors.push('The required field ' + emailFieldName + ' is missing.');
			makeInvalid(emailControl);
			makeInvalid(emailConfirmControl);
			return false;
		}
		if(email.length !== 0) {
			if(!validateEmailFormat(email)) {
				errors.push('The ' + ((required === true) ? ' required ' : ' ') + ' field ' + emailFieldName + ' is malformed.');
				makeInvalid(emailControl);
				makeInvalid(emailConfirmControl);
				return false;
			}
			if(email != emailConfirm) {
				errors.push('The address in the field ' + emailFieldName + ' does not match what is in the field ' + emailConfirmFieldName + '.');
				makeInvalid(emailControl);
				makeInvalid(emailConfirmControl);
				return false;
			}
		}
		makeValid(emailControl);
		makeValid(emailConfirmControl);
		return true;
	};

	var validateEmailNotifyCheck = function(emailNotifyCheck, emailText, emailNotifyFieldName, emailFieldName, errors) {
		var checkControl = $j('#' + emailNotifyCheck);
		var isChecked = checkControl.is(':checked');
		var emailControl = $j('#' + ids.eMailText);
		var email = emailControl.val();
		if((email.length === 0) && (isChecked === true)) {
			makeInvalid(checkControl);
			errors.push(emailNotifyFieldName + ' is checked and there is nothing in the ' + emailFieldName + ' field.');
			return false;
		}
		makeValid(checkControl);
		return true;
	};

	var validatePin = function(pinText, pinConfirmText, required, pinFieldName, pinConfirmFieldName, errors) {
		var pinControl = $j('#' + pinText);
		var pinConfirmControl = $j('#' + pinConfirmText);
		var pin = pinControl.val();
		var pinConfirm = pinConfirmControl.val();

		if((pin.length === 0) && (required === true)) {
			errors.push('The required field ' + pinFieldName + ' is missing.');
			makeInvalid(pinControl);
			makeInvalid(pinConfirmControl);
			return false;
		}
		if(pin.length > 0) {
			if(pin != pinConfirm) {
				errors.push('The data in the field ' + pinFieldName + ' does not match what is in the field ' + pinConfirmFieldName + '.');
				makeInvalid(pinControl);
				makeInvalid(pinConfirmControl);
				return false;
			}
		}
		makeValid(pinControl);
		makeValid(pinConfirmControl);
		return true;
	};

	var isNumeric = function(data, requiredLength) {
		if(data.length != requiredLength) {
			return false;
		}

		var validChars = "0123456789";
		var currChar;

		for(index = 0; index < data.length; ++index) {
			currChar = data.charAt(index);
			if(validChars.indexOf(currChar) == -1) {
				return false;
			}
		}
		return true;
	};

	var sortBranches = function(branchesToSort) {
		branchesToSort.sort(function(a, b) {
			var aComp = a.displayName.toLowerCase();
			var bComp = b.displayName.toLowerCase();
			if(bComp < aComp) {
				return 1;
			}
			if(aComp < bComp) {
				return -1;
			}
			return 0;
		});
	};

	var validateEmailFormat = function(fld) {
		  var tfld = fld.replace(/^\s+|\s+$/, '');
		  var regExFilter = /^[^@]+@[^@.]+\.[^@]*\w\w$/;
		  var regExIllegal = /[\(\)\<\>\,\;\:\\\"\[\]]/;
		  
		  return (!regExFilter.test(tfld) || fld.match(regExIllegal)) ? false : true;
	};

	var onMailMyCardCheck = function() {
		var sendMeMyCardRadio = $j('#' + ids.sendMeMyCardRadio);
		var iWillPickUpMyCardRadio = $j('#' + ids.iWillPickUpMyCardRadio);
		var isSendMeMyCard = sendMeMyCardRadio.is(':checked');
		if(isSendMeMyCard === true) {
			var answer = confirm(formData.obrConfigDwr.messageToDisplayWhenCardToBeMailedIsChecked);
			if(!answer) {
				sendMeMyCardRadio.attr('checked', false);
				iWillPickUpMyCardRadio.attr('checked', true);
			}
		}
	};

	var displayConfirmationPage = function(borrower, barcode) {
		var nameLine = borrower.nameTitle;
		if(borrower.firstName.length > 0) {
			if(nameLine.length > 0) {
				nameLine += ' ';
			}
			nameLine += borrower.firstName;
		}
		if(borrower.middleName.length > 0) {
			if(nameLine.length > 0) {
				nameLine += ' ';
			}
			nameLine += borrower.middleName;
		}
		if(borrower.lastName.length > 0) {
			if(nameLine.length > 0) {
				nameLine += ' ';
			}
			nameLine += borrower.lastName;
		}
		if(borrower.nameSuffix.length > 0) {
			if(nameLine.length > 0) {
				nameLine += ' ';
			}
			nameLine += borrower.nameSuffix;
		}

		var cityLine = borrower.city;
		if(borrower.state.length > 0) {
			if(cityLine.length > 0) {
				cityLine += ', ';
			}
			cityLine += borrower.state;
		}
		if(borrower.zipcode.length > 0) {
			if(cityLine.length > 0) {
				cityLine += ' ';
			}
			cityLine += borrower.zipcode;
		}

		var mainDiv = $j('#' + divId);
		mainDiv.empty();

		var wrapperDiv = $j('<div></div>').attr('id', ids.wrapper);
		var contentDiv = $j('<div></div>').attr('id', ids.content);

		contentDiv.append($j('<div align="center"></div>').attr('id', ids.banner).addClass(classes.banner).append('Registration Successful'));
		contentDiv.append($j('<div align="center"></div>').attr('id', ids.banner2).addClass(classes.banner2).append('The following information has been registered with the library.'));
		if(nameLine.length > 0) {
			contentDiv.append($j('<div>' + nameLine + '</div>'));
		}
		if(borrower.address1.length > 0) {
			contentDiv.append($j('<div>' + borrower.address1 + '</div>'));
		}
		if(cityLine.length > 0) {
			contentDiv.append($j('<div>' + cityLine + '</div>'));
		}
		if(borrower.phone.length > 0) {
			contentDiv.append($j('<div>' + borrower.phone + '</div>'));
		}
		if(borrower.altPhone.length > 0) {
			contentDiv.append($j('<div>' + borrower.altPhone + '</div>'));
		}
		if(borrower.email.length > 0) {
			contentDiv.append($j('<div>' + borrower.email + '</div>'));
		}
		if(borrower.dateOfBirth.length > 0) {
			contentDiv.append($j('<div>' + 'Date of birth: ' + borrower.dateOfBirth + '</div>'));
		}
		if(borrower.gender.length > 0) {
			contentDiv.append($j('<div>' + ' Gender: ' + borrower.gender + '</div>'));
		}
		contentDiv.append($j('<div>' + 'Home Location: ' + getHomeBranch(borrower.homeBranch) + '</div>'));
		contentDiv.append($j('<div>' + 'Your temporary barcode is: <strong>' + barcode + '</strong></div>').css('margin-top', '15px'));
		if(formData.obrConfigDwr.registrationConfirmationMessage.length > 0) {
			contentDiv.append($j('<div>' + formData.obrConfigDwr.registrationConfirmationMessage + '</div>').css('margin-top', '15px'));
		}
		contentDiv.append($j('<div></div>').css('margin-top', '15px')
			.append($j('<input type="button" value="Print"></input>').addClass('searchform button clickable submit').click(function() {
					printConfirmationPage(borrower, barcode);
				})
			)
			.append($j('<input type="button" value="Done"></input>').addClass('searchform button clickable submit').css('margin-left', '5px').click(function() {
					refresh();
				})
			)
		);

		wrapperDiv.append(contentDiv);
		mainDiv.append(wrapperDiv);

		runRefreshTimer();
	};

	var getHomeBranch = function(branchIdentifier) {
		for(var index = 0; index < formData.allBranches.length; ++index) {
			if(formData.allBranches[index].identifier == branchIdentifier) {
				return formData.allBranches[index].displayName;
			}
		}
		return 'Unknown';
	};

	var printConfirmationPage = function(borrower, barcode) {
		if(printFrame === null) {
			printFrame = document.createElement('iframe');
			printFrame.style.position='absolute';
			printFrame.width='0px';
			printFrame.height='0px';
			printFrame.frameBorder="0";
			document.body.appendChild(printFrame);
		}

		printFrame.contentWindow.document.open();
		printFrame.contentWindow.document.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
		printFrame.contentWindow.document.write('<html>');
		printFrame.contentWindow.document.write('<head>');
		printFrame.contentWindow.document.write('<style type="text/css">');
		printFrame.contentWindow.document.write('</style>');
		printFrame.contentWindow.document.write('<link rel="stylesheet" type="text/css" href="../styles/onlineBorrowerRegistration.css" type="text/css"/>');
		printFrame.contentWindow.document.write('<script type="text/javascript">');
		printFrame.contentWindow.document.write('	window.onload = function (){');
		printFrame.contentWindow.document.write('		window.focus();');
		printFrame.contentWindow.document.write('		window.print();');
		printFrame.contentWindow.document.write('	};');
		printFrame.contentWindow.document.write('</script>');
		printFrame.contentWindow.document.write('</head>');
		printFrame.contentWindow.document.write('<body>');

		printFrame.contentWindow.document.write($j('<div><h1>Registration Successful</h1></div>').html());
		printFrame.contentWindow.document.write($j('<div><h2>The following information has been registered with the library.</h2></div>').html());
		printFrame.contentWindow.document.write($j('<div>' + borrower.nameTitle + '         ' + borrower.firstName + ' ' + borrower.middleName + ' ' + borrower.lastName + ' ' + borrower.nameSuffix + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write($j('<div>' + borrower.address1 + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write($j('<div>' + borrower.city + ', ' + borrower.state + ' ' + borrower.zipcode + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write($j('<div>' + borrower.phone + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');
		if(borrower.altPhone.length > 0) {
			printFrame.contentWindow.document.write($j('<div>' + borrower.altPhone + '</div>').html());
			printFrame.contentWindow.document.write('<br/>');
		}
		if(borrower.email.length > 0) {
			printFrame.contentWindow.document.write($j('<div>' + borrower.email + '</div>').html());
			printFrame.contentWindow.document.write('<br/>');
		}
		if(borrower.dateOfBirth.length > 0) {
			printFrame.contentWindow.document.write($j('<div>' + 'Date of birth: ' + borrower.dateOfBirth + '</div>').html());
			printFrame.contentWindow.document.write('<br/>');
		}
		printFrame.contentWindow.document.write($j('<div>' + ' Gender: ' + borrower.gender + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');

		printFrame.contentWindow.document.write($j('<div>' + 'Home Location: ' + getHomeBranch(borrower.homeBranch) + '</div>').html());
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write($j('<div>' + 'Your temporary barcode is: <strong>' + barcode + '</strong></div>').html());
		printFrame.contentWindow.document.write('<br/>');
		if(formData.obrConfigDwr.registrationConfirmationMessage.length > 0) {
			printFrame.contentWindow.document.write('<br/>');
			printFrame.contentWindow.document.write($j('<div>' + formData.obrConfigDwr.registrationConfirmationMessage + '</div>').html());
			printFrame.contentWindow.document.write('<br/>');
		}
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write('<br/>');
		printFrame.contentWindow.document.write($j('<div>Signature ______________________________</div>').html());

		printFrame.contentWindow.document.write('</body>');
		printFrame.contentWindow.document.write('</html>');

		printFrame.contentWindow.document.close();
	};

	var getJcapWord = function() {
		if(formData.obrConfigDwr.jcapCaptchasOn === true) {
			return $j('#' + jcapVars.jfldid).val();
		}
		return null;
	};

	var getJcapHash = function() {
		if(formData.obrConfigDwr.jcapCaptchasOn === true) {
			return jcapVars.cword[jcapVars.anum - 1];
		}
		return null;
	};

	var makeValid = function(control) {
		control.removeClass('searchformError');
	};

	var makeInvalid = function(control) {
		control.addClass('searchformError');
	};

	var loadPacHeaderImg = function() {
		var image = new Image();
		image.onload = function(){
			$j('.' + 'PACHeader').prepend($j('<img src="' + pacHeaderBannerImageSource + '"/>'));
		};
		image.src = pacHeaderBannerImageSource;
	};

	///////////////////////////////////////////////////////////////////////////////
	//  Refresh functions
	///////////////////////////////////////////////////////////////////////////////

	var onEvent = function(e) {
		if(refreshTimeout !== null) {
			clearTimeout(refreshTimeout);
			refreshTimeout = setTimeout(refresh, formData.obrConfigDwr.refreshTimeout * 1000);
		}
		return true;
	};

	var initAutoRefresh = function() {
		$j(document).mousemove(onEvent);
		$j(document).mousedown(onEvent);
		$j(document).keydown(onEvent);
		$j(document).keypress(onEvent);
		$j(document).click(onEvent);
		$j(document).scroll(onEvent);
	};

	var runRefreshTimer = function() {
		if(refreshTimeout !== null) {
			clearTimeout(refreshTimeout);
		}
		refreshTimeout = setTimeout(refresh, formData.obrConfigDwr.refreshTimeout * 1000);
	};

	var refresh = function() {
		if(refreshTimeout !== null) {
			clearTimeout(refreshTimeout);
			refreshTimeout = null;
		}
		if(refreshToUrl) {
			window.location.href = refreshToUrl;
		} else if(formData.obrConfigDwr.refreshUrl) {
			window.location.href = formData.obrConfigDwr.refreshUrl;
		} else {
			window.location.reload(true);
		}
	};
};

$j(document).ready(function() {
	var onlineBorrowerRegistrationView = new OnlineBorrowerRegistrationView('onlineBorrowerRegistrationWrapper');
	onlineBorrowerRegistrationView.init();
});
