function visitorSearchChangeHandler(userId, gg_form) {
	
	var gee_form = gg_form;
	
	this.user_id = userId;
	
	_initialize = function(userId) {
		
		try {
			
			// currently does nothing
			
		} catch(err) {
			console.log("@@@ visitorSearchChangeHandler:: init, record query failed message["+err.message+"]");
		}
		
		//console.log("@@@ visitorSearchChangeHandler:: init called.");
	};
	
	//
	//	user_id = sys_user id
	//  this is temporary pending update to reference.
	//  to provide variable field names
	//
	this.buildUserRoleListOnChange = function(/*userFieldRef, roleRef*/) {
		try {
			//
			//  support existing use of method by providing default
			//  field parameters.
			//
			//document.getElementById("LmEmailId").innerHTML=""; // clear any text
			
			this._buildRoleList('requested_for', 'vs_which_role');
			
		} catch(err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::buildUserRoleListOnChange, message=" + err.message);
		}
	};
	
	//
	//	user_id = sys_user id
	//
	this.populateRoleList = function(userFieldRef, roleRef) {
		try {
			
			this._buildRoleList(userFieldRef, roleRef);
			
		} catch(err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::populateRoleList, message=" + err.message);
		}
	};
	
	//
	//	user_id = sys_user id
	//
	//  the parameters are strings
	//
	this._buildRoleList = function(userFieldref, roleRef ) {
		
		try {
			gee_form.hideFieldMsg(userFieldref);
			//console.log("@@@ visitorSearchChangeHandler::_buildRoleList entered.");
			//console.log("@@@ visitorSearchChangeHandler::_buildRoleList user_id=" + this.user_id);
			var role = new GlideRecord('u_employee_post');
			role.addQuery('u_active', true);
			role.addQuery('u_employee', this.user_id);
			role.addQuery('u_status', 'IN', 'PS009,PS010');
			role.query(function Q(role){
				
				gee_form.clearOptions(roleRef);
				var ord = 0;
				var mainRole = null;
				var mainRoleDesc = '';
				var defaultRole = null;
				var defaultRoleDesc = '';
				
				gee_form.setReadOnly(roleRef, true);
				while (role.next()) {
					++ord;
					console.log("@@@ # MainRole["+((role.u_main_post=='true') ? "True" : "False") +"] Number[" + role.u_number + "], Description[" + role.u_short_description + "]");
					if(role.u_main_post=='true') {
						//console.log("@@@ Main post is " + role.u_short_description);
						gee_form.addOption(roleRef, '' + role.sys_id, '' + role.u_short_description, 0);
						if(mainRole==null) {
							mainRole = role.sys_id;
							mainRoleDesc = role.u_short_description;
						}
					} else {
						gee_form.addOption(roleRef, '' + role.sys_id, '' + role.u_short_description, ord);
						if(defaultRole==null) {
							defaultRole = role.sys_id; // to use as the default if no main role found
							defaultRoleDesc = role.u_short_description;
						}
					}
					
					if(mainRole!=null) console.log("@@@ % add Main role Option: " + mainRole + ", " + mainRoleDesc);
						
				}
				
				if(mainRole!= null) {
					
					gee_form.setValue(roleRef, mainRole, '' + mainRoleDesc);
				} else if(defaultRole!=null) {
					
					gee_form.setValue(roleRef, defaultRole, '' + defaultRoleDesc);
				} else {
					// this user has no active posts.
					gee_form.addOption(roleRef, 'NoPosts', 'No active posts found', 0);
					gee_form.setValue(roleRef, 'NoPosts', 'No active posts found');
					gee_form.showFieldMsg(userFieldref, "This user has no active posts. This request requires an active post.", 'error');
				}
			});
		}
		catch (err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::_buildRoleList, message=" + err.message);
		}
		finally {
			gee_form.setReadOnly(roleRef, false);
		}
		
	};
	
	this.BuildPostListForManager = function(fieldName) {
		var namevalid = false;
		try {
			var fd = fieldName + "";
			namevalid = fd.trim() !=''; // make field state available to finally block
			if(namevalid) {
				gee_form.clearOptions(fieldName);
				var role = new GlideRecord('u_employee_post');
				role.addQuery('u_active', true);
				role.addQuery('u_employee', this.user_id);
				role.query(function Q(role){
					if(role.hasNext()) {
						// populate list
						var ord = 0;
						var mainRole = null;
						var mainRoleDesc = '';
						var defaultRole = null;
						var defaultRoleDesc = '';
						
						gee_form.setReadOnly(fieldName, true);
						while (role.next()) {
							++ord;
							console.log("@@@ # MainRole["+((role.u_main_post=='true') ? "True" : "False") +"] Number[" + role.u_number + "], Description[" + role.u_short_description + "]");
							if(role.u_main_post=='true') {
								console.log("@@@ Main post is " + role.u_short_description);
								gee_form.addOption(fieldName, '' + role.u_number + ', ' + role.u_short_description, '' + role.u_number + ', ' + role.u_short_description, 0);
								if(mainRole==null) {
									mainRole = role.sys_id;
									mainRoleDesc = role.u_number + ', ' + role.u_short_description;
								}
							} else {
								gee_form.addOption(fieldName, '' + role.u_number + ', ' + role.u_short_description, '' + role.u_number + ', ' + role.u_short_description, ord);
								if(defaultRole==null) {
									defaultRole = role.sys_id; // to use as the default if no main role found
									defaultRoleDesc = role.u_number + ', ' + role.u_short_description;
								}
							}
							
							if(mainRole!=null) jslog("@@@ % add Main role Option: " + mainRole + ", " + mainRoleDesc);
								
						} /* end while */
						
						if(mainRole!= null) {
							gee_form.setValue(fieldName, '' + mainRoleDesc, '' + mainRoleDesc);
						} else if(defaultRole!=null) {
							gee_form.setValue(fieldName, '' + defaultRoleDesc, '' + defaultRoleDesc);
						} else {
							gee_form.addOption(fieldName, 'NoPosts', 'No active posts found', 0);
							gee_form.setValue(fieldName, 'NoPosts', 'No active posts found');
							gee_form.showFieldMsg(fieldName, "This Manager has no active posts. This request requires an active post.", 'error');
						}
						
					} else {
						gee_form.addOption(fieldName, 'NoPosts', 'No active posts found', 0);
						gee_form.setValue(fieldName, 'NoPosts', 'No active posts found');
						gee_form.showFieldMsg(fieldName, "This Manager has no active posts. This request requires an active post.", 'error');
					}
				});
			} else {
				console.log("@@@ An ERROR occurred in visitorSearchChangeHandler::BuildPostListForManager, parameter fieldName was invalid.");
			}
		} catch(err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::BuildPostListForManager, message=" + err.message);
		}
		finally {
			if(namevalid) gee_form.setReadOnly(fieldName, false);
			}
	};
	
	
	//
	//  to support HR return to work request need to be able to note
	//  the line manager and post id.
	//
	this.updateRTWRoleData = function(role_sys_id, LMfieldName, postidfieldName, posttitlefieldName) {
		try {
			var role = new GlideRecord('u_employee_post');
			role.addQuery('sys_id', role_sys_id);
			role.query(function Q(role) {
				
				if(role.next()) {
					gee_form.setValue(LMfieldName , role.u_manager);
					gee_form.setValue(postidfieldName , role.u_number);
					gee_form.setValue(posttitlefieldName , role.u_short_description);
					
				} else console.log("@@@ no record returned for sys_id=" + role_sys_id);
			});
		} catch(err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::updateRTWRoleData, message[" + err.message + "]");
		}
	};
	//
	//	role_sys_id = Role id to find. update displayed values from this role
	//
	this.updateRoleOnChange = function (role_sys_id)
	{
		try {
			console.log("@@@ userSearchChangeHandler::updateRoleOnChange entered.");
			
			var role = new GlideRecord('u_employee_post');
			role.addQuery('sys_id', role_sys_id);
			role.query(function Q(role){
				
				if(role.next()) {
					
					var helper = new userSearchChangeHelper(userId, gee_form);
					helper.updateRoleDataVisitor(role);
					
				} else console.log("@@@ no record returned for sys_id=" + role_sys_id);
			});
			
		}
		catch (err) {
			console.log("@@@ An exception occurred in visitorSearchChangeHandler::updateRoleOnChange, message=" + err.message);
		}
		
	};
	
	
	this.type = 'visitorSearchChangeHandler';
	_initialize();
}
