personSearch1.js 4.47 KB
/*
 * requires fittingStrings.js to be loaded first
 */


/*
 * provide alternative Names already existent in DB to given names in
 * input text fields:
 *
 * Arguments:
 * fname    / ID of the input text field with firstname
 * sname    / ID of the input text field with surname
 * fnameAlt / ID of the list that recieves the alternative firstnames
 * snameAlt / ID of the list that receives the alternative surnames
 * names    / Array containing the already existing names and persons.
 *
 * Methods:
 * updField            / exact match(no-case) found => update input field
 * genAlternativesList / generate List of alternative Strings
 * altSurnames         / fill the list of alternative surnames
 * altFirstnames       / fill the list of alternative firstnames
 */
function c_personSearch1 (fname, sname, fnameAlt, snameAlt, names, person)
{
	this.firstname = fname;
	this.surname   = sname;
	this.fNameAlt  = fnameAlt;
	this.sNameAlt  = snameAlt;

	this.surnames = new Array ();
	this.firstnames = new Array ();
	this.persons = new Array ();
	for (sn in names)
	{
		this.surnames.push (sn);
		this.firstnames[sn] = new Array ();
		this.persons[sn] = new Array ();
		for (d in names[sn])
		{
			this.firstnames[sn].push (names[sn][d][0]);
			this.persons[sn][names[sn][d][0]] = names[sn][d][1];
		}
	}
	this.person = person;

	this.sNameBest  = new Array (-1, -1, null);
	this.fNameBest  = new Array (-1, -1, null);

	this.show = function (id)
	{
		var node = document.getElementById (id);
		node.parentNode.style.visibility = 'visible';

		return false;
	}

	this.hide = function (id)
	{
		var node = document.getElementById (id);
		node.parentNode.style.visibility = 'hidden';

		return false;
	}

	this.updField = function (field, alternative, altId)
	{
		if (alternative[1] == 0)
			field.value = alternative[2];
		else
			if (alternative[1] >= 0)
				return this.show (altId);

		return this.hide (altId);
	}

	this.genAlternativesList = function (bestFit, dists)
	{
		if (dists.length > 0)
			// there are caculated distances for surnames
		{
			var i = 0;
			var bestMatch = dists[0].split ('::'); // infos for best match

			// reset matches select
			while ((child = bestFit.firstChild) != null)
				bestFit.removeChild (child);

			for (match in dists)
				// walk through all matches
			{
				// get infos for match
				var sMatch = dists[match].split ('::');

				// create list entries
				newLi = document.createElement ('li');
				liTxt = document.createTextNode (sMatch[2]);
				newLi.appendChild (liTxt);
				bestFit.appendChild (newLi);
				i=i+1;

				if (i >= bestMatch[1])
					// dont show more than best match distance matches.
					break;
			}
		}
		else
			// there are no caculated distances for surnames
		{
			// reset matches select
			while ((child = bestFit.firstChild) != null)
				bestFit.removeChild (child);
			return new Array (-1, -1, '');
		}

		return bestMatch;
	}

	this.altSurnames = function ()
	{
		var surname  = document.getElementById (this.surname);
		var sNameAlt = document.getElementById (this.sNameAlt);
		var dists    = fittingStrings (surname.value, this.surnames, false);

		this.sNameBest = this.genAlternativesList (sNameAlt, dists);
		this.updField (surname, this.sNameBest, this.sNameAlt)

		if (this.sNameBest[1] == 0)
		{
			var firstname = document.getElementById (this.firstname);
			var dists = fittingStrings (
				firstname.value, this.firstnames[this.sNameBest[2]], false);

			if (dists.length > 0)
				this.fNameBest = dists[0].split ('::');

			if (this.person != null)
				if (this.fNameBest[1] == 0)
					this.person.update (
						this.persons[this.sNameBest[2]][this.fNameBest[2]]);
				else
					this.person.empty ();
		}
		else
		{
			this.fNameBest = new Array (-1, -1, null);
			if (this.person != null)
				this.person.empty ();
		}

		return false;
	}

	this.altFirstnames = function (person)
	{
		var firstname = document.getElementById (this.firstname);
		var fNameAlt  = document.getElementById (this.fNameAlt);

		if (this.sNameBest[1] == 0)
		{
			var surname  = document.getElementById (this.surname);
			var dists = fittingStrings (
				firstname.value, this.firstnames[this.sNameBest[2]], false);
		}
		else
			dists = new Array ();

		this.fNameBest = this.genAlternativesList (fNameAlt, dists);
		this.updField (firstname, this.fNameBest, this.fNameAlt)

		if (this.person != null)
			if (this.sNameBest[1] == 0 && this.fNameBest[1] == 0)
				this.person.update (
					this.persons[this.sNameBest[2]][this.fNameBest[2]]);
			else
				this.person.empty ();

		return false;
	}
}