| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-09-11 20:55:07 -06:00
										 |  |  |  * 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/.
 | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var packages = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (localStorage.getItem("packages") != null) { | 
					
						
							|  |  |  |     packages = JSON.parse(localStorage.getItem("packages")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  | /** | 
					
						
							|  |  |  |  * 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; | 
					
						
							| 
									
										
										
										
											2019-09-26 11:06:05 -06:00
										 |  |  |     for (var i = 0; i < address.items.length; i++) { | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |         if (!address.items[i].delivered) { | 
					
						
							|  |  |  |             undelivered++; | 
					
						
							| 
									
										
										
										
											2019-09-21 22:35:10 -06:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |     return undelivered; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | 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]; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  | 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++) { | 
					
						
							| 
									
										
										
										
											2019-09-26 21:14:17 -06:00
										 |  |  |         // Don't consider delivered packages when determining icon,
 | 
					
						
							|  |  |  |         // only count them to check if everything is delivered
 | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |         if (items[i].delivered) { | 
					
						
							|  |  |  |             deliveredcount++; | 
					
						
							| 
									
										
										
										
											2019-09-26 21:14:17 -06:00
										 |  |  |             continue; | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-09-26 21:14:17 -06:00
										 |  |  |         types[items[i].type]++; | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |     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"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | function addPackage(address, latitude, longitude, type, callback) { | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |     var added = false; | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |     if (typeof type == 'undefined') { | 
					
						
							|  |  |  |         type = "package"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     var packageID = uuidv4(); | 
					
						
							|  |  |  |     var coordsID = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |     for (var i = 0; i < packages.length; i++) { | 
					
						
							| 
									
										
										
										
											2019-09-26 11:06:05 -06:00
										 |  |  |         if (packages[i].coords[0] == latitude && packages[i].coords[1] == longitude && packages[i].address == address) { | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |             coordsID = packages[i].id; | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |             packages[i].items.push({ | 
					
						
							|  |  |  |                 address: address, | 
					
						
							|  |  |  |                 delivered: false, | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |                 type: type, | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                 id: packageID | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |             }); | 
					
						
							|  |  |  |             added = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!added) { | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |         coordsID = uuidv4(); | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |         packages.push({ | 
					
						
							|  |  |  |             coords: [ | 
					
						
							|  |  |  |                 latitude, | 
					
						
							|  |  |  |                 longitude | 
					
						
							|  |  |  |             ], | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |             id: coordsID, | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |             address: address, | 
					
						
							|  |  |  |             items: [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     address: address, | 
					
						
							|  |  |  |                     delivered: false, | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |                     type: type, | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                     id: packageID | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |                 } | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2019-09-21 22:35:10 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |     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(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (typeof callback == 'function') { | 
					
						
							|  |  |  |         callback({ | 
					
						
							|  |  |  |             coordsID: coordsID, | 
					
						
							|  |  |  |             packageID: packageID | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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') { | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  |                     if (packages[i].items[j].delivered == false) { | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |                         delivered = true; | 
					
						
							|  |  |  |                     } else { | 
					
						
							|  |  |  |                         delivered = false; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 packages[i].items[j].delivered = delivered; | 
					
						
							|  |  |  |                 if (delivered) { | 
					
						
							|  |  |  |                     packages[i].items[j].deliverytimestamp = Date.now(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-21 22:35:10 -06:00
										 |  |  |     localStorage.setItem("packages", JSON.stringify(packages)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | function confirmDeletePackage(package, callback) { | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  |     app.dialog.confirm( | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |             "Delete item at " + package.address + "?", | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  |             "Confirm", | 
					
						
							|  |  |  |             function () { | 
					
						
							|  |  |  |                 // delete
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                 deletePackage(package.id, callback); | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  |             }, | 
					
						
							|  |  |  |             function () { | 
					
						
							|  |  |  |                 // cancel
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | function deletePackage(id, callback) { | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if (typeof callback == 'function') { | 
					
						
							|  |  |  |                     callback(id); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function countRemainingPackages() { | 
					
						
							|  |  |  |     var undelivered = 0; | 
					
						
							|  |  |  |     for (var i = 0; i < packages.length; i++) { | 
					
						
							| 
									
										
										
										
											2019-09-26 10:53:38 -06:00
										 |  |  |         for (var j = 0; j < packages[i].items.length; j++) { | 
					
						
							|  |  |  |             if (packages[i].items[j].delivered != true) { | 
					
						
							|  |  |  |                 undelivered++; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return undelivered; | 
					
						
							| 
									
										
										
										
											2019-09-11 20:19:33 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 20:58:13 -06:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  | function addPackageByAddress(address, citystate, type, callback) { | 
					
						
							| 
									
										
										
										
											2019-09-11 20:19:33 -06:00
										 |  |  |     $.getJSON(SETTINGS.geocodeapi, { | 
					
						
							|  |  |  |         address: address + " " + citystate | 
					
						
							|  |  |  |     }, function (resp) { | 
					
						
							|  |  |  |         if (resp.status == "OK") { | 
					
						
							|  |  |  |             if (resp.accuracy.ok) { | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                 addPackage(resp.address.street, resp.coords[0], resp.coords[1], type, callback); | 
					
						
							| 
									
										
										
										
											2019-09-11 20:19:33 -06:00
										 |  |  |             } 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 == "") { | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                                 addPackage(address, resp.coords[0], resp.coords[1], type, callback); | 
					
						
							| 
									
										
										
										
											2019-09-11 20:19:33 -06:00
										 |  |  |                             } else { | 
					
						
							| 
									
										
										
										
											2019-09-28 20:00:30 -06:00
										 |  |  |                                 addPackage(resp.address.street, resp.coords[0], resp.coords[1], type, callback); | 
					
						
							| 
									
										
										
										
											2019-09-11 20:19:33 -06:00
										 |  |  |                             } | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             playSound("error"); | 
					
						
							|  |  |  |             app.dialog.alert(resp.message, "Error"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-08-14 22:09:18 -06:00
										 |  |  | } |