152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
        }
 | 
						|
    });
 | 
						|
} |