|
|
|
/*
|
|
|
|
* 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 packages = [];
|
|
|
|
|
|
|
|
if (localStorage.getItem("packages") != null) {
|
|
|
|
packages = JSON.parse(localStorage.getItem("packages"));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Count how many items are still undelivered for an address.
|
|
|
|
* @param {type} address An item in the packages array.
|
|
|
|
* @returns {Number}
|
|
|
|
*/
|
|
|
|
function getUndeliveredCount(address) {
|
|
|
|
var undelivered = 0;
|
|
|
|
for (var i = 0; i < address.items.length; i++) {
|
|
|
|
if (!address.items[i].delivered) {
|
|
|
|
undelivered++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return undelivered;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getPackage(packageid) {
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
for (var j = 0; j < packages[i].items.length; j++) {
|
|
|
|
if (packages[i].items[j].id == packageid) {
|
|
|
|
return packages[i].items[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getIconForType(packagetype) {
|
|
|
|
switch (packagetype) {
|
|
|
|
case "package":
|
|
|
|
return "fas fa-box";
|
|
|
|
case "letter":
|
|
|
|
return "fas fa-envelope";
|
|
|
|
case "express":
|
|
|
|
return "fas fa-shipping-fast";
|
|
|
|
default:
|
|
|
|
return "fas fa-box";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getMapIconForItems(items) {
|
|
|
|
var types = {
|
|
|
|
package: 0,
|
|
|
|
letter: 0,
|
|
|
|
express: 0
|
|
|
|
};
|
|
|
|
var deliveredcount = 0;
|
|
|
|
var type = "package";
|
|
|
|
for (var i = 0; i < items.length; i++) {
|
|
|
|
// Don't consider delivered packages when determining icon,
|
|
|
|
// only count them to check if everything is delivered
|
|
|
|
if (items[i].delivered) {
|
|
|
|
deliveredcount++;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
types[items[i].type]++;
|
|
|
|
}
|
|
|
|
if (deliveredcount == items.length) {
|
|
|
|
return "check";
|
|
|
|
}
|
|
|
|
if (types.letter == 0 && types.express == 0) {
|
|
|
|
if (types.package > 1) {
|
|
|
|
return "boxes";
|
|
|
|
}
|
|
|
|
return "box";
|
|
|
|
}
|
|
|
|
if (types.package == 0 && types.express == 0) {
|
|
|
|
if (types.letter > 1) {
|
|
|
|
return "envelopes";
|
|
|
|
}
|
|
|
|
return "envelope";
|
|
|
|
}
|
|
|
|
if (types.package == 0 && types.letter == 0) {
|
|
|
|
return "express";
|
|
|
|
}
|
|
|
|
return "multiple-items";
|
|
|
|
}
|
|
|
|
|
|
|
|
function addPackage(address, latitude, longitude, type, callback) {
|
|
|
|
var added = false;
|
|
|
|
if (typeof type == 'undefined') {
|
|
|
|
type = "package";
|
|
|
|
}
|
|
|
|
|
|
|
|
var packageID = uuidv4();
|
|
|
|
var coordsID = "";
|
|
|
|
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
if (packages[i].coords[0] == latitude && packages[i].coords[1] == longitude && packages[i].address == address) {
|
|
|
|
coordsID = packages[i].id;
|
|
|
|
packages[i].items.push({
|
|
|
|
address: address,
|
|
|
|
delivered: false,
|
|
|
|
type: type,
|
|
|
|
id: packageID
|
|
|
|
});
|
|
|
|
added = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!added) {
|
|
|
|
coordsID = uuidv4();
|
|
|
|
packages.push({
|
|
|
|
coords: [
|
|
|
|
latitude,
|
|
|
|
longitude
|
|
|
|
],
|
|
|
|
id: coordsID,
|
|
|
|
address: address,
|
|
|
|
items: [
|
|
|
|
{
|
|
|
|
address: address,
|
|
|
|
delivered: false,
|
|
|
|
type: type,
|
|
|
|
id: packageID
|
|
|
|
}
|
|
|
|
]
|
|
|
|
});
|
|
|
|
}
|
|
|
|
localStorage.setItem("packages", JSON.stringify(packages));
|
|
|
|
|
|
|
|
playSound("ok");
|
|
|
|
|
|
|
|
app.toast.show({
|
|
|
|
text: 'Package Added!<br><span style="font-size: 80%;">' + address + "</span>",
|
|
|
|
position: "bottom",
|
|
|
|
destroyOnClose: true,
|
|
|
|
closeTimeout: 1000 * 3
|
|
|
|
});
|
|
|
|
|
|
|
|
if (map != null) {
|
|
|
|
reloadMap();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof callback == 'function') {
|
|
|
|
callback({
|
|
|
|
coordsID: coordsID,
|
|
|
|
packageID: packageID
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
addAutofillEntry(address);
|
|
|
|
}
|
|
|
|
|
|
|
|
function markDelivered(id, delivered) {
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
for (var j = 0; j < packages[i].items.length; j++) {
|
|
|
|
if (packages[i].items[j].id == id) {
|
|
|
|
if (typeof delivered == 'undefined') {
|
|
|
|
if (packages[i].items[j].delivered == false) {
|
|
|
|
delivered = true;
|
|
|
|
} else {
|
|
|
|
delivered = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
packages[i].items[j].delivered = delivered;
|
|
|
|
if (delivered) {
|
|
|
|
packages[i].items[j].deliverytimestamp = Date.now();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
localStorage.setItem("packages", JSON.stringify(packages));
|
|
|
|
}
|
|
|
|
|
|
|
|
function confirmDeletePackage(package, callback) {
|
|
|
|
app.dialog.confirm(
|
|
|
|
"Delete item at " + package.address + "?",
|
|
|
|
"Confirm",
|
|
|
|
function () {
|
|
|
|
// delete
|
|
|
|
deletePackage(package.id, callback);
|
|
|
|
},
|
|
|
|
function () {
|
|
|
|
// cancel
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function deletePackage(id, callback) {
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
for (var j = 0; j < packages[i].items.length; j++) {
|
|
|
|
if (packages[i].items[j].id == id) {
|
|
|
|
packages[i].items.splice(j, 1);
|
|
|
|
|
|
|
|
if (packages[i].items.length == 0) {
|
|
|
|
packages.splice(i, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
localStorage.setItem("packages", JSON.stringify(packages));
|
|
|
|
loadPackageList();
|
|
|
|
|
|
|
|
if (typeof callback == 'function') {
|
|
|
|
callback(id);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function countRemainingPackages() {
|
|
|
|
var undelivered = 0;
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
for (var j = 0; j < packages[i].items.length; j++) {
|
|
|
|
if (packages[i].items[j].delivered != true) {
|
|
|
|
undelivered++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return undelivered;
|
|
|
|
}
|
|
|
|
|
|
|
|
function countPackages() {
|
|
|
|
var count = 0;
|
|
|
|
for (var i = 0; i < packages.length; i++) {
|
|
|
|
for (var j = 0; j < packages[i].items.length; j++) {
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
function addPackageByAddress(address, citystate, type, callback) {
|
|
|
|
$.getJSON(SETTINGS.geocodeapi, {
|
|
|
|
address: address + " " + citystate
|
|
|
|
}, function (resp) {
|
|
|
|
if (resp.status == "OK") {
|
|
|
|
if (resp.accuracy.ok) {
|
|
|
|
addPackage(resp.address.street, resp.coords[0], resp.coords[1], type, callback);
|
|
|
|
} else {
|
|
|
|
playSound("error");
|
|
|
|
app.dialog.confirm(
|
|
|
|
"The address \"" + address + "\" couldn't be reliably located. Add it anyways?",
|
|
|
|
"Accuracy Warning",
|
|
|
|
function (ok) {
|
|
|
|
if (resp.address.street == "") {
|
|
|
|
addPackage(address, resp.coords[0], resp.coords[1], type, callback);
|
|
|
|
} else {
|
|
|
|
addPackage(resp.address.street, resp.coords[0], resp.coords[1], type, callback);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
playSound("error");
|
|
|
|
app.dialog.alert(resp.message, "Error");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|