You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
3.8 KiB
JavaScript

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
var autofillDB = {};
var autofillStreetDB = [];
if (getStorage("autofill_db") != null) {
autofillDB = JSON.parse(getStorage("autofill_db"));
}
if (getStorage("autofill_streetdb") != null) {
autofillStreetDB = JSON.parse(getStorage("autofill_streetdb"));
}
function addressToNumberAndStreet(address) {
var number = "";
var street = "";
var addressRegex = RegExp("^[0-9]+ .+$");
if (addressRegex.test(address)) {
number = address.split(" ", 2)[0];
street = address.substring(address.indexOf(' ') + 1);
}
return [number, street];
}
function addAutofillEntry(address) {
var [number, street] = addressToNumberAndStreet(address);
if (number == "" || street == "") {
return;
}
if (typeof autofillDB[number] == 'undefined') {
autofillDB[number] = [
[street, 1]
];
} else {
var found = false;
for (var i = 0; i < autofillDB[number].length; i++) {
if (autofillDB[number][i][0] == street) {
autofillDB[number][i][1]++;
found = true;
break;
}
}
if (!found) {
autofillDB[number].push([street, 1]);
}
}
setStorage("autofill_db", JSON.stringify(autofillDB));
var found = false;
for (var i = 0; i < autofillStreetDB.length; i++) {
if (autofillStreetDB[i][0] == street) {
autofillStreetDB[i][1]++;
found = true;
break;
}
}
if (!found) {
autofillStreetDB.push([street, 1]);
}
setStorage("autofill_streetdb", JSON.stringify(autofillStreetDB));
}
function searchAutofill(q, number) {
var byNumber = [];
if (typeof number != 'undefined') {
byNumber = searchAutofillByNumber(number, q);
}
var byStreet = [];
if (q.length > 0) {
byStreet = searchAutofillByStreet(q);
}
return byNumber.concat(byStreet.filter((item) => byNumber.indexOf(item) < 0));
}
function searchAutofillByNumber(number, q) {
if (typeof autofillDB[number] == 'undefined') {
return [];
}
var sorted = autofillDB[number].sort(function (a, b) {
return b[1] - a[1];
});
var query = false;
if (typeof q != 'undefined' && q != "") {
query = true;
}
var streets = [];
for (var i = 0; i < sorted.length; i++) {
// if there's no search query OR if the query matches the current item
if (!query || (query && sorted[i][0].toLowerCase().includes(q))) {
streets.push(sorted[i][0]);
}
}
return streets;
}
function searchAutofillByStreet(q) {
var streets = [];
var sortedDB = autofillStreetDB.sort(function (a, b) {
return b[1] - a[1];
});
//console.log(sortedDB);
q = q.toLowerCase();
for (var i = 0; i < sortedDB.length; i++) {
//console.log(sortedDB[i][0].toLowerCase().indexOf(q));
if (sortedDB[i][0].toLowerCase().includes(q)) {
streets.push(sortedDB[i][0]);
}
}
return streets;
}
function setupStreetAutofill(streetBox, numberBox) {
app.autocomplete.create({
inputEl: streetBox,
openIn: 'dropdown',
/* If we set valueProperty to "id" then input value on select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
limit: 10, //limit to 10 results
typeahead: true,
dropdownPlaceholderText: '',
source: function (query, render) {
var streets = searchAutofill(query, $(numberBox).val());
render(streets);
}
});
}