/* * 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.snameIdx = -1; this.fnameIdx = -1; this.snameMaxIdx = -1; this.fnameMaxIdx = -1; this.snameDists = new Array (); this.fnameDists = new Array (); this.incSnameIdx = function () { if (this.snameIdx < this.snameMaxIdx-1) this.snameIdx ++; } this.incFnameIdx = function () { if (this.fnameIdx < this.fnameMaxIdx-1) this.fnameIdx ++; } this.decSnameIdx = function () { if (this.snameIdx >= 0) this.snameIdx --; } this.decFnameIdx = function () { if (this.fnameIdx >= 0) this.fnameIdx --; } 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); var inField = node.parentNode.parentNode.getElementsByTagName ('input')[0]; var idx = -1; var dists = new Array (); node.parentNode.style.visibility = 'hidden'; switch (inField.getAttribute ('id')) { case 'personSearch1_fname': idx = this.fnameIdx; if (idx != -1) { dists = this.fnameDists[idx].split ('::'); this.fNameBest = new Array (0, 0, dists[2]); inField.value = dists[2]; } break; case 'personSearch1_sname': idx = this.snameIdx; if (idx != -1) { dists = this.snameDists[idx].split ('::'); this.sNameBest = new Array (0, 0, dists[2]); inField.value = dists[2]; } } 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; } 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, idx) { if (dists.length > 0) // there are caculated distances for surnames { var bestMatch = dists[0].split ('::'); // infos for best match var len = bestMatch[1]; // reset matches select while ((child = bestFit.firstChild) != null) bestFit.removeChild (child); // len ist ein Array mit entweder snameMaxIdx oder fnameMaxIdx // als einziges Element. Ich übergebe das als Array um ein call // bei reference zu simulieren. if (len < dists.length) while (dists[len].split ('::')[1] < bestMatch[1] && len < dists.lenth) len++; else len = dists.length; for (var i=0; i 0) this.sNameBest = this.snameDists[0].split ('::'); else this.sNameBest = new Array (-1, -1, ''); this.snameMaxIdx = this.genAlternativesList (sNameAlt, this.snameDists, this.snameIdx); this.updField (surname, this.sNameBest, this.sNameAlt) if (this.sNameBest[1] == 0) { var firstname = document.getElementById (this.firstname); this.fnameDists = fittingStrings ( firstname.value, this.firstnames[this.sNameBest[2]], false); if (this.fnameDists.length > 0) this.fNameBest = this.fnameDists[0].split ('::'); else this.fNameBest = new Array (-1, -1, ''); if (this.fnameDists.length > 0) this.fNameBest = this.fnameDists[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 () { var firstname = document.getElementById (this.firstname); var fNameAlt = document.getElementById (this.fNameAlt); if (this.sNameBest[1] == 0) { var surname = document.getElementById (this.surname); this.fnameDists = fittingStrings ( firstname.value, this.firstnames[this.sNameBest[2]], false); } else this.fnameDists = new Array (); if (this.fnameDists.length > 0) this.fNameBest = this.fnameDists[0].split ('::'); else this.fNameBest = new Array (-1, -1, ''); this.fnameMaxIdx = this.genAlternativesList (fNameAlt, this.fnameDists, this.fnameIdx); 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; } } function personSearch1AltFirstnameHandler (_event) { if (_event == undefined) _event = window.event; if (_event.which) var keycode = _event.which; else if (_event.keyCode) var keycode = _event.keyCode; // pSearch1 wird im php personSearch1.js angelegt. switch (keycode) { case 38: pSearch1.decFnameIdx (); break; case 40: pSearch1.incFnameIdx (); break; case 13: return pSearch1.hide ('personSearch1_fBestFit'); default: pSearch1.fnameIdx = -1; } return pSearch1.altFirstnames (); } function personSearch1AltSurnameHandler (_event) { if (_event == undefined) _event = window.event; if (_event.which) var keycode = _event.which; else if (_event.keyCode) var keycode = _event.keyCode; // pSearch1 wird im php personSearch1.js angelegt. switch (keycode) { case 38: pSearch1.decSnameIdx (); break; case 40: pSearch1.incSnameIdx (); break; case 13: alert (pSearch1.snameDists); return pSearch1.hide ('personSearch1_sBestFit'); default: pSearch1.snameIdx = -1; } return pSearch1.altSurnames (); }