function userSearchChangeHandler(userId, gg_form) {
	
	// gee_form
	// local because I can't pass it into
	// query call backs. SP sucks
	var gee_form = gg_form; 
	
	this.user_id = userId;
	
	_initialize = function() {
		
		try {
			// does nothing currently
		} catch(err) {
			console.log("@@@ userSearchChangeHandler:: init, error. message["+err.message+"]");
		}
		
		console.log("@@@ userSearchChangeHandler:: init called.");
	};
	
	//
	//	user_id = sys_user id
	//  this is temporary pending update to reference.
	//  to provide variable field names
	//
	this.buildUserRoleListOnChange = function() {
		try {
			//
			//  support existing use of method by providing default
			//  field parameters.
			//
			//if(document && gel) document.getElementById("LmEmailId").innerHTML=""; // clear any text
			// else service portal
			
			this._buildRoleList('requested_for', 'which_role');
			
		} catch(err) {
			console.log("@@@ An exception occurred in userSearchChangeHandler::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 userSearchChangeHandler::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("@@@ userSearchChangeHandler::_buildRoleList entered.");
			console.log("@@@ userSearchChangeHandler::_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.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 userSearchChangeHandler::_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) console.log("@@@ % 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 userSearchChangeHandler::BuildPostListForManager, parameter fieldName was invalid.");
			}
		} catch(err) {
			console.log("@@@ An exception occurred in userSearchChangeHandler::BuildPostListForManager, message=" + err.message);
		}
		finally {
			if(namevalid) this.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 userSearchChangeHandler::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.updateRoleData(role);
				
			} else console.log("@@@ no record returned for sys_id=" + role_sys_id);
			});
		}
		catch (err) {
			console.log("@@@ An exception occurred in userSearchChangeHandler::updateRoleOnChange, message=" + err.message);
		}
		
	};
	
	
	this.type = 'userSearchChangeHandler';
	_initialize();
}
