/* * 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.reset (); } else { this.fNameBest = new Array (-1, -1, null); if (this.person != null) this.person.reset (); } 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.reset (); return false; } }