diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..6d8707ab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,38 @@ +{ + "version": "0.1.0", + "configurations": [ + { + "name": "Automint Electron App", + "type": "node", + "program": "${workspaceRoot}/src/main.js", + "stopOnEntry": false, + "args": [], + "runtimeExecutable": "/usr/local/bin/electron", + "runtimeArgs": [ + ".", + "--enable-logging" + ], + "cwd": "${workspaceRoot}/src", + "request": "launch", + "env": {}, + "externalConsole": false, + "sourceMaps": false, + "outDir": null + }, + { + "name": "Attach", + "type": "node", + "request": "attach", + "port": 5858, + "sourceMaps": false, + "outDir": null + }, + { + "name": "Chrome Debugger", + "type": "chrome", + "request": "attach", + "port": 9222, + "sourceMaps": true + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..e3af0d39 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,10 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "0.1.0", + "command": "electron", + "isShellCommand": true, + "args": [ + "src" + ] +} \ No newline at end of file diff --git a/pkg/package.json b/pkg/package.json index c0d564b4..363219a3 100644 --- a/pkg/package.json +++ b/pkg/package.json @@ -22,17 +22,17 @@ }, "devDependencies": { "del": "^2.2.0", - "electron-builder": "^3.25.0", + "electron-builder": "^5.11.1", "electron-prebuilt": "^1.1.3", "gulp": "^3.9.1", "gulp-clean-css": "^2.0.6", - "gulp-htmlmin": "^1.3.0", - "gulp-imagemin": "^2.4.0", + "gulp-htmlmin": "^2.0.0", + "gulp-imagemin": "^3.0.1", "gulp-jsonminify": "^1.0.0", "gulp-minify-inline": "^0.2.0", "gulp-size": "^2.1.0", "gulp-uglify": "^1.5.3", - "imagemin-pngquant": "^4.2.2", + "imagemin-pngquant": "^5.0.0", "main-bower-files": "^2.13.0", "rimraf": "^2.5.2", "run-sequence": "^1.1.5" diff --git a/src/app/app.controller.js b/src/app/app.controller.js index f925c6a0..7a1eef11 100644 --- a/src/app/app.controller.js +++ b/src/app/app.controller.js @@ -2,7 +2,7 @@ * Closure for root level controllers * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -40,7 +40,7 @@ } function gps(res) { - if (res.enabled == false) { + if (!res || res.enabled == false) { unlock(); skip = true; return; @@ -83,11 +83,12 @@ } function openHelpWindow() { - console.log(ammHelp); ammHelp.openHelpWindow(); } function gps(res) { + if (res == undefined) + return; $rootScope.isPasscodeEnabled = res.enabled; } diff --git a/src/app/app.directive.js b/src/app/app.directive.js index 03086f19..67df5aa3 100644 --- a/src/app/app.directive.js +++ b/src/app/app.directive.js @@ -2,7 +2,7 @@ * Closure for root level directives * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -12,27 +12,10 @@ .directive('pageTitle', PageTitleDirective) .directive('amDropFiles', amDropFilesDirective) .directive('amUploadFiles', amUploadFilesDirective) - .directive('amOnEnter', OnEnterDirective) - .directive('amOffsetFromTop', OffsetFromTopDirective); + .directive('amOnEnter', OnEnterDirective); PageTitleDirective.$inject = ['$rootScope', '$timeout']; - function OffsetFromTopDirective() { - return { - restrict: 'A', - scope: { - callback: '&amOffsetFromTop' - }, - link: link - } - - function link(scope, elem, attr) { - var callbackFunction = scope.callback(); - - callbackFunction(elem); - } - } - function OnEnterDirective() { return onEnter; diff --git a/src/app/app.service.js b/src/app/app.service.js index 4fca42d2..cbe67736 100644 --- a/src/app/app.service.js +++ b/src/app/app.service.js @@ -2,7 +2,7 @@ * Closure for root level service * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -49,7 +49,7 @@ pdbCache.setDatabase(constants.pdb_cache); // check and create views - ccViews(); + manageDbVersions().then(ccViews).catch(ccViews); // listen to changes in local db OnCustomerDbChanged(); @@ -60,6 +60,91 @@ // syncDb(); } + function manageDbVersions() { + var tracker = $q.defer(); + isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get(sVm.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.dbversion) + res.dbversion = 0; + switch (res.dbversion) { + case 0: + applyPatch1().then(proceed).catch(proceed); + break; + } + + function proceed(res) { + res.dbversion = constants.db_version; + pdbConfig.save(res).then(success).catch(failure); + } + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: sVm.username, + dbversion: constants.db_version + } + applyPatch1().then(proceed).catch(proceed); + + function proceed(res) { + pdbConfig.save(doc).then(success).catch(failure); + } + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + + function applyPatch1() { + var tracker = $q.defer(); + pdbCustomers.getAll().then(success).catch(failure); + return tracker.promise; + + function success(res) { + var customers = []; + res.rows.forEach(iterateRows); + pdbCustomers.saveAll(customers).then(saveSuccess).catch(failure); + + function iterateRows(row) { + if (row.doc && row.doc.user && row.doc.user.vehicles) { + Object.keys(row.doc.user.vehicles).forEach(iterateVehicles); + customers.push(row.doc); + } + + function iterateVehicles(vId) { + if (row.doc.user.vehicles[vId].services) + Object.keys(row.doc.user.vehicles[vId].services).forEach(iterateServices); + + function iterateServices(sId) { + if (row.doc.user.vehicles[vId].services[sId].status == 'billed') + row.doc.user.vehicles[vId].services[sId].status = 'due'; + if (row.doc.user.vehicles[vId].services[sId].state == undefined || row.doc.user.vehicles[vId].services[sId].state == '') + row.doc.user.vehicles[vId].services[sId].state = 'Bill'; + } + } + } + } + + function saveSuccess(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + function ccViews(force) { // service module @@ -105,9 +190,11 @@ vhcl_reg: vehicle.reg, vhcl_manuf: vehicle.manuf, vhcl_model: vehicle.model, + vhcl_nextdue: vehicle.nextdue, srvc_date: service.date, srvc_cost: service.cost, - srvc_status: service.status + srvc_status: service.status, + srvc_state: service.state }; } } @@ -116,7 +203,7 @@ } function failure(err) { - console.log(err); + console.warn(err); } } @@ -190,9 +277,11 @@ vhcl_reg: vehicle.reg, vhcl_manuf: vehicle.manuf, vhcl_model: vehicle.model, + vhcl_nextdue: vehicle.nextdue, srvc_date: service.date, srvc_cost: service.cost, - srvc_status: service.status + srvc_status: service.status, + srvc_state: service.state }; } } diff --git a/src/app/app.states.js b/src/app/app.states.js index 47ac6901..564b1074 100644 --- a/src/app/app.states.js +++ b/src/app/app.states.js @@ -2,7 +2,7 @@ * Closure for state definitions and mappings to template files * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -105,7 +105,8 @@ controllerAs: 'vm', params: { id: undefined, - openTab: undefined + openTab: undefined, + fromState: undefined }, resolve: { deps: ['$ocLazyLoad', loadCuUIDeps] @@ -413,6 +414,7 @@ return $ocLazyLoad.load([ 'material-datatable', 'google-chart', + 'app/components/dashboard/dashboard.controller-deps.js', 'app/components/dashboard/dashboard.controller.js', 'app/components/dashboard/dashboard.factory.js' ]); @@ -480,6 +482,7 @@ function loadSeRADeps($ocLazyLoad) { return $ocLazyLoad.load([ 'material-datatable', + 'app/components/services/tmpl/dialog_timefilter.controller.js', 'app/components/services/services-viewall.controller.js' ]) } @@ -497,6 +500,7 @@ 'app/components/settings/settings-importdata.service.js', 'app/components/settings/settings-invoices.factory.js', 'app/components/settings/settings-servicetax.factory.js', + 'app/components/settings/settings.factory.js', 'assets/js/jquery.csv.min.js' ]) } diff --git a/src/app/appbar/headerView.html b/src/app/appbar/headerView.html index 6d7e4c5b..2955c7a3 100644 --- a/src/app/appbar/headerView.html +++ b/src/app/appbar/headerView.html @@ -1,7 +1,7 @@
- + menu
diff --git a/src/app/components/customers/customers-add.controller.js b/src/app/components/customers/customers-add.controller.js index 2bb2bce4..d471c36d 100644 --- a/src/app/components/customers/customers-add.controller.js +++ b/src/app/components/customers/customers-add.controller.js @@ -2,7 +2,7 @@ * Controller for Add Customer component * @author ndkcha * @since 0.4.1 - * @version 0.5.0 + * @version 0.6.4 */ /// @@ -43,6 +43,10 @@ vm.models = []; vm.membershipChips = []; vm.vehicleTypeList = []; + vm.loadingBasedOnMobile = false; + vm.isNextDueService = false; + vm.nextDueDate = new Date(); + vm.nextDueDate.setMonth(vm.nextDueDate.getMonth() + 3); // function maps vm.convertNameToTitleCase = convertNameToTitleCase; @@ -64,13 +68,91 @@ vm.OnAddMembershipChip = OnAddMembershipChip; vm.changeMembershipTab = changeMembershipTab; vm.goBack = goBack; + vm.autoCapitalizeCustomerAddress = autoCapitalizeCustomerAddress; + vm.autoCapitalizeVehicleModel = autoCapitalizeVehicleModel; + vm.checkExistingCustomerMobile = checkExistingCustomerMobile; + vm.unsubscribeMembership = unsubscribeMembership; + vm.getDate = getDate; // default execution steps + setTimeout(focusCustomerName, 300); getMemberships(); getRegularTreatments(); getVehicleTypes(); // function definitions + + function getDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + function unsubscribeMembership(ev, chip) { + var confirm = $mdDialog.confirm() + .textContent('Unsubscribe to ' + chip.name + ' ?') + .ariaLabel('Unsubscribe to ' + chip.name) + .targetEvent(ev) + .ok('Yes') + .cancel('No'); + + $mdDialog.show(confirm).then(performDelete, ignoreDelete); + + function performDelete() { + console.info('deleted'); + } + + function ignoreDelete() { + vm.membershipChips.push(chip); + } + } + + function focusCustomerName() { + $('#ami-customer-name').focus(); + } + + function checkExistingCustomerMobile(ev) { + vm.loadingBasedOnMobile = true; + amCustomers.getCustomerByMobile(vm.user.mobile).then(success).catch(failure); + + function success(res) { + vm.loadingBasedOnMobile = false; + var confirm = $mdDialog.confirm() + .title('Do you want to edit customer details ?') + .textContent('Customer record for ' + res.name + ' with ' + vm.user.mobile + ' already exists') + .ariaLabel('Edit Customer') + .targetEvent(ev) + .ok('Yes') + .cancel('No'); + + $mdDialog.show(confirm).then(doEdit, ignore); + + function doEdit() { + $state.go('restricted.customers.edit', { + id: res.id + }); + } + + function ignore() { + vm.user.mobile = ''; + } + } + + function failure(err) { + vm.loadingBasedOnMobile = false; + console.info('New Customer'); + } + } + + function autoCapitalizeVehicleModel() { + vm.vehicle.model = utils.autoCapitalizeWord(vm.vehicle.model); + } + + function autoCapitalizeVehicleManuf() { + vm.vehicle.manuf = utils.autoCapitalizeWord(vm.vehicle.manuf); + } + + function autoCapitalizeCustomerAddress() { + vm.user.address = utils.autoCapitalizeWord(vm.user.address); + } function goBack() { $state.go('restricted.customers.all'); @@ -227,6 +309,7 @@ function convertNameToTitleCase() { vm.user.name = utils.convertToTitleCase(vm.user.name); } + function convertRegToCaps() { vm.vehicle.reg = vm.vehicle.reg.toUpperCase(); } @@ -297,6 +380,7 @@ } function searchVehicleChange() { + autoCapitalizeVehicleManuf(); vm.models = []; vm.vehicle.model = ''; } @@ -360,6 +444,8 @@ vm.user.memberships = vm.membershipChips; if (!(vm.vehicle.reg == '' && vm.vehicle.manuf == '' && vm.vehicle.model == '')) { vm.vehicle.reg = vm.vehicle.reg.replace(/\s/g, ''); + if (vm.isNextDueService) + vm.vehicle.nextdue = vm.nextDueDate; amCustomers.addNewCustomer(vm.user, vm.vehicle).then(successfullSave).catch(failedSave); } else amCustomers.addNewCustomer(vm.user).then(successfullSave).catch(failedSave); diff --git a/src/app/components/customers/customers-edit.controller.js b/src/app/components/customers/customers-edit.controller.js index e65fd4e8..348766af 100644 --- a/src/app/components/customers/customers-edit.controller.js +++ b/src/app/components/customers/customers-edit.controller.js @@ -2,7 +2,7 @@ * Controller for Edit Customer component * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -20,7 +20,7 @@ var vm = this; // temporary named assignments - var autofillVehicle = false, isMembershipAltered = false; + var autofillVehicle = false; var userDbInstance; // vm assignments to keep track of UI related elements @@ -53,6 +53,10 @@ page: 1, total: 0 }; + vm.serviceStateList = ['Job Card', 'Estimate', 'Bill']; + vm.isNextDueService = false; + vm.nextDueDate = new Date(); + vm.nextDueDate.setMonth(vm.nextDueDate.getMonth() + 3); // function maps vm.convertNameToTitleCase = convertNameToTitleCase; @@ -75,18 +79,34 @@ vm.OnAddMembershipChip = OnAddMembershipChip; vm.changeMembershipTab = changeMembershipTab; vm.goBack = goBack; - vm.OnRemoveMembershipChip = OnRemoveMembershipChip; vm.changeServicesTab = changeServicesTab; vm.getServiceDate = getServiceDate; vm.editService = editService; vm.deleteService = deleteService; vm.goToInvoice = goToInvoice; - + vm.autoCapitalizeCustomerAddress = autoCapitalizeCustomerAddress; + vm.autoCapitalizeVehicleModel = autoCapitalizeVehicleModel; + vm.unsubscribeMembership = unsubscribeMembership; + vm.IsServiceDue = IsServiceDue; + vm.IsServiceStateIv = IsServiceStateIv; + vm.IsServiceStateEs = IsServiceStateEs; + vm.IsServiceStateJc = IsServiceStateJc; + vm.getDate = getDate; + // default execution steps if ($state.params.id != undefined) { getMemberships(getRegularTreatments, getVehicleTypes, getCustomer); - if ($state.params.openTab == 'services') - changeServicesTab(true); + switch ($state.params.openTab) { + case 'services': + changeServicesTab(true); + break; + case 'vehicle': + changeVehicleTab(true); + break; + default: + setTimeout(focusCustomerMobile, 300); + break; + } } else { utils.showSimpleToast('Something went wrong!'); $state.go('restricted.customers.all'); @@ -94,6 +114,61 @@ // function definitions + function getDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + function IsServiceStateIv(state) { + return (state == vm.serviceStateList[2]); + } + + function IsServiceStateEs(state) { + return (state == vm.serviceStateList[1]); + } + + function IsServiceStateJc(state) { + return (state == vm.serviceStateList[0]); + } + + function IsServiceDue(status) { + return (status == 'Due'); + } + + function unsubscribeMembership(ev, chip) { + var confirm = $mdDialog.confirm() + .textContent('Unsubscribe to ' + chip.name + ' ?') + .ariaLabel('Unsubscribe to ' + chip.name) + .targetEvent(ev) + .ok('Yes') + .cancel('No'); + + $mdDialog.show(confirm).then(performDelete, ignoreDelete); + + function performDelete() { + console.info('membership deleted'); + } + + function ignoreDelete() { + vm.membershipChips.push(chip); + } + } + + function focusCustomerMobile() { + $('#ami-customer-mobile').focus(); + } + + function autoCapitalizeVehicleModel() { + vm.vehicle.model = utils.autoCapitalizeWord(vm.vehicle.model); + } + + function autoCapitalizeVehicleManuf() { + vm.vehicle.manuf = utils.autoCapitalizeWord(vm.vehicle.manuf); + } + + function autoCapitalizeCustomerAddress() { + vm.user.address = utils.autoCapitalizeWord(vm.user.address); + } + // edit service function editService(service) { $state.go('restricted.services.edit', { @@ -120,7 +195,7 @@ } function ignoreDelete() { - console.log('nope'); + console.info('nope'); } @@ -133,7 +208,7 @@ } function failure(err) { - console.log(err); + console.warn(err); utils.showSimpleToast('Service can not be deleted at moment. Please Try Again!'); } } @@ -157,7 +232,19 @@ } function goBack() { - $state.go('restricted.customers.all'); + var transitState = 'restricted.customers.all'; + var transitParams = undefined; + if ($state.params.fromState != undefined) { + switch ($state.params.fromState) { + case 'dashboard.nextdueservices': + transitState = 'restricted.dashboard'; + transitParams = { + openDialog: 'nextdueservices' + } + break; + } + } + $state.go(transitState, transitParams); } function changeMembershipTab(bool) { @@ -182,7 +269,6 @@ }).then(changeMembershipChip).catch(changeMembershipChip); function changeMembershipChip(obj) { - isMembershipAltered = true; $log.info('Changes Saved'); } } @@ -243,13 +329,8 @@ item.checked = false; } } - - function OnRemoveMembershipChip() { - isMembershipAltered = true; - } function OnAddMembershipChip(chip) { - isMembershipAltered = true; var m = $.extend({}, chip.treatments, false); chip.treatments = []; Object.keys(m).forEach(iterateTreatments); @@ -430,7 +511,8 @@ reg: vehicle.reg, manuf: vehicle.manuf, model: vehicle.model, - name: vehicle.manuf + ' - ' + vehicle.model + (vehicle.reg == '' ? '' : ', ' + vehicle.reg) + name: vehicle.manuf + ' - ' + vehicle.model + (vehicle.reg == '' ? '' : ', ' + vehicle.reg), + nextdue: vehicle.nextdue }); if (vehicle.services) Object.keys(vehicle.services).forEach(iterateServices); @@ -446,7 +528,8 @@ srvc_id: sId, srvc_date: service.date, srvc_cost: service.cost, - srvc_status: utils.convertToTitleCase(service.status) + srvc_status: utils.convertToTitleCase(service.status), + srvc_state: service.state }); } } @@ -477,6 +560,10 @@ vm.vehicle.reg = found[0].reg; vm.vehicle.manuf = found[0].manuf; vm.vehicle.model = found[0].model; + if (found[0].nextdue && (found[0].nextdue.localeCompare(moment().format()) > 0)) { + vm.isNextDueService = true; + vm.nextDueDate = new Date(found[0].nextdue); + } changeVehicleRegLabel(); autofillVehicle = true; } else @@ -570,12 +657,14 @@ } } - function searchVehicleChange() { + function searchVehicleChange(e) { + autoCapitalizeVehicleManuf(); if (!autofillVehicle) { vm.models = []; vm.vehicle.model = ''; autofillVehicle = false; - } + } else + autofillVehicle = false; } // return boolean response to different configurations [BEGIN] @@ -620,11 +709,6 @@ // save to database function save() { - $log.info('same = ' + isSame()); - if (isSame() == true) { - successfullSave(); - return; - } userDbInstance.user.mobile = vm.user.mobile; userDbInstance.user.name = vm.user.name; userDbInstance.user.email = vm.user.email; @@ -644,13 +728,20 @@ vehicleDbInstance.reg = vm.vehicle.reg; vehicleDbInstance.manuf = vm.vehicle.manuf; vehicleDbInstance.model = vm.vehicle.model; + if (vm.isNextDueService) + vehicleDbInstance.nextdue = vm.nextDueDate; + else if (vehicleDbInstance.nextdue) + delete vehicleDbInstance['nextdue']; } else { var prefixVehicle = 'vhcl' + ((vm.vehicle.manuf && vm.vehicle.model) ? '-' + angular.lowercase(vm.vehicle.manuf).replace(' ', '-') + '-' + angular.lowercase(vm.vehicle.model).replace(' ', '-') : ''); - userDbInstance.user.vehicles[utils.generateUUID(prefixVehicle)] = { + var vo = { reg: (vm.vehicle.reg == undefined ? '' : vm.vehicle.reg), manuf: (vm.vehicle.manuf == undefined ? '' : vm.vehicle.manuf), model: (vm.vehicle.model == undefined ? '' : vm.vehicle.model) - }; + } + if (vm.isNextDueService) + vo.nextdue = vm.nextDueDate; + userDbInstance.user.vehicles[utils.generateUUID(prefixVehicle)] = vo; } } diff --git a/src/app/components/customers/customers-viewall.controller.js b/src/app/components/customers/customers-viewall.controller.js index 510c57df..5ea2947d 100644 --- a/src/app/components/customers/customers-viewall.controller.js +++ b/src/app/components/customers/customers-viewall.controller.js @@ -112,7 +112,7 @@ } function ignoreDelete() { - console.log('nope'); + console.info('nope'); } function success(res) { diff --git a/src/app/components/customers/customers.factory.js b/src/app/components/customers/customers.factory.js index 793077b9..01873495 100644 --- a/src/app/components/customers/customers.factory.js +++ b/src/app/components/customers/customers.factory.js @@ -2,7 +2,7 @@ * Factory that handles database interactions between customer database and controller * @author ndkcha * @since 0.4.1 - * @version 0.5.0 + * @version 0.6.4 */ /// @@ -25,12 +25,60 @@ saveCustomer: saveCustomer, getMemberships: getMemberships, getRegularTreatments: getRegularTreatments, - getVehicleTypes: getVehicleTypes + getVehicleTypes: getVehicleTypes, + getCustomerByMobile: getCustomerByMobile }; return factory; // function definitions + + function getCustomerByMobile(mobile) { + var tracker = $q.defer(); + pdbCustomers.query(mapView, { + include_docs: true, + key: mobile + }).then(success).catch(failure); + return tracker.promise; + + function mapView(doc, emit) { + if (doc.user) + emit(doc.user.mobile, doc.user); + } + + function success(res) { + var doc = res.rows[0].doc; + var response = {}; + var pvl = []; + response.id = doc._id; + response.mobile = doc.user.mobile; + response.email = doc.user.email; + response.name = doc.user.name; + response.address = doc.user.address; + response.memberships = doc.user.memberships; + if (doc.user.vehicles) + Object.keys(doc.user.vehicles).forEach(iterateVehicle); + response.possibleVehicleList = pvl; + tracker.resolve(response); + + delete doc; + + function iterateVehicle(vId) { + var vehicle = doc.user.vehicles[vId]; + pvl.push({ + id: vId, + reg: vehicle.reg, + manuf: vehicle.manuf, + model: vehicle.model, + name: vehicle.manuf + ' - ' + vehicle.model + (vehicle.reg == '' || vehicle.reg == undefined ? '' : ', ' + vehicle.reg), + type: (vehicle.type) ? vehicle.type : '' + }); + } + } + function failure(err) { + tracker.reject(undefined); + } + } function getVehicleTypes() { var tracker = $q.defer(); diff --git a/src/app/components/customers/customers_add.html b/src/app/components/customers/customers_add.html index c034dc50..849226b8 100644 --- a/src/app/components/customers/customers_add.html +++ b/src/app/components/customers/customers_add.html @@ -1,3 +1,16 @@ + arrow_back Back @@ -11,14 +24,14 @@ person_pin - +
phone - + email @@ -30,11 +43,15 @@ home - +
+
+ + Please wait +
done Save @@ -54,7 +71,7 @@ Choose Vehicle: - {{vm.currentVehicle}} + {{vm.currentVehicle}} @@ -76,7 +93,7 @@
Choose Manufacturer: - + {{manuf}} @@ -84,7 +101,7 @@
Choose Model: - + {{model}} @@ -97,6 +114,13 @@
e.g. GJ01AB9999
+
+ Next Service Reminder: +
+ + {{vm.getDate(vm.nextDueDate)}} +
+
@@ -127,11 +151,9 @@ {{service.vhcl_manuf + ' ' + service.vhcl_model}} ({{service.vhcl_reg}}) {{vm.getServiceDate(service.srvc_date)}} {{service.srvc_cost}} - {{service.srvc_status}} + {{service.srvc_status}} + {{service.srvc_state}} - - Invoice - delete @@ -148,7 +170,7 @@
card_membership
- + {{membership.name}} diff --git a/src/app/components/dashboard/dashboard.controller-deps.js b/src/app/components/dashboard/dashboard.controller-deps.js new file mode 100644 index 00000000..01e0559d --- /dev/null +++ b/src/app/components/dashboard/dashboard.controller-deps.js @@ -0,0 +1,284 @@ +/** + * Controller for dashboard sub-views + * @author ndkcha + * @since 0.6.4 + * @version 0.6.4 + */ + +/// + +(function() { + const ammPreferences = require('./automint_modules/am-preferences.js'); + + angular.module('automintApp') + .controller('amCtrlDashDuPy', DuePaymentsController) + .controller('amCtrlDashNwCu', NewCustomerController) + .controller('amCtrlDashTmFl', TimeFilterController) + .controller('amCtrlDashNxDu', NextDueServicesController); + + DuePaymentsController.$inject = ['$state', '$mdDialog', 'unbilledServices']; + NewCustomerController.$inject = ['$mdDialog', 'newCustomers']; + TimeFilterController.$inject = ['$mdDialog', '$filter', 'filterRange', 'currentTimeSet']; + NextDueServicesController.$inject = ['$state', '$mdDialog', 'amDashboard', 'dueCustomers', 'nsdcTimeRange', 'nsdcTime']; + + function DuePaymentsController($state, $mdDialog, unbilledServices) { + // initialize view model + var vm = this; + + // named assignments to keep track of UI + vm.query = { + limit: 20, + page: 1, + total: unbilledServices.length + }; + // function mappings + vm.getServiceDate = getServiceDate; + vm.services = unbilledServices; + vm.editService = editService; + vm.closeDialog = closeDialog; + + // default execution steps + vm.services.sort(sortFunction); + + // function definitions + + function sortFunction(lhs, rhs) { + return (rhs.srvc_date.localeCompare(lhs.srvc_date)); + } + + function getServiceDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + // close dialog box + function closeDialog() { + $mdDialog.hide(); + } + + // edit service + function editService(service) { + $mdDialog.hide(); + $state.go('restricted.services.edit', { + serviceId: service.srvc_id, + vehicleId: service.vhcl_id, + userId: service.cstmr_id, + fromState: 'dashboard.duepayments' + }); + } + } + + function NewCustomerController($mdDialog, newCustomers) { + // initialize view model + var vm = this; + + // named assignments to keep track of UI + vm.query = { + limit: 20, + page: 1, + total: newCustomers.length + }; + // function mappings + vm.customers = newCustomers; + vm.closeDialog = closeDialog; + + // function definitions + + // close dialog box + function closeDialog() { + $mdDialog.hide(); + } + } + + function TimeFilterController($mdDialog, $filter, filterRange, currentTimeSet) { + var vm = this; + + vm.currentYearIndex = 0; + vm.yearRange = []; + vm.selectedDateSet = $.extend([], currentTimeSet); + + // default execution steps + populateYearRange(); + + // function mappings + vm.IsNextYear = IsNextYear; + vm.IsPreviousYear = IsPreviousYear; + vm.changeToNextYear = changeToNextYear; + vm.changeToPreviousYear = changeToPreviousYear; + vm.selectDateSet = selectDateSet; + vm.IsDateSetSelected = IsDateSetSelected; + vm.IsDateSetDisabled = IsDateSetDisabled; + vm.confirm = confirm; + + // function definitions + + function confirm() { + if (vm.selectedDateSet.length < 1) + vm.selectedDateSet = currentTimeSet; + $mdDialog.hide(vm.selectedDateSet); + } + + function IsDateSetDisabled(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(filterRange, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + return (found.length == 0); + } + + function IsDateSetSelected(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(vm.selectedDateSet, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + return (found.length == 1); + } + + function selectDateSet(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(vm.selectedDateSet, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + if (found.length == 0) { + vm.selectedDateSet.push({ + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }); + } else { + var i = vm.selectedDateSet.indexOf(found[0]); + vm.selectedDateSet.splice(i, 1); + } + } + + function changeToNextYear() { + vm.currentYearIndex--; + } + + function changeToPreviousYear() { + vm.currentYearIndex++; + } + + function IsNextYear() { + return (vm.currentYearIndex != 0); + } + + function IsPreviousYear() { + return (vm.currentYearIndex != (vm.yearRange.length - 1)); + } + + function populateYearRange() { + filterRange.forEach(iterateYearRange); + + function iterateYearRange(item) { + var found = $filter('filter')(vm.yearRange, item.year, true); + + if (found == 0) + vm.yearRange.push(item.year); + } + } + } + + function NextDueServicesController($state, $mdDialog, amDashboard, dueCustomers, nsdcTimeRange, nsdcTime) { + // initialize view model + var vm = this; + + // named assignments to keep track of UI + vm.query = { + limit: 20, + page: 1, + total: dueCustomers.length + }; + vm.nsdcTime = nsdcTime; + vm.nsdcTimeRange = nsdcTimeRange + + // function mappings + vm.closeDialog = closeDialog; + vm.getDate = getDate; + vm.openNxtDueTimer = openNxtDueTimer; + vm.changeNsdcTimeRange = changeNsdcTimeRange; + vm.editCustomer = editCustomer; + vm.deleteServiceReminder = deleteServiceReminder; + vm.changeDate = changeDate; + + // default execution steps + manageCustomers(dueCustomers); + + // function definitions + + function changeDate(customer) { + amDashboard.changeServiceReminderDate(customer.cstmr_id, customer.vhcl_id, moment(customer.vhcl_nextdue).format()).then(success).catch(failure); + + function success(res) { + setTimeout(changeNsdcTimeRange, 300); + } + + function failure(err) { + console.warn(err); + } + } + + function manageCustomers(holder) { + holder.forEach(iterateCustomers); + vm.customers = holder; + + function iterateCustomers(customer) { + customer.vhcl_nextdue = new Date(moment(customer.vhcl_nextdue).format("YYYY"), moment(customer.vhcl_nextdue).format("MM") - 1, moment(customer.vhcl_nextdue).format("DD")); + } + } + + function deleteServiceReminder(cId, vId) { + amDashboard.deleteServiceReminder(cId, vId).then(success).catch(failure); + + function success(res) { + setTimeout(changeNsdcTimeRange, 300); + } + + function failure(err) { + console.warn(err); + } + } + + function editCustomer(cId) { + $state.go('restricted.customers.edit', { + id: cId, + openTab: 'vehicle', + fromState: 'dashboard.nextdueservices' + }); + $mdDialog.hide(); + } + + function generateNdcData(res) { + manageCustomers(res); + } + + function changeNsdcTimeRange(time) { + if (time != undefined) { + vm.nsdcTime = time; + ammPreferences.storePreference('dashboard.serviceReminders', vm.nsdcTime); + } + amDashboard.getNextDueCustomers(vm.nsdcTime).then(generateNdcData).catch(failure); + + function failure(err) { + console.warn(err); + } + } + + function openNxtDueTimer($mdOpenMenu, ev) { + $mdOpenMenu(ev); + } + + function getDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + // close dialog box + function closeDialog() { + $mdDialog.hide(); + } + } +})(); \ No newline at end of file diff --git a/src/app/components/dashboard/dashboard.controller.js b/src/app/components/dashboard/dashboard.controller.js index 113c9164..5da341d0 100644 --- a/src/app/components/dashboard/dashboard.controller.js +++ b/src/app/components/dashboard/dashboard.controller.js @@ -2,25 +2,22 @@ * Controller for dashboard view * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// (function() { - angular.module('automintApp') - .controller('dashboardCtrl', DashboardController) - .controller('amCtrlDashDuPy', DuePaymentsController) - .controller('amCtrlDashNwCu', NewCustomerController); + const ammPreferences = require('./automint_modules/am-preferences.js'); + + angular.module('automintApp').controller('dashboardCtrl', DashboardController); DashboardController.$inject = ['$state', '$filter', '$log', '$mdDialog', '$amRoot', 'utils', 'amDashboard']; - DuePaymentsController.$inject = ['$state', '$mdDialog', 'unbilledServices']; - NewCustomerController.$inject = ['$mdDialog', 'newCustomers']; function DashboardController($state, $filter, $log, $mdDialog, $amRoot, utils, amDashboard) { // initialize view model var vm = this; - var ubServices = [], nwCustomers = []; + var ubServices = [], nwCustomers = [], filterRange = [], isNextDueServicesOpened = false; // named assignments to keep track of UI vm.totalCustomersServed = 0; @@ -79,20 +76,214 @@ }], rows: [] }; + vm.currentTimeSet = []; + vm.ddTimeSet = ''; + vm.displayIncome = false; + vm.nextServiceDueCustomers = []; + vm.nsdcTimeRange = ['Today', 'This Week', 'This Month', 'All']; + vm.nsdcTime = vm.nsdcTimeRange[0]; // function maps vm.addNewService = addNewService; vm.viewAllServices = viewAllServices; vm.openDuePayments = openDuePayments; vm.openNewCustomers = openNewCustomers; + vm.openTimeFilter = openTimeFilter; + vm.openNxtDueTimer = openNxtDueTimer; + vm.changeNsdcTimeRange = changeNsdcTimeRange; + vm.getNxtDueField = getNxtDueField; + vm.getNextDueVehicle = getNextDueVehicle; + vm.IsNextDueFieldLong = IsNextDueFieldLong; + vm.openNextDueServices = openNextDueServices; + vm.IsNoNextDueReminders = IsNoNextDueReminders; // default execution steps + initCurrentTimeSet(); + getFilterMonths(); $amRoot.ccViews(); - amDashboard.getTotalCustomerServed().then(generateTcsData).catch(failure); - amDashboard.getNewCustomers().then(generateNcpData).catch(failure); - amDashboard.getProblemsAndVehicleTypes().then(sortProblemsAndVehicleTypes).catch(failure); + processPreferences(); // function definitions + + function IsNoNextDueReminders() { + return (vm.nextServiceDueCustomers.length == 0); + } + + function openNextDueServices() { + $mdDialog.show({ + controller: 'amCtrlDashNxDu', + controllerAs: 'vm', + templateUrl: 'app/components/dashboard/tmpl/dialog_nextdueservices.tmpl.html', + parent: angular.element(document.body), + targetEvent: event, + locals: { + dueCustomers: vm.nextServiceDueCustomers, + nsdcTimeRange: vm.nsdcTimeRange, + nsdcTime: vm.nsdcTime + }, + clickOutsideToClose: true + }).then(closeNdsDialog).catch(closeNdsDialog); + + function closeNdsDialog() { + ammPreferences.getPreference('dashboard.serviceReminders').then(success).catch(failure); + + function success(res) { + changeNsdcTimeRange(res, true); + } + } + } + + function IsNextDueFieldLong(text) { + return (text.length > 15); + } + + function getNextDueVehicle(manuf, model, reg, long) { + var v = (model ? model : (reg ? reg : (manuf ? manuf : ''))); + var t = (manuf ? manuf : '') + ((manuf || model) ? ' ' : '') + (model ? model : '') + (((manuf || model) && reg) ? ' - ' : '') + (reg ? reg : ''); + return (long ? t : getNxtDueField(v)); + } + + function getNxtDueField(text) { + return ((text.length <= 15) ? text : text.substr(0, 15) + '...'); + } + + function changeNsdcTimeRange(time, isStoreBlocked) { + vm.nsdcTime = time; + amDashboard.getNextDueCustomers(vm.nsdcTime).then(generateNdcData).catch(failure); + if (!isStoreBlocked) + ammPreferences.storePreference('dashboard.serviceReminders', vm.nsdcTime); + } + + function openNxtDueTimer($mdOpenMenu, ev) { + $mdOpenMenu(ev); + } + + function generateNdcData(res) { + vm.nextServiceDueCustomers = res; + if (isNextDueServicesOpened) { + openNextDueServices(); + isNextDueServicesOpened = false; + } + } + + function processPreferences() { + ammPreferences.getAllPreferences('viewServices').then(processViewServices).catch(failure); + ammPreferences.getAllPreferences('dashboard').then(processDashboard).catch(failure); + + function processDashboard(res) { + if ($state.params.openDialog == 'nextdueservices') + isNextDueServicesOpened = true; + if (res['dashboard.serviceReminders']) { + vm.nsdcTime = res['dashboard.serviceReminders']; + } + changeNsdcTimeRange(vm.nsdcTime, true); + } + + function processViewServices(res) { + if (res['viewServices.showingDataFor']) { + var sdf = res['viewServices.showingDataFor'].split(';'); + vm.currentTimeSet = []; + sdf.forEach(iterateDateRange); + displayCurrentTimeSet(); + } + + amDashboard.getTotalCustomerServed(vm.currentTimeSet).then(generateTcsData).catch(failure); + amDashboard.getNewCustomers(vm.currentTimeSet).then(generateNcpData).catch(failure); + amDashboard.getProblemsAndVehicleTypes(vm.currentTimeSet).then(sortProblemsAndVehicleTypes).catch(failure); + + function iterateDateRange(dr) { + var m = dr.split(','); + for (var i = 0; i < (m.length - 1); i++) { + vm.currentTimeSet.push({ + month: moment(m[i].replace(' ', ''), "MMMM").format("MMM"), + year: m[m.length - 1].replace(' ', '') + }); + } + } + } + + function failure(err) { + amDashboard.getTotalCustomerServed(vm.currentTimeSet).then(generateTcsData).catch(failure); + amDashboard.getNewCustomers(vm.currentTimeSet).then(generateNcpData).catch(failure); + amDashboard.getProblemsAndVehicleTypes(vm.currentTimeSet).then(sortProblemsAndVehicleTypes).catch(failure); + changeNsdcTimeRange(vm.nsdcTimeRange[0]); + console.warn(err.message); + } + } + + function displayCurrentTimeSet() { + vm.ddTimeSet = ''; + var years = []; + vm.currentTimeSet.forEach(iterateTimeSets); + years.forEach(iterateYears); + vm.ddTimeSet = vm.ddTimeSet.substr(0, vm.ddTimeSet.length - 2); + + function iterateYears(y) { + var tyf = $filter('filter')(vm.currentTimeSet, { + year: y + }, true); + + tyf.forEach(iterateFoundYear); + vm.ddTimeSet += y + '; '; + + function iterateFoundYear(fy) { + vm.ddTimeSet += moment(fy.month, 'MMM').format('MMMM') + ', '; + } + } + + function iterateTimeSets(ts) { + var tyf = $filter('filter')(years, ts.year, true); + + if (tyf.length == 0) + years.push(ts.year); + } + } + + function initCurrentTimeSet() { + vm.currentTimeSet.push({ + month: moment().format('MMM'), + year: moment().format('YYYY') + }); + displayCurrentTimeSet(); + } + + function getFilterMonths() { + amDashboard.getFilterMonths().then(success).catch(failure); + + function success(res) { + filterRange = res; + } + + function failure(err) { + console.info('failed to get filter months'); + } + } + + function openTimeFilter(event) { + $mdDialog.show({ + controller: 'amCtrlDashTmFl', + controllerAs: 'vm', + templateUrl: 'app/components/dashboard/tmpl/dialog_timefilter.html', + parent: angular.element(document.body), + targetEvent: event, + locals: { + filterRange: filterRange, + currentTimeSet: vm.currentTimeSet + }, + clickOutsideToClose: true + }).then(success).catch(success); + + function success(res) { + if (!res) + return; + vm.currentTimeSet = res; + amDashboard.getTotalCustomerServed(vm.currentTimeSet).then(generateTcsData).catch(failure); + amDashboard.getNewCustomers(vm.currentTimeSet).then(generateNcpData).catch(failure); + amDashboard.getProblemsAndVehicleTypes(vm.currentTimeSet).then(sortProblemsAndVehicleTypes).catch(failure); + displayCurrentTimeSet(); + ammPreferences.storePreference('viewServices.showingDataFor', vm.ddTimeSet); + } + } function openDuePayments() { if (ubServices.length <= 0) { @@ -152,16 +343,17 @@ Object.keys(res.problems).forEach(iterateProblems); sp.sort(sortByCount); for (var i = 0; i < sp.length; i++) { - if (i == 4) { + if (i == 5) { sortedProblems.push({ name: "Others", count: sp[i].count }); - } else if (i > 4) - sortedProblems[4].count += sp[i].count; + } else if (i > 5) + sortedProblems[5].count += sp[i].count; else sortedProblems.push(sp[i]); } + vm.topTreatmentsChart.data.rows = []; sortedProblems.forEach(ip); } if (res.vehicletypes) { @@ -178,6 +370,7 @@ else sortedVehicleTypes.push(svt[i]); } + vm.topVtChart.data.rows = []; sortedVehicleTypes.forEach(ivt); } @@ -236,20 +429,32 @@ function generateTcsData(res) { var uids = [], - spd = {}; + spd = {}, + dates = []; vm.totalCustomersServed = 0; vm.totalRevenueEarned = 0; vm.totalServicesDone = 0; res.forEach(iterateServices); vm.totalRevenueEarned = parseFloat(vm.totalRevenueEarned); vm.totalRevenueEarned = (vm.totalRevenueEarned % 1 != 0) ? vm.totalRevenueEarned.toFixed(2) : parseInt(vm.totalRevenueEarned); - if (spd) + if (spd) { + vm.perDayServiceChart.data.rows = []; Object.keys(spd).forEach(calculateSpd); + } + dates.sort(sortDates); + vm.perDayServiceChart.options['zoomStartTime'] = dates[0]; + vm.perDayServiceChart.options['zoomEndTime'] = dates[dates.length - 1]; + + function sortDates(lhs, rhs) { + return lhs.getTime() - rhs.getTime(); + } function calculateSpd(d) { + var tempdate = new Date(moment(d, 'DD MMM YYYY').format('YYYY'), moment(d, 'DD MMM YYYY').format('MM') - 1, moment(d, 'DD MMM YYYY').format('DD')); + dates.push(tempdate); vm.perDayServiceChart.data.rows.push({ c: [{ - v: new Date(moment(d, 'DD MMM YYYY').format('YYYY'), moment(d, 'DD MMM YYYY').format('MM') - 1, moment(d, 'DD MMM YYYY').format('DD')) + v: tempdate }, { v: spd[d] }] @@ -275,75 +480,7 @@ } function failure(err) { - // console.log(err); - } - } - - function DuePaymentsController($state, $mdDialog, unbilledServices) { - // initialize view model - var vm = this; - - // named assignments to keep track of UI - vm.query = { - limit: 20, - page: 1, - total: unbilledServices.length - }; - // function mappings - vm.getServiceDate = getServiceDate; - vm.services = unbilledServices; - vm.editService = editService; - vm.closeDialog = closeDialog; - - // default execution steps - vm.services.sort(sortFunction); - - // function definitions - - function sortFunction(lhs, rhs) { - return (rhs.srvc_date.localeCompare(lhs.srvc_date)); - } - - function getServiceDate(date) { - return moment(date).format('DD MMM YYYY'); - } - - // close dialog box - function closeDialog() { - $mdDialog.hide(); - } - - // edit service - function editService(service) { - $mdDialog.hide(); - $state.go('restricted.services.edit', { - serviceId: service.srvc_id, - vehicleId: service.vhcl_id, - userId: service.cstmr_id, - fromState: 'dashboard.duepayments' - }); - } - } - - function NewCustomerController($mdDialog, newCustomers) { - // initialize view model - var vm = this; - - // named assignments to keep track of UI - vm.query = { - limit: 20, - page: 1, - total: newCustomers.length - }; - // function mappings - vm.customers = newCustomers; - vm.closeDialog = closeDialog; - - // function definitions - - // close dialog box - function closeDialog() { - $mdDialog.hide(); + console.warn(err); } } })();; \ No newline at end of file diff --git a/src/app/components/dashboard/dashboard.factory.js b/src/app/components/dashboard/dashboard.factory.js index bfd74422..a998896d 100644 --- a/src/app/components/dashboard/dashboard.factory.js +++ b/src/app/components/dashboard/dashboard.factory.js @@ -2,7 +2,7 @@ * Factory that handles database interactions between dashboard dataset and controller * @author ndkcha * @since 0.6.0 - * @version 0.6.0 + * @version 0.6.4 */ /// @@ -17,26 +17,153 @@ var factory = { getTotalCustomerServed: getTotalCustomerServed, getNewCustomers: getNewCustomers, - getProblemsAndVehicleTypes: getProblemsAndVehicleTypes + getProblemsAndVehicleTypes: getProblemsAndVehicleTypes, + getFilterMonths: getFilterMonths, + getNextDueCustomers: getNextDueCustomers, + deleteServiceReminder: deleteServiceReminder, + changeServiceReminderDate: changeServiceReminderDate } return factory; // function definitions + + function changeServiceReminderDate(cId, vId, nextdue) { + var tracker = $q.defer(); + pdbCustomers.get(cId).then(getCustomerDoc).catch(failure); + return tracker.promise; + + function getCustomerDoc(res) { + res.user.vehicles[vId].nextdue = nextdue; + pdbCustomers.save(res).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + + function deleteServiceReminder(cId, vId) { + var tracker = $q.defer(); + pdbCustomers.get(cId).then(getCustomerDoc).catch(failure); + return tracker.promise; + + function getCustomerDoc(res) { + delete res.user.vehicles[vId].nextdue; + pdbCustomers.save(res).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + + function getNextDueCustomers(dateRange) { + var tracker = $q.defer(); + pdbCache.get(constants.pdb_cache_views.view_services).then(generateNextDueCustomers).catch(failure); + return tracker.promise; + + function generateNextDueCustomers(res) { + var startdate, enddate, dateFormat, result = []; + switch (dateRange) { + case "Today": + dateFormat = 'YYYY-MM-DD'; + startdate = moment().format(dateFormat); + enddate = moment().format(dateFormat); + break; + case "This Week": + dateFormat = 'w'; + startdate = moment().format(dateFormat); + enddate = moment().format(dateFormat); + break; + case "This Month": + dateFormat = 'M'; + startdate = moment().format(dateFormat); + enddate = moment().format(dateFormat); + break; + } + Object.keys(res).forEach(iterateDateRange); + result.sort(dateSort); + tracker.resolve(result); + + function dateSort(lhs, rhs) { + return lhs.vhcl_nextdue.localeCompare(rhs.vhcl_nextdue); + } + + function iterateDateRange(dr) { + if (dr.match(/_id|_rev/g)) + return; + Object.keys(res[dr]).forEach(iterateService); + + function iterateService(sId) { + if (res[dr][sId].vhcl_nextdue && ((dateRange == 'All') || ((moment(res[dr][sId].vhcl_nextdue).format(dateFormat).localeCompare(startdate) >= 0) && (moment(res[dr][sId].vhcl_nextdue).format(dateFormat).localeCompare(enddate) <= 0)))) { + var cfound = $filter('filter')(result, { + cstmr_id: res[dr][sId].cstmr_id + }, true); + + if (cfound.length == 0) + result.push(res[dr][sId]); + } + } + } + } + + function failure(err) { + tracker.reject(err); + } + } + + function getFilterMonths() { + var tracker = $q.defer(); + pdbCache.get(constants.pdb_cache_views.view_services).then(generateMonthsUsed).catch(failure); + return tracker.promise; + + function generateMonthsUsed(res) { + var result = []; + Object.keys(res).forEach(iterateDateRange); + tracker.resolve(result); + + function iterateDateRange(dr) { + if (dr.match(/_id|_rev/g)) + return; + var temp = dr.split('-'); + result.push({ + month: utils.convertToTitleCase(temp[0]), + year: temp[1] + }); + } + } + + function failure(err) { + tracker.reject(err); + } + } - function getTotalCustomerServed() { + function getTotalCustomerServed(dateRange) { var tracker = $q.defer(); pdbCache.get(constants.pdb_cache_views.view_services).then(generateChartValues).catch(failure); return tracker.promise; function generateChartValues(res) { - var result = []; - var cd = moment().format('MMM YYYY'); - cd = angular.lowercase(cd).replace(' ', '-'); - if (res && res[cd]) { - Object.keys(res[cd]).forEach(iterateService); - } + var result = [], cd; + dateRange.forEach(iterateDateRange); tracker.resolve(result); + + function iterateDateRange(dr) { + cd = moment(dr.month + ' ' + dr.year, 'MMM YYYY').format('MMM YYYY'); + cd = angular.lowercase(cd).replace(' ', '-'); + if (res && res[cd]) { + Object.keys(res[cd]).forEach(iterateService); + } + } function iterateService(sId) { var target = res[cd][sId]; @@ -50,7 +177,7 @@ } } - function getProblemsAndVehicleTypes() { + function getProblemsAndVehicleTypes(dateRange) { var problems = {}, vehicleTypes = {}; var tracker = $q.defer(); pdbCustomers.getAll().then(success).catch(failure); @@ -69,17 +196,25 @@ function iterateVehicles(vId) { var vt = row.doc.user.vehicles[vId].type; - if (vt) { - if (!vehicleTypes[vt]) - vehicleTypes[vt] = 0; - vehicleTypes[vt]++; - } + var vtc = 0; + if (vt) + vtc = (vehicleTypes[vt] != undefined) ? vehicleTypes[vt] : 0; if (row.doc.user.vehicles[vId].services) Object.keys(row.doc.user.vehicles[vId].services).forEach(iterateService); function iterateService(sId) { if (row.doc.user.vehicles[vId].services[sId]._deleted == true) return; + var csd = moment(row.doc.user.vehicles[vId].services[sId].date).format('MMM YYYY').split(' '); + var sdfound = $filter('filter')(dateRange, { + month: csd[0], + year: csd[1] + }, true); + + if (sdfound.length > 0) + vehicleTypes[vt] = vtc + 1; + else + return; if (row.doc.user.vehicles[vId].services[sId].problems) Object.keys(row.doc.user.vehicles[vId].services[sId].problems).forEach(iterateProblems); @@ -98,29 +233,37 @@ } } - function getNewCustomers() { + function getNewCustomers(dateRange) { var tracker = $q.defer(); pdbCache.get(constants.pdb_cache_views.view_services).then(getDoc).catch(failure); return tracker.promise; function getDoc(res) { - var result = [], ub = [], unbilled = []; - var cd = moment().format('MMM YYYY'); - cd = angular.lowercase(cd).replace(' ', '-'); - if (res[cd]) - Object.keys(res[cd]).forEach(iservice); - unbilled.forEach(iterateUnbilled); - delete unbilled; - if (res) - Object.keys(res).forEach(iterateDateRange); + var result = [], ub = [], unbilled = [], cd; + dateRange.forEach(iterateDateSetRange); tracker.resolve({ unbilledServices: ub, newCustomers: result }); + + function iterateDateSetRange(drange) { + cd = moment(drange.month + ' ' + drange.year, 'MMM YYYY').format('MMM YYYY'); + cd = angular.lowercase(cd).replace(' ', '-'); + if (res[cd]) + Object.keys(res[cd]).forEach(iservice); + unbilled.forEach(iterateUnbilled); + if (res) + Object.keys(res).forEach(iterateDateRange); + } function iterateUnbilled(s) { - if (s.srvc_status != 'Paid') - ub.push(s); + if (s.srvc_status != 'Paid') { + var found = $filter('filter')(ub, { + srvc_id: s.srvc_id + }, true); + if (found.length == 0) + ub.push(s); + } } function iservice(s) { @@ -131,7 +274,7 @@ var found = $filter('filter')(result, { cstmr_id: target.cstmr_id }, true); - + if (found == 0) result.push(target); } @@ -139,6 +282,16 @@ function iterateDateRange(dr) { if (dr.match(/_id|_rev/g)) return; + var temp = dr.split('-'); + var td = utils.convertToTitleCase(temp[0]) + ' ' + temp[1]; + var f = $filter('filter')(dateRange, { + month: moment(td, 'MMM YYYY').format('MMM'), + year: moment(td, 'MMM YYYY').format('YYYY') + }, true); + + if (f.length == 1) + return; + if (res[dr]) Object.keys(res[dr]).forEach(iterateService); diff --git a/src/app/components/dashboard/dashboard.html b/src/app/components/dashboard/dashboard.html index 4890f838..f065e149 100644 --- a/src/app/components/dashboard/dashboard.html +++ b/src/app/components/dashboard/dashboard.html @@ -11,7 +11,11 @@ .am-card-label { font-weight: 500; font-size: medium; - color: rgba(30, 30, 30, 0.7); + color: #616161; + } + + .am-card-label.white { + color: #fff; } .am-chart-no-border div { @@ -55,15 +59,36 @@ outline: none; cursor: pointer; } + + .am-dashboard-table-nxtdue { + width: 100%; + padding: 4px 4px 0 10px; + } + + .am-dashboard-table-nxtdue td { + padding: 4px 0; + cursor: default; + color: #424242; + transition: color 400ms ease; + } + + .am-dashboard-table-nxtdue tr:hover td { + color: #212121; + } - + + + Showing data for : {{vm.ddTimeSet}} + + date_range + +
Customers Served - (This Month)
{{vm.totalCustomersServed}}
@@ -74,7 +99,6 @@
Income - (This Month)
Rs.$$$Rs.{{vm.totalRevenueEarned}}
@@ -85,7 +109,6 @@
Due Payments - (This Month)
Rs.{{vm.totalPendingPayments}}
@@ -96,7 +119,6 @@
New Customers - (This Month)
{{vm.totalNewCustomers}}
@@ -105,19 +127,20 @@
- +
- Daily Services (This Month: {{vm.totalServicesDone}} Services) +
Daily Services ({{vm.totalServicesDone}} Services)
+ list View All Services - + add Add Service
-
+
No Services Added For This Month
@@ -126,14 +149,55 @@
- - Top Treatments (Overall) + +
Top Treatments
- - Top Vehicle Types (Overall) + +
+ Service Reminders + + {{vm.nsdcTime}} + + + date_range + Change Duration + + + + + {{tr}} + + + + +
+ + + + + + + + +
{{vm.getNxtDueField(customer.cstmr_name)}}{{customer.cstmr_name}}{{vm.getNxtDueField(customer.cstmr_mobile)}}{{customer.cstmr_mobile}}{{vm.getNextDueVehicle(customer.vhcl_manuf,customer.vhcl_model,customer.vhcl_reg)}}{{vm.getNextDueVehicle(customer.vhcl_manuf,customer.vhcl_model,customer.vhcl_reg, true)}}
+
+ No Reminders {{vm.nsdcTime}} +
+
+
+ + More + more_horiz + +
+
+
+ + +
Top Vehicle Types
diff --git a/src/app/components/dashboard/tmpl/dialog_nextdueservices.tmpl.html b/src/app/components/dashboard/tmpl/dialog_nextdueservices.tmpl.html new file mode 100644 index 00000000..9b97c43a --- /dev/null +++ b/src/app/components/dashboard/tmpl/dialog_nextdueservices.tmpl.html @@ -0,0 +1,77 @@ + + + +
+ Customers with Next Due Service +
+ {{vm.nsdcTime}} + + + date_range + Change Duration + + + + + {{tr}} + + + + + + close + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
CustomerMobileVehicleDate
{{customer.cstmr_name}}{{customer.cstmr_mobile}}{{customer.vhcl_manuf + ' ' + customer.vhcl_model}} ({{customer.vhcl_reg}}) + + {{vm.getDate(customer.vhcl_nextdue)}} + + + delete + Delete Reminder + +
+
+ + +
+
+
\ No newline at end of file diff --git a/src/app/components/dashboard/tmpl/dialog_timefilter.html b/src/app/components/dashboard/tmpl/dialog_timefilter.html new file mode 100644 index 00000000..90cae099 --- /dev/null +++ b/src/app/components/dashboard/tmpl/dialog_timefilter.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + arrow_back + + + + {{vm.yearRange[vm.currentYearIndex]}} + + + + arrow_forward + +
+ + Jan + + + + Feb + + + + Mar + +
+ + Apr + + + + May + + + + Jun + +
+ + Jul + + + + Aug + + + + Sept + +
+ + Oct + + + + Nov + + + + Dec + +
+
+ + + done + Done + + +
\ No newline at end of file diff --git a/src/app/components/invoices/invoices-view.controller.js b/src/app/components/invoices/invoices-view.controller.js index 5dba8a94..7002b8c9 100644 --- a/src/app/components/invoices/invoices-view.controller.js +++ b/src/app/components/invoices/invoices-view.controller.js @@ -2,7 +2,7 @@ * Controller for View Invoice component * @author ndkcha * @since 0.5.0 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -14,17 +14,23 @@ const eIpc = require("electron").ipcRenderer; // angular code - angular.module('automintApp').controller('amCtrlIvRI', InvoicesViewController); + angular.module('automintApp') + .controller('amCtrlIvRI', InvoicesViewController) + .controller('amCtrlCmI', ConfirmMailController); - InvoicesViewController.$inject = ['$q', '$log', '$state', '$window', 'utils', 'amInvoices']; + InvoicesViewController.$inject = ['$q', '$log', '$state', '$window', '$mdDialog', 'utils', 'amInvoices']; + ConfirmMailController.$inject = ['$mdDialog', 'utils', 'user']; - function InvoicesViewController($q, $log, $state, $window, utils, amInvoices) { + function InvoicesViewController($q, $log, $state, $window, $mdDialog, utils, amInvoices) { // initialize view model var vm = this; + var oCustomerEmail; + // named assignments to keep track of UI elements vm.isFabOpen = true; vm.fabClass = ''; + vm.subtotal = 0; // function maps vm.printInvoice = printInvoice; @@ -41,6 +47,10 @@ vm.IsSocialFacebook = IsSocialFacebook; vm.IsSocialInstagram = IsSocialInstagram; vm.IsSocialTwitter = IsSocialTwitter; + vm.initiateMailInvoiceProcess = initiateMailInvoiceProcess; + vm.IsInvoiceAvailable = IsInvoiceAvailable; + vm.IsSubtotalEnabled = IsSubtotalEnabled; + vm.calculateSubtotal = calculateSubtotal; // default execution steps if ($state.params.userId == undefined || $state.params.vehicleId == undefined || $state.params.serviceId == undefined) { @@ -57,6 +67,41 @@ // function definitions + function IsSubtotalEnabled() { + return (vm.isDiscountApplied || vm.isRoundOff || (vm.sTaxSettings && vm.sTaxSettings.applyTax) || (vm.vatSettings && vm.vatSettings.applyTax)); + } + + function calculateSubtotal() { + var totalCost = 0; + vm.service.problems.forEach(iterateProblem); + vm.service.inventories.forEach(iterateInventories); + if (vm.service.packages) { + vm.service.packages.forEach(iteratePackages); + } + totalCost = (totalCost % 1 != 0) ? totalCost.toFixed(2) : parseInt(totalCost); + vm.subtotal = totalCost; + + function iterateProblem(element) { + totalCost += parseFloat(element.rate); + } + + function iterateInventories(element) { + totalCost += parseFloat(element.rate * element.qty); + } + + function iteratePackages(package) { + package.treatments.forEach(ipt); + } + + function ipt(treatment) { + totalCost += treatment.rate; + } + } + + function IsInvoiceAvailable() { + return (vm.service && vm.service.state == "Bill"); + } + function IsSocialFacebook() { if (vm.workshop.social.facebook == undefined) return false; @@ -83,7 +128,7 @@ } function failure(err) { - console.log('Cound not find margin settings'); + console.info('Cound not find margin settings'); } } @@ -154,6 +199,7 @@ function fillServiceDetails(res) { vm.user = res.user; + oCustomerEmail = res.user.email; vm.vehicle = res.vehicle; vm.service = res.service; vm.isRoundOff = (vm.service.roundoff != undefined); @@ -169,6 +215,7 @@ tax: res.service.vat.tax } calculateInventoryValues(); + calculateSubtotal(); } function failure(err) { @@ -234,7 +281,7 @@ } function failure(err) { - console.log(err); + console.warn(err); $log.info('Could not load display settings!'); } } @@ -286,6 +333,36 @@ } } + function initiateMailInvoiceProcess(ev) { + $mdDialog.show({ + controller: 'amCtrlCmI', + controllerAs: 'vm', + templateUrl: 'app/components/invoices/invoices_confirmmail.tmpl.html', + parent: angular.element(document.body), + targetEvent: event, + locals: { + utils: utils, + user: vm.user + }, + clickOutsideToClose: true + }).then(doMailInvoice).catch(cancelMailInvoice); + + function doMailInvoice(result) { + vm.user.email = result; + mailInvoice(); + if (vm.user.email != oCustomerEmail) + amInvoices.saveCustomerEmail($state.params.userId, vm.user.email).then(respond).catch(respond); + + function respond(res) { + console.info(res); + } + } + + function cancelMailInvoice() { + console.info('cancelled'); + } + } + // send email function mailInvoice() { if (vm.user.email == undefined || vm.user.email == '') { @@ -381,4 +458,24 @@ } } } + + function ConfirmMailController($mdDialog, utils, user) { + var vm = this; + + vm.user = user; + vm.sendInvoice = sendInvoice; + vm.cancelInvoice = cancelInvoice; + + function sendInvoice() { + if (vm.user.email == '' || vm.user.email == undefined) { + utils.showSimpleToast('Please Enter Email Address'); + return; + } + $mdDialog.hide(vm.user.email); + } + + function cancelInvoice() { + $mdDialog.cancel(); + } + } })(); \ No newline at end of file diff --git a/src/app/components/invoices/invoices.factory.js b/src/app/components/invoices/invoices.factory.js index 5b4b8d6b..1f92fb9c 100644 --- a/src/app/components/invoices/invoices.factory.js +++ b/src/app/components/invoices/invoices.factory.js @@ -2,7 +2,7 @@ * Factory that handles database interactions between invoices database and controller * @author ndkcha * @since 0.5.0 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -19,13 +19,33 @@ getServiceDetails: getServiceDetails, getWorkshopDetails: getWorkshopDetails, getIvSettings: getIvSettings, - getIvAlignMargins: getIvAlignMargins + getIvAlignMargins: getIvAlignMargins, + saveCustomerEmail: saveCustomerEmail } return factory; // function definitions + function saveCustomerEmail(userId, email) { + var tracker = $q.defer(); + pdbCustomers.get(userId).then(getUserObject).catch(failure); + return tracker.promise; + + function getUserObject(res) { + res.user.email = email; + pdbCustomers.save(res).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + function getIvAlignMargins() { var tracker = $q.defer(); $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); diff --git a/src/app/components/invoices/invoices_confirmmail.tmpl.html b/src/app/components/invoices/invoices_confirmmail.tmpl.html new file mode 100644 index 00000000..99f4699c --- /dev/null +++ b/src/app/components/invoices/invoices_confirmmail.tmpl.html @@ -0,0 +1,32 @@ + + +
+ Confirm Email Address + Please enter {{vm.user.name}}'s email address + +
+
+ + Cancel + + + Send + send + +
+
\ No newline at end of file diff --git a/src/app/components/invoices/invoices_view.html b/src/app/components/invoices/invoices_view.html index 44bff2d5..25e1b5b0 100644 --- a/src/app/components/invoices/invoices_view.html +++ b/src/app/components/invoices/invoices_view.html @@ -16,7 +16,7 @@ Back
- + email Email @@ -167,7 +167,7 @@

{{vm.workshop.name}}

-

Invoice #{{vm.service.invoiceno}}

+

Invoice #{{vm.service.invoiceno}}

{{vm.service.date}} @@ -213,31 +213,37 @@

{{vm.workshop.name}}

{{inventory.qty}} Rs. {{inventory.total}} - + + Sub Total + + + Rs. {{vm.subtotal}} + + Service Tax ({{vm.sTaxSettings.tax}}%) Rs. {{vm.calculateServiceTax()}} - + VAT ({{vm.vatSettings.tax}}%) Rs. {{vm.calculateVat()}} - + Discount ({{vm.service.discount.percent}}%) Rs. {{vm.service.discount.amount}} - + Round Off Rs. {{vm.service.roundoff}} - + Total diff --git a/src/app/components/services/services-add.controller.js b/src/app/components/services/services-add.controller.js index 86956b79..63cf2686 100644 --- a/src/app/components/services/services-add.controller.js +++ b/src/app/components/services/services-add.controller.js @@ -2,7 +2,7 @@ * Controller for Add Service module * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -12,7 +12,7 @@ .controller('amCtrlSeCI', ServiceAddController) .controller('amCtrlMeD', MembershipEditDialogController); - ServiceAddController.$inject = ['$state', '$q', '$log', '$filter', '$mdEditDialog', '$mdDialog', 'utils', 'amServices']; + ServiceAddController.$inject = ['$scope', '$state', '$q', '$log', '$filter', '$timeout', '$mdEditDialog', '$mdDialog', '$mdSidenav', 'utils', 'amServices']; MembershipEditDialogController.$inject = ['$mdDialog', '$filter', 'membership', 'treatments']; /* @@ -20,7 +20,7 @@ > Do not create new method named moment() since it is used by moment.js */ - function ServiceAddController($state, $q, $log, $filter, $mdEditDialog, $mdDialog, utils, amServices) { + function ServiceAddController($scope, $state, $q, $log, $filter, $timeout, $mdEditDialog, $mdDialog, $mdSidenav, utils, amServices) { // initialize view model var vm = this; @@ -28,20 +28,15 @@ var autofillVehicle = false, flagGetUserBasedOnMobile = true, olInvoiceNo = 1, + olJobCardNo = 1, + olEstimateNo = 1, transitIds = undefined, transitInterState = undefined, - isDiscountByPercent = true, - isManualRoundOff = false, - serviceTotalCost = 0, - forceStopCalCost = false; + forceStopCalCost = false, + serviceTcRo = 0, + serviceTcDc = 0; // vm assignments to keep track of UI related elements - vm.label_userMobile = 'Enter Mobile Number:'; - vm.label_userEmail = 'Enter Email:'; - vm.label_userAddress = 'Enter Address:'; - vm.label_vehicleReg = 'Enter Vehicle Reg Number:'; - vm.label_vehicleManuf = 'Manufacturer:'; - vm.label_vehicleModel = 'Model:'; vm.vehicleTypeList = []; vm.user = { id: '', @@ -62,7 +57,10 @@ odo: 0, cost: 0, status: '', + state: '', invoiceno: 1, + jobcardno: 1, + estimateno: 1, problems: [] }; vm.problem = { @@ -95,6 +93,15 @@ total: '' }; vm.totalCost = 0; + vm.isUserInfoExpanded = true; + vm.isVehicleInfoExpanded = false; + vm.isServiceInfoExpanded = false; + vm.serviceStateList = ['Job Card', 'Estimate', 'Bill']; + vm.service.state = vm.serviceStateList[2]; + vm.label_invoice = 'Invoice'; + vm.isNextDueService = false; + vm.nextDueDate = new Date(); + vm.nextDueDate.setMonth(vm.nextDueDate.getMonth() + 3); // named assignments to handle behaviour of UI elements vm.redirect = { @@ -107,11 +114,6 @@ vm.searchVehicleChange = searchVehicleChange; vm.manufacturersQuerySearch = manufacturersQuerySearch; vm.modelQuerySearch = modelQuerySearch; - vm.changeUserMobileLabel = changeUserMobileLabel; - vm.changeUserEmailLabel = changeUserEmailLabel; - vm.changeVehicleRegLabel = changeVehicleRegLabel; - vm.changeVehicleTab = changeVehicleTab; - vm.changeUserTab = changeUserTab; vm.changeVehicle = changeVehicle; vm.isAddOperation = isAddOperation; vm.chooseVehicle = chooseVehicle; @@ -123,16 +125,14 @@ vm.treatmentsQuerySearch = treatmentsQuerySearch; vm.onProblemSelected = onProblemSelected; vm.onProblemDeselected = onProblemDeselected; - vm.changeServiceTab = changeServiceTab; vm.updateTreatmentDetails = updateTreatmentDetails; vm.finalizeNewProblem = finalizeNewProblem; vm.save = save; - vm.changeUserAddressLabel = changeUserAddressLabel; vm.queryMembershipChip = queryMembershipChip; vm.OnClickMembershipChip = OnClickMembershipChip; vm.calculateCost = calculateCost; vm.OnAddMembershipChip = OnAddMembershipChip; - vm.navigateToSubscriptMembership = navigateToSubscriptMembership; + vm.navigateToSubscribeMembership = navigateToSubscribeMembership; vm.goBack = goBack; vm.changeProblemRate = changeProblemRate; vm.changeServiceTax = changeServiceTax; @@ -150,12 +150,54 @@ vm.calculateVat = calculateVat; vm.changeQty = changeQty; vm.changeInventoryTotal = changeInventoryTotal; - vm.populateRoundOffVal = populateRoundOffVal; + vm.populateRoD = populateRoD; vm.changeForceStopCalCost = changeForceStopCalCost; - vm.calculateViewportHeight = calculateViewportHeight; + vm.unsubscribeMembership = unsubscribeMembership; + vm.label_titleCustomerMoreInfo = label_titleCustomerMoreInfo; + vm.changeUserInfoState = changeUserInfoState; + vm.changeVehicleInfoState = changeVehicleInfoState; + vm.changeServiceInfoState = changeServiceInfoState; + vm.openCustomerMoreDetails = buildDelayedToggler('customer-more-right'); + vm.closeCustomerMoreDetails = closeCustomerMoreDetails; + vm.openServiceDetailsPanel = buildDelayedToggler('service-details-left'); + vm.fetchFocusItemAfterSS = fetchFocusItemAfterSS; + vm.lockServiceNavbar = lockServiceNavbar; + vm.IsMembershipTreatmentsDisabled = IsMembershipTreatmentsDisabled; + vm.IsNoMembershipSubscribed = IsNoMembershipSubscribed; + vm.IsMembershipEnabled = IsMembershipEnabled; + vm.IsPackageEnabled = IsPackageEnabled; + vm.convertVehicleTypeToAF = convertVehicleTypeToAF; + vm.IsTreatmentAmountEditable = IsTreatmentAmountEditable; + vm.IsTreatmentAmountText = IsTreatmentAmountText; + vm.IsPackageEnabled = IsPackageEnabled; + vm.changeDisplayAsList = changeDisplayAsList; + vm.IsTreatmentRateDisplayed = IsTreatmentRateDisplayed; + vm.changeInventoryAsList = changeInventoryAsList; + vm.IsInventoryTotalEditable = IsInventoryTotalEditable; + vm.IsInventoryTotalText = IsInventoryTotalText; + vm.IsServiceStateSelected = IsServiceStateSelected; + vm.selectServiceState = selectServiceState; + vm.WhichServiceStateEnabled = WhichServiceStateEnabled; + vm.autoCapitalizeCustomerAddress = autoCapitalizeCustomerAddress; + vm.autoCapitalizeVehicleModel = autoCapitalizeVehicleModel; + vm.calculateSubtotal = calculateSubtotal; + vm.doRoundOff = doRoundOff; + vm.calculateRoundOff = calculateRoundOff; + vm.calculateDiscount = calculateDiscount; + vm.isRoD = isRoD; + vm.IsSubtotalEnabled = IsSubtotalEnabled; + vm.IsServiceStateJc = IsServiceStateJc; + vm.IsServiceStateEs = IsServiceStateEs; + vm.IsServiceStateIv = IsServiceStateIv; + vm.getDate = getDate; // default execution steps - // vm.serviceTab = true; // testing purposes [amTODO: remove it] + setCoverPic(); + changeUserInfoState(true); // ammToDo: Enable this while commiting + setTimeout(focusUserName, 700); + // changeServiceInfoState(true); // ammToDo: Testing Purpose, Disable while commiting + buildDelayedToggler('service-details-left'); + getDefaultServiceType(); getTreatmentDisplayFormat(); getInventoriesSettings(); getVehicleTypes(); @@ -163,13 +205,307 @@ getInventories(); getMemberships(); getLastInvoiceNo(); + getLastEstimateNo(); + getLastJobCardNo(); - vm.serviceViewportHeight = $(window).height(); + // watchers + $(window).on('resize', OnWindowResize); // function definitions - function calculateViewportHeight(element) { - vm.serviceViewportHeight = $(window).height() - (2*element[0].offsetTop + 0.6*element[0].offsetTop); + function getDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + function IsServiceStateIv(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[2]); + } + + function IsServiceStateEs(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[1]); + } + + function IsServiceStateJc(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[0]); + } + + function OnWindowResize() { + if (vm.isServiceInfoExpanded) + setServicesVpHeight(); + } + + function setServicesVpHeight() { + $('#am-service-viewport').height($(window).height() - ($('#am-service-viewport').offset().top + 15)); + } + + function IsSubtotalEnabled() { + return (vm.isDiscountApplied || vm.isRoundOffVal || (vm.sTaxSettings && vm.sTaxSettings.applyTax) || (vm.vatSettings && vm.vatSettings.applyTax)); + } + + function isRoD() { + return (vm.isDiscountApplied || vm.isRoundOffVal); + } + + function doRoundOff(input) { + if (input == '') + return 0; + return ((input % 1 != 0) ? input.toFixed(2) : parseInt(input)); + } + + function calculateSubtotal() { + var totalCost = 0; + vm.service.problems.forEach(iterateProblem); + vm.selectedInventories.forEach(iterateInventories); + if (vm.serviceType == vm.serviceTypeList[1]) { + vm.packages.forEach(iteratePackages); + } + totalCost = (totalCost % 1 != 0) ? totalCost.toFixed(2) : parseInt(totalCost); + return totalCost; + + function iterateProblem(element) { + totalCost += parseFloat(element.rate ? (element.rate * (element.checked ? 1 : 0)) : 0); + } + + function iterateInventories(element) { + totalCost += parseFloat(element.rate ? ((element.rate * element.qty) * (element.checked ? 1 : 0)) : 0); + } + + function iteratePackages(package) { + if (!package.checked) + return; + package.selectedTreatments.forEach(ipt); + } + + function ipt(treatment) { + totalCost += treatment.rate[vm.vehicle.type.toLowerCase().replace(' ', '-')]; + } + } + + function getDefaultServiceType() { + amServices.getDefaultServiceType().then(success).catch(failure); + + function success(res) { + vm.service.state = res; + vm.label_invoice = (vm.service.state == vm.serviceStateList[2]) ? 'Invoice' : 'Send'; + } + + function failure(err) { + vm.service.state = vm.serviceStateList[2]; + vm.label_invoice = (vm.service.state == vm.serviceStateList[2]) ? 'Invoice' : 'Send'; + } + } + + function autoCapitalizeVehicleModel() { + vm.vehicle.model = utils.autoCapitalizeWord(vm.vehicle.model); + } + + function autoCapitalizeVehicleManuf() { + vm.vehicle.manuf = utils.autoCapitalizeWord(vm.vehicle.manuf); + } + + function autoCapitalizeCustomerAddress() { + vm.user.address = utils.autoCapitalizeWord(vm.user.address); + } + + function WhichServiceStateEnabled(index) { + return (IsServiceStateSelected(vm.serviceStateList[index])); + } + + function selectServiceState(state) { + vm.service.state = state; + vm.label_invoice = (vm.service.state == vm.serviceStateList[2]) ? 'Invoice' : 'Send'; + } + + function IsServiceStateSelected(state) { + return (vm.service.state == state); + } + + function focusShowAllInventoriesButton() { + $('#ami-display-inventory-as').focus(); + } + + function focusShowAllTreatmentsButton() { + $('#ami-display-as').focus(); + } + + function IsInventoryTotalText() { + return (vm.vatSettings && !vm.vatSettings.inclusive && vm.vatSettings.applyTax); + } + + function IsInventoryTotalEditable() { + return (vm.vatSettings && (vm.vatSettings.inclusive || !vm.vatSettings.applyTax)); + } + + function changeInventoryAsList(bool) { + vm.displayInventoriesAsList = bool; + setTimeout(focusShowAllInventoriesButton, 300); + } + + function IsTreatmentRateDisplayed() { + return (vm.sTaxSettings && vm.sTaxSettings.applyTax && !vm.sTaxSettings.inclusive); + } + + function changeDisplayAsList(bool) { + vm.displayTreatmentAsList = bool; + setTimeout(focusShowAllTreatmentsButton, 300); + } + + function IsPackageEnabled() { + return (vm.packages.length < 1); + } + + function IsTreatmentAmountText() { + return (vm.sTaxSettings && !vm.sTaxSettings.inclusive && vm.sTaxSettings.applyTax); + } + + function IsTreatmentAmountEditable() { + return (vm.sTaxSettings && (vm.sTaxSettings.inclusive || !vm.sTaxSettings.applyTax)); + } + + function convertVehicleTypeToAF() { + return (vm.vehicle.type.toLowerCase().replace(' ', '-')); + } + + function IsPackageEnabled() { + return (vm.serviceType == vm.serviceTypeList[1]); + } + + function IsMembershipEnabled() { + return (vm.serviceType == vm.serviceTypeList[2]); + } + + function IsNoMembershipSubscribed() { + return (vm.membershipChips.length < 1); + } + + function IsMembershipTreatmentsDisabled(membership, treatment) { + return (membership.calculateTOccurenceLeft(treatment) <= 0 || membership.calculateTDurationLeft(treatment) <= 0); + } + + function lockServiceNavbar() { + return $mdMedia('gt-md'); + } + + function fetchFocusItemAfterSS() { + changeServiceInfoState(true, null, true); + } + + function setCoverPic() { + var source = localStorage.getItem('cover-pic'); + $('#am-sp-cover-pic').attr('src', (source) ? source : 'assets/img/logo-250x125px.png').width(250).height(125); + } + + function label_titleCustomerMoreInfo() { + return (vm.user.name ? vm.user.name + "'s" : "Customer"); + } + + function closeCustomerMoreDetails() { + $mdSidenav('customer-more-right').close(); + setTimeout(cvis, 800); + + function cvis() { + changeVehicleInfoState(true); + } + } + + // Supplies a function that will continue to operate until the time is up. + function debounce(func, wait, context) { + var timer; + return function debounced() { + var context = $scope, + args = Array.prototype.slice.call(arguments); + $timeout.cancel(timer); + timer = $timeout(function() { + timer = undefined; + func.apply(context, args); + }, wait || 10); + }; + } + + // Build handler to open/close a SideNav; when animation finishes report completion in console + function buildDelayedToggler(navID) { + return debounce(function() { + $mdSidenav(navID).toggle(); + }, 200); + } + + function focusServiceState() { + $('#ami-service-state').focus(); + } + + function focusInvoiceNo() { + $('#ami-service-invoice-no').focus(); + } + + function focusUserName() { + $('#ami-user-name input').focus(); + } + + function focusVehicleManuf() { + $('#ami-vehicle-manuf input').focus(); + } + + function changeUserInfoState(expanded) { + vm.isUserInfoExpanded = expanded; + if (expanded) + setTimeout(focusUserName, 300); + vm.isVehicleInfoExpanded = true; + vm.isServiceInfoExpanded = false; + } + + function changeVehicleInfoState(expanded, event) { + if (event != undefined) { + if (event.keyCode != 9) + return; + } + vm.isVehicleInfoExpanded = expanded; + if (expanded) + setTimeout(focusVehicleManuf, 300); + vm.isUserInfoExpanded = true; + vm.isServiceInfoExpanded = false; + } + + function changeServiceInfoState(expanded, event, isAlreadyThere) { + if (event != undefined) { + if (event.keyCode != 9) + return; + } + if (expanded) { + if (!isAlreadyThere) + setTimeout(focusInvoiceNo, 300); + else + setTimeout(focusServiceState, 300); + } + vm.isServiceInfoExpanded = expanded; + if (expanded) + setTimeout(setServicesVpHeight, 500); + vm.isUserInfoExpanded = false; + vm.isVehicleInfoExpanded = false; + } + + function unsubscribeMembership(ev, chip) { + var confirm = $mdDialog.confirm() + .textContent('Unsubscribe to ' + chip.name + ' ?') + .ariaLabel('Unsubscribe to ' + chip.name) + .targetEvent(ev) + .ok('Yes') + .cancel('No'); + + $mdDialog.show(confirm).then(performDelete, ignoreDelete); + + function performDelete() { + console.info('deleted'); + } + + function ignoreDelete() { + vm.membershipChips.push(chip); + } } function changeInventoryTotal(inventory) { @@ -186,7 +522,7 @@ function iterateInventories(element) { if ((vm.vatSettings && !vm.vatSettings.applyTax) || !element.tax || !element.checked) return; - totalTax += parseFloat(element.tax.toFixed(2) * element.qty); + totalTax += parseFloat(element.tax * element.qty); } } @@ -364,8 +700,6 @@ inventory.rate = inventory.amount; inventory.tax = (inventory.rate * vm.vatSettings.tax / 100); inventory.amount = inventory.rate + inventory.tax; - if (inventory.amount % 1 != 0) - inventory.amount = parseFloat(inventory.amount).toFixed(2); } } else if (force) { if (vm.vatSettings.inclusive) @@ -410,7 +744,7 @@ if (!problem.rate) problem.rate = problem.amount; problem.tax = (problem.rate * vm.sTaxSettings.tax / 100); - problem.amount = Math.round(problem.rate + problem.tax); + problem.amount = problem.rate + problem.tax; } } else if (force) { if (vm.sTaxSettings.inclusive) @@ -469,8 +803,9 @@ OnAddMembershipChip(chip); } - function navigateToSubscriptMembership() { - vm.userTab = true; + function navigateToSubscribeMembership() { + changeUserInfoState(true); + vm.openCustomerMoreDetails(); } function OnClickMembershipChip(event) { @@ -558,11 +893,12 @@ } function OnAddMembershipChip(chip) { - if (vm.membershipChips.length > 0) - vm.serviceType = vm.serviceTypeList[2]; + vm.serviceType = (vm.membershipChips.length > 0) ? vm.serviceTypeList[2] : vm.serviceTypeList[0]; var m = $.extend({}, chip.treatments, false); - chip.treatments = []; - Object.keys(m).forEach(iterateTreatments); + if (!angular.isArray(chip.treatments)) { + chip.treatments = []; + Object.keys(m).forEach(iterateTreatments); + } chip.selectedTreatments = []; chip.startdate = moment().format(); chip.treatments.forEach(makeSelectedTreatments); @@ -719,7 +1055,7 @@ treatment.tax[cvt] = (treatment.rate[cvt] * vm.sTaxSettings.tax / 100); } else { treatment.tax[cvt] = (treatment.rate[cvt] * vm.sTaxSettings.tax / 100); - treatment.amount[cvt] = Math.round(treatment.rate[cvt] + treatment.tax[cvt]); + treatment.amount[cvt] = treatment.rate[cvt] + treatment.tax[cvt]; } } else if (force) { if (vm.sTaxSettings.inclusive) @@ -753,6 +1089,34 @@ } } + function getLastJobCardNo() { + amServices.getLastJobCardNo().then(success).catch(failure); + + function success(res) { + vm.service.jobcardno = ++res; + olJobCardNo = res; + } + + function failure(err) { + vm.service.jobcardno = 1; + olJobCardNo = 1; + } + } + + function getLastEstimateNo() { + amServices.getLastEstimateNo().then(success).catch(failure); + + function success(res) { + vm.service.estimateno = ++res; + olEstimateNo = res; + } + + function failure(err) { + vm.service.estimateno = 1; + olEstimateNo = 1; + } + } + // get last invoice number from database function getLastInvoiceNo() { amServices.getLastInvoiceNo().then(success).catch(failure); @@ -794,6 +1158,7 @@ } function failure(err) { + console.log(err); setDefaultVehicle(); } } @@ -845,13 +1210,9 @@ vm.user.name = res.name; vm.user.address = (res.address == undefined) ? '' : res.address; if (res.memberships) { - if (Object.keys(res.memberships).length > 0) - vm.serviceType = vm.serviceTypeList[2]; + vm.serviceType = (Object.keys(res.memberships).length > 0) ? vm.serviceTypeList[2] : vm.serviceTypeList[0]; Object.keys(res.memberships).forEach(iterateMemberships); } - changeUserMobileLabel(); - changeUserEmailLabel(); - changeUserAddressLabel(); vm.possibleVehicleList = res.possibleVehicleList; vm.changeUserMobile(false); changeVehicle(vm.possibleVehicleList.length > 0 ? vm.possibleVehicleList[0].id : undefined); @@ -870,9 +1231,6 @@ vm.user.email = ''; vm.user.address = ''; vm.membershipChips = []; - changeUserMobileLabel(); - changeUserEmailLabel(); - changeUserAddressLabel(); vm.possibleVehicleList = []; changeVehicle(); } @@ -903,9 +1261,6 @@ vm.serviceType = vm.serviceTypeList[2]; Object.keys(res.memberships).forEach(iterateMemberships); } - changeUserMobileLabel(); - changeUserEmailLabel(); - changeUserAddressLabel(); vm.possibleVehicleList = res.possibleVehicleList; changeVehicle(vm.possibleVehicleList.length > 0 ? vm.possibleVehicleList[0].id : undefined); @@ -919,29 +1274,34 @@ function failure(err) { vm.loadingBasedOnMobile = false; vm.user.id = ''; - changeUserMobileLabel(); vm.possibleVehicleList = []; changeVehicle(); } } // change vehicle related details when changed from UI - function changeVehicle(id) { + function changeVehicle(id, manual) { if (!id) { setDefaultVehicle(); + setTimeout(focusVehicleManuf, 500); return; } var found = $filter('filter')(vm.possibleVehicleList, { id: id }, true); if (found.length > 0) { + if (manual) + changeServiceInfoState(true); vm.currentVehicle = found[0].name; vm.vehicle.id = found[0].id; vm.vehicle.reg = found[0].reg; vm.vehicle.manuf = found[0].manuf; vm.vehicle.model = found[0].model; vm.vehicle.type = (found[0].type == undefined || found[0].type == '') ? vm.vehicleTypeList[0] : found[0].type; - changeVehicleRegLabel(); + if (found[0].nextdue && (found[0].nextdue.localeCompare(moment().format()) > 0)) { + vm.isNextDueService = true; + vm.nextDueDate = new Date(found[0].nextdue); + } changeVehicleType(); autofillVehicle = true; } else @@ -959,7 +1319,9 @@ vm.vehicle.type = vm.vehicleTypeList[0]; changeVehicleType(); } - changeVehicleRegLabel(); + vm.isNextDueService = false; + vm.nextDueDate = new Date(); + vm.nextDueDate.setMonth(vm.nextDueDate.getMonth() + 3); autofillVehicle = false; } @@ -1045,6 +1407,7 @@ // vehicle manufacturer is updated from UI, clear model list to populate new list w.r.t. manufacturer function searchVehicleChange() { + autoCapitalizeVehicleManuf(); if (!autofillVehicle) { vm.models = []; vm.vehicle.model = ''; @@ -1072,7 +1435,7 @@ } else { problem.rate = (rate == '' || rate == undefined ? problem.rate : rate); problem.tax = (problem.rate * vm.sTaxSettings.tax / 100); - problem.amount = Math.round(problem.rate + problem.tax); + problem.amount = problem.rate + problem.tax; } } else { problem.rate = (rate == '' || rate == undefined ? problem.rate : rate); @@ -1088,43 +1451,6 @@ } // return boolean response to different configurations [END] - // change user tab selector variable - function changeUserTab(bool) { - vm.userTab = bool; - } - - // change vehicle tab selector variable - function changeVehicleTab(bool) { - vm.vehicleTab = bool; - } - - // change service tab selector variable - function changeServiceTab(bool) { - vm.serviceTab = bool; - } - - // listen to changes in input fields [BEGIN] - function changeUserMobileLabel(force) { - vm.isUserMobile = (force != undefined || vm.user.mobile != ''); - vm.label_userMobile = vm.isUserMobile ? 'Mobile:' : 'Enter Mobile Number:'; - } - - function changeUserEmailLabel(force) { - vm.isUserEmail = (force != undefined || vm.user.email != ''); - vm.label_userEmail = vm.isUserEmail ? 'Email:' : 'Enter Email:'; - } - - function changeUserAddressLabel(force) { - vm.isUserAddress = (force != undefined || vm.user.address != ''); - vm.label_userAddress = vm.isUserAddress ? 'Address:' : 'Enter Address:'; - } - - function changeVehicleRegLabel(force) { - vm.isVehicleReg = (force != undefined || vm.vehicle.reg != ''); - vm.label_vehicleReg = vm.isVehicleReg ? 'Vehicle Registration Number:' : 'Enter Vehicle Reg Number:'; - } - // listen to changes in input fields [END] - // populate regular treatment list function getRegularTreatments() { vm.problemPromise = amServices.getRegularTreatments().then(success).catch(failure); @@ -1183,55 +1509,57 @@ } } - function populateRoundOffVal() { - vm.roundedOffVal = vm.service.cost - serviceTotalCost; + function populateRoD() { + if (vm.isDiscountApplied) { + vm.discountValue = serviceTcDc - vm.service.cost; + calculateDiscount(false); + } else if (vm.isRoundOffVal) + vm.roundedOffVal = vm.service.cost - serviceTcRo; + } + + function calculateRoundOff(isRoundOffManual) { + if (!isRoundOffManual) { + var ot = totalCost = vm.service.cost; + totalCost = vm.isRoundOffVal ? Math.floor(totalCost * 0.1) * 10 : totalCost; + vm.roundedOffVal = (totalCost - ot); + } + calculateCost(); + } + + function calculateDiscount(isDiscountByPercent) { + var totalCost = vm.service.cost; + if (isDiscountByPercent) { + vm.discountValue = totalCost * parseFloat(vm.discountPercentage) / 100; + vm.discountValue = (isNaN(vm.discountValue) || vm.discountValue == null) ? '' : vm.discountValue; + } else if (vm.discountValue != '') + vm.discountPercentage = 100 * parseFloat(vm.discountValue) / totalCost; + calculateCost(); } function changeForceStopCalCost(bool) { forceStopCalCost = bool; - isManualRoundOff = true; } - function calculateCost(isDbp, isMro) { + function calculateCost() { if (forceStopCalCost) return; - isDiscountByPercent = (isDbp != undefined) ? isDbp : isDiscountByPercent; - isManualRoundOff = (isMro != undefined) ? isMro : isManualRoundOff; var totalCost = 0; - serviceTotalCost = 0; vm.service.problems.forEach(iterateProblem); vm.selectedInventories.forEach(iterateInventories); if (vm.serviceType == vm.serviceTypeList[1]) { vm.packages.forEach(iteratePackages); } + serviceTcDc = totalCost; if (vm.isDiscountApplied) { - if (isDiscountByPercent) { - var dv = totalCost * parseFloat(vm.discountPercentage) / 100; - totalCost = vm.isDiscountApplied && !isNaN(dv) ? totalCost - dv : totalCost; - vm.discountValue = (dv % 1 != 0) ? dv.toFixed(2) : dv; - vm.discountValue = (isNaN(vm.discountValue) || vm.discountValue == null) ? '' : vm.discountValue; - delete dv; - } else if (vm.discountValue != '') { - var dv = parseFloat(vm.discountValue); - vm.discountPercentage = 100 * dv / totalCost; - vm.discountPercentage = (vm.discountPercentage % 1 != 0) ? vm.discountPercentage.toFixed(2) : vm.discountPercentage; - totalCost -= dv; - delete dv; - } + totalCost = vm.isDiscountApplied && !isNaN(vm.discountValue) ? totalCost - vm.discountValue : totalCost; } - serviceTotalCost = totalCost; + serviceTcRo = totalCost; if (vm.isRoundOffVal) { - if (!isManualRoundOff) { - var ot = totalCost; - totalCost = vm.isRoundOffVal ? Math.floor(totalCost * 0.1) * 10 : totalCost; - vm.roundedOffVal = (totalCost - ot); - vm.roundedOffVal = (vm.roundedOffVal % 1 != 0) ? vm.roundedOffVal.toFixed(2) : vm.roundedOffVal; - delete ot; - } else { - totalCost += parseFloat(vm.roundedOffVal); - } + totalCost += parseFloat(vm.roundedOffVal); + serviceTcDc += parseFloat(vm.roundedOffVal); } totalCost = (totalCost % 1 != 0) ? totalCost.toFixed(2) : totalCost; + totalCost = (totalCost % 1).toFixed(2) == 0.00 ? Math.round(totalCost) : totalCost; vm.service.cost = totalCost; function iterateProblem(element) { @@ -1264,7 +1592,7 @@ function iterateProblems(problem) { if ((vm.sTaxSettings && !vm.sTaxSettings.applyTax) || !problem.tax || !problem.checked) return; - totalTax += parseFloat(problem.tax.toFixed(2)); + totalTax += parseFloat(problem.tax); } function iteratePackages(package) { @@ -1276,7 +1604,7 @@ function ipt(treatment) { if ((vm.sTaxSettings && !vm.sTaxSettings.applyTax) || !treatment.tax) return; - totalTax += parseFloat(treatment.tax[vm.vehicle.type.toLowerCase().replace(' ', '-')].toFixed(2)); + totalTax += parseFloat(treatment.tax[vm.vehicle.type.toLowerCase().replace(' ', '-')]); } } @@ -1332,7 +1660,7 @@ } else { vm.problem.rate = (rate == '' || rate == undefined ? vm.problem.rate : rate); vm.problem.tax = (vm.problem.rate * vm.sTaxSettings.tax / 100); - vm.problem.amount = Math.round(vm.problem.rate + vm.problem.tax); + vm.problem.amount = vm.problem.rate + vm.problem.tax; } } else { if (vm.sTaxSettings.inclusive) @@ -1346,7 +1674,7 @@ function validate() { if (vm.user.name == '') { - changeUserTab(true); + changeUserInfoState(true); setTimeout(doFocus, 300); utils.showSimpleToast('Please Enter Name'); @@ -1358,7 +1686,7 @@ var isVehicleBlank = (vm.vehicle.manuf == undefined || vm.vehicle.manuf == '') && (vm.vehicle.model == undefined || vm.vehicle.model == '') && (vm.vehicle.reg == undefined || vm.vehicle.reg == ''); if (isVehicleBlank) { - changeVehicleTab(true); + changeVehicleInfoState(true); utils.showSimpleToast('Please Enter At Least One Vehicle Detail'); return false; } @@ -1390,7 +1718,9 @@ } vm.service.problems = vm.selectedProblems; var options = { - isLastInvoiceNoChanged: (vm.service.invoiceno == olInvoiceNo) + isLastInvoiceNoChanged: (vm.service.invoiceno == olInvoiceNo), + isLastEstimateNoChanged: (vm.service.estimateno == olEstimateNo), + isLastJobCardNoChanged: (vm.service.jobcardno == olJobCardNo) } vm.user.memberships = vm.membershipChips; switch (vm.serviceType) { @@ -1401,8 +1731,10 @@ vm.membershipChips.forEach(addMsToService); break; } - vm.service.status = vm.servicestatus ? 'paid' : 'billed'; + vm.service.status = vm.servicestatus ? 'paid' : 'due'; vm.service.date = moment(vm.service.date).format(); + if (vm.isNextDueService) + vm.vehicle.nextdue = moment(vm.nextDueDate).format(); if (vm.isDiscountApplied) { vm.service['discount'] = { percent: parseFloat(vm.discountPercentage), @@ -1429,6 +1761,20 @@ } vm.selectedInventories.forEach(iterateInventories); vm.service.inventories = vm.selectedInventories; + switch (vm.service.state) { + case vm.serviceStateList[0]: + delete vm.service.invoiceno; + delete vm.service.estimateno; + break; + case vm.serviceStateList[1]: + delete vm.service.jobcardno; + delete vm.service.invoiceno; + break; + case vm.serviceStateList[2]: + delete vm.service.jobcardno; + delete vm.service.estimateno; + break; + } amServices.saveService(vm.user, vm.vehicle, vm.service, options).then(success).catch(failure); function addMsToService(membership) { diff --git a/src/app/components/services/services-edit.controller.js b/src/app/components/services/services-edit.controller.js index a5984a71..a8521e82 100644 --- a/src/app/components/services/services-edit.controller.js +++ b/src/app/components/services/services-edit.controller.js @@ -2,7 +2,7 @@ * Controller for Edit Service component * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -12,7 +12,7 @@ .controller('amCtrlSeUI', ServiceEditController) .controller('amCtrlMeD', MembershipEditDialogController); - ServiceEditController.$inject = ['$state', '$q', '$log', '$filter', '$mdEditDialog', '$mdDialog', 'utils', 'amServices']; + ServiceEditController.$inject = ['$scope', '$state', '$q', '$log', '$filter', '$timeout', '$mdEditDialog', '$mdDialog', '$mdSidenav', 'utils', 'amServices']; MembershipEditDialogController.$inject = ['$mdDialog', '$filter', 'membership', 'treatments']; /* @@ -20,7 +20,7 @@ > Do not create new method named moment() since it is used by moment.js */ - function ServiceEditController($state, $q, $log, $filter, $mdEditDialog, $mdDialog, utils, amServices) { + function ServiceEditController($scope, $state, $q, $log, $filter, $timeout, $mdEditDialog, $mdDialog, $mdSidenav, utils, amServices) { // initialize view model var vm = this; @@ -29,16 +29,18 @@ isDiscountByPercent = true, isManualRoundOff = false, isFirstTimeLoad = true, - serviceTotalCost = 0, - forceStopCalCost = false; + serviceTcRo = 0, + serviceTcDc = 0, + forceStopCalCost = false, + olInvoiceNo = 0, + olJobCardNo = 0, + olEstimateNo = 0, + isInvoice = false, + isEstimate = false, + isJobCard = false, + wasNextDueService = false; // vm assignments to keep track of UI related elements - vm.label_userMobile = 'Enter Mobile Number:'; - vm.label_userEmail = 'Enter Email:'; - vm.label_userAddress = 'Enter Address:'; - vm.label_vehicleReg = 'Enter Vehicle Registration Number:'; - vm.label_vehicleManuf = 'Manufacturer:'; - vm.label_vehicleModel = 'Model:'; vm.vehicleTypeList = []; vm.user = { id: '', @@ -58,8 +60,11 @@ date: new Date(), odo: 0, cost: 0, - invoiceno: 1, status: '', + state: '', + invoiceno: undefined, + jobcardno: undefined, + estimateno: undefined, problems: [] }; vm.problem = { @@ -90,6 +95,15 @@ total: '' }; vm.totalCost = 0; + vm.isUserInfoExpanded = true; + vm.isVehicleInfoExpanded = false; + vm.isServiceInfoExpanded = false; + vm.serviceStateList = ['Job Card', 'Estimate', 'Bill']; + vm.service.state = vm.serviceStateList[0]; + vm.label_invoice = 'Invoice'; + vm.isNextDueService = false; + vm.nextDueDate = new Date(); + vm.nextDueDate.setMonth(vm.nextDueDate.getMonth() + 3); // named assignments to handle behaviour of UI elements vm.redirect = { @@ -102,25 +116,19 @@ vm.searchVehicleChange = searchVehicleChange; vm.manufacturersQuerySearch = manufacturersQuerySearch; vm.modelQuerySearch = modelQuerySearch; - vm.changeUserMobileLabel = changeUserMobileLabel; - vm.changeUserEmailLabel = changeUserEmailLabel; - vm.changeVehicleRegLabel = changeVehicleRegLabel; - vm.changeVehicleTab = changeVehicleTab; vm.changeVehicleType = changeVehicleType; vm.treatmentsQuerySearch = treatmentsQuerySearch; vm.onProblemSelected = onProblemSelected; vm.onProblemDeselected = onProblemDeselected; vm.isAddOperation = isAddOperation; - vm.changeServiceTab = changeServiceTab; vm.updateTreatmentDetails = updateTreatmentDetails; vm.finalizeNewProblem = finalizeNewProblem; vm.save = save; - vm.changeUserAddressLabel = changeUserAddressLabel; vm.queryMembershipChip = queryMembershipChip; vm.OnClickMembershipChip = OnClickMembershipChip; vm.calculateCost = calculateCost; vm.OnAddMembershipChip = OnAddMembershipChip; - vm.navigateToSubscriptMembership = navigateToSubscriptMembership; + vm.navigateToSubscribeMembership = navigateToSubscribeMembership; vm.goBack = goBack; vm.changeProblemRate = changeProblemRate; vm.changeServiceTax = changeServiceTax; @@ -138,20 +146,378 @@ vm.calculateVat = calculateVat; vm.changeQty = changeQty; vm.changeInventoryTotal = changeInventoryTotal; - vm.populateRoundOffVal = populateRoundOffVal; + vm.populateRoD = populateRoD; vm.changeForceStopCalCost = changeForceStopCalCost; - vm.calculateViewportHeight = calculateViewportHeight; + vm.unsubscribeMembership = unsubscribeMembership; + vm.label_titleCustomerMoreInfo = label_titleCustomerMoreInfo; + vm.changeUserInfoState = changeUserInfoState; + vm.changeVehicleInfoState = changeVehicleInfoState; + vm.changeServiceInfoState = changeServiceInfoState; + vm.openCustomerMoreDetails = buildDelayedToggler('customer-more-right'); + vm.closeCustomerMoreDetails = closeCustomerMoreDetails; + vm.openServiceDetailsPanel = buildDelayedToggler('service-details-left'); + vm.fetchFocusItemAfterSS = fetchFocusItemAfterSS; + vm.lockServiceNavbar = lockServiceNavbar; + vm.IsMembershipTreatmentsDisabled = IsMembershipTreatmentsDisabled; + vm.IsNoMembershipSubscribed = IsNoMembershipSubscribed; + vm.IsMembershipEnabled = IsMembershipEnabled; + vm.IsPackageEnabled = IsPackageEnabled; + vm.convertVehicleTypeToAF = convertVehicleTypeToAF; + vm.IsTreatmentAmountEditable = IsTreatmentAmountEditable; + vm.IsTreatmentAmountText = IsTreatmentAmountText; + vm.IsPackageEnabled = IsPackageEnabled; + vm.changeDisplayAsList = changeDisplayAsList; + vm.IsTreatmentRateDisplayed = IsTreatmentRateDisplayed; + vm.changeInventoryAsList = changeInventoryAsList; + vm.IsInventoryTotalEditable = IsInventoryTotalEditable; + vm.IsInventoryTotalText = IsInventoryTotalText; + vm.IsServiceStateSelected = IsServiceStateSelected; + vm.selectServiceState = selectServiceState; + vm.WhichServiceStateEnabled = WhichServiceStateEnabled; + vm.autoCapitalizeCustomerAddress = autoCapitalizeCustomerAddress; + vm.autoCapitalizeVehicleModel = autoCapitalizeVehicleModel; + vm.calculateSubtotal = calculateSubtotal; + vm.doRoundOff = doRoundOff; + vm.calculateRoundOff = calculateRoundOff; + vm.calculateDiscount = calculateDiscount; + vm.isRoD = isRoD; + vm.IsSubtotalEnabled = IsSubtotalEnabled; + vm.IsServiceStateJc = IsServiceStateJc; + vm.IsServiceStateEs = IsServiceStateEs; + vm.IsServiceStateIv = IsServiceStateIv; + vm.getDate = getDate; // default execution steps + setCoverPic(); + buildDelayedToggler('service-details-left'); + changeServiceInfoState(true); getVehicleTypes(); - changeServiceTab(true); getPackages(); getMemberships(); + // watchers + $(window).on('resize', OnWindowResize); + // function definitions - function calculateViewportHeight(element) { - vm.serviceViewportHeight = $(window).height() - (2*element[0].offsetTop + 0.45*element[0].offsetTop); + function getDate(date) { + return moment(date).format('DD MMM YYYY'); + } + + function IsServiceStateIv(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[2]); + } + + function IsServiceStateEs(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[1]); + } + + function IsServiceStateJc(state) { + if (!IsServiceStateSelected(state)) + return false; + return (vm.service.state == vm.serviceStateList[0]); + } + + function OnWindowResize() { + if (vm.isServiceInfoExpanded) + setServicesVpHeight(); + } + + function setServicesVpHeight() { + $('#am-service-viewport').height($(window).height() - ($('#am-service-viewport').offset().top + 15)); + } + + function IsSubtotalEnabled() { + return (vm.isDiscountApplied || vm.isRoundOffVal || (vm.sTaxSettings && vm.sTaxSettings.applyTax) || (vm.vatSettings && vm.vatSettings.applyTax)); + } + + function isRoD() { + return (vm.isDiscountApplied || vm.isRoundOffVal); + } + + function doRoundOff(input) { + if (input == '') + return 0; + return ((input % 1 != 0) ? input.toFixed(2) : parseInt(input)); + } + + function calculateSubtotal() { + var totalCost = 0; + vm.service.problems.forEach(iterateProblem); + vm.selectedInventories.forEach(iterateInventories); + if (vm.serviceType == vm.serviceTypeList[1]) { + vm.packages.forEach(iteratePackages); + } + totalCost = (totalCost % 1 != 0) ? totalCost.toFixed(2) : parseInt(totalCost); + return totalCost; + + function iterateProblem(element) { + totalCost += parseFloat(element.rate ? (element.rate * (element.checked ? 1 : 0)) : 0); + } + + function iterateInventories(element) { + totalCost += parseFloat(element.rate ? ((element.rate * element.qty) * (element.checked ? 1 : 0)) : 0); + } + + function iteratePackages(package) { + if (!package.checked) + return; + package.selectedTreatments.forEach(ipt); + } + + function ipt(treatment) { + totalCost += treatment.rate[vm.vehicle.type.toLowerCase().replace(' ', '-')]; + } + } + + function autoCapitalizeVehicleModel() { + vm.vehicle.model = utils.autoCapitalizeWord(vm.vehicle.model); + } + + function autoCapitalizeVehicleManuf() { + vm.vehicle.manuf = utils.autoCapitalizeWord(vm.vehicle.manuf); + } + + function autoCapitalizeCustomerAddress() { + vm.user.address = utils.autoCapitalizeWord(vm.user.address); + } + + function getLastJobCardNo() { + amServices.getLastJobCardNo().then(success).catch(failure); + + function success(res) { + if (vm.service.jobcardno != undefined) + return; + vm.service.jobcardno = ++res; + olJobCardNo = res; + } + + function failure(err) { + vm.service.jobcardno = 1; + olJobCardNo = 1; + } + } + + function getLastEstimateNo() { + amServices.getLastEstimateNo().then(success).catch(failure); + + function success(res) { + if (vm.service.estimateno != undefined) + return; + vm.service.estimateno = ++res; + olEstimateNo = res; + } + + function failure(err) { + vm.service.estimateno = 1; + olEstimateNo = 1; + } + } + + // get last invoice number from database + function getLastInvoiceNo() { + amServices.getLastInvoiceNo().then(success).catch(failure); + + function success(res) { + if (vm.service.invoiceno != undefined) + return; + vm.service.invoiceno = ++res; + olInvoiceNo = res; + } + + function failure(err) { + vm.service.invoiceno = 1; + olInvoiceNo = 1; + } + } + + function WhichServiceStateEnabled(index) { + return (IsServiceStateSelected(vm.serviceStateList[index])); + } + + function selectServiceState(state) { + vm.service.state = state; + vm.label_invoice = (vm.service.state == vm.serviceStateList[2]) ? 'Invoice' : 'Send'; + } + + function IsServiceStateSelected(state) { + return (vm.service.state == state); + } + + function IsInventoryTotalText() { + return (vm.vatSettings && !vm.vatSettings.inclusive && vm.vatSettings.applyTax); + } + + function IsInventoryTotalEditable() { + return (vm.vatSettings && (vm.vatSettings.inclusive || !vm.vatSettings.applyTax)); + } + + function changeInventoryAsList(bool) { + vm.displayInventoriesAsList = bool; + } + + function IsTreatmentRateDisplayed() { + return (vm.sTaxSettings && vm.sTaxSettings.applyTax && !vm.sTaxSettings.inclusive); + } + + function changeDisplayAsList(bool) { + vm.displayTreatmentAsList = bool; + } + + function IsPackageEnabled() { + return (vm.packages.length < 1); + } + + function IsTreatmentAmountText() { + return (vm.sTaxSettings && !vm.sTaxSettings.inclusive && vm.sTaxSettings.applyTax); + } + + function IsTreatmentAmountEditable() { + return (vm.sTaxSettings && (vm.sTaxSettings.inclusive || !vm.sTaxSettings.applyTax)); + } + + function convertVehicleTypeToAF() { + return (vm.vehicle.type.toLowerCase().replace(' ', '-')); + } + + function IsPackageEnabled() { + return (vm.serviceType == vm.serviceTypeList[1]); + } + + function IsMembershipEnabled() { + return (vm.serviceType == vm.serviceTypeList[2]); + } + + function IsNoMembershipSubscribed() { + return (vm.membershipChips.length < 1); + } + + function IsMembershipTreatmentsDisabled(membership, treatment) { + return (membership.calculateTOccurenceLeft(treatment) <= 0 || membership.calculateTDurationLeft(treatment) <= 0); + } + + function lockServiceNavbar() { + return $mdMedia('gt-md'); + } + + function fetchFocusItemAfterSS() { + changeServiceInfoState(true, null, true); + } + + function setCoverPic() { + var source = localStorage.getItem('cover-pic'); + $('#am-sp-cover-pic').attr('src', (source) ? source : 'assets/img/logo-250x125px.png').width(250).height(125); + } + + function label_titleCustomerMoreInfo() { + return (vm.user.name ? vm.user.name + "'s" : "Customer"); + } + + function closeCustomerMoreDetails() { + $mdSidenav('customer-more-right').close(); + setTimeout(cvis, 800); + + function cvis() { + changeVehicleInfoState(true); + } + } + + // Supplies a function that will continue to operate until the time is up. + function debounce(func, wait, context) { + var timer; + return function debounced() { + var context = $scope, + args = Array.prototype.slice.call(arguments); + $timeout.cancel(timer); + timer = $timeout(function() { + timer = undefined; + func.apply(context, args); + }, wait || 10); + }; + } + + // Build handler to open/close a SideNav; when animation finishes report completion in console + function buildDelayedToggler(navID) { + return debounce(function() { + $mdSidenav(navID).toggle(); + }, 200); + } + + function focusServiceState() { + $('#ami-service-state').focus(); + } + + function focusInvoiceNo() { + $('#ami-service-invoice-no').focus(); + } + + function focusUserName() { + $('#ami-user-name input').focus(); + } + + function focusVehicleManuf() { + $('#ami-vehicle-manuf input').focus(); + } + + function changeUserInfoState(expanded) { + vm.isUserInfoExpanded = expanded; + if (expanded) + setTimeout(focusUserName, 300); + vm.isVehicleInfoExpanded = true; + vm.isServiceInfoExpanded = false; + } + + function changeVehicleInfoState(expanded, event) { + if (event != undefined) { + if (event.keyCode != 9) + return; + } + vm.isVehicleInfoExpanded = expanded; + if (expanded) + setTimeout(focusVehicleManuf, 300); + vm.isUserInfoExpanded = true; + vm.isServiceInfoExpanded = false; + } + + function changeServiceInfoState(expanded, event, isAlreadyThere) { + if (event != undefined) { + if (event.keyCode != 9) + return; + } + if (expanded) { + if (!isAlreadyThere) + setTimeout(focusInvoiceNo, 1300); + else + setTimeout(focusServiceState, 300); + } + vm.isServiceInfoExpanded = expanded; + if (expanded) + setTimeout(setServicesVpHeight, 500); + vm.isUserInfoExpanded = false; + vm.isVehicleInfoExpanded = false; + } + + function unsubscribeMembership(ev, chip) { + var confirm = $mdDialog.confirm() + .textContent('Unsubscribe to ' + chip.name + ' ?') + .ariaLabel('Unsubscribe to ' + chip.name) + .targetEvent(ev) + .ok('Yes') + .cancel('No'); + + $mdDialog.show(confirm).then(performDelete, ignoreDelete); + + function performDelete() { + console.info('deleted'); + } + + function ignoreDelete() { + vm.membershipChips.push(chip); + } } function changeInventoryTotal(inventory) { @@ -168,7 +534,7 @@ function iterateInventories(element) { if ((vm.vatSettings && !vm.vatSettings.applyTax) || !element.tax || !element.checked) return; - totalTax += parseFloat(element.tax.toFixed(2) * (element.qty ? element.qty : 1)); + totalTax += parseFloat(element.tax * (element.qty ? element.qty : 1)); } } @@ -279,42 +645,49 @@ function success(res) { vm.inventories = res; - existingInventories.forEach(iterateInventories); + addExistingInventories(existingInventories); getVatSettings(); - function iterateInventories(inventory) { - if (inventory.name != '') { - if (inventory.qty == undefined) - inventory.qty = 1; - var found = $filter('filter')(vm.inventories, { - name: inventory.name - }, true); - if (found.length == 1) { - found[0].checked = true; - found[0].rate = inventory.rate; - found[0].amount = inventory.rate; - found[0].qty = inventory.qty; - vm.selectedInventories.push(found[0]); - } else { - vm.inventories.push({ - name: inventory.name, - rate: inventory.rate, - amount: inventory.rate, - qty: inventory.qty, - checked: true - }); - vm.selectedInventories.push(vm.inventories[vm.inventories.length - 1]); - } - } - } + } function failure(err) { vm.inventories = []; + addExistingInventories(existingInventories); getVatSettings(); } } + function addExistingInventories(existingInventories) { + existingInventories.forEach(iterateInventories); + + function iterateInventories(inventory) { + if (inventory.name != '') { + if (inventory.qty == undefined) + inventory.qty = 1; + var found = $filter('filter')(vm.inventories, { + name: inventory.name + }, true); + if (found.length == 1) { + found[0].checked = true; + found[0].rate = inventory.rate; + found[0].amount = inventory.rate; + found[0].qty = inventory.qty; + vm.selectedInventories.push(found[0]); + } else { + vm.inventories.push({ + name: inventory.name, + rate: inventory.rate, + amount: inventory.rate, + qty: inventory.qty, + checked: true + }); + vm.selectedInventories.push(vm.inventories[vm.inventories.length - 1]); + } + } + } + } + function getVatSettings() { amServices.getVatSettings().then(success).catch(failure); @@ -369,8 +742,6 @@ inventory.rate = inventory.amount; inventory.tax = (inventory.rate * vm.vatSettings.tax / 100); inventory.amount = inventory.rate + inventory.tax; - if (inventory.amount % 1 != 0) - inventory.amount = parseFloat(inventory.amount).toFixed(2); } } else if (force) { if (vm.vatSettings.inclusive) @@ -419,7 +790,7 @@ if (!problem.rate) problem.rate = problem.amount; problem.tax = (problem.rate * vm.sTaxSettings.tax / 100); - problem.amount = Math.round(problem.rate + problem.tax); + problem.amount = problem.rate + problem.tax; } } else if (force) { if (vm.sTaxSettings.inclusive) { @@ -497,8 +868,9 @@ OnAddMembershipChip(chip); } - function navigateToSubscriptMembership() { - vm.userTab = true; + function navigateToSubscribeMembership() { + changeUserInfoState(true); + vm.openCustomerMoreDetails(); } function OnClickMembershipChip(event) { @@ -733,7 +1105,7 @@ treatment.tax[cvt] = (treatment.rate[cvt] * vm.sTaxSettings.tax / 100); } else { treatment.tax[cvt] = (treatment.rate[cvt] * vm.sTaxSettings.tax / 100); - treatment.amount[cvt] = Math.round(treatment.rate[cvt] + treatment.tax[cvt]); + treatment.amount[cvt] = treatment.rate[cvt] + treatment.tax[cvt]; } } else if (force) { if (vm.sTaxSettings.inclusive) @@ -808,14 +1180,10 @@ vm.user.email = res.email; vm.user.mobile = res.mobile; vm.user.address = res.address; - changeUserEmailLabel(); - changeUserMobileLabel(); - changeUserAddressLabel(); if (res.memberships) Object.keys(res.memberships).forEach(iterateMemberships); vm.vehicle.id = $state.params.vehicleId; vm.vehicle.reg = res.vehicle.reg; - changeVehicleRegLabel(); vm.vehicle.manuf = res.vehicle.manuf; vm.vehicle.model = res.vehicle.model; vm.vehicle.type = res.vehicle.type; @@ -829,16 +1197,24 @@ } vm.service.id = $state.params.serviceId; vm.service.date = new Date(res.vehicle.service.date); + if (res.vehicle.nextdue && (res.vehicle.nextdue.localeCompare(moment().format()) > 0)) { + wasNextDueService = true; + vm.isNextDueService = true; + vm.nextDueDate = new Date(res.vehicle.nextdue); + } else { + wasNextDueService = false; + vm.isNextDueService = false; + } vm.service.cost = res.vehicle.service.cost; vm.service.odo = res.vehicle.service.odo; - vm.service.invoiceno = res.vehicle.service.invoiceno; vm.service.status = res.vehicle.service.status; + vm.service.state = (res.vehicle.service.state == undefined) ? vm.serviceStateList[2] : res.vehicle.service.state; + vm.label_invoice = (vm.service.state == vm.serviceStateList[2]) ? 'Invoice' : 'Send'; if (res.vehicle.service.discount) { vm.isDiscountApplied = true; isDiscountByPercent = false; vm.discountPercentage = parseFloat(res.vehicle.service.discount.percent); vm.discountValue = parseFloat(res.vehicle.service.discount.amount); - console.log(res.vehicle.service.discount.amount); } if (res.vehicle.service.roundoff) { vm.isRoundOffVal = true; @@ -852,6 +1228,21 @@ vm.servicestatus = (res.vehicle.service.status == 'paid'); getRegularTreatments(res.vehicle.service.problems); getInventories(res.vehicle.service.inventories); + if (res.vehicle.service.jobcardno != undefined) { + vm.service.jobcardno = res.vehicle.service.jobcardno; + isJobCard = true; + } + if (res.vehicle.service.estimateno != undefined) { + vm.service.estimateno = res.vehicle.service.estimateno; + isEstimate = true; + } + if (res.vehicle.service.invoiceno != undefined) { + vm.service.invoiceno = res.vehicle.service.invoiceno; + isInvoice = true; + } + getLastJobCardNo(); + getLastEstimateNo(); + getLastInvoiceNo(); function iterateMemberships(membership) { res.memberships[membership].name = membership; @@ -1000,11 +1391,13 @@ // vehicle manufacturer is updated from UI, clear model list to populate new list w.r.t. manufacturer function searchVehicleChange() { + autoCapitalizeVehicleManuf(); if (!autofillVehicle) { vm.models = []; vm.vehicle.model = ''; autofillVehicle = false; - } + } else + autofillVehicle = false; } // replace all the treatment values with updated vehicle type @@ -1027,7 +1420,7 @@ } else { problem.rate = (rate == '' || rate == undefined ? problem.rate : rate); problem.tax = (problem.rate * vm.sTaxSettings.tax / 100); - problem.amount = Math.round(problem.rate + problem.tax); + problem.amount = problem.rate + problem.tax; } } else { problem.rate = (rate == '' || rate == undefined ? problem.rate : rate); @@ -1043,38 +1436,6 @@ } // return boolean response to different configurations [END] - // change vehicle tab selector variable - function changeVehicleTab(bool) { - vm.vehicleTab = bool; - } - - // change service tab selector variable - function changeServiceTab(bool) { - vm.serviceTab = bool; - } - - // listen to changes in input fields [BEGIN] - function changeUserMobileLabel(force) { - vm.isUserMobile = (force != undefined || vm.user.mobile != ''); - vm.label_userMobile = vm.isUserMobile ? 'Mobile:' : 'Enter Mobile Number:'; - } - - function changeUserEmailLabel(force) { - vm.isUserEmail = (force != undefined || vm.user.email != ''); - vm.label_userEmail = vm.isUserEmail ? 'Email:' : 'Enter Email:'; - } - - function changeUserAddressLabel(force) { - vm.isUserAddress = (force != undefined || vm.user.address != ''); - vm.label_userAddress = vm.isUserAddress ? 'Address:' : 'Enter Address:'; - } - - function changeVehicleRegLabel(force) { - vm.largeVehicleRegLabel = (force != undefined || vm.vehicle.reg != ''); - vm.label_vehicleReg = vm.largeVehicleRegLabel ? 'Vehicle Registration Number:' : 'Enter Vehicle Registration Number:'; - } - // listen to changes in input fields [END] - // populate regular treatment list function getRegularTreatments(existingProblems) { amServices.getRegularTreatments().then(success).catch(failure); @@ -1156,55 +1517,54 @@ } } - function populateRoundOffVal() { - vm.roundedOffVal = vm.service.cost - serviceTotalCost; + function populateRoD() { + if (vm.isDiscountApplied) { + vm.discountValue = serviceTcDc - vm.service.cost; + calculateDiscount(false); + } else if (vm.isRoundOffVal) + vm.roundedOffVal = vm.service.cost - serviceTcRo; + } + + function calculateRoundOff(isRoundOffManual) { + if (!isRoundOffManual) { + var ot = totalCost = vm.service.cost; + totalCost = vm.isRoundOffVal ? Math.floor(totalCost * 0.1) * 10 : totalCost; + vm.roundedOffVal = (totalCost - ot); + } + calculateCost(); + } + + function calculateDiscount(isDiscountByPercent) { + var totalCost = vm.service.cost; + if (isDiscountByPercent) { + vm.discountValue = totalCost * parseFloat(vm.discountPercentage) / 100; + vm.discountValue = (isNaN(vm.discountValue) || vm.discountValue == null) ? '' : vm.discountValue; + } else if (vm.discountValue != '') + vm.discountPercentage = 100 * parseFloat(vm.discountValue) / totalCost; + calculateCost(); } function changeForceStopCalCost(bool) { - forceStopCalCost = bool; - isManualRoundOff = true; + forceStopCalCost = bool; } - function calculateCost(isDbp, isMro) { + function calculateCost(isDbp) { if (forceStopCalCost) return; - isDiscountByPercent = (isDbp != undefined) ? isDbp : isDiscountByPercent; - isManualRoundOff = (isMro != undefined) ? isMro : isManualRoundOff; var totalCost = 0; - serviceTotalCost = 0; vm.service.problems.forEach(iterateProblem); vm.selectedInventories.forEach(iterateInventories); if (vm.serviceType == vm.serviceTypeList[1]) { vm.packages.forEach(iteratePackages); } + serviceTcDc = totalCost; if (vm.isDiscountApplied) { - if (isDiscountByPercent) { - var dv = totalCost * parseFloat(vm.discountPercentage) / 100; - totalCost = vm.isDiscountApplied && !isNaN(dv) ? totalCost - dv : totalCost; - vm.discountValue = (dv % 1 != 0) ? dv.toFixed(2) : dv; - vm.discountValue = (vm.discountValue % 1).toFixed(2) == 0.00 ? Math.round(vm.discountValue) : vm.discountValue; - vm.discountValue = (isNaN(vm.discountValue) || vm.discountValue == null) ? '' : vm.discountValue; - totalCost = (totalCost % 1).toFixed(2) == 0.00 ? Math.round(totalCost) : totalCost; - delete dv; - } else if (vm.discountValue != '') { - var dv = parseFloat(vm.discountValue); - vm.discountPercentage = 100 * dv / totalCost; - vm.discountPercentage = (vm.discountPercentage % 1 != 0) ? vm.discountPercentage.toFixed(2) : vm.discountPercentage; - totalCost -= dv; - delete dv; - } + totalCost = vm.isDiscountApplied && !isNaN(vm.discountValue) ? totalCost - vm.discountValue : totalCost; } - serviceTotalCost = totalCost; + serviceTcRo = totalCost; if (vm.isRoundOffVal) { - if (!isManualRoundOff) { - var ot = totalCost; - totalCost = vm.isRoundOffVal ? Math.floor(totalCost * 0.1) * 10 : totalCost; - vm.roundedOffVal = (totalCost - ot); - vm.roundedOffVal = (vm.roundedOffVal % 1 != 0) ? vm.roundedOffVal.toFixed(2) : vm.roundedOffVal; - delete ot; - } else { - totalCost += parseFloat(vm.roundedOffVal); - } + totalCost += parseFloat(vm.roundedOffVal); + serviceTcDc += parseFloat(vm.roundedOffVal); } totalCost = (totalCost % 1 != 0) ? totalCost.toFixed(2) : totalCost; totalCost = (totalCost % 1).toFixed(2) == 0.00 ? Math.round(totalCost) : totalCost; @@ -1240,7 +1600,7 @@ function iterateProblems(problem) { if ((vm.sTaxSettings && !vm.sTaxSettings.applyTax) || !problem.tax || !problem.checked) return; - totalTax += parseFloat(problem.tax.toFixed(2)); + totalTax += parseFloat(problem.tax); } function iteratePackages(package) { @@ -1252,7 +1612,7 @@ function ipt(treatment) { if ((vm.sTaxSettings && !vm.sTaxSettings.applyTax) || !treatment.tax) return; - totalTax += parseFloat(treatment.tax[vm.vehicle.type.toLowerCase().replace(' ', '-')].toFixed(2)); + totalTax += parseFloat(treatment.tax[vm.vehicle.type.toLowerCase().replace(' ', '-')]); } } @@ -1301,7 +1661,7 @@ } else { vm.problem.rate = (rate == '' || rate == undefined ? vm.problem.rate : rate); vm.problem.tax = (vm.problem.rate * vm.sTaxSettings.tax / 100); - vm.problem.amount = Math.round(vm.problem.rate + vm.problem.tax); + vm.problem.amount = vm.problem.rate + vm.problem.tax; } } else { if (vm.sTaxSettings.inclusive) @@ -1317,7 +1677,7 @@ var isVehicleBlank = (vm.vehicle.manuf == undefined || vm.vehicle.manuf == '') && (vm.vehicle.model == undefined || vm.vehicle.model == '') && (vm.vehicle.reg == undefined || vm.vehicle.reg == ''); if (isVehicleBlank) { - changeVehicleTab(true); + changeVehicleInfoState(true); utils.showSimpleToast('Please Enter At Least One Vehicle Detail'); return false; } @@ -1357,8 +1717,12 @@ vm.membershipChips.forEach(addMsToService); break; } - vm.service.status = vm.servicestatus ? 'paid' : 'billed'; + vm.service.status = vm.servicestatus ? 'paid' : 'due'; vm.service.date = moment(vm.service.date).format(); + if (vm.isNextDueService) + vm.vehicle.nextdue = moment(vm.nextDueDate).format(); + else if (wasNextDueService) + vm.vehicle.nextdue = undefined; vm.service.problems.forEach(iterateProblems); if (vm.isDiscountApplied) { vm.service['discount'] = { @@ -1385,7 +1749,32 @@ } vm.selectedInventories.forEach(iterateInventories); vm.service.inventories = vm.selectedInventories; - amServices.saveService(vm.user, vm.vehicle, vm.service).then(success).catch(failure); + var options = { + isLastInvoiceNoChanged: (vm.service.invoiceno == olInvoiceNo), + isLastEstimateNoChanged: (vm.service.estimateno == olEstimateNo), + isLastJobCardNoChanged: (vm.service.jobcardno == olJobCardNo) + } + switch (vm.service.state) { + case vm.serviceStateList[0]: + if (!isInvoice) + delete vm.service.invoiceno; + if (!isEstimate) + delete vm.service.estimateno; + break; + case vm.serviceStateList[1]: + if (!isJobCard) + delete vm.service.jobcardno; + if (!isInvoice) + delete vm.service.invoiceno; + break; + case vm.serviceStateList[2]: + if (!isJobCard) + delete vm.service.jobcardno; + if (!isEstimate) + delete vm.service.estimateno; + break; + } + amServices.saveService(vm.user, vm.vehicle, vm.service, options).then(success).catch(failure); function addMsToService(membership) { if (!membership.checked) @@ -1481,7 +1870,7 @@ // !(save successfull) function failure(err) { - console.log(err); + console.info(err); utils.showSimpleToast('Failed to update. Please Try Again!'); } } diff --git a/src/app/components/services/services-viewall.controller.js b/src/app/components/services/services-viewall.controller.js index 7275ec87..2d8ac03c 100644 --- a/src/app/components/services/services-viewall.controller.js +++ b/src/app/components/services/services-viewall.controller.js @@ -2,20 +2,21 @@ * Controller for View Services module * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// (function() { - angular.module('automintApp') - .controller('amCtrlSeRA', ServiceViewAllController); + const ammPreferences = require('./automint_modules/am-preferences.js'); + + angular.module('automintApp').controller('amCtrlSeRA', ServiceViewAllController); ServiceViewAllController.$inject = ['$scope', '$state', '$filter', '$timeout', '$mdDialog', 'utils', 'amServices']; function ServiceViewAllController($scope, $state, $filter, $timeout, $mdDialog, utils, amServices) { // initialize view model - var vm = this, queryChangedPromise, cacheLoadTimeout = false; + var vm = this, queryChangedPromise, cacheLoadTimeout = false, isDataLoaded = false, isPreferencesLoaded = false, filterRange, isFirstTimeWsq = true; // named assginments for tracking UI elements vm.query = { @@ -23,37 +24,14 @@ page: 1, total: 0 }; - vm.filter = { - month: 0, - year: 0 - } vm.services = []; - // month indexes will start from zero - vm.displayDataOptions = [{ - name: 'This Month', - month: 0, - year: 0 - }, { - name: 'Last 2 Months', - month: 1, - year: 0 - }, { - name: 'Last 6 Months', - month: 5, - year: 0 - }, { - name: 'Last Year', - month: 0, - year: 1 - }, { - name: 'Everything', - month: -1, - year: -1 - }]; - vm.displayDataFor = vm.displayDataOptions[0].name; vm.serviceQuery = ''; vm.isQueryMode = false; vm.displayItemPage = 1; + vm.sortColumns = ''; + vm.serviceStateList = ['Job Card', 'Estimate', 'Bill']; + vm.currentTimeSet = []; + vm.ddTimeSet = ''; // function maps vm.addService = addService; @@ -63,36 +41,248 @@ vm.changeQueryMode = changeQueryMode; vm.goToInvoice = goToInvoice; vm.getServiceDate = getServiceDate; + vm.sortByColumns = sortByColumns; + vm.IsServiceDue = IsServiceDue; + vm.IsServiceStateJc = IsServiceStateJc; + vm.IsServiceStateEs = IsServiceStateEs; + vm.IsServiceStateIv = IsServiceStateIv; + vm.openTimeFilter = openTimeFilter; // default execution steps - $scope.$watch('vm.displayDataFor', watchDisplayDataFor); $scope.$watch('vm.serviceQuery', watchServiceQuery); - + getFilterMonths(processPreferences); + initCurrentTimeSet(); + // function definitions + + function openTimeFilter(event) { + $mdDialog.show({ + controller: 'amCtrlSeTmFl', + controllerAs: 'vm', + templateUrl: 'app/components/services/tmpl/dialog_timefilter.html', + parent: angular.element(document.body), + targetEvent: event, + locals: { + filterRange: filterRange, + currentTimeSet: vm.currentTimeSet + }, + clickOutsideToClose: true + }).then(success).catch(success); + + function success(res) { + if (!res) + return; + vm.currentTimeSet = res; + getServices(); + displayCurrentTimeSet(); + ammPreferences.storePreference('viewServices.showingDataFor', vm.ddTimeSet); + } + } + + function getFilterMonths() { + var callback = arguments[0]; + var callingFunction = this; + var callbackArgs = arguments; + amServices.getFilterMonths().then(success).catch(failure); + + function success(res) { + filterRange = res; + callback.apply(callingFunction, Array.prototype.slice.call(callbackArgs, 1)); + } + + function failure(err) { + callback.apply(callingFunction, Array.prototype.slice.call(callbackArgs, 1)); + console.info('failed to get filter months'); + } + } + + function initCurrentTimeSet() { + vm.currentTimeSet.push({ + month: moment().format('MMM'), + year: moment().format('YYYY') + }); + displayCurrentTimeSet(); + } + + function displayCurrentTimeSet() { + vm.ddTimeSet = ''; + var years = []; + vm.currentTimeSet.forEach(iterateTimeSets); + years.forEach(iterateYears); + vm.ddTimeSet = vm.ddTimeSet.substr(0, vm.ddTimeSet.length - 2); + + function iterateYears(y) { + var tyf = $filter('filter')(vm.currentTimeSet, { + year: y + }, true); + + tyf.forEach(iterateFoundYear); + vm.ddTimeSet += y + '; '; + + function iterateFoundYear(fy) { + vm.ddTimeSet += moment(fy.month, 'MMM').format('MMMM') + ', '; + } + } + + function iterateTimeSets(ts) { + var tyf = $filter('filter')(years, ts.year, true); + + if (tyf.length == 0) + years.push(ts.year); + } + } + + function IsServiceStateIv(state) { + return (state == vm.serviceStateList[2]); + } + + function IsServiceStateEs(state) { + return (state == vm.serviceStateList[1]); + } + + function IsServiceStateJc(state) { + return (state == vm.serviceStateList[0]); + } + + function IsServiceDue(status) { + return (status == 'Due'); + } + + function sortByColumns(isBlockSave) { + if (vm.sortColumns == '' || vm.sortColumns == undefined) + return; + switch (vm.sortColumns) { + case "date": + vm.services.sort(sortAColumnByDate); + break; + case "-date": + vm.services.sort(sortDColumnByDate); + break; + case "customerName": + vm.services.sort(sortAColumnByCustomerName); + break; + case "-customerName": + vm.services.sort(sortDColumnByCustomerName); + break; + case "vehicle": + vm.services.sort(sortAColumnByVehicle); + break; + case "-vehicle": + vm.services.sort(sortDColumnByVehicle); + break; + case "amount": + vm.services.sort(sortAColumnByAmount); + break; + case "-amount": + vm.services.sort(sortDColumnByAmount); + break; + case "payment": + vm.services.sort(sortAColumnByPayment); + break; + case "-payment": + vm.services.sort(sortDColumnByPayment); + break; + } + + if (isPreferencesLoaded && !((typeof(isBlockSave) === "boolean") && isBlockSave)) + ammPreferences.storePreference('viewServices.sort', vm.sortColumns.replace('-', '') + '.' + ((vm.sortColumns.indexOf('-') == 0) ? 'descending' : 'ascending')); + } + + function sortAColumnByPayment(lhs, rhs) { + return lhs.srvc_status.localeCompare(rhs.srvc_status); + } + + function sortDColumnByPayment(lhs, rhs) { + return rhs.srvc_status.localeCompare(lhs.srvc_status); + } + + function sortAColumnByAmount(lhs, rhs) { + return (parseFloat(lhs.srvc_cost) - parseFloat(rhs.srvc_cost)); + } + + function sortDColumnByAmount(lhs, rhs) { + return (parseFloat(rhs.srvc_cost) - parseFloat(lhs.srvc_cost)); + } + + function sortAColumnByVehicle(lhs, rhs) { + var lhsv = ((lhs.vhcl_manuf) ? lhs.vhcl_manuf : '') + ' ' + ((lhs.vhcl_model) ? lhs.vhcl_model : '') + ' ' + ((lhs.vhcl_reg) ? lhs.vhcl_reg : ''); + var rhsv = ((rhs.vhcl_manuf) ? rhs.vhcl_manuf : '') + ' ' + ((rhs.vhcl_model) ? rhs.vhcl_model : '') + ' ' + ((rhs.vhcl_reg) ? rhs.vhcl_reg : ''); + return lhsv.localeCompare(rhsv); + } + + function sortDColumnByVehicle(lhs, rhs) { + var lhsv = ((lhs.vhcl_manuf) ? lhs.vhcl_manuf : '') + ' ' + ((lhs.vhcl_model) ? lhs.vhcl_model : '') + ' ' + ((lhs.vhcl_reg) ? lhs.vhcl_reg : ''); + var rhsv = ((rhs.vhcl_manuf) ? rhs.vhcl_manuf : '') + ' ' + ((rhs.vhcl_model) ? rhs.vhcl_model : '') + ' ' + ((rhs.vhcl_reg) ? rhs.vhcl_reg : ''); + return rhsv.localeCompare(lhsv); + } + + function sortAColumnByCustomerName(lhs, rhs) { + return lhs.cstmr_name.localeCompare(rhs.cstmr_name); + } + + function sortDColumnByCustomerName(lhs, rhs) { + return rhs.cstmr_name.localeCompare(lhs.cstmr_name); + } + + function sortAColumnByDate(lhs, rhs) { + return lhs.srvc_date.localeCompare(rhs.srvc_date); + } + + function sortDColumnByDate(lhs, rhs) { + return rhs.srvc_date.localeCompare(lhs.srvc_date); + } + + function processPreferences() { + ammPreferences.getAllPreferences('viewServices').then(success).catch(failure); + + function success(res) { + if (res['viewServices.sort']) { + var t = res['viewServices.sort'].split('.'); + vm.sortColumns = ((t[1] == 'descending') ? "-" : "") + t[0]; + } + if (res['viewServices.showingDataFor']) { + var sdf = res['viewServices.showingDataFor'].split(';'); + vm.currentTimeSet = []; + sdf.forEach(iterateDateRange); + displayCurrentTimeSet(); + } + + isPreferencesLoaded = true; + getServices(); + + function iterateDateRange(dr) { + var m = dr.split(','); + for (var i = 0; i < (m.length - 1); i++) { + vm.currentTimeSet.push({ + month: moment(m[i].replace(' ', ''), "MMMM").format("MMM"), + year: m[m.length - 1].replace(' ', '') + }); + } + } + } + + function failure(err) { + isPreferencesLoaded = true; + getServices(); + console.warn(err.message); + } + } function getServiceDate(date) { return moment(date).format('DD MMM YYYY'); } function watchServiceQuery(newValue, oldValue) { + if (isFirstTimeWsq) { + isFirstTimeWsq = false; + return; + } if(queryChangedPromise){ $timeout.cancel(queryChangedPromise); } queryChangedPromise = $timeout(getServices, 500); } - // listen to changes in display data settings - function watchDisplayDataFor(newValue, oldValue) { - var found = $filter('filter')(vm.displayDataOptions, { - name: newValue - }); - if (found.length == 1) { - vm.filter.month = found[0].month; - vm.filter.year = found[0].year; - getServices(); - } - } - // toggle boolean to indicate searching operation function changeQueryMode(bool) { vm.isQueryMode = bool; @@ -111,11 +301,13 @@ // fill datatable with list of services function getServices() { vm.showPaginationBar = (vm.serviceQuery == ''); - vm.promise = amServices.getServices(vm.filter.month, vm.filter.year, vm.serviceQuery).then(success).catch(failure); + vm.promise = (isPreferencesLoaded) ? amServices.getServices(vm.currentTimeSet, vm.serviceQuery).then(success).catch(failure) : undefined; function success(res) { + isDataLoaded = true; vm.services = res; vm.query.total = res.length; + sortByColumns(true); } function failure(err) { @@ -158,7 +350,7 @@ } function ignoreDelete() { - console.log('nope'); + console.info('nope'); } @@ -171,7 +363,7 @@ } function failure(err) { - console.log(err); + console.info(err); utils.showSimpleToast('Service can not be deleted at moment. Please Try Again!'); } } diff --git a/src/app/components/services/services.factory.js b/src/app/components/services/services.factory.js index 1f385be5..6beae693 100644 --- a/src/app/components/services/services.factory.js +++ b/src/app/components/services/services.factory.js @@ -2,7 +2,7 @@ * Factory that handles database interactions between services database and controller * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -11,9 +11,9 @@ angular.module('automintApp') .factory('amServices', ServicesFactory); - ServicesFactory.$inject = ['$http', '$timeout', '$q', '$log', 'utils', '$amRoot', 'constants', 'pdbCustomers', 'pdbCommon', 'pdbConfig', 'pdbCache']; + ServicesFactory.$inject = ['$http', '$timeout', '$q', '$log', '$filter', 'utils', '$amRoot', 'constants', 'pdbCustomers', 'pdbCommon', 'pdbConfig', 'pdbCache']; - function ServicesFactory($http, $timeout, $q, $log, utils, $amRoot, constants, pdbCustomers, pdbCommon, pdbConfig, pdbCache) { + function ServicesFactory($http, $timeout, $q, $log, $filter, utils, $amRoot, constants, pdbCustomers, pdbCommon, pdbConfig, pdbCache) { // initialize factory variable and function maps var factory = { getManufacturers: getManufacturers, @@ -34,13 +34,70 @@ getServices: getServices, getInventories: getInventories, getVatSettings: getVatSettings, - getInventoriesSettings: getInventoriesSettings + getInventoriesSettings: getInventoriesSettings, + getLastEstimateNo : getLastEstimateNo, + getLastJobCardNo: getLastJobCardNo, + getDefaultServiceType: getDefaultServiceType, + getFilterMonths: getFilterMonths } return factory; // function definitions + function getFilterMonths() { + var tracker = $q.defer(); + pdbCache.get(constants.pdb_cache_views.view_services).then(generateMonthsUsed).catch(failure); + return tracker.promise; + + function generateMonthsUsed(res) { + var result = []; + Object.keys(res).forEach(iterateDateRange); + tracker.resolve(result); + + function iterateDateRange(dr) { + if (dr.match(/_id|_rev/g)) + return; + var temp = dr.split('-'); + result.push({ + month: utils.convertToTitleCase(temp[0]), + year: temp[1] + }); + } + } + + function failure(err) { + tracker.reject(err); + } + } + + function getDefaultServiceType() { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(failure); + } + + function getSettingsObject(res) { + if (res.settings && res.settings.servicestate) + tracker.resolve(res.settings.servicestate); + else + failure(); + } + + function failure(err) { + if (!err) { + err = { + success: false, + message: 'Could not find service state' + } + } + tracker.reject(err); + } + } + function getInventoriesSettings() { var tracker = $q.defer(); $amRoot.isSettingsId().then(configFound).catch(failure); @@ -294,48 +351,37 @@ } } - function getServices(filterMonth, filterYear, query) { + function getServices(dateRange, query) { query = angular.lowercase(query); - filterMonth += (12*filterYear); var tracker = $q.defer(); pdbCache.get(constants.pdb_cache_views.view_services).then(success).catch(failure); return tracker.promise; function success(res) { - var result = [], ltm = filterMonth, currentRange = ''; - if (filterMonth < 0 && filterYear < 0) { - Object.keys(res).forEach(iterateDateRange); - - function iterateDateRange(dr) { - currentRange = dr; - if (currentRange.match(/_id|_rev/g)) - return; - if (res[currentRange]) - Object.keys(res[currentRange]).forEach(iterateService); - } - } else { - do { - var queryDate = moment().subtract({ - months: ltm - }); - currentRange = moment(queryDate).format('MMM YYYY'); - currentRange = angular.lowercase(currentRange).replace(' ', '-'); - if (res[currentRange]) - Object.keys(res[currentRange]).forEach(iterateService); - ltm--; - } while(ltm >= 0); - } - result.sort(dateSort); + var result = [], currentRange = ''; + Object.keys(res).forEach(iterateDateRange); tracker.resolve(result); - - function dateSort(lhs, rhs) { - return rhs.srvc_date.localeCompare(lhs.srvc_date); + + function iterateDateRange(dr) { + if (dr.match(/_id|_rev/g)) + return; + var crd = dr.split('-'); + var crdfound = $filter('filter')(dateRange, { + month: utils.convertToTitleCase(crd[0]), + year: crd[1] + }, true); + + if (crdfound.length == 0) + return; + currentRange = dr; + if (res[currentRange]) + Object.keys(res[currentRange]).forEach(iterateService); } function iterateService(sId) { var target = res[currentRange][sId]; if (query != undefined) { - if (query != undefined && (target.cstmr_name && angular.lowercase(target.cstmr_name).search(query) > -1) || (target.srvc_status && angular.lowercase(target.srvc_status).search(query) > -1) || (target.vhcl_manuf && angular.lowercase(target.vhcl_manuf).search(query) > -1) || (target.vhcl_model && angular.lowercase(target.vhcl_model).search(query) > -1) || (target.vhcl_reg && angular.lowercase(target.vhcl_reg).search(query) > -1) || (target.srvc_cost && target.srvc_cost.toString().search(query) > -1) || (target.srvc_date && angular.lowercase(target.srvc_date).search(query) > -1)) { + if (query != undefined && (target.cstmr_name && angular.lowercase(target.cstmr_name).search(query) > -1) || (target.srvc_state && angular.lowercase(target.srvc_state).search(query) > -1) || (target.srvc_status && angular.lowercase(target.srvc_status).search(query) > -1) || (target.vhcl_manuf && angular.lowercase(target.vhcl_manuf).search(query) > -1) || (target.vhcl_model && angular.lowercase(target.vhcl_model).search(query) > -1) || (target.vhcl_reg && angular.lowercase(target.vhcl_reg).search(query) > -1) || (target.srvc_cost && target.srvc_cost.toString().search(query) > -1) || (target.srvc_date && angular.lowercase(target.srvc_date).search(query) > -1)) { target.srvc_status = utils.convertToTitleCase(target.srvc_status); target.srvc_id = sId; result.push(target); @@ -348,6 +394,7 @@ } } function failure(err) { + console.log(err); tracker.reject(err); } } @@ -522,7 +569,8 @@ manuf: vehicle.manuf, model: vehicle.model, name: vehicle.manuf + ' - ' + vehicle.model + (vehicle.reg == '' ? '' : ', ' + vehicle.reg), - type: (vehicle.type) ? vehicle.type : '' + type: (vehicle.type) ? vehicle.type : '', + nextdue: vehicle.nextdue }); } } @@ -571,7 +619,8 @@ manuf: vehicle.manuf, model: vehicle.model, name: vehicle.manuf + ' - ' + vehicle.model + (vehicle.reg == '' || vehicle.reg == undefined ? '' : ', ' + vehicle.reg), - type: (vehicle.type) ? vehicle.type : '' + type: (vehicle.type) ? vehicle.type : '', + nextdue: vehicle.nextdue }); } } @@ -623,8 +672,14 @@ delete newService.id; delete newVehicle.id; delete newUser.id; - if (options && options.isLastInvoiceNoChanged) - saveLastInvoiceNo(newService.invoiceno); + if (options) { + if (newService.invoiceno && options.isLastInvoiceNoChanged) + saveLastInvoiceNo(newService.invoiceno); + if (newService.estimateno && options.isLastEstimateNoChanged) + saveLastEstimateNo(newService.estimateno); + if (newService.jobcardno && options.isLastJobCardNoChanged) + saveLastJobCardNo(newService.jobcardno); + } pdbCustomers.get(newUserId).then(foundExistingUser).catch(noUserFound); return tracker.promise; @@ -650,6 +705,8 @@ } function iterateVehicleFields(vfn) { + if (newVehicle[vfn] == undefined) + delete res.user.vehicles[newVehicleId][vfn]; res.user.vehicles[newVehicleId][vfn] = newVehicle[vfn]; } } @@ -823,6 +880,60 @@ tracker.reject(error); } } + + function getLastJobCardNo() { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(failure); + } + + function getSettingsObject(res) { + if (res.settings && res.settings.invoices && res.settings.invoices.lastJobCardNo) + tracker.resolve(res.settings.invoices.lastJobCardNo); + else + failure(); + } + + function failure(err) { + if (!err) { + err = { + success: false, + message: 'No invoice settings found!' + } + } + tracker.reject(err); + } + } + + function getLastEstimateNo() { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(failure); + } + + function getSettingsObject(res) { + if (res.settings && res.settings.invoices && res.settings.invoices.lastEstimateNo) + tracker.resolve(res.settings.invoices.lastEstimateNo); + else + faillure(); + } + + function failure(err) { + if (!err) { + err = { + success: false, + message: 'No invoice settings found!' + } + } + tracker.reject(err); + } + } // get last invoice number function getLastInvoiceNo() { @@ -886,5 +997,73 @@ $log.info('Cannot save invoice settings'); } } + + function saveLastEstimateNo(leno) { + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.settings) + res.settings = {}; + if (!res.settings.invoices) + res.settings.invoices = {}; + res.settings.invoices.lastEstimateNo = leno; + pdbConfig.save(res); + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: $amRoot.username, + settings: { + invoices: { + lastEstimateNo: 1 + } + } + } + pdbConfig.save(doc); + } + + function failure(err) { + $log.info('Cannot save estimate settings'); + } + } + + function saveLastJobCardNo(ljbno) { + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.settings) + res.settings = {}; + if (!res.settings.invoices) + res.settings.invoices = {}; + res.settings.invoices.lastJobCardNo = ljbno; + pdbConfig.save(res); + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: $amRoot.username, + settings: { + invoices: { + lastJobCardNo: 1 + } + } + } + pdbConfig.save(doc); + } + + function failure(err) { + $log.info('Cannot save jobcard settings'); + } + } } })(); \ No newline at end of file diff --git a/src/app/components/services/services_add.html b/src/app/components/services/services_add.html index 27a6c9a1..8e9bc28c 100644 --- a/src/app/components/services/services_add.html +++ b/src/app/components/services/services_add.html @@ -1,4 +1,40 @@ arrow_back Back - - - - -
-
- person_pin - - - {{user.name}} - - -
-
- - phone - - - - - email - - - -
-
- - home - - - -
-
- card_membership -
- - - - {{membership.name}} - - - - {{$chip.name}} - - - -
* Click on Membership for details
+ + + {{vm.label_titleCustomerMoreInfo()}} Information + + +
+ + +
+
+ + +
+
+ + + + {{membership.name}} + + + + {{$chip.name}} + + + +
* Click on Membership for details
+
+
+ + Continue + Continue to Add Service + +
+
+ + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + {{type}} + +
+
+ +
+ + {{type}} + +
+
+
+ Next Service Reminder: +
+ + {{vm.getDate(vm.nextDueDate)}} +
+
+
+
+
+ +
+ + +
+ Customer: + {{vm.user.name}}(M) {{vm.user.mobile}} +
+
+
+
+ + + + {{user.name}} + + +
+
+ + +
+
+ + More Details + more + More About Customer +
@@ -114,104 +248,85 @@ Please wait
-
- - Continue - navigate_next - + + + + + +
+ Vehicle: + {{vm.vehicle.manuf}} {{vm.vehicle.model}} - {{vm.vehicle.reg}}
- - - - -
-
-
- Choose Vehicle: - - - {{vm.currentVehicle}} - - - - - New Vehicle - - - - - {{vehicle.name}} - - - - - (To add new vehicle, click on the button above and select new vehicle) -
-
-
-
- Choose Manufacturer: - +
+
+
+ + {{manuf}}
-
- Choose Model: - +
+ + {{model}}
+
+
+ + + + + directions_car + Change Vehicle + + + + + {{vehicle.name}} + + + + + New Vehicle + + + + +
+
-
- - - -
e.g. GJ01AB9999
-
-
-
-
- - Continue - navigate_next -
- - - - -
-
- - - - {{type}} - - - - - - - - - - {{type}} - - - - - - - -
-
-
- -
+ + +
+ + + +
+ Service Details + + Click to Expand +
+
+
+
+ +
+ + {{state}} + + + {{state}} + + >> +
+
+
@@ -229,13 +344,14 @@ add_circle_outline remove_circle_outline + CollapseExpand Membership
{{membership.name}}
-
+
@@ -246,7 +362,7 @@ - + @@ -257,12 +373,14 @@ -
- {{vm.user.name || 'Customer'}} has not subscribed to any memberships. Click here to subscribe to one +
+ {{vm.user.name || 'Customer'}} has not subscribed to any memberships. Click here to subscribe to one
- -
+ +
+
+
@@ -286,6 +404,7 @@ add_circle_outline remove_circle_outline + CollapseExpand Package
@@ -298,8 +417,8 @@ {{(package.total ? package.total * (package.checked ? 1 : 0) : 0)}}
-
- +
+
{{treatment.name}} {{membership.calculateTOccurenceLeft(treatment)}} {{membership.calculateTDurationLeft(treatment)}}
@@ -313,15 +432,15 @@ @@ -330,11 +449,13 @@ -
+
No Packages Found!
- + + +
{{treatment.name}} - {{treatment.rate[vm.vehicle.type.toLowerCase().replace(' ', '-')] | number: 2}} - + {{treatment.rate[vm.convertVehicleTypeToAF()] | number: 2}} + - {{treatment.tax[vm.vehicle.type.toLowerCase().replace(' ', '-')] | number: 2}} + {{treatment.tax[vm.convertVehicleTypeToAF()] | number: 2}} - - {{treatment.amount[vm.vehicle.type.toLowerCase().replace(' ', '-')]}} + + {{treatment.amount[vm.convertVehicleTypeToAF()]}}
@@ -342,65 +463,52 @@ - - + + - - - - - - - - - -
Treatments - ( - Show All - ) + ( + Show AllShow All Treatments + ) RateTax (%) - RateTax Amount
- {{problem.rate | number: 2}} + + {{vm.doRoundOff(problem.rate)}} - {{problem.tax | number: 2}} + + {{vm.doRoundOff(problem.tax)}} - - {{problem.amount}} + + {{vm.doRoundOff(problem.amount)}}
- + {{treatment.name}} - {{vm.problem.rate | number: 2}} - + + {{vm.doRoundOff(vm.problem.rate)}} + - {{vm.problem.tax | number: 2}} + + {{vm.doRoundOff(vm.problem.tax)}} - - {{vm.problem.amount}} + + {{vm.doRoundOff(vm.problem.amount)}}
- - add - Add More - -
@@ -411,65 +519,52 @@ Treatments - ( - Show Few - ) + ( + Show FewShow Selected Treatments + ) - Rate - Tax (%) - + Rate + Tax Amount - - {{problem.rate | number: 2}} + + {{vm.doRoundOff(problem.rate)}} - - {{problem.tax | number: 2}} + + {{vm.doRoundOff(problem.tax)}} - - {{problem.amount}} + + {{vm.doRoundOff(problem.amount)}} - + {{treatment.name}} - - {{vm.problem.rate | number: 2}} - + + {{vm.doRoundOff(vm.problem.rate)}} + - - {{vm.problem.tax | number: 2}} + + {{vm.doRoundOff(vm.problem.tax)}} - - {{vm.problem.amount}} + + {{vm.doRoundOff(vm.problem.amount)}} - - - - - - add - Add More - - - - @@ -479,15 +574,14 @@ Parts - ( - Show All - ) + ( + Show AllShow All Inventories + ) Rate Qty - VAT (%) - + VAT Amount @@ -504,53 +598,41 @@ - - {{inventory.tax * (inventory.qty ? inventory.qty : 1) | number: 2}} + + {{vm.doRoundOff(inventory.tax * inventory.qty)}} - - {{inventory.total}} + + {{vm.doRoundOff(inventory.total)}} - + {{inventory.name}} - - + + - + - + - - {{vm.inventory.tax * (vm.inventory.qty ? vm.inventory.qty : 1) | number: 2}} + + {{vm.doRoundOff(vm.inventory.tax * vm.inventory.qty)}} - - {{vm.inventory.total}} + + {{vm.doRoundOff(vm.inventory.total)}} - - - - - - add - Add More - - - - @@ -560,15 +642,14 @@ Parts - ( - Show Few - ) + ( + Show FewShow Selected Inventories + ) Rate Qty - VAT (%) - + VAT Amount @@ -585,96 +666,98 @@ - - {{inventory.tax * (inventory.qty ? inventory.qty : 1) | number: 2}} + + {{vm.doRoundOff(inventory.tax * inventory.qty)}} - - {{inventory.total}} + + {{vm.doRoundOff(inventory.total)}} - + {{inventory.name}} - - + + - + - + - - {{vm.inventory.tax * (vm.inventory.qty ? vm.inventory.qty : 1) | number: 2}} + + {{vm.doRoundOff(vm.inventory.tax * vm.inventory.qty)}} - - {{vm.inventory.total}} + + {{vm.doRoundOff(vm.inventory.total)}} - - - - - - add - Add More - - - - - -
- -
-
- Payment Received - Service Tax - VAT - Round Off - - Discount -  % - -
-
-
- Service Tax: Rs. {{vm.calculateTax()}} -   - VAT: Rs. {{vm.calculateVat()}} -   - Discount: Rs. -   - Round Off: Rs. -   - Total Cost: Rs. {{vm.service.cost}}
- -
- - done - Save - - - receipt - Invoice - + +
+ +
+
+
+ + {{vm.getDate(vm.service.date)}}
+ Payment + + Service Tax +  % + + VAT +  % + + Round Off + + + Discount +  % + +
+
+
+ Subtotal: Rs. {{vm.calculateSubtotal()}} +   + Service Tax: Rs. {{vm.calculateTax()}} +   + VAT: Rs. {{vm.calculateVat()}} +   + Discount: Rs. +   + Round Off: Rs. +   + Total Cost: Rs. {{vm.service.cost}} +
+ +
+ + done + Save + Save Service + + + receipt + {{vm.label_invoice}} + View Invoice +
- - - +
+ + \ No newline at end of file diff --git a/src/app/components/services/services_viewAll.html b/src/app/components/services/services_viewAll.html index 79f464e1..dbc69aae 100644 --- a/src/app/components/services/services_viewAll.html +++ b/src/app/components/services/services_viewAll.html @@ -1,46 +1,42 @@ - -
- - person_add - Add Service + + + person_add + Add Service + +
+
+ Showing data for : {{vm.ddTimeSet}} + + date_range + + + search -
-
- Display Data For: - - {{opt.name}} - - - search - -
- -
-
- Display Data For: - - {{opt.name}} - -
- - - close + +
+ Showing data for : {{vm.ddTimeSet}} + + date_range
+ + + close +
- + - - - - - + + + + + @@ -49,11 +45,9 @@ - + +
CustomerVehicleDateAmount
(Rs.)
PaymentCustomerVehicleDateAmount
(Rs.)
Payment
{{service.vhcl_manuf + ' ' + service.vhcl_model}} ({{service.vhcl_reg}}) {{vm.getServiceDate(service.srvc_date)}} {{service.srvc_cost}}{{service.srvc_status}}{{service.srvc_status}}{{service.srvc_state}} - - Invoice - delete diff --git a/src/app/components/services/tmpl/dialog_timefilter.controller.js b/src/app/components/services/tmpl/dialog_timefilter.controller.js new file mode 100644 index 00000000..c58f0d1d --- /dev/null +++ b/src/app/components/services/tmpl/dialog_timefilter.controller.js @@ -0,0 +1,108 @@ +/** + * Controller for Time Filter dialog box + * @author ndkcha + * @since 0.6.4 + * @version 0.6.4 + */ + +/// + +(function() { + angular.module('automintApp').controller('amCtrlSeTmFl', TimeFilterController); + + TimeFilterController.$inject = ['$mdDialog', '$filter', 'filterRange', 'currentTimeSet']; + + function TimeFilterController($mdDialog, $filter, filterRange, currentTimeSet) { + var vm = this; + + vm.currentYearIndex = 0; + vm.yearRange = []; + vm.selectedDateSet = $.extend([], currentTimeSet); + + // default execution steps + populateYearRange(); + + // function mappings + vm.IsNextYear = IsNextYear; + vm.IsPreviousYear = IsPreviousYear; + vm.changeToNextYear = changeToNextYear; + vm.changeToPreviousYear = changeToPreviousYear; + vm.selectDateSet = selectDateSet; + vm.IsDateSetSelected = IsDateSetSelected; + vm.IsDateSetDisabled = IsDateSetDisabled; + vm.confirm = confirm; + + // function definitions + + function confirm() { + if (vm.selectedDateSet.length < 1) + vm.selectedDateSet = currentTimeSet; + $mdDialog.hide(vm.selectedDateSet); + } + + function IsDateSetDisabled(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(filterRange, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + return (found.length == 0); + } + + function IsDateSetSelected(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(vm.selectedDateSet, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + return (found.length == 1); + } + + function selectDateSet(month) { + var temp_m = moment(month, 'M').format('MMM'); + var found = $filter('filter')(vm.selectedDateSet, { + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }, true); + + if (found.length == 0) { + vm.selectedDateSet.push({ + year: vm.yearRange[vm.currentYearIndex], + month: temp_m + }); + } else { + var i = vm.selectedDateSet.indexOf(found[0]); + vm.selectedDateSet.splice(i, 1); + } + } + + function changeToNextYear() { + vm.currentYearIndex--; + } + + function changeToPreviousYear() { + vm.currentYearIndex++; + } + + function IsNextYear() { + return (vm.currentYearIndex != 0); + } + + function IsPreviousYear() { + return (vm.currentYearIndex != (vm.yearRange.length - 1)); + } + + function populateYearRange() { + filterRange.forEach(iterateYearRange); + + function iterateYearRange(item) { + var found = $filter('filter')(vm.yearRange, item.year, true); + + if (found == 0) + vm.yearRange.push(item.year); + } + } + } +})(); \ No newline at end of file diff --git a/src/app/components/services/tmpl/dialog_timefilter.html b/src/app/components/services/tmpl/dialog_timefilter.html new file mode 100644 index 00000000..90cae099 --- /dev/null +++ b/src/app/components/services/tmpl/dialog_timefilter.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + arrow_back + + + + {{vm.yearRange[vm.currentYearIndex]}} + + + + arrow_forward + +
+ + Jan + + + + Feb + + + + Mar + +
+ + Apr + + + + May + + + + Jun + +
+ + Jul + + + + Aug + + + + Sept + +
+ + Oct + + + + Nov + + + + Dec + +
+
+ + + done + Done + + +
\ No newline at end of file diff --git a/src/app/components/settings/settings-invoices.factory.js b/src/app/components/settings/settings-invoices.factory.js index f6846f75..eddbc959 100644 --- a/src/app/components/settings/settings-invoices.factory.js +++ b/src/app/components/settings/settings-invoices.factory.js @@ -2,7 +2,7 @@ * Factory to fetch and retrieve invoice settings from database * @author ndkcha * @since 0.5.0 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -23,7 +23,9 @@ saveIvDisplaySettings: saveIvDisplaySettings, saveIvEmailSubject: saveIvEmailSubject, saveIvAlignMargins : saveIvAlignMargins, - getIvAlignMargins: getIvAlignMargins + getIvAlignMargins: getIvAlignMargins, + changeLastJobCardNo: changeLastJobCardNo, + changeLastEstimateNo: changeLastEstimateNo } return factory; @@ -158,6 +160,86 @@ tracker.reject(err); } } + + function changeLastJobCardNo(jobcardno) { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.settings) + res.settings = {}; + if (!res.settings.invoices) + res.settings.invoices = {}; + res.settings.invoices.lastJobCardNo = jobcardno; + pdbConfig.save(res).then(success).catch(failure); + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: $amRoot.username, + settings: { + invoices: { + lastJobCardNo: jobcardno + } + } + } + pdbConfig.save(doc).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + + function changeLastEstimateNo(estimateno) { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.settings) + res.settings = {}; + if (!res.settings.invoices) + res.settings.invoices = {}; + res.settings.invoices.lastEstimateNo = estimateno; + pdbConfig.save(res).then(success).catch(failure); + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: $amRoot.username, + settings: { + invoices: { + lastEstimateNo: estimateno + } + } + } + pdbConfig.save(doc).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } // change last invoice number in database function changeLastInvoiceNo(invoiceno) { diff --git a/src/app/components/settings/settings.controller.js b/src/app/components/settings/settings.controller.js index 850c59be..0377f9f3 100644 --- a/src/app/components/settings/settings.controller.js +++ b/src/app/components/settings/settings.controller.js @@ -2,7 +2,7 @@ * Controller for Settings component * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -11,14 +11,21 @@ angular.module('automintApp') .controller('amCtrlSettings', SettingsController); - SettingsController.$inject = ['$rootScope', '$scope', '$state', '$log', 'utils', 'amBackup', 'amLogin', 'amImportdata', 'amIvSettings', 'amSeTaxSettings']; + SettingsController.$inject = ['$rootScope', '$scope', '$state', '$log', 'utils', 'amBackup', 'amLogin', 'amImportdata', 'amIvSettings', 'amSeTaxSettings', 'amSettings']; - function SettingsController($rootScope, $scope, $state, $log, utils, amBackup, amLogin, amImportdata, amIvSettings, amSeTaxSettings) { + function SettingsController($rootScope, $scope, $state, $log, utils, amBackup, amLogin, amImportdata, amIvSettings, amSeTaxSettings, amSettings) { // initialize view model var vm = this; // temporary named assignments - var olino = 0, ivEmailSubject, oIvFacebookLink, oIvInstagramLink, oIvTwitterLink, oPasscode = '1234', oPasscodeEnabled, oIvAlignTop = '', oIvAlignBottom = '', oIvWorkshopName, oIvWorkshopPhone, oIvWorkshopAddress1, oIvWorkshopAddress2, oIvWorkshopCity; + var olino = 0, + oljbno = 0, + oleno = 0, + oPasscode = '1234', + oPasscodeEnabled, + oIvAlignTop = '', + oIvAlignBottom = '', + ivEmailSubject, oIvFacebookLink, oIvInstagramLink, oIvTwitterLink, oIvWorkshopName, oIvWorkshopPhone, oIvWorkshopAddress1, oIvWorkshopAddress2, oIvWorkshopCity, oDefaultServiceType; // named assignments to keep track of UI [BEGIN] // general settings @@ -28,6 +35,8 @@ }; vm.label_username = 'Enter Username:'; vm.label_password = 'Enter Password:'; + vm.serviceStateList = ['Job Card', 'Estimate', 'Bill']; + vm.serviceState = vm.serviceStateList[2]; // invoice settings vm.workshop = { name: '', @@ -67,6 +76,7 @@ vm.handleUploadedFile = handleUploadedFile; vm.handleUploadedCoverPic = handleUploadedCoverPic; vm.handlePasscodeVisibility = handlePasscodeVisibility; + vm.saveDefaultServiceType = saveDefaultServiceType; // invoice settings vm.changeWorkshopNameLabel = changeWorkshopNameLabel; vm.changeWorkshopPhoneLabel = changeWorkshopPhoneLabel; @@ -94,6 +104,15 @@ vm.saveWorkshopAddress1 = saveWorkshopAddress1; vm.saveWorkshopAddress2 = saveWorkshopAddress2; vm.saveWorkshopCity = saveWorkshopCity; + vm.resetLastEstimateNo = resetLastEstimateNo; + vm.OnBlurLastEstimateNo = OnBlurLastEstimateNo; + vm.resetLastJobCardNo = resetLastJobCardNo; + vm.OnBlurLastJobCardNo = OnBlurLastJobCardNo; + vm.autoCapitalizeCity = autoCapitalizeCity; + vm.autoCapitalizeAddressLine1 = autoCapitalizeAddressLine1; + vm.autoCapitalizeAddressLine2 = autoCapitalizeAddressLine2; + vm.autoCapitalizeWorkshopName = autoCapitalizeWorkshopName; + vm.autoCapitalizeEmailSubject = autoCapitalizeEmailSubject; // function maps [END] // default execution steps [BEGIN] @@ -107,6 +126,7 @@ // general settings checkLogin(); getPasscode(); + getDefaultServiceType(); // invoice settings getWorkshopDetails(); getInvoiceSettings(); @@ -120,6 +140,95 @@ // function definitions + function getDefaultServiceType() { + amSettings.getDefaultServiceType().then(success).catch(failure); + + function success(res) { + vm.serviceState = res; + oDefaultServiceType = res; + } + + function failure(err) { + vm.serviceState = vm.serviceStateList[2]; + oDefaultServiceType = vm.serviceStateList[2]; + } + } + + function saveDefaultServiceType() { + if (oDefaultServiceType == vm.serviceState) + return; + amSettings.saveDefaultServiceType(vm.serviceState).then(success).catch(failure); + + function success(res) { + if (res.ok) { + oDefaultServiceType = vm.serviceState; + utils.showSimpleToast('Default Service Type Changed Successfully!'); + } else + failure(); + } + + function failure(err) { + utils.showSimpleToast('Could not set default service type at moment'); + vm.serviceState = oDefaultServiceType; + } + } + + function autoCapitalizeEmailSubject() { + vm.ivSettings.emailsubject = utils.autoCapitalizeWord(vm.ivSettings.emailsubject); + } + + function autoCapitalizeCity() { + vm.workshop.city = utils.autoCapitalizeWord(vm.workshop.city); + } + + function autoCapitalizeAddressLine2() { + vm.workshop.address2 = utils.autoCapitalizeWord(vm.workshop.address2); + } + + function autoCapitalizeAddressLine1() { + vm.workshop.address1 = utils.autoCapitalizeWord(vm.workshop.address1); + } + + function autoCapitalizeWorkshopName() { + vm.workshop.name = utils.autoCapitalizeWord(vm.workshop.name); + } + + function OnBlurLastJobCardNo() { + if (vm.ivSettings.lastJobCardNo == '' || vm.ivSettings.lastJobCardNo == null || vm.ivSettings.lastJobCardNo == undefined) + vm.ivSettings.lastJobCardNo = 0; + if (vm.ivSettings.lastJobCardNo == oljbno) + return; + resetLastJobCardNo(vm.ivSettings.lastJobCardNo); + } + + function resetLastJobCardNo(jobcardno, reset) { + amIvSettings.changeLastJobCardNo((jobcardno == undefined) ? 0 : jobcardno).then(respond).catch(respond); + + function respond(res) { + getInvoiceSettings(); + if (reset != true) + utils.showActionToast('Job Card Number has been ' + ((jobcardno == undefined) ? 'reset' : 'changed'), 'Undo', resetLastJobCardNo, oljbno, true); + } + } + + function OnBlurLastEstimateNo() { + if (vm.ivSettings.lastEstimateNo == '' || vm.ivSettings.lastEstimateNo == null || vm.ivSettings.lastEstimateNo == undefined) + vm.ivSettings.lastEstimateNo = 0; + if (vm.ivSettings.lastEstimateNo == oleno) + return; + resetLastEstimateNo(vm.ivSettings.lastEstimateNo); + } + + function resetLastEstimateNo(estimateno, reset) { + amIvSettings.changeLastEstimateNo((estimateno == undefined) ? 0 : estimateno).then(respond).catch(respond); + + function respond(res) { + getInvoiceSettings(); + if (reset != true) + utils.showActionToast('Estimate number has been ' + ((estimateno == undefined) ? 'reset' : 'changed'), 'Undo', resetLastEstimateNo, oleno, true); + } + } + function handlePasscodeVisibility(visible) { document.getElementById('am-passcode').type = (visible) ? 'text' : 'password'; } @@ -157,7 +266,7 @@ } function failure(err) { - console.log(err); + console.warn(err); utils.showSimpleToast('Could not save margin! Please Try Again!'); } } @@ -333,7 +442,6 @@ function handleUploadedFile(e) { vm.currentCsvProgress = 0; var files = e.target.files || e.originalEvent.dataTransfer.files; - console.log(files); amImportdata.compileCSVFile(files).then(displayToastMessage).catch(displayToastMessage).finally(cleanUp, updates); function displayToastMessage(res) { @@ -479,7 +587,16 @@ function success(res) { vm.ivSettings = res; + if (!vm.ivSettings.lastJobCardNo) + vm.ivSettings.lastJobCardNo = 0; + if (!vm.ivSettings.lastEstimateNo) + vm.ivSettings.lastEstimateNo = 0; + if (!vm.ivSettings.lastInvoiceNumber) + vm.ivSettings.lastInvoiceNumber = 0; + olino = res.lastInvoiceNumber; + oljbno = res.lastJobCardNo; + oleno = res.lastEstimateNo; ivEmailSubject = res.emailsubject; } diff --git a/src/app/components/settings/settings.factory.js b/src/app/components/settings/settings.factory.js new file mode 100644 index 00000000..7f4a0843 --- /dev/null +++ b/src/app/components/settings/settings.factory.js @@ -0,0 +1,88 @@ +/** + * Factory to fetch and retrieve service tax settings from database + * @author ndkcha + * @since 0.6.4 + * @version 0.6.4 + */ + +/// + +(function() { + angular.module('automintApp').factory('amSettings', SettingsFactory); + + SettingsFactory.$inject = ['$q', '$amRoot', 'utils', 'pdbConfig']; + + function SettingsFactory($q, $amRoot, utils, pdbConfig) { + var factory = { + getDefaultServiceType: getDefaultServiceType, + saveDefaultServiceType: saveDefaultServiceType + } + + return factory; + + // function definitions + + function getDefaultServiceType() { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(failure); + } + + function getSettingsObject(res) { + if (res.settings && res.settings.servicestate) + tracker.resolve(res.settings.servicestate); + else + failure(); + } + + function failure(err) { + if (!err) { + err = { + success: false, + message: 'Could not find service state' + } + } + tracker.reject(err); + } + } + + function saveDefaultServiceType(servicestate) { + var tracker = $q.defer(); + $amRoot.isSettingsId().then(getSettingsDoc).catch(failure); + return tracker.promise; + + function getSettingsDoc(res) { + pdbConfig.get($amRoot.docIds.settings).then(getSettingsObject).catch(writeSettingsObject); + } + + function getSettingsObject(res) { + if (!res.settings) + res.settings = {}; + res.settings.servicestate = servicestate; + pdbConfig.save(res).then(success).catch(failure); + } + + function writeSettingsObject(err) { + var doc = { + _id: utils.generateUUID('sttngs'), + creator: $amRoot.username, + settings: { + servicestate: servicestate + } + } + pdbConfig.save(doc).then(success).catch(failure); + } + + function success(res) { + tracker.resolve(res); + } + + function failure(err) { + tracker.reject(err); + } + } + } +})(); \ No newline at end of file diff --git a/src/app/components/settings/settings.html b/src/app/components/settings/settings.html index 2dc53c1a..07cc8577 100644 --- a/src/app/components/settings/settings.html +++ b/src/app/components/settings/settings.html @@ -107,13 +107,11 @@
- - - Import - Add customers and their vehicle data (in CSV format). - - +
+ Import + Add customers and their vehicle data (in CSV format). +
Click to upload @@ -140,18 +138,26 @@ + + +
+ Default Service Type +
+ + {{state}} + +
+
- -
- Backup Your Data -
- - file_download - Download - -
+ + Backup Your Data +
+ + file_download + Download +
@@ -197,16 +203,15 @@ - - + +
Service Tax - - - Apply Service Tax - - - -
+
+ + Apply Service Tax + +
+
Exclusive @@ -221,16 +226,15 @@ - - + +
VAT - - - Apply VAT - - - -
+
+ + Apply VAT + +
+
Exclusive @@ -252,37 +256,35 @@
- - - Workshop Details - - - - - domain - - - - - phone - - - - - location_on - - - - - location_on - - - - - location_city - - - + + Workshop Details +
+ + domain + + + + + phone + + + + + location_on + + + + + location_on + + + + + location_city + + + +
@@ -291,30 +293,28 @@
- - Social Links -
- - Show Links - -
- -
- - - + +
+ Social Links +
+ + Show Links + +
+ + +
@@ -323,15 +323,34 @@
-
+ Last Invoice Number: - -
-
- - Reset - -
+ + +
+ + Reset + +
+
+ + Last Estimate Number: + + +
+ + Reset + +
+
+ + Last Job Card Number: + + +
+ + Reset +
@@ -360,19 +379,19 @@ Email Subject subject - + - - Printing Margin (in cm) -
- - Enable Margins - -
+
+ Printing Margin (in cm) +
+ + Enable Margins + +
vertical_align_top diff --git a/src/app/components/treatments/memberships/memberships-edit.controller.js b/src/app/components/treatments/memberships/memberships-edit.controller.js index 46ccda97..e6cff398 100644 --- a/src/app/components/treatments/memberships/memberships-edit.controller.js +++ b/src/app/components/treatments/memberships/memberships-edit.controller.js @@ -176,7 +176,7 @@ } } function failure(err) { - console.log(err); + console.info(err); errorAndExit(); } } diff --git a/src/app/components/treatments/treatments.factory.js b/src/app/components/treatments/treatments.factory.js index 8f150cad..b7b0eeeb 100644 --- a/src/app/components/treatments/treatments.factory.js +++ b/src/app/components/treatments/treatments.factory.js @@ -2,7 +2,7 @@ * Factory that handles database interactions between treatments database and controller * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ /// @@ -199,9 +199,9 @@ function treatmentDocFound(res) { if (!res.regular) res.regular = {}; - if (!(res.regular[treatment.name] && method == 'add')) { - res.regular[treatment.name] = i; - } + if (res.regular[treatment.name]) + delete res.regular[treatment.name]['._deleted']; + res.regular[treatment.name] = i; pdbConfig.save(res).then(success).catch(failure); } diff --git a/src/assets/css/automint.css b/src/assets/css/automint.css index 6cf38590..742f9b42 100644 --- a/src/assets/css/automint.css +++ b/src/assets/css/automint.css @@ -2,7 +2,7 @@ * Customised style sheet for Automint App * @author ndkcha * @since 0.4.1 - * @version 0.6.1 + * @version 0.6.4 */ input[type=number]::-webkit-inner-spin-button, @@ -11,6 +11,51 @@ input[type=number]::-webkit-outer-spin-button { margin: 0; } +.am-jobcard-text { + color: #FB8C00; + font-weight: 500; +} + +.am-estimate-text { + color: #4CAF50; + font-weight: 500; +} + +.am-invoice-text { + color: #03A9F4; + font-weight: 500; +} + +.am-red-text { + color: #F44336; +} + +.am-blue-bar { + background: #03A9F4; + color: #fff; +} + +.am-blue-bar.c600 { + background: #039BE5; +} + +.am-blue-bar.c800 { + background: #0277BD; +} + +.am-service-details-panel.ng-hide { + opacity: 0; +} + +.am-service-details-panel.ng-show { + opacity: 1; +} + +.am-service-details-panel { + opacity: 1; + transition: left 600ms ease, opacity 1s ease; +} + .am-tab-margin { margin-top: 0.4rem; } @@ -37,7 +82,6 @@ input[type=number]::-webkit-outer-spin-button { .am-select-table-row:hover { background: #ECEFF1; } - .am-clear-error-spacer .md-errors-spacer { display: none; } @@ -46,7 +90,7 @@ input[type=number]::-webkit-outer-spin-button { font-weight: 500; padding-bottom: 0.1rem; font-size: small; - color: rgba(30, 30, 30, 0.7); + color: #000; margin-bottom: 0.5rem; } @@ -54,7 +98,7 @@ input[type=number]::-webkit-outer-spin-button { font-weight: 500; padding-bottom: 0.1rem; font-size: medium; - color: rgba(30, 30, 30, 0.7); + color: #000; margin-bottom: 0.1rem; } @@ -189,7 +233,7 @@ md-sidenav.md-closed.md-locked-open-add-active { } .am-datatable-actions.view-all-services { - width: 132px; + width: 40px; } .am-datatable-actions.view-all-services .invoice { @@ -270,13 +314,21 @@ md-sidenav.md-closed.md-locked-open-add-active { outline: none; } -.am-el-item .el-item { - background-color: white; - transition: all 200ms; +.am-el-item .tile.service-form .folded { + cursor: pointer; + outline: none; + padding: 1rem; } -.am-el-item .el-item * { - transition: all 200ms; +.am-el-item .tile.service-form.selected .folded { + cursor: pointer; + outline: none; + padding: 1rem; +} + +.am-el-item .el-item { + background-color: white; + transition: all 260ms; } .am-el-item .el-item .actions { @@ -294,13 +346,23 @@ md-sidenav.md-closed.md-locked-open-add-active { border-radius: 2px; } +.am-el-item .el-item.selected.service-form { + border-radius: 2px; + margin: 0; +} + +.am-el-item .el-item.selected.service-form .expanded { + border-radius: 2px; + padding: 0.8rem; +} + .am-el-item .el-item.selected .expanded { visibility: visible; } .am-el-item .el-item.selected .expanded, .am-el-item .el-item.selected .expanded> * { - max-height: 700px; + max-height: 7000px; opacity: 1; } @@ -316,7 +378,7 @@ md-sidenav.md-closed.md-locked-open-add-active { .am-el-item .el-item .expanded> * { max-height: 0; opacity: 0; - transition: all 200ms; + transition: all 260ms; } .am-lockscreen { diff --git a/src/assets/js/pouchdb-4.0.1.min.js b/src/assets/js/pouchdb-4.0.1.min.js deleted file mode 100644 index 2e1cc499..00000000 --- a/src/assets/js/pouchdb-4.0.1.min.js +++ /dev/null @@ -1,11 +0,0 @@ -// PouchDB 4.0.1 -// -// (c) 2012-2015 Dale Harvey and the PouchDB team -// PouchDB may be freely distributed under the Apache license, version 2.0. -// For all details and documentation: -// http://pouchdb.com -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.PouchDB=e()}}(function(){var define,module,exports;return function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[s]={exports:{}};t[s][0].call(f.exports,function(e){var n=t[s][1][e];return o(n?n:e)},f,f.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s0?t.keys.slice(t.skip):t.keys;if(t.descending&&r.reverse(),!r.length)return e._allDocs({limit:0},n);var o={offset:t.skip};return y.all(r.map(function(n){var r=d.extend({key:n,deleted:"ok"},t);return["limit","skip","keys"].forEach(function(e){delete r[e]}),new y(function(t,i){e._allDocs(r,function(e,r){return e?i(e):(o.total_rows=r.total_rows,void t(r.rows[0]||{key:n,error:"not_found"}))})})})).then(function(e){return o.rows=e,o})}function c(e){var t=e._compactionQueue[0],r=t.opts,o=t.callback;e.get("_local/compaction")["catch"](function(){return!1}).then(function(t){t&&t.last_seq&&(r.last_seq=t.last_seq),e._compact(r,function(t,r){t?o(t):o(null,r),n.nextTick(function(){e._compactionQueue.shift(),e._compactionQueue.length&&c(e)})})})}function f(){p.call(this)}var d=e(78),l=e(67),h=e(48),p=e(81).EventEmitter,v=e(57),_=e(14),y=d.Promise,m=e(38),g=e(39);d.inherits(f,p),t.exports=f,f.prototype.post=d.adapterFun("post",function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e||Array.isArray(e)?n(h.error(h.NOT_AN_OBJECT)):void this.bulkDocs({docs:[e]},t,o(n))}),f.prototype.put=d.adapterFun("put",d.getArguments(function(e){var t,n,r,i,s=e.shift(),a="_id"in s;if("object"!=typeof s||Array.isArray(s))return(i=e.pop())(h.error(h.NOT_AN_OBJECT));for(s=d.clone(s);;)if(t=e.shift(),n=typeof t,"string"!==n||a?"string"!==n||!a||"_rev"in s?"object"===n?r=t:"function"===n&&(i=t):s._rev=t:(s._id=t,a=!0),!e.length)break;r=r||{};var u=d.invalidIdError(s._id);return u?i(u):g(s._id)&&"function"==typeof this._putLocal?s._deleted?this._removeLocal(s,i):this._putLocal(s,i):void this.bulkDocs({docs:[s]},r,o(i))})),f.prototype.putAttachment=d.adapterFun("putAttachment",function(e,t,n,r,o,i){function s(e){return e._attachments=e._attachments||{},e._attachments[t]={content_type:o,data:r},a.put(e)}var a=this;return"function"==typeof o&&(i=o,o=r,r=n,n=null),"undefined"==typeof o&&(o=r,r=n,n=null),a.get(e).then(function(e){if(e._rev!==n)throw h.error(h.REV_CONFLICT);return s(e)},function(t){if(t.reason===h.MISSING_DOC.message)return s({_id:e});throw t})}),f.prototype.removeAttachment=d.adapterFun("removeAttachment",function(e,t,n,r){var o=this;o.get(e,function(e,i){return e?void r(e):i._rev!==n?void r(h.error(h.REV_CONFLICT)):i._attachments?(delete i._attachments[t],0===Object.keys(i._attachments).length&&delete i._attachments,void o.put(i,r)):r()})}),f.prototype.remove=d.adapterFun("remove",function(e,t,n,r){var i;"string"==typeof t?(i={_id:e,_rev:t},"function"==typeof n&&(r=n,n={})):(i=e,"function"==typeof t?(r=t,n={}):(r=n,n=t)),n=d.clone(n||{}),n.was_delete=!0;var s={_id:i._id,_rev:i._rev||n.rev};return s._deleted=!0,g(s._id)&&"function"==typeof this._removeLocal?this._removeLocal(i,r):void this.bulkDocs({docs:[s]},n,o(r))}),f.prototype.revsDiff=d.adapterFun("revsDiff",function(e,t,n){function r(e,t){a.has(e)||a.set(e,{missing:[]}),a.get(e).missing.push(t)}function o(t,n){var o=e[t].slice(0);l.traverseRevTree(n,function(e,n,i,s,a){var u=n+"-"+i,c=o.indexOf(u);-1!==c&&(o.splice(c,1),"available"!==a.status&&r(t,u))}),o.forEach(function(e){r(t,e)})}"function"==typeof t&&(n=t,t={}),t=d.clone(t);var i=Object.keys(e);if(!i.length)return n(null,{});var s=0,a=new d.Map;i.map(function(t){this._getRevisionTree(t,function(r,u){if(r&&404===r.status&&"missing"===r.message)a.set(t,{missing:e[t]});else{if(r)return n(r);o(t,u)}if(++s===i.length){var c={};return a.forEach(function(e,t){c[t]=e}),n(null,c)}})},this)}),f.prototype.compactDocument=d.adapterFun("compactDocument",function(e,t,n){var r=this;this._getRevisionTree(e,function(o,i){if(o)return n(o);var s=a(i),u=[],c=[];Object.keys(s).forEach(function(e){s[e]>t&&u.push(e)}),l.traverseRevTree(i,function(e,t,n,r,o){var i=t+"-"+n;"available"===o.status&&-1!==u.indexOf(i)&&c.push(i)}),r._doCompaction(e,c,n)})}),f.prototype.compact=d.adapterFun("compact",function(e,t){"function"==typeof e&&(t=e,e={});var n=this;e=d.clone(e||{}),n._compactionQueue=n._compactionQueue||[],n._compactionQueue.push({opts:e,callback:t}),1===n._compactionQueue.length&&c(n)}),f.prototype._compact=function(e,t){function n(e){s.push(o.compactDocument(e.id,0))}function r(e){var n=e.last_seq;y.all(s).then(function(){return v(o,"_local/compaction",function(e){return!e.last_seq||e.last_seqt?t:u;var c="?"+Object.keys(i).map(function(e){return e+"="+encodeURIComponent(i[e])}).join("&"),f={headers:_(O.headers),method:h,url:a(O,"_changes"+c),timeout:e.timeout,body:l};m=r,e.aborted||(y=n(f,o))}},E=10,w=0,S={results:[]},T=function(n,i){if(!e.aborted){var a=0;if(i&&i.results){a=i.results.length,S.last_seq=i.last_seq;var c={};c.query=e.query_params,i.results=i.results.filter(function(t){u--;var n=p.filterChange(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&r(t),o&&S.results.push(t),e.onChange(t)),n})}else if(n)return e.aborted=!0,void e.complete(n);i&&i.last_seq&&(m=i.last_seq);var f=s&&0>=u||i&&t>a||e.descending;if((!e.continuous||s&&0>=u)&&f)e.complete(null,S);else{n?w+=1:w=0;var d=1<h)return void e.complete(n||b.error(b.UNKNOWN_ERROR));setTimeout(function(){g(m,T)},l)}}};return g(e.since||0,T),{cancel:function(){e.aborted=!0,y&&y.abort()}}},y.revsDiff=p.adapterFun("revsDiff",function(e,t,r){"function"==typeof t&&(r=t,t={}),n({headers:_(O.headers),method:"POST",url:a(O,"_revs_diff"),body:JSON.stringify(e)},r)}),y._close=function(e){e()},y._destroy=function(t){n({url:a(O,""),method:"DELETE",headers:_(O.headers)},function(n,r){return n?(y.emit("error",n),t(n)):(y.emit("destroyed"),y.constructor.emit("destroyed",e.name),void t(null,r))})}}var f=25,d=1800,l=e(31),h=e(29),p=e(78),v=p.Promise,_=p.clone,y=e(28),m=y.btoa,g=y.atob,b=e(48),E=e(83)("pouchdb:http"),w=e(24),S=e(33),T=e(42);c.valid=function(){return!0},t.exports=c},{24:24,28:28,29:29,31:31,33:33,42:42,48:48,78:78,83:83}],4:[function(e,t,n){"use strict";function r(e,t,n,r,o){try{if(e&&t)return o?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return o?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return o?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(r)return IDBKeyRange.only(r)}catch(i){return{error:i}}return null}function o(e,t,n,r){return"DataError"===n.name&&0===n.code?r(null,{total_rows:e._meta.docCount,offset:t.skip,rows:[]}):void r(a.error(a.IDB_ERROR,n.name,n.message))}function i(e,t,n,i){function a(e,i){function a(t,n,r){var o=t.id+"::"+r;N.get(o).onsuccess=function(r){n.doc=h(r.target.result),e.conflicts&&(n.doc._conflicts=s.collectConflicts(t)),v(n.doc,e,q)}}function u(t,n,r){var o={id:r.id,key:r.id,value:{rev:n}},i=r.deleted;if("ok"===e.deleted)L.push(o),i?(o.value.deleted=!0,o.doc=null):e.include_docs&&a(r,o,n);else if(!i&&S--<=0&&(L.push(o),e.include_docs&&a(r,o,n),0===--T))return;t["continue"]()}function c(e){j=t._meta.docCount;var n=e.target.result;if(n){var r=p(n.value),o=r.winningRev;u(n,o,r)}}function m(){i(null,{total_rows:j,offset:e.skip,rows:L})}function g(){e.attachments?_(L,e.binary).then(m):m()}var b="startkey"in e?e.startkey:!1,E="endkey"in e?e.endkey:!1,w="key"in e?e.key:!1,S=e.skip||0,T="number"==typeof e.limit?e.limit:-1,O=e.inclusive_end!==!1,x="descending"in e&&e.descending?"prev":null,k=r(b,E,O,w,x);if(k&&k.error)return o(t,e,k.error,i);var A=[l,d];e.attachments&&A.push(f);var R=y(n,A,"readonly");if(R.error)return i(R.error);var q=R.txn,C=q.objectStore(l),I=q.objectStore(d),D=x?C.openCursor(k,x):C.openCursor(k),N=I.index("_doc_id_rev"),L=[],j=0;q.oncomplete=g,D.onsuccess=c}function u(e,n){return 0===e.limit?n(null,{total_rows:t._meta.docCount,offset:e.skip,rows:[]}):void a(e,n)}u(e,i)}var s=e(67),a=e(48),u=e(9),c=e(7),f=c.ATTACH_STORE,d=c.BY_SEQ_STORE,l=c.DOC_STORE,h=u.decodeDoc,p=u.decodeMetadata,v=u.fetchAttachmentsIfNecessary,_=u.postProcessAttachments,y=u.openTransactionSafely;t.exports=i},{48:48,67:67,7:7,9:9}],5:[function(e,t,n){"use strict";function r(e,t){return new o.Promise(function(n,r){var s=i([""],{type:"image/png"});e.objectStore(a).put(s,"key"),e.oncomplete=function(){var e=t.transaction([a],"readwrite"),i=e.objectStore(a).get("key");i.onerror=r,i.onsuccess=function(e){var t=e.target.result,r=URL.createObjectURL(t);o.ajax({url:r,cache:!0,binary:!0},function(e,t){e&&405===e.status?n(!0):(n(!(!t||"image/png"!==t.type)),e&&404===e.status&&o.explain404("PouchDB is just detecting blob URL support.")),URL.revokeObjectURL(r)})}}})["catch"](function(){return!1})}var o=e(78),i=e(32),s=e(7),a=s.DETECT_BLOB_SUPPORT_STORE;t.exports=r},{32:32,7:7,78:78}],6:[function(e,t,n){"use strict";function r(e,t,n,r,c,f){function w(){var e=[p,h,l,_,v,d],t=E(r,e,"readwrite");return t.error?f(t.error):(N=t.txn,N.onerror=b(f),N.ontimeout=b(f),N.oncomplete=O,L=N.objectStore(p),j=N.objectStore(h),B=N.objectStore(l),F=N.objectStore(d),void k(function(e){return e?(W=!0,f(e)):void T()}))}function S(){a(P,n,G,N,Q,A,t)}function T(){function e(){++n===P.length&&S()}function t(t){var n=m(t.target.result);n&&G.set(n.id,n),e()}if(P.length)for(var n=0,r=0,o=P.length;o>r;r++){var i=P[r];if(i._id&&u(i._id))e();else{var s=L.get(i.metadata.id);s.onsuccess=t}}}function O(){W||(c.notify(n._meta.name),n._meta.docCount+=U,f(null,Q))}function x(e,t){var n=B.get(e);n.onsuccess=function(n){if(n.target.result)t();else{var r=i.error(i.MISSING_STUB,"unknown stub attachment with digest "+e);r.status=412,t(r)}}}function k(e){function t(){++o===n.length&&e(r)}var n=[];if(P.forEach(function(e){e.data&&e.data._attachments&&Object.keys(e.data._attachments).forEach(function(t){var r=e.data._attachments[t];r.stub&&n.push(r.digest)})}),!n.length)return e();var r,o=0;n.forEach(function(e){x(e,function(e){e&&!r&&(r=e),t()})})}function A(e,t,n,r,o,i,s,a){U+=i,e.metadata.winningRev=t,e.metadata.deleted=n;var u=e.data;u._id=e.metadata.id,u._rev=e.metadata.rev,r&&(u._deleted=!0);var c=u._attachments&&Object.keys(u._attachments).length;return c?C(e,t,n,o,s,a):void q(e,t,n,o,s,a)}function R(e){var t=o.compactTree(e.metadata);y(t,e.metadata.id,N)}function q(e,t,r,o,i,s){function a(i){o&&n.auto_compaction&&R(e),d.seq=i.target.result,delete d.rev;var s=g(d,t,r),a=L.put(s);a.onsuccess=c}function u(e){e.preventDefault(),e.stopPropagation();var t=j.index("_doc_id_rev"),n=t.getKey(f._doc_id_rev);n.onsuccess=function(e){var t=j.put(f,e.target.result);t.onsuccess=a}}function c(){Q[i]={ok:!0,id:d.id,rev:t},G.set(e.metadata.id,e.metadata),I(e,d.seq,s)}var f=e.data,d=e.metadata;f._doc_id_rev=d.id+"::"+d.rev,delete f._id,delete f._rev;var l=j.put(f);l.onsuccess=a,l.onerror=u}function C(e,t,n,r,o,i){function s(){c===f.length&&q(e,t,n,r,o,i)}function a(){c++,s()}var u=e.data,c=0,f=Object.keys(u._attachments);f.forEach(function(t){var n=e.data._attachments[t];if(n.stub)c++,s();else{var r=n.data;delete n.data;var o=n.digest;D(o,r,a)}})}function I(e,t,n){function r(){++i===s.length&&n()}function o(n){var o=e.data._attachments[n].digest,i=F.put({seq:t,digestSeq:o+"::"+t});i.onsuccess=r,i.onerror=function(e){e.preventDefault(),e.stopPropagation(),r()}}var i=0,s=Object.keys(e.data._attachments||{});if(!s.length)return n();for(var a=0;aJ;J++){var V=P[J];V._id&&u(V._id)||(V=P[J]=o.parseDoc(V,t.new_edits),V.error&&!M&&(M=V))}if(M)return f(M);var Q=new Array(P.length),G=new o.Map,W=!1,K=n._meta.blobSupport?"blob":"base64";s(P,K,function(e){return e?f(e):void w()})}var o=e(78),i=e(48),s=e(43),a=e(44),u=e(39),c=e(9),f=e(7),d=f.ATTACH_AND_SEQ_STORE,l=f.ATTACH_STORE,h=f.BY_SEQ_STORE,p=f.DOC_STORE,v=f.LOCAL_STORE,_=f.META_STORE,y=c.compactRevs,m=c.decodeMetadata,g=c.encodeMetadata,b=c.idbError,E=c.openTransactionSafely;t.exports=r},{39:39,43:43,44:44,48:48,7:7,78:78,9:9}],7:[function(e,t,n){"use strict";n.ADAPTER_VERSION=5,n.DOC_STORE="document-store",n.BY_SEQ_STORE="by-sequence",n.ATTACH_STORE="attach-store",n.ATTACH_AND_SEQ_STORE="attach-seq-store",n.META_STORE="meta-store",n.LOCAL_STORE="local-store",n.DETECT_BLOB_SUPPORT_STORE="detect-blob-support"},{}],8:[function(e,t,n){(function(n){"use strict";function r(e,t){var n=this;N.queue.push({action:function(t){o(n,e,t)},callback:t}),O()}function o(e,t,o){function d(e){var t=e.createObjectStore(w,{keyPath:"id"});e.createObjectStore(b,{autoIncrement:!0}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0}),e.createObjectStore(g,{keyPath:"digest"}),e.createObjectStore(T,{keyPath:"id",autoIncrement:!1}),e.createObjectStore(E),t.createIndex("deletedOrLocal","deletedOrLocal",{unique:!1}),e.createObjectStore(S,{keyPath:"_id"});var n=e.createObjectStore(m,{autoIncrement:!0});n.createIndex("seq","seq"),n.createIndex("digestSeq","digestSeq",{unique:!0})}function l(e,t){var n=e.objectStore(w);n.createIndex("deletedOrLocal","deletedOrLocal",{unique:!1}),n.openCursor().onsuccess=function(e){var r=e.target.result;if(r){var o=r.value,i=u(o);o.deletedOrLocal=i?"1":"0",n.put(o),r["continue"]()}else t()}}function O(e){e.createObjectStore(S,{keyPath:"_id"}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0})}function N(e,t){var n=e.objectStore(S),r=e.objectStore(w),o=e.objectStore(b),i=r.openCursor();i.onsuccess=function(e){var i=e.target.result;if(i){var s=i.value,u=s.id,f=c(u),d=a.winningRev(s);if(f){var l=u+"::"+d,h=u+"::",p=u+"::~",v=o.index("_doc_id_rev"),_=IDBKeyRange.bound(h,p,!1,!1),y=v.openCursor(_);y.onsuccess=function(e){if(y=e.target.result){var t=y.value;t._doc_id_rev===l&&n.put(t),o["delete"](y.primaryKey),y["continue"]()}else r["delete"](i.primaryKey),i["continue"]()}}else i["continue"]()}else t&&t()}}function B(e){var t=e.createObjectStore(m,{autoIncrement:!0});t.createIndex("seq","seq"),t.createIndex("digestSeq","digestSeq",{unique:!0})}function F(e,t){var n=e.objectStore(b),r=e.objectStore(g),o=e.objectStore(m),i=r.count();i.onsuccess=function(e){var r=e.target.result;return r?void(n.openCursor().onsuccess=function(e){var n=e.target.result;if(!n)return t();for(var r=n.value,i=n.primaryKey,s=Object.keys(r._attachments||{}),a={},u=0;uo&&(o=n),t["continue"]()}}function i(){var e=R(u,u.winningRev,u.deleted),t=r.put(e);t.onsuccess=function(){s["continue"]()}}var s=e.target.result;if(s){var u=t(s.value);return u.winningRev=u.winningRev||a.winningRev(u),u.seq?i():void o()}}}var P=t.name,U=null;e._meta=null,e.type=function(){return"idb"},e._id=s.toPromise(function(t){t(null,e._meta.instanceId)}),e._bulkDocs=function(t,n,o){h(t,n,e,U,r.Changes,o)},e._get=function(e,t,n){function r(){n(s,{doc:o,metadata:i,ctx:a})}var o,i,s,a=t.ctx;if(!a){var c=L(U,[w,b,g],"readonly");if(c.error)return n(c.error);a=c.txn}a.objectStore(w).get(e).onsuccess=function(e){if(i=A(e.target.result),!i)return s=f.error(f.MISSING_DOC,"missing"),r();if(u(i)&&!t.rev)return s=f.error(f.MISSING_DOC,"deleted"),r();var n=a.objectStore(b),c=t.rev||i.winningRev,d=i.id+"::"+c;n.index("_doc_id_rev").get(d).onsuccess=function(e){return o=e.target.result,o&&(o=k(o)),o?void r():(s=f.error(f.MISSING_DOC,"missing"),r())}}},e._getAttachment=function(e,t,n){var r;if(t.ctx)r=t.ctx;else{var o=L(U,[w,b,g],"readonly");if(o.error)return n(o.error);r=o.txn}var i=e.digest,s=e.content_type;r.objectStore(g).get(i).onsuccess=function(e){var r=e.target.result.body;D(r,s,t.binary,function(e){n(null,e)})}},e._info=function(t){if(null===U||!j[P]){var n=new Error("db isn't open");return n.id="idbNull",t(n)}var r,o,i=L(U,[b],"readonly");if(i.error)return t(i.error);var s=i.txn,a=s.objectStore(b).openCursor(null,"prev");a.onsuccess=function(t){var n=t.target.result;r=n?n.key:0,o=e._meta.docCount},s.oncomplete=function(){t(null,{doc_count:o,update_seq:r,idb_attachment_format:e._meta.blobSupport?"binary":"base64"})}},e._allDocs=function(t,n){p(t,e,U,n)},e._changes=function(t){function n(e){function n(){return a.seq!==s?e["continue"]():(d=s,a.winningRev===i._rev?o(i):void r())}function r(){var e=i._id+"::"+a.winningRev,t=v.index("_doc_id_rev").openCursor(IDBKeyRange.bound(e,e+"ï¿¿"));t.onsuccess=function(e){o(k(e.target.result.value))}}function o(n){var r=t.processChange(n,a,t);r.seq=a.seq,E(r)&&(m++,h&&y.push(r),t.attachments&&t.include_docs?q(n,t,p,function(){I([r],t.binary).then(function(){t.onChange(r)})}):t.onChange(r)),m!==l&&e["continue"]()}var i=k(e.value),s=e.key;if(c&&!c.has(i._id))return e["continue"]();var a;return(a=S.get(i._id))?n():void(_.get(i._id).onsuccess=function(e){ -a=A(e.target.result),S.set(i._id,a),n()})}function o(e){var t=e.target.result;t&&n(t)}function i(){var e=[w,b];t.attachments&&e.push(g);var n=L(U,e,"readonly");if(n.error)return t.complete(n.error);p=n.txn,p.onerror=C(t.complete),p.oncomplete=a,v=p.objectStore(b),_=p.objectStore(w);var r;r=f?v.openCursor(null,f):v.openCursor(IDBKeyRange.lowerBound(t.since,!0)),r.onsuccess=o}function a(){function e(){t.complete(null,{results:y,last_seq:d})}!t.continuous&&t.attachments?I(y).then(e):e()}if(t=s.clone(t),t.continuous){var u=P+":"+s.uuid();return r.Changes.addListener(P,u,e,t),r.Changes.notify(P),{cancel:function(){r.Changes.removeListener(P,u)}}}var c=t.doc_ids&&new s.Set(t.doc_ids),f=t.descending?"prev":null;t.since=t.since||0;var d=t.since,l="limit"in t?t.limit:-1;0===l&&(l=1);var h;h="returnDocs"in t?t.returnDocs:!0;var p,v,_,y=[],m=0,E=s.filterChange(t),S=new s.Map;i()},e._close=function(e){return null===U?e(f.error(f.NOT_OPEN)):(U.close(),delete j[P],U=null,void e())},e._getRevisionTree=function(e,t){var n=L(U,[w],"readonly");if(n.error)return t(n.error);var r=n.txn,o=r.objectStore(w).get(e);o.onsuccess=function(e){var n=A(e.target.result);n?t(null,n.rev_tree):t(f.error(f.MISSING_DOC))}},e._doCompaction=function(e,t,n){var r=[w,b,g,m],o=L(U,r,"readwrite");if(o.error)return n(o.error);var i=o.txn,s=i.objectStore(w);s.get(e).onsuccess=function(n){var r=A(n.target.result);a.traverseRevTree(r.rev_tree,function(e,n,r,o,i){var s=n+"-"+r;-1!==t.indexOf(s)&&(i.status="missing")}),x(t,e,i);var o=r.winningRev,s=r.deleted;i.objectStore(w).put(R(r,o,s))},i.onerror=C(n),i.oncomplete=function(){n()}},e._getLocal=function(e,t){var n=L(U,[S],"readonly");if(n.error)return t(n.error);var r=n.txn,o=r.objectStore(S).get(e);o.onerror=C(t),o.onsuccess=function(e){var n=e.target.result;n?(delete n._doc_id_rev,t(null,n)):t(f.error(f.MISSING_DOC))}},e._putLocal=function(e,t,n){"function"==typeof t&&(n=t,t={}),delete e._revisions;var r=e._rev,o=e._id;r?e._rev="0-"+(parseInt(r.split("-")[1],10)+1):e._rev="0-1";var i,s=t.ctx;if(!s){var a=L(U,[S],"readwrite");if(a.error)return n(a.error);s=a.txn,s.onerror=C(n),s.oncomplete=function(){i&&n(null,i)}}var u,c=s.objectStore(S);r?(u=c.get(o),u.onsuccess=function(o){var s=o.target.result;if(s&&s._rev===r){var a=c.put(e);a.onsuccess=function(){i={ok:!0,id:e._id,rev:e._rev},t.ctx&&n(null,i)}}else n(f.error(f.REV_CONFLICT))}):(u=c.add(e),u.onerror=function(e){n(f.error(f.REV_CONFLICT)),e.preventDefault(),e.stopPropagation()},u.onsuccess=function(){i={ok:!0,id:e._id,rev:e._rev},t.ctx&&n(null,i)})},e._removeLocal=function(e,t,n){"function"==typeof t&&(n=t,t={});var r=t.ctx;if(!r){var o=L(U,[S],"readwrite");if(o.error)return n(o.error);r=o.txn,r.oncomplete=function(){i&&n(null,i)}}var i,s=e._id,a=r.objectStore(S),u=a.get(s);u.onerror=C(n),u.onsuccess=function(r){var o=r.target.result;o&&o._rev===e._rev?(a["delete"](s),i={ok:!0,id:s,rev:"0-0"},t.ctx&&n(null,i)):n(f.error(f.MISSING_DOC))}},e._destroy=function(e){r.Changes.removeAllListeners(P),r.openReqList[P]&&r.openReqList[P].result&&(r.openReqList[P].result.close(),delete j[P]);var t=indexedDB.deleteDatabase(P);t.onsuccess=function(){r.openReqList[P]&&(r.openReqList[P]=null),_()&&P in localStorage&&delete localStorage[P],e(null,{ok:!0})},t.onerror=C(e)};var J=j[P];if(J)return U=J.idb,e._meta=J.global,void n.nextTick(function(){o(null,e)});var H=indexedDB.open(P,y);"openReqList"in r||(r.openReqList={}),r.openReqList[P]=H,H.onupgradeneeded=function(e){function t(){var e=o[i-1];i++,e&&e(r,t)}var n=e.target.result;if(e.oldVersion<1)return d(n);var r=e.currentTarget.transaction;e.oldVersion<3&&O(n),e.oldVersion<4&&B(n);var o=[l,N,F,M],i=e.oldVersion;t()},H.onsuccess=function(t){U=t.target.result,U.onversionchange=function(){U.close(),delete j[P]},U.onabort=function(){U.close(),delete j[P]};var n=U.transaction([T,E,w],"readwrite"),r=n.objectStore(T).get(T),a=null,u=null,c=null;r.onsuccess=function(t){var r=function(){null!==a&&null!==u&&null!==c&&(e._meta={name:P,instanceId:c,blobSupport:a,docCount:u},j[P]={idb:U,global:e._meta},o(null,e))},f=t.target.result||{id:T};P+"_id"in f?(c=f[P+"_id"],r()):(c=s.uuid(),f[P+"_id"]=c,n.objectStore(T).put(f).onsuccess=function(){r()}),i||(i=v(n,U)),i.then(function(e){a=e,r()});var d=n.objectStore(w).index("deletedOrLocal");d.count(IDBKeyRange.only("0")).onsuccess=function(e){u=e.target.result,r()}}},H.onerror=function(e){var t="Failed to open indexedDB, are you in private browsing mode?";console.error(t),o(f.error(f.IDB_ERROR,t))}}var i,s=e(78),a=e(67),u=e(38),c=e(39),f=e(48),d=e(9),l=e(7),h=e(6),p=e(4),v=e(5),_=e(46),y=l.ADAPTER_VERSION,m=l.ATTACH_AND_SEQ_STORE,g=l.ATTACH_STORE,b=l.BY_SEQ_STORE,E=l.DETECT_BLOB_SUPPORT_STORE,w=l.DOC_STORE,S=l.LOCAL_STORE,T=l.META_STORE,O=d.applyNext,x=d.compactRevs,k=d.decodeDoc,A=d.decodeMetadata,R=d.encodeMetadata,q=d.fetchAttachmentsIfNecessary,C=d.idbError,I=d.postProcessAttachments,D=d.readBlobData,N=d.taskQueue,L=d.openTransactionSafely,j={};r.valid=function(){var e="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform);return!e&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange},r.Changes=new s.Changes,t.exports=r}).call(this,e(82))},{38:38,39:39,4:4,46:46,48:48,5:5,6:6,67:67,7:7,78:78,82:82,9:9}],9:[function(e,t,n){(function(t){"use strict";function r(e,t,n){try{e.apply(t,n)}catch(r){"undefined"!=typeof PouchDB&&PouchDB.emit("error",r)}}var o=e(48),i=e(78),s=e(28),a=s.btoa,u=e(7),c=e(36),f=e(29),d=e(32);n.taskQueue={running:!1,queue:[]},n.applyNext=function(){if(!n.taskQueue.running&&n.taskQueue.queue.length){n.taskQueue.running=!0;var e=n.taskQueue.queue.shift();e.action(function(o,i){r(e.callback,this,[o,i]),n.taskQueue.running=!1,t.nextTick(n.applyNext)})}},n.idbError=function(e){return function(t){var n=t.target&&t.target.error&&t.target.error.name||t.target;e(o.error(o.IDB_ERROR,n,t.type))}},n.encodeMetadata=function(e,t,n){return{data:i.safeJsonStringify(e),winningRev:t,deletedOrLocal:n?"1":"0",seq:e.seq,id:e.id}},n.decodeMetadata=function(e){if(!e)return null;var t=i.safeJsonParse(e.data);return t.winningRev=e.winningRev,t.deleted="1"===e.deletedOrLocal,t.seq=e.seq,t},n.decodeDoc=function(e){if(!e)return e;var t=e._doc_id_rev.lastIndexOf(":");return e._id=e._doc_id_rev.substring(0,t-1),e._rev=e._doc_id_rev.substring(t+1),delete e._doc_id_rev,e},n.readBlobData=function(e,t,n,r){n?r(e?"string"!=typeof e?e:f(e,t):d([""],{type:t})):e?"string"!=typeof e?c(e,function(e){r(a(e))}):r(e):r("")},n.fetchAttachmentsIfNecessary=function(e,t,n,r){function o(){++a===s.length&&r&&r()}function i(e,t){var r=e._attachments[t],i=r.digest,s=n.objectStore(u.ATTACH_STORE).get(i);s.onsuccess=function(e){r.body=e.target.result.body,o()}}var s=Object.keys(e._attachments||{});if(!s.length)return r&&r();var a=0;s.forEach(function(n){t.attachments&&t.include_docs?i(e,n):(e._attachments[n].stub=!0,o())})},n.postProcessAttachments=function(e,t){return i.Promise.all(e.map(function(e){if(e.doc&&e.doc._attachments){var r=Object.keys(e.doc._attachments);return i.Promise.all(r.map(function(r){var o=e.doc._attachments[r];if("body"in o){var s=o.body,a=o.content_type;return new i.Promise(function(u){n.readBlobData(s,a,t,function(t){e.doc._attachments[r]=i.extend(i.pick(o,["digest","content_type"]),{data:t}),u()})})}}))}}))},n.compactRevs=function(e,t,n){function r(){f--,f||o()}function o(){i.length&&i.forEach(function(e){var t=c.index("digestSeq").count(IDBKeyRange.bound(e+"::",e+"::ï¿¿",!1,!1));t.onsuccess=function(t){var n=t.target.result;n||a["delete"](e)}})}var i=[],s=n.objectStore(u.BY_SEQ_STORE),a=n.objectStore(u.ATTACH_STORE),c=n.objectStore(u.ATTACH_AND_SEQ_STORE),f=e.length;e.forEach(function(e){var n=s.index("_doc_id_rev"),o=t+"::"+e;n.getKey(o).onsuccess=function(e){var t=e.target.result;if("number"!=typeof t)return r();s["delete"](t);var n=c.index("seq").openCursor(IDBKeyRange.only(t));n.onsuccess=function(e){var t=e.target.result;if(t){var n=t.value.digestSeq.split("::")[0];i.push(n),c["delete"](t.primaryKey),t["continue"]()}else r()}}})},n.openTransactionSafely=function(e,t,n){try{return{txn:e.transaction(t,n)}}catch(r){return{error:r}}}}).call(this,e(82))},{28:28,29:29,32:32,36:36,48:48,7:7,78:78,82:82}],10:[function(e,t,n){"use strict";function r(e,t,n,r,f,g){function b(){return I?g(I):(f.notify(n._name),n._docCount=-1,void g(null,D))}function E(e,t){var n="SELECT count(*) as cnt FROM "+h+" WHERE digest=?";C.executeSql(n,[e],function(n,r){if(0===r.rows.item(0).cnt){var o=i.error(i.MISSING_STUB,"unknown stub attachment with digest "+e);t(o)}else t()})}function w(e){function t(){++o===n.length&&e(r)}var n=[];if(R.forEach(function(e){e.data&&e.data._attachments&&Object.keys(e.data._attachments).forEach(function(t){var r=e.data._attachments[t];r.stub&&n.push(r.digest)})}),!n.length)return e();var r,o=0;n.forEach(function(e){E(e,function(e){e&&!r&&(r=e),t()})})}function S(e,t,r,i,s,a,u,c){function f(){function t(e,t){function r(){return++i===s.length&&t(),!1}function o(t){var o="INSERT INTO "+p+" (digest, seq) VALUES (?,?)",i=[n._attachments[t].digest,e];C.executeSql(o,i,r,r)}var i=0,s=Object.keys(n._attachments||{});if(!s.length)return t();for(var a=0;a0;){var e=ee.pop();e(null,$)}}function G(e,t){if(0===t){var n="CREATE TABLE IF NOT EXISTS "+E+" (dbid, db_version INTEGER)",r="CREATE TABLE IF NOT EXISTS "+g+" (digest UNIQUE, escaped TINYINT(1), body BLOB)",o="CREATE TABLE IF NOT EXISTS "+w+" (digest, seq INTEGER)",s="CREATE TABLE IF NOT EXISTS "+y+" (id unique, json, winningseq, max_seq INTEGER UNIQUE)",a="CREATE TABLE IF NOT EXISTS "+m+" (seq INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, json, deleted TINYINT(1), doc_id, rev)",u="CREATE TABLE IF NOT EXISTS "+b+" (id UNIQUE, rev, json)";e.executeSql(r),e.executeSql(u),e.executeSql(o,[],function(){e.executeSql(L),e.executeSql(j)}),e.executeSql(s,[],function(){e.executeSql(N),e.executeSql(a,[],function(){e.executeSql(I),e.executeSql(D),e.executeSql(n,[],function(){var t="INSERT INTO "+E+" (db_version, dbid) VALUES (?,?)";$=i.uuid();var n=[_,$];e.executeSql(t,n,function(){Q()})})})})}else{var c=function(){var n=_>t;n&&e.executeSql("UPDATE "+E+" SET db_version = "+_);var r="SELECT dbid FROM "+E;e.executeSql(r,[],function(e,t){$=t.rows.item(0).dbid,Q()})},f=[h,M,P,U,J,H,c],d=t,l=function(e){f[d-1](e,l),d++};l(e)}}function W(){te.transaction(function(e){V(e,function(){K(e)})},A(t),n)}function K(e){var t="SELECT sql FROM sqlite_master WHERE tbl_name = "+E;e.executeSql(t,[],function(e,t){t.rows.length?/db_version/.test(t.rows.item(0).sql)?e.executeSql("SELECT db_version FROM "+E,[],function(e,t){var n=t.rows.item(0).db_version;G(e,n)}):e.executeSql("ALTER TABLE "+E+" ADD COLUMN db_version INTEGER",[],function(){G(e,1)}):G(e,0)})}function z(e,t){if(-1!==Y._docCount)return t(Y._docCount);var n=x("COUNT("+y+".id) AS 'num'",[y,m],B,m+".deleted=0");e.executeSql(n,[],function(e,n){Y._docCount=n.rows.item(0).num,t(Y._docCount)})}var X,Y=this,$=null,Z=R(e),ee=[];Y._docCount=-1,Y._name=e.name;var te=q({name:Y._name,version:C,description:Y._name,size:Z,location:e.location,createFromLocation:e.createFromLocation,androidDatabaseImplementation:e.androidDatabaseImplementation});return te?("function"!=typeof te.readTransaction&&(te.readTransaction=te.transaction),i.isCordova()?window.addEventListener(Y._name+"_pouch",function ne(){window.removeEventListener(Y._name+"_pouch",ne,!1),W()},!1):W(),Y.type=function(){return"websql"},Y._id=i.toPromise(function(e){e(null,$)}),Y._info=function(e){te.readTransaction(function(t){z(t,function(n){var r="SELECT MAX(seq) AS seq FROM "+m;t.executeSql(r,[],function(t,r){var o=r.rows.item(0).seq||0;e(null,{doc_count:n,update_seq:o,sqlite_plugin:te._sqlitePlugin,websql_encoding:X})})})},A(e))},Y._bulkDocs=function(e,t,n){v(e,t,Y,te,o.Changes,n)},Y._get=function(e,t,n){function r(){n(a,{doc:o,metadata:s,ctx:u})}var o,s,a,u=t.ctx;if(!u)return te.readTransaction(function(r){Y._get(e,i.extend({ctx:r},t),n)});var f,d;t.rev?(f=x(F,[y,m],y+".id="+m+".doc_id",[m+".doc_id=?",m+".rev=?"]),d=[e,t.rev]):(f=x(F,[y,m],B,y+".id=?"),d=[e]),u.executeSql(f,d,function(e,n){if(!n.rows.length)return a=c.error(c.MISSING_DOC,"missing"),r();var u=n.rows.item(0);return s=i.safeJsonParse(u.metadata),u.deleted&&!t.rev?(a=c.error(c.MISSING_DOC,"deleted"),r()):(o=O(u.data,s.id,u.rev),void r())})},Y._allDocs=function(e,t){var n,o=[],a="startkey"in e?e.startkey:!1,u="endkey"in e?e.endkey:!1,c="key"in e?e.key:!1,f="descending"in e?e.descending:!1,d="limit"in e?e.limit:-1,l="skip"in e?e.skip:0,h=e.inclusive_end!==!1,p=[],v=[];if(c!==!1)v.push(y+".id = ?"),p.push(c);else if(a!==!1||u!==!1){if(a!==!1&&(v.push(y+".id "+(f?"<=":">=")+" ?"),p.push(a)),u!==!1){var _=f?">":"<";h&&(_+="="),v.push(y+".id "+_+" ?"),p.push(u)}c!==!1&&(v.push(y+".id = ?"),p.push(c))}"ok"!==e.deleted&&v.push(m+".deleted = 0"),te.readTransaction(function(t){z(t,function(a){if(n=a,0!==d){var u=x(F,[y,m],B,v,y+".id "+(f?"DESC":"ASC"));u+=" LIMIT "+d+" OFFSET "+l,t.executeSql(u,p,function(t,n){for(var a=0,u=n.rows.length;u>a;a++){var c=n.rows.item(a),f=i.safeJsonParse(c.metadata),d=f.id,l=O(c.data,d,c.rev),h=l._rev,p={id:d,key:d,value:{rev:h}};if(e.include_docs&&(p.doc=l,p.doc._rev=h,e.conflicts&&(p.doc._conflicts=s.collectConflicts(f)),r(p.doc,e,Y,t)),c.deleted){if("ok"!==e.deleted)continue;p.value.deleted=!0,p.doc=null}o.push(p)}})}})},A(t),function(){t(null,{total_rows:n,offset:e.skip,rows:o})})},Y._changes=function(e){function t(){var t=y+".json AS metadata, "+y+".max_seq AS maxSeq, "+m+".json AS winningDoc, "+m+".rev AS winningRev ",n=y+" JOIN "+m,o=y+".id="+m+".doc_id AND "+y+".winningseq="+m+".seq",d=["maxSeq > ?"],l=[e.since];e.doc_ids&&(d.push(y+".id IN "+S(e.doc_ids.length)),l=l.concat(e.doc_ids));var h="maxSeq "+(s?"DESC":"ASC"),p=x(t,n,o,d,h),v=i.filterChange(e);e.view||e.filter||(p+=" LIMIT "+a);var _=e.since||0;te.readTransaction(function(t){t.executeSql(p,l,function(t,n){function o(t){return function(){e.onChange(t)}}for(var s=0,d=n.rows.length;d>s;s++){var l=n.rows.item(s),h=i.safeJsonParse(l.metadata);_=l.maxSeq;var p=O(l.winningDoc,h.id,l.winningRev),y=e.processChange(p,h,e);if(y.seq=l.maxSeq,v(y)&&(f++,u&&c.push(y),e.attachments&&e.include_docs?r(p,e,Y,t,o(y)):o(y)()),f===a)break}})},A(e.complete),function(){e.continuous||e.complete(null,{results:c,last_seq:_})})}if(e=i.clone(e),e.continuous){var n=Y._name+":"+i.uuid();return o.Changes.addListener(Y._name,n,Y,e),o.Changes.notify(Y._name),{cancel:function(){o.Changes.removeListener(Y._name,n)}}}var s=e.descending;e.since=e.since&&!s?e.since:0;var a="limit"in e?e.limit:-1;0===a&&(a=1);var u;u="returnDocs"in e?e.returnDocs:!0;var c=[],f=0;t()},Y._close=function(e){e()},Y._getAttachment=function(e,t,n){var r,o=t.ctx,s=e.digest,a=e.content_type,u="SELECT escaped, CASE WHEN escaped = 1 THEN body ELSE HEX(body) END AS body FROM "+g+" WHERE digest=?";o.executeSql(u,[s],function(e,o){var s=o.rows.item(0),u=s.escaped?p.unescapeBlob(s.body):f(s.body,X);r=t.binary?d(u,a):i.btoa(u),n(null,r)})},Y._getRevisionTree=function(e,t){te.readTransaction(function(n){var r="SELECT json AS metadata FROM "+y+" WHERE id = ?";n.executeSql(r,[e],function(e,n){if(n.rows.length){var r=i.safeJsonParse(n.rows.item(0).metadata);t(null,r.rev_tree)}else t(c.error(c.MISSING_DOC))})})},Y._doCompaction=function(e,t,n){return t.length?void te.transaction(function(n){var r="SELECT json AS metadata FROM "+y+" WHERE id = ?";n.executeSql(r,[e],function(n,r){var o=i.safeJsonParse(r.rows.item(0).metadata);s.traverseRevTree(o.rev_tree,function(e,n,r,o,i){var s=n+"-"+r;-1!==t.indexOf(s)&&(i.status="missing")});var a="UPDATE "+y+" SET json = ? WHERE id = ?";n.executeSql(a,[i.safeJsonStringify(o),e])}),k(t,e,n)},A(n),function(){n()}):n()},Y._getLocal=function(e,t){te.readTransaction(function(n){var r="SELECT json, rev FROM "+b+" WHERE id=?";n.executeSql(r,[e],function(n,r){if(r.rows.length){var o=r.rows.item(0),i=O(o.json,e,o.rev);t(null,i)}else t(c.error(c.MISSING_DOC))})})},Y._putLocal=function(e,t,n){function r(e){var r,f;i?(r="UPDATE "+b+" SET rev=?, json=? WHERE id=? AND rev=?",f=[o,u,s,i]):(r="INSERT INTO "+b+" (id, rev, json) VALUES (?,?,?)",f=[s,o,u]),e.executeSql(r,f,function(e,r){r.rowsAffected?(a={ok:!0,id:s,rev:o},t.ctx&&n(null,a)):n(c.error(c.REV_CONFLICT))},function(){return n(c.error(c.REV_CONFLICT)),!1})}"function"==typeof t&&(n=t,t={}),delete e._revisions;var o,i=e._rev,s=e._id;o=i?e._rev="0-"+(parseInt(i.split("-")[1],10)+1):e._rev="0-1";var a,u=T(e);t.ctx?r(t.ctx):te.transaction(r,A(n),function(){a&&n(null,a)})},Y._removeLocal=function(e,t,n){function r(r){var i="DELETE FROM "+b+" WHERE id=? AND rev=?",s=[e._id,e._rev];r.executeSql(i,s,function(r,i){return i.rowsAffected?(o={ok:!0,id:e._id,rev:"0-0"},void(t.ctx&&n(null,o))):n(c.error(c.MISSING_DOC))})}"function"==typeof t&&(n=t,t={});var o;t.ctx?r(t.ctx):te.transaction(r,A(n),function(){o&&n(null,o)})},void(Y._destroy=function(e){o.Changes.removeAllListeners(Y._name),te.transaction(function(e){var t=[y,m,g,E,b,w];t.forEach(function(t){e.executeSql("DROP TABLE IF EXISTS "+t,[])})},A(e),function(){l()&&(delete window.localStorage["_pouch__websqldb_"+Y._name],delete window.localStorage[Y._name]),e(null,{ok:!0})})})):t(c.error(c.UNKNOWN_ERROR))}var i=e(78),s=e(67),a=e(38),u=e(39),c=e(48),f=e(52),d=e(31),l=e(46),h=e(11),p=e(13),v=e(10),_=h.ADAPTER_VERSION,y=h.DOC_STORE,m=h.BY_SEQ_STORE,g=h.ATTACH_STORE,b=h.LOCAL_STORE,E=h.META_STORE,w=h.ATTACH_AND_SEQ_STORE,S=p.qMarks,T=p.stringifyDoc,O=p.unstringifyDoc,x=p.select,k=p.compactRevs,A=p.unknownError,R=p.getSize,q=p.openDB,C=1,I="CREATE INDEX IF NOT EXISTS 'by-seq-deleted-idx' ON "+m+" (seq, deleted)",D="CREATE UNIQUE INDEX IF NOT EXISTS 'by-seq-doc-id-rev' ON "+m+" (doc_id, rev)",N="CREATE INDEX IF NOT EXISTS 'doc-winningseq-idx' ON "+y+" (winningseq)",L="CREATE INDEX IF NOT EXISTS 'attach-seq-seq-idx' ON "+w+" (seq)",j="CREATE UNIQUE INDEX IF NOT EXISTS 'attach-seq-digest-idx' ON "+w+" (digest, seq)",B=m+".seq = "+y+".winningseq",F=m+".seq AS seq, "+m+".deleted AS deleted, "+m+".json AS data, "+m+".rev AS rev, "+y+".json AS metadata";o.valid=p.valid,o.Changes=new i.Changes,t.exports=o},{10:10,11:11,13:13,31:31,38:38,39:39,46:46,48:48,52:52,67:67,78:78}],13:[function(e,t,n){"use strict";function r(e){return e.replace(/\u0002/g,"").replace(/\u0001/g,"").replace(/\u0000/g,"")}function o(e){return e.replace(/\u0001\u0001/g,"\x00").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,"")}function i(e){return delete e._id,delete e._rev,JSON.stringify(e)}function s(e,t,n){return e=JSON.parse(e),e._id=t,e._rev=n,e}function a(e){for(var t="(";e--;)t+="?",e&&(t+=",");return t+")"}function u(e,t,n,r,o){return"SELECT "+e+" FROM "+("string"==typeof t?t:t.join(" JOIN "))+(n?" ON "+n:"")+(r?" WHERE "+("string"==typeof r?r:r.join(" AND ")):"")+(o?" ORDER BY "+o:"")}function c(e,t,n){function r(){++i===e.length&&o()}function o(){if(s.length){var e="SELECT DISTINCT digest AS digest FROM "+b+" WHERE seq IN "+a(s.length);n.executeSql(e,s,function(e,t){for(var n=[],r=0;rr.since&&!r.cancelled&&(r.since=e.seq,r.onChange(e))}).on("complete",function(){"waiting"===s&&setTimeout(function(){o()},0),s=!1}).on("error",function(){s=!1})}}if(!this._listeners[t]){var i=this,s=!1;this._listeners[t]=o, -this.on(e,o)}},o.prototype.removeListener=function(e,t){t in this._listeners&&i.prototype.removeListener.call(this,e,this._listeners[t])},o.prototype.notifyLocalWindows=function(e){a()?chrome.storage.local.set({dbName:e}):u()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},o.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)},t.exports=o},{46:46,47:47,54:54,81:81,86:86}],16:[function(e,t,n){(function(n,r){"use strict";function o(e){e&&r.debug&&console.error(e)}function i(e,t){function n(){i.emit("destroyed",o),i.emit(o,"destroyed")}function r(){e.removeListener("destroyed",n),e.emit("destroyed",e)}var o=t.originalName,i=e.constructor,s=i._destructionListeners;e.once("destroyed",n),s.has(o)||s.set(o,[]),s.get(o).push(r)}function s(e,t,r){if(!(this instanceof s))return new s(e,t,r);var l=this;("function"==typeof t||"undefined"==typeof t)&&(r=t,t={}),e&&"object"==typeof e&&(t=e,e=void 0),"undefined"==typeof r&&(r=o),e=e||t.name,t=c.clone(t),delete t.name,this.__opts=t;var h=r;l.auto_compaction=t.auto_compaction,l.prefix=s.prefix,u.call(l),l.taskqueue=new f;var p=new d(function(o,u){r=function(e,t){return e?u(e):(delete t.then,void o(t))},t=c.clone(t);var f,d,h=t.name||e;return function(){try{if("string"!=typeof h)throw d=new Error("Missing/invalid DB name"),d.code=400,d;if(f=s.parseAdapter(h,t),t.originalName=h,t.name=f.name,t.prefix&&"http"!==f.adapter&&"https"!==f.adapter&&(t.name=t.prefix+t.name),t.adapter=t.adapter||f.adapter,l._adapter=t.adapter,a("pouchdb:adapter")("Picked adapter: "+t.adapter),l._db_name=h,!s.adapters[t.adapter])throw d=new Error("Adapter is missing"),d.code=404,d;if(!s.adapters[t.adapter].valid())throw d=new Error("Invalid Adapter"),d.code=404,d}catch(e){l.taskqueue.fail(e)}}(),d?u(d):(l.adapter=t.adapter,l.replicate={},l.replicate.from=function(e,t,n){return l.constructor.replicate(e,l,t,n)},l.replicate.to=function(e,t,n){return l.constructor.replicate(l,e,t,n)},l.sync=function(e,t,n){return l.constructor.sync(l,e,t,n)},l.replicate.sync=l.sync,s.adapters[t.adapter].call(l,t,function(e){return e?(l.taskqueue.fail(e),void r(e)):(i(l,t),l.emit("created",l),s.emit("created",t.originalName),l.taskqueue.ready(l),void r(null,l))}),t.skipSetup&&(l.taskqueue.ready(l),n.nextTick(function(){r(null,l)})),void(c.isCordova()&&cordova.fireWindowEvent(t.name+"_pouch",{})))});p.then(function(e){h(null,e)},h),l.then=p.then.bind(p),l["catch"]=p["catch"].bind(p)}var a=e(83),u=e(1),c=e(78),f=e(77),d=c.Promise;c.inherits(s,u),s.debug=a,t.exports=s}).call(this,e(82),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1,77:77,78:78,82:82,83:83}],17:[function(e,t,n){"use strict";function r(e,t){function n(t,n,r){if(e.binary||e.json||!e.processData||"string"==typeof t){if(!e.binary&&e.json&&"string"==typeof t)try{t=JSON.parse(t)}catch(o){return r(o)}}else t=JSON.stringify(t);Array.isArray(t)&&(t=t.map(function(e){return e.error||e.missing?i.generateErrorFromResponse(e):e})),e.binary&&a(t,n),r(null,t,n)}function r(e,t){var n,r;if(e.code&&e.status){var o=new Error(e.message||e.code);return o.status=e.status,t(o)}try{n=JSON.parse(e.responseText),r=i.generateErrorFromResponse(n)}catch(s){r=i.generateErrorFromResponse(e)}t(r)}e=s.clone(e);var f={method:"GET",headers:{},json:!0,processData:!0,timeout:1e4,cache:!1};return e=s.extend(f,e),e.json&&(e.binary||(e.headers.Accept="application/json"),e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json"),e.binary&&(e.encoding=null,e.json=!1),e.processData||(e.json=!1),o(e,function(o,s,a){if(o)return s?(0===s.statusCode&&c(),o.status=s.statusCode):o.status=400,r(o,t);var f,d=s.headers&&s.headers["content-type"],l=a||u();if(!e.binary&&(e.json||!e.processData)&&"object"!=typeof l&&(/json/.test(d)||/^[\s]*\{/.test(l)&&/\}[\s]*$/.test(l)))try{l=JSON.parse(l.toString())}catch(h){}s.statusCode>=200&&s.statusCode<300?n(l,s,t):(f=i.generateErrorFromResponse(l),f.status=s.statusCode,t(f))})}var o=e(26),i=e(48),s=e(78),a=e(18),u=e(21),c=e(23);t.exports=r},{18:18,21:21,23:23,26:26,48:48,78:78}],18:[function(e,t,n){"use strict";t.exports=function(){}},{}],19:[function(e,t,n){"use strict";var r=e(32);t.exports=function(e,t){return r(e,{type:t})}},{32:32}],20:[function(e,t,n){"use strict";var r=e(30);t.exports=function(e){return r(e)}},{30:30}],21:[function(e,t,n){"use strict";t.exports=function(){return""}},{}],22:[function(e,t,n){(function(e){"use strict";t.exports=function(t){"console"in e&&"info"in console&&console.info("The above 404 is totally normal. "+t)}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],23:[function(e,t,n){(function(e){"use strict";t.exports=function(){"console"in e&&"error"in console&&console.error("PouchDB error: the remote database does not seem to have CORS enabled. To fix this, please enable CORS: http://pouchdb.com/errors.html#no_access_control_allow_origin_header")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],24:[function(e,t,n){"use strict";function r(e){e=u(e);var t=s(),n={};Object.keys(e._attachments).forEach(function(t){var r=e._attachments[t];if(!r.stub){var o=i(r.data);n[t]={type:r.content_type,data:o},r.length=o.length,r.follows=!0,delete r.digest,delete r.data}});var r="--"+t+"\r\nContent-Type: application/json\r\n\r\n",o=[r,JSON.stringify(e)];Object.keys(n).forEach(function(e){var r=n[e],i="\r\n--"+t+"\r\nContent-Disposition: attachment; filename="+JSON.stringify(e)+"\r\nContent-Type: "+r.type+"\r\nContent-Length: "+r.data.length+"\r\n\r\n";o.push(i),o.push(f(r.data))}),o.push("\r\n--"+t+"--");var a="multipart/related; boundary="+t,d=c(o,a);return{headers:{"Content-Type":a},body:d}}var o=e(28),i=o.atob,s=e(58),a=e(78),u=a.clone,c=e(19),f=e(20);t.exports=r},{19:19,20:20,28:28,58:58,78:78}],25:[function(e,t,n){"use strict";var r=e(17);t.exports=function(e,t){if(("POST"===e.method||"GET"===e.method)&&!e.cache){var n=-1!==e.url.indexOf("?");e.url+=(n?"&":"?")+"_nonce="+Date.now()}return r(e,t)}},{17:17}],26:[function(e,t,n){"use strict";function r(){for(var e={},t=new u.Promise(function(t,n){e.resolve=t,e.reject=n}),n=new Array(arguments.length),r=0;r0&&(o=setTimeout(function(){n.reject(new Error("Load timeout for resource: "+e.url))},e.timeout)),n.promise.then(function(t){return i={statusCode:t.status},e.timeout>0&&clearTimeout(o),i.statusCode>=200&&i.statusCode<300?e.binary?t.blob():t.text():t.json()}).then(function(e){i.statusCode>=200&&i.statusCode<300?t(null,i,e):t(e,i)})["catch"](function(e){t(e,i)}),{abort:n.reject}}function i(e,t){var n,r,o,i=function(){n.abort()};n=e.xhr?new e.xhr:new XMLHttpRequest,n.open(e.method,e.url),n.withCredentials=!0,"GET"===e.method?delete e.headers["Content-Type"]:e.json&&(e.headers.Accept="application/json",e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json",e.body&&e.processData&&"string"!=typeof e.body&&(e.body=JSON.stringify(e.body))),e.binary&&(n.responseType="arraybuffer"),"body"in e||(e.body=null);for(var s in e.headers)e.headers.hasOwnProperty(s)&&n.setRequestHeader(s,e.headers[s]);return e.timeout>0&&(r=setTimeout(i,e.timeout),n.onprogress=function(){clearTimeout(r),r=setTimeout(i,e.timeout)},"undefined"==typeof o&&(o=-1!==Object.keys(n).indexOf("upload")&&"undefined"!=typeof n.upload),o&&(n.upload.onprogress=n.onprogress)),n.onreadystatechange=function(){if(4===n.readyState){var r={statusCode:n.status};if(n.status>=200&&n.status<300){var o;o=e.binary?a([n.response||""],{type:n.getResponseHeader("Content-Type")}):n.responseText,t(null,r,o)}else{var i={};try{i=JSON.parse(n.response)}catch(s){}t(i,r)}}},e.body&&e.body instanceof Blob?c(e.body,function(e){n.send(e)}):n.send(e.body),{abort:i}}function s(){try{return new XMLHttpRequest,!0}catch(e){return!1}}var a=e(32),u=e(78),c=e(35),f=s();t.exports=function(e,t){return f||e.xhr?i(e,t):o(e,t)}},{32:32,35:35,78:78}],27:[function(e,t,n){"use strict";t.exports=function(e){for(var t="",n=new Uint8Array(e),r=n.byteLength,o=0;r>o;o++)t+=String.fromCharCode(n[o]);return t}},{}],28:[function(e,t,n){"use strict";var r=e(34);"function"==typeof atob?n.atob=function(e){return atob(e)}:n.atob=function(e){var t=new r(e,"base64");if(t.toString("base64")!==e)throw"Cannot base64 encode full string";return t.toString("binary")},"function"==typeof btoa?n.btoa=function(e){return btoa(e)}:n.btoa=function(e){return new r(e,"binary").toString("base64")}},{34:34}],29:[function(e,t,n){"use strict";var r=e(28).atob,o=e(31);t.exports=function(e,t){return o(r(e),t)}},{28:28,31:31}],30:[function(e,t,n){"use strict";t.exports=function(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),o=0;t>o;o++)r[o]=e.charCodeAt(o);return n}},{}],31:[function(e,t,n){"use strict";var r=e(32),o=e(30);t.exports=function(e,t){return r([o(e)],{type:t})}},{30:30,32:32}],32:[function(e,t,n){"use strict";function r(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(n){if("TypeError"!==n.name)throw n;for(var r="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,o=new r,i=0;in;n++)t[n]=o(e[n]);return t}if(e instanceof Date)return e.toISOString();if(!r(e))return e;t={};for(n in e)if(e.hasOwnProperty(n)){var s=o(e[n]);"undefined"!=typeof s&&(t[n]=s)}return t}},{}],38:[function(e,t,n){"use strict";function r(e){return e.ids}function o(e,t){t||(t=i.winningRev(e));for(var n,o=t.substring(t.indexOf("-")+1),s=e.rev_tree.map(r);n=s.pop();){if(n[0]===o)return!!n[1].deleted;s=s.concat(n[2])}}var i=e(67);t.exports=o},{67:67}],39:[function(e,t,n){"use strict";function r(e){return/^_local/.test(e)}t.exports=r},{}],40:[function(e,t,n){"use strict";var r=e(41);t.exports=function(e){var t=r(e);return t?t.join("/"):null}},{41:41}],41:[function(e,t,n){"use strict";t.exports=function(e){if(!e)return null;var t=e.split("/");return 2===t.length?t:1===t.length?[e,e]:null}},{}],42:[function(e,t,n){"use strict";function r(e){return e.reduce(function(e,t){return e[t]=!0,e},{})}function o(e){if(!/^\d+\-./.test(e))return s.error(s.INVALID_REV);var t=e.indexOf("-"),n=e.substring(0,t),r=e.substring(t+1);return{prefix:parseInt(n,10),id:r}}function i(e,t){for(var n=e.start-e.ids.length+1,r=e.ids,o=[r[0],t,[]],i=1,s=r.length;s>i;i++)o=[r[i],{status:"missing"},[o]];return[{pos:n,ids:o}]}var s=e(48),a=e(58),u=r(["_id","_rev","_attachments","_deleted","_revisions","_revs_info","_conflicts","_deleted_conflicts","_local_seq","_rev_tree","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats","_removed"]),c=r(["_attachments","_replication_id","_replication_state","_replication_state_time","_replication_state_reason","_replication_stats"]);n.invalidIdError=function(e){var t;if(e?"string"!=typeof e?t=s.error(s.INVALID_ID):/^_/.test(e)&&!/^_(design|local)/.test(e)&&(t=s.error(s.RESERVED_ID)):t=s.error(s.MISSING_ID),t)throw t},n.parseDoc=function(e,t){var r,f,d,l={status:"available"};if(e._deleted&&(l.deleted=!0),t)if(e._id||(e._id=a()),f=a(32,16).toLowerCase(),e._rev){if(d=o(e._rev),d.error)return d;e._rev_tree=[{pos:d.prefix,ids:[d.id,{status:"missing"},[[f,l,[]]]]}],r=d.prefix+1}else e._rev_tree=[{pos:1,ids:[f,l,[]]}],r=1;else if(e._revisions&&(e._rev_tree=i(e._revisions,l),r=e._revisions.start,f=e._revisions.ids[0]),!e._rev_tree){if(d=o(e._rev),d.error)return d;r=d.prefix,f=d.id,e._rev_tree=[{pos:r,ids:[f,l,[]]}]}n.invalidIdError(e._id),e._rev=r+"-"+f;var h={metadata:{},data:{}};for(var p in e)if(e.hasOwnProperty(p)){var v="_"===p[0];if(v&&!u[p]){var _=s.error(s.DOC_VALIDATION,p);throw _.message=s.DOC_VALIDATION.message+": "+p,_}v&&!c[p]?h.metadata[p.slice(1)]=e[p]:h.data[p]=e[p]}return h}},{48:48,58:58}],43:[function(e,t,n){"use strict";function r(e,t,n){function r(e){try{return o.atob(e)}catch(t){var n=u.error(u.BAD_ARG,"Attachments need to be base64 encoded");return{error:n}}}function f(e,n){if(e.stub)return n();if("string"==typeof e.data){var u=r(e.data);if(u.error)return n(u.error);e.length=u.length,"blob"===t?e.data=a(u,e.content_type):"base64"===t?e.data=o.btoa(u):e.data=u,c(u).then(function(t){e.digest="md5-"+t,n()})}else s(e.data,function(r){"binary"===t?e.data=i(r):"base64"===t&&(e.data=o.btoa(i(r))),c(r).then(function(t){e.digest="md5-"+t,e.length=r.byteLength,n()})})}function d(){h++,e.length===h&&(l?n(l):n())}if(!e.length)return n();var l,h=0;e.forEach(function(e){function t(e){l=e,r++,r===n.length&&d()}var n=e.data&&e.data._attachments?Object.keys(e.data._attachments):[],r=0;if(!n.length)return d();for(var o in e.data._attachments)e.data._attachments.hasOwnProperty(o)&&f(e.data._attachments[o],t)})}var o=e(28),i=e(27),s=e(35),a=e(31),u=e(48),c=e(50);t.exports=r},{27:27,28:28,31:31,35:35,48:48,50:50}],44:[function(e,t,n){"use strict";function r(e,t,n,r,c,d,l,h){function p(e,t,n){var r=o.winningRev(e.metadata),s=a(e.metadata,r);if("was_delete"in l&&s)return c[t]=i.error(i.MISSING_DOC,"deleted"),n();var u=s?0:1;d(e,r,s,s,!1,u,t,n)}function v(){++m===g&&h&&h()}var _=l.new_edits,y=new f,m=0,g=e.length;e.forEach(function(e,n){if(e._id&&u(e._id))return void t[e._deleted?"_removeLocal":"_putLocal"](e,{ctx:r},function(e){e?c[n]=e:c[n]={ok:!0},v()});var o=e.metadata.id;y.has(o)?(g--,y.get(o).push([e,n])):y.set(o,[[e,n]])}),y.forEach(function(e,t){function r(){++il?-1:1;b=g===E?w:s(t.metadata,g),c(t,E,w,b,!0,S,r,u)}var o=e(67),i=e(48),s=e(38),a=e(42).parseDoc;t.exports=r},{38:38,42:42,48:48,67:67}],46:[function(e,t,n){"use strict";var r,o=e(47);if(o())r=!1;else try{localStorage.setItem("_pouch_check_localstorage",1),r=!!localStorage.getItem("_pouch_check_localstorage")}catch(i){r=!1}t.exports=function(){return r}},{47:47}],47:[function(e,t,n){"use strict";t.exports=function(){return"undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage&&"undefined"!=typeof chrome.storage.local}},{}],48:[function(e,t,n){"use strict";function r(e){Error.call(e.reason),this.status=e.status,this.name=e.error,this.message=e.reason,this.error=!0}var o=e(86);o(r,Error),r.prototype.toString=function(){return JSON.stringify({status:this.status,name:this.name,message:this.message})},n.UNAUTHORIZED=new r({status:401,error:"unauthorized",reason:"Name or password is incorrect."}),n.MISSING_BULK_DOCS=new r({status:400,error:"bad_request",reason:"Missing JSON list of 'docs'"}),n.MISSING_DOC=new r({status:404,error:"not_found",reason:"missing"}),n.REV_CONFLICT=new r({status:409,error:"conflict",reason:"Document update conflict"}),n.INVALID_ID=new r({status:400,error:"invalid_id",reason:"_id field must contain a string"}),n.MISSING_ID=new r({status:412,error:"missing_id",reason:"_id is required for puts"}),n.RESERVED_ID=new r({status:400,error:"bad_request",reason:"Only reserved document ids may start with underscore."}),n.NOT_OPEN=new r({status:412,error:"precondition_failed",reason:"Database not open"}),n.UNKNOWN_ERROR=new r({status:500,error:"unknown_error",reason:"Database encountered an unknown error"}),n.BAD_ARG=new r({status:500,error:"badarg",reason:"Some query argument is invalid"}),n.INVALID_REQUEST=new r({status:400,error:"invalid_request",reason:"Request was invalid"}),n.QUERY_PARSE_ERROR=new r({status:400,error:"query_parse_error",reason:"Some query parameter is invalid"}),n.DOC_VALIDATION=new r({status:500,error:"doc_validation",reason:"Bad special document member"}),n.BAD_REQUEST=new r({status:400,error:"bad_request",reason:"Something wrong with the request"}),n.NOT_AN_OBJECT=new r({status:400,error:"bad_request",reason:"Document must be a JSON object"}),n.DB_MISSING=new r({status:404,error:"not_found",reason:"Database not found"}),n.IDB_ERROR=new r({status:500,error:"indexed_db_went_bad",reason:"unknown"}),n.WSQ_ERROR=new r({status:500,error:"web_sql_went_bad",reason:"unknown"}),n.LDB_ERROR=new r({status:500,error:"levelDB_went_went_bad",reason:"unknown"}),n.FORBIDDEN=new r({status:403,error:"forbidden",reason:"Forbidden by design doc validate_doc_update function"}),n.INVALID_REV=new r({status:400,error:"bad_request",reason:"Invalid rev format"}),n.FILE_EXISTS=new r({status:412,error:"file_exists",reason:"The database could not be created, the file already exists."}),n.MISSING_STUB=new r({status:412,error:"missing_stub"}),n.error=function(e,t,n){function o(t){for(var r in e)"function"!=typeof e[r]&&(this[r]=e[r]);void 0!==n&&(this.name=n),void 0!==t&&(this.reason=t)}return o.prototype=r.prototype,new o(t)},n.getErrorTypeByProp=function(e,t,r){var o=n,i=Object.keys(o).filter(function(n){var r=o[n];return"function"!=typeof r&&r[e]===t}),s=r&&i.filter(function(e){var t=o[e];return t.message===r})[0]||i[0];return s?o[s]:null},n.generateErrorFromResponse=function(e){var t,r,o,i,s,a=n;return r=e.error===!0&&"string"==typeof e.name?e.name:e.error,s=e.reason,o=a.getErrorTypeByProp("name",r,s),e.missing||"missing"===s||"deleted"===s||"not_found"===r?o=a.MISSING_DOC:"doc_validation"===r?(o=a.DOC_VALIDATION,i=s):"bad_request"===r&&o.message!==s&&(o=a.BAD_REQUEST),o||(o=a.getErrorTypeByProp("status",e.status,s)||a.UNKNOWN_ERROR),t=a.error(o,s,r),i&&(t.message=i),e.id&&(t.id=e.id),e.status&&(t.status=e.status),e.missing&&(t.missing=e.missing),t}},{86:86}],49:[function(e,t,n){"use strict";function r(e,t){for(var n in t)if(t.hasOwnProperty(n)){var r=o(t[n]);"undefined"!=typeof r&&(e[n]=r)}}var o=e(37);t.exports=function(e,t,n){return r(e,t),n&&r(e,n),e}},{37:37}],50:[function(e,t,n){(function(n){"use strict";function r(e){return String.fromCharCode(255&e)+String.fromCharCode(e>>>8&255)+String.fromCharCode(e>>>16&255)+String.fromCharCode(e>>>24&255)}function o(e){for(var t="",n=0,o=e.length;o>n;n++)t+=r(e[n]);return u.btoa(t)}function i(e,t,n,r){(n>0||r0||rh)v(p,e,r,i),f(n);else{v(p,e,r,i);var s=p.end(!0),a=o(s);t(null,a),p.destroy()}}var r="string"==typeof e,a=r?e.length:e.byteLength,u=Math.min(d,a),l=Math.ceil(a/u),h=0,p=r?new c:new c.ArrayBuffer,v=r?s:i;n()})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{28:28,56:56,92:92}],51:[function(e,t,n){"use strict";function r(e){var t=!1;return o(function(n){if(t)throw new Error("once called more than once");t=!0,e.apply(this,n)})}var o=e(80);t.exports=r},{80:80}],52:[function(e,t,n){"use strict";function r(e){return decodeURIComponent(window.escape(e))}function o(e){return 65>e?e-48:e-55}function i(e,t,n){for(var r="";n>t;)r+=String.fromCharCode(o(e.charCodeAt(t++))<<4|o(e.charCodeAt(t++)));return r}function s(e,t,n){for(var r="";n>t;)r+=String.fromCharCode(o(e.charCodeAt(t+2))<<12|o(e.charCodeAt(t+3))<<8|o(e.charCodeAt(t))<<4|o(e.charCodeAt(t+1))),t+=4;return r}function a(e,t){return"UTF-8"===t?r(i(e,0,e.length)):s(e,0,e.length)}t.exports=a},{}],53:[function(e,t,n){"use strict";function r(e){for(var t=a.exec(e),n={},r=14;r--;){var u=o[r],c=t[r]||"",f=-1!==["user","password"].indexOf(u);n[u]=f?decodeURIComponent(c):c}return n[i]={},n[o[12]].replace(s,function(e,t,r){t&&(n[i][t]=r)}),n}var o=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],i="queryKey",s=/(?:^|&)([^&=]*)=?([^&]*)/g,a=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;t.exports=r},{}],54:[function(e,t,n){"use strict";t.exports=function(e,t){for(var n={},r=0,o=t.length;o>r;r++){var i=t[r];i in e&&(n[i]=e[i])}return n}},{}],55:[function(e,t,n){"use strict";t.exports="function"==typeof Promise?Promise:e(87)},{87:87}],56:[function(e,t,n){(function(n){"use strict";function r(e){return i(function(t){var r,i=this,a="function"==typeof t[t.length-1]?t.pop():!1;a&&(r=function(e,t){n.nextTick(function(){a(e,t)})});var u=new o(function(n,r){var o;try{var a=s(function(e,t){e?r(e):n(t)});t.push(a),o=e.apply(i,t),o&&"function"==typeof o.then&&n(o)}catch(u){r(u)}});return r&&u.then(function(e){r(null,e)},r),u})}var o=e(55),i=e(80),s=e(51);t.exports=r}).call(this,e(82))},{51:51,55:55,80:80,82:82}],57:[function(e,t,n){"use strict";function r(e,t,n){return e.put(t).then(function(e){return{updated:!0,rev:e.rev}},function(r){if(409!==r.status)throw r;return i(e,t._id,n)})}var o=e(55),i=t.exports=function(e,t,n){return new o(function(o,i){return"string"!=typeof t?i(new Error("doc id is required")):void e.get(t,function(s,a){if(s){if(404!==s.status)return i(s);a={}}var u=a._rev,c=n(a);return c?(c._id=t,c._rev=u,void o(r(e,c,n))):o({updated:!1,rev:u})})})}},{55:55}],58:[function(e,t,n){"use strict";function r(e){return 0|Math.random()*e}function o(e,t){t=t||i.length;var n="",o=-1;if(e){for(;++o0?e.slice(n):e}function c(e){var t=e.value,n=t&&"object"==typeof t&&t._id||e.id;return n}function f(e){e.rows.forEach(function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach(function(e){var n=t[e];t[e].data=D(n.data,n.content_type)})})}function d(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&f(t),t}}function l(e){var t="builtin "+e+" function requires map values to be numbers or number arrays";return new C(t)}function h(e){for(var t=0,n=0,r=e.length;r>n;n++){var o=e[n];if("number"!=typeof o){if(!Array.isArray(o))throw l("_sum");t="number"==typeof t?[t]:t;for(var i=0,s=o.length;s>i;i++){var a=o[i];if("number"!=typeof a)throw l("_sum");"undefined"==typeof t[i]?t.push(a):t[i]+=a}}else"number"==typeof t?t+=o:t[0]+=o}return t}function p(e,t,n,r){var o=t[e];"undefined"!=typeof o&&(r&&(o=encodeURIComponent(JSON.stringify(o))),n.push(e+"="+o))}function v(e,t){var n=e.descending?"endkey":"startkey",r=e.descending?"startkey":"endkey";if("undefined"!=typeof e[n]&&"undefined"!=typeof e[r]&&j(e[n],e[r])>0)throw new R("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&e.reduce!==!1){if(e.include_docs)throw new R("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new R("Multi-key fetches for reduce views must use {group: true}")}if(e.group_level){if("number"!=typeof e.group_level)throw new R('Invalid value for integer: "'+e.group_level+'"');if(e.group_level<0)throw new R('Invalid value for positive integer: "'+e.group_level+'"')}}function _(e,t,n){var o,i=[],s="GET";if(p("reduce",n,i),p("include_docs",n,i),p("attachments",n,i),p("limit",n,i),p("descending",n,i),p("group",n,i),p("group_level",n,i),p("skip",n,i),p("stale",n,i),p("conflicts",n,i),p("startkey",n,i,!0),p("start_key",n,i,!0),p("endkey",n,i,!0),p("end_key",n,i,!0),p("inclusive_end",n,i),p("key",n,i,!0),i=i.join("&"),i=""===i?"":"?"+i,"undefined"!=typeof n.keys){var a=2e3,u="keys="+encodeURIComponent(JSON.stringify(n.keys));u.length+i.length+1<=a?i+=("?"===i[0]?"&":"?")+u:(s="POST","string"==typeof t?o=JSON.stringify({keys:n.keys}):t.keys=n.keys)}if("string"==typeof t){var c=r(t);return e.request({method:s,url:"_design/"+c[0]+"/_view/"+c[1]+i,body:o}).then(d(n))}return o=o||{},Object.keys(t).forEach(function(e){Array.isArray(t[e])?o[e]=t[e]:o[e]=t[e].toString()}),e.request({method:"POST",url:"_temp_view"+i,body:o}).then(d(n))}function y(e){return function(t){if(404===t.status)return e;throw t}}function m(e,t,n){function r(){return o(d)?H.resolve(u):t.db.get(a)["catch"](y(u))}function i(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):H.resolve({rows:[]})}function s(e,t){for(var n=[],r={},o=0,i=t.rows.length;i>o;o++){var s=t.rows[o],a=s.doc;if(a&&(n.push(a),r[a._id]=!0,a._deleted=!f[a._id],!a._deleted)){var u=f[a._id];"value"in u&&(a.value=u.value)}}var c=Object.keys(f);return c.forEach(function(e){if(!r[e]){var t={_id:e},o=f[e];"value"in o&&(t.value=o.value),n.push(t)}}),e.keys=J.uniq(c.concat(e.keys)),n.push(e),n}var a="_local/doc_"+e,u={_id:a,keys:[]},c=n[e],f=c.indexableKeysToKeyValues,d=c.changes;return r().then(function(e){return i(e).then(function(t){return s(e,t)})})}function g(e,t,n){var r="_local/lastSeq";return e.db.get(r)["catch"](y({_id:r,seq:0})).then(function(r){var o=Object.keys(t);return H.all(o.map(function(n){return m(n,e,t)})).then(function(t){var o=J.flatten(t);return r.seq=n,o.push(r),e.db.bulkDocs({docs:o})})})}function b(e){var t="string"==typeof e?e:e.name,n=Q[t];return n||(n=Q[t]=new L),n}function E(e){return J.sequentialize(b(e),function(){return w(e)})()}function w(e){function t(e,t){var n={id:o._id,key:F(e)};"undefined"!=typeof t&&null!==t&&(n.value=F(t)),r.push(n)}function n(t,n){return function(){return g(e,t,n)}}var r,o,i;if("function"==typeof e.mapFun&&2===e.mapFun.length){var u=e.mapFun;i=function(e){return u(e,t)}}else i=U(e.mapFun.toString(),t,h,I,Array.isArray,JSON.parse);var c=e.seq||0,f=new L;return new H(function(t,u){function d(){f.finish().then(function(){e.seq=c,t()})}function l(){function t(e){u(e)}e.sourceDB.changes({conflicts:!0,include_docs:!0,style:"all_docs",since:c,limit:W}).on("complete",function(t){var u=t.results;if(!u.length)return d();for(var h={},p=0,v=u.length;v>p;p++){var _=u[p];if("_"!==_.doc._id[0]){r=[],o=_.doc,o._deleted||s(e.sourceDB,i,[o]),r.sort(a);for(var y,m={},g=0,b=r.length;b>g;g++){var E=r[g],w=[E.key,E.id];0===j(E.key,y)&&w.push(g);var S=B(w);m[S]=E,y=E.key}h[_.doc._id]={indexableKeysToKeyValues:m,changes:_.changes}}c=_.seq}return f.add(n(h,c)),u.lengtha?n.slice(0,a):n),t&&0===j(t.key[0][0],n)?(t.key.push([n,e.id]),void t.value.push(e.value)):void i.push({key:[[n,e.id]],value:[e.value]})});for(var c=0,f=i.length;f>c;c++){var d=i[c],l=s(e.sourceDB,r,[d.key,d.value,!1]);if(l.error&&l.error instanceof C)throw l.error;d.value=l.error?null:l.output,d.key=d.key[0][0]}return{rows:u(i,n.limit,n.skip)}}function T(e,t){return J.sequentialize(b(e),function(){return O(e,t)})()}function O(e,t){function n(t){return t.include_docs=!0,e.db.allDocs(t).then(function(e){return o=e.total_rows,e.rows.map(function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(n>t||t>n))return e.doc.value}var r=M(e.doc._id);return{key:r[0],id:r[1],value:"value"in e.doc?e.doc.value:null}})})}function r(n){var r;if(r=i?S(e,n,t):{ -total_rows:o,offset:s,rows:n},t.include_docs){var a=J.uniq(n.map(c));return e.sourceDB.allDocs({keys:a,include_docs:!0,conflicts:t.conflicts,attachments:t.attachments,binary:t.binary}).then(function(e){var t={};return e.rows.forEach(function(e){e.doc&&(t["$"+e.id]=e.doc)}),n.forEach(function(e){var n=c(e),r=t["$"+n];r&&(e.doc=r)}),r})}return r}var o,i=e.reduceFun&&t.reduce!==!1,s=t.skip||0;"undefined"==typeof t.keys||t.keys.length||(t.limit=0,delete t.keys);var a=function(e){return e.reduce(function(e,t){return e.concat(t)})};if("undefined"!=typeof t.keys){var u=t.keys,f=u.map(function(e){var t={startkey:B([e]),endkey:B([e,{}])};return n(t)});return H.all(f).then(a).then(r)}var d={descending:t.descending};if(t.start_key&&(t.startkey=t.start_key),t.end_key&&(t.endkey=t.end_key),"undefined"!=typeof t.startkey&&(d.startkey=B(t.descending?[t.startkey,{}]:[t.startkey])),"undefined"!=typeof t.endkey){var l=t.inclusive_end!==!1;t.descending&&(l=!l),d.endkey=B(l?[t.endkey,{}]:[t.endkey])}if("undefined"!=typeof t.key){var h=B([t.key]),p=B([t.key,{}]);d.descending?(d.endkey=h,d.startkey=p):(d.startkey=h,d.endkey=p)}return i||("number"==typeof t.limit&&(d.limit=t.limit),d.skip=s),n(d).then(r)}function x(e){return e.request({method:"POST",url:"_view_cleanup"})}function k(e){return e.get("_local/mrviews").then(function(t){var n={};Object.keys(t.views).forEach(function(e){var t=r(e),o="_design/"+t[0],i=t[1];n[o]=n[o]||{},n[o][i]=!0});var o={keys:Object.keys(n),include_docs:!0};return e.allDocs(o).then(function(r){var o={};r.rows.forEach(function(e){var r=e.key.substring(8);Object.keys(n[e.key]).forEach(function(n){var i=r+"/"+n;t.views[i]||(i=n);var s=Object.keys(t.views[i]),a=e.doc&&e.doc.views&&e.doc.views[n];s.forEach(function(e){o[e]=o[e]||a})})});var i=Object.keys(o).filter(function(e){return!o[e]}),s=i.map(function(t){return J.sequentialize(b(t),function(){return new e.constructor(t,e.__opts).destroy()})()});return H.all(s).then(function(){return{ok:!0}})})},y({ok:!0}))}function A(e,n,o){if("http"===e.type())return _(e,n,o);if("string"!=typeof n){v(o,n);var i={db:e,viewName:"temp_view/temp_view",map:n.map,reduce:n.reduce,temporary:!0};return G.add(function(){return P(i).then(function(e){function t(){return e.db.destroy()}return J.fin(E(e).then(function(){return T(e,o)}),t)})}),G.finish()}var s=n,a=r(s),u=a[0],c=a[1];return e.get("_design/"+u).then(function(n){var r=n.views&&n.views[c];if(!r||"string"!=typeof r.map)throw new q("ddoc "+u+" has no view named "+c);v(o,r);var i={db:e,viewName:s,map:r.map,reduce:r.reduce};return P(i).then(function(e){return"ok"===o.stale||"update_after"===o.stale?("update_after"===o.stale&&t.nextTick(function(){E(e)}),T(e,o)):E(e).then(function(){return T(e,o)})})})}function R(e){this.status=400,this.name="query_parse_error",this.message=e,this.error=!0;try{Error.captureStackTrace(this,R)}catch(t){}}function q(e){this.status=404,this.name="not_found",this.message=e,this.error=!0;try{Error.captureStackTrace(this,q)}catch(t){}}function C(e){this.status=500,this.name="invalid_value",this.message=e,this.error=!0;try{Error.captureStackTrace(this,C)}catch(t){}}var I,D=e(29),N=e(89),L=e(65),j=N.collate,B=N.toIndexableString,F=N.normalizeKey,M=N.parseIndexableString,P=e(61),U=e(62);I="undefined"!=typeof console&&"function"==typeof console.log?Function.prototype.bind.call(console.log,console):function(){};var J=e(66),H=e(55),V=e(86),Q={},G=new L,W=50,K={_sum:function(e,t){return h(t)},_count:function(e,t){return t.length},_stats:function(e,t){function n(e){for(var t=0,n=0,r=e.length;r>n;n++){var o=e[n];t+=o*o}return t}return{sum:h(t),min:Math.min.apply(null,t),max:Math.max.apply(null,t),count:t.length,sumsqr:n(t)}}};n.viewCleanup=J.callbackify(function(){var e=this;return"http"===e.type()?x(e):k(e)}),n.query=function(e,t,n){"function"==typeof t&&(n=t,t={}),t=t||{},"function"==typeof e&&(e={map:e});var r=this,o=H.resolve().then(function(){return A(r,e,t)});return J.promisedCallback(o,n),o},V(R,Error),V(q,Error),V(C,Error)}).call(this,e(82))},{29:29,55:55,61:61,62:62,65:65,66:66,82:82,86:86,89:89}],64:[function(e,t,n){"use strict";var r=e(92);t.exports=function(e){return r.hash(e)}},{92:92}],65:[function(e,t,n){"use strict";function r(){this.promise=new o(function(e){e()})}var o=e(55);r.prototype.add=function(e){return this.promise=this.promise["catch"](function(){}).then(function(){return e()}),this.promise},r.prototype.finish=function(){return this.promise},t.exports=r},{55:55}],66:[function(e,t,n){(function(t){"use strict";var r=e(80);n.promisedCallback=function(e,n){return n&&e.then(function(e){t.nextTick(function(){n(null,e)})},function(e){t.nextTick(function(){n(e)})}),e},n.callbackify=function(e){return r(function(t){var r=t.pop(),o=e.apply(this,t);return"function"==typeof r&&n.promisedCallback(o,r),o})},n.fin=function(e,t){return e.then(function(e){return t().then(function(){return e})},function(e){return t().then(function(){throw e})})},n.sequentialize=function(e,t){return function(){var n=arguments,r=this;return e.add(function(){return t.apply(r,n)})}},n.flatten=function(e){for(var t=[],n=0,r=e.length;r>n;n++)t=t.concat(e[n]);return t},n.uniq=function(e){for(var t={},n=0,r=e.length;r>n;n++)t["$"+e[n]]=!0;var o=Object.keys(t),i=new Array(o.length);for(n=0,r=o.length;r>n;n++)i[n]=o[n].substring(1);return i}}).call(this,e(82))},{80:80,82:82}],67:[function(e,t,n){"use strict";function r(e,t,n){for(var r,o=0,i=e.length;i>o;)r=o+i>>>1,n(e[r],t)<0?o=r+1:i=r;return o}function o(e,t){return e.pos-t.pos}function i(e,t,n){var o=r(e,t,n);e.splice(o,0,t)}function s(e,t){for(var n,r,o=t,i=e.length;i>o;o++){var s=e[o],a=[s.id,s.opts,[]];r?(r[2].push(a),r=a):n=r=a}return n}function a(e,t){return e[0]0;){var o=n.pop(),s=o.tree1,u=o.tree2;(s[1].status||u[1].status)&&(s[1].status="available"===s[1].status||"available"===u[1].status?"available":"missing");for(var c=0;cc;c++){var d=e[c];if(d.pos===t.pos&&d.ids[0]===t.ids[0])r=u(d.ids,t.ids),i.push({pos:d.pos,ids:r.tree}),s=s||r.conflicts,a=!0;else if(n!==!0){var l=d.pos0;){var y=_.pop();if(0!==y.diff)for(var m=y.ids[2],g=0,b=m.length;b>g;g++)_.push({ids:m[g],diff:y.diff-1,parent:y.ids,parentIdx:g});else y.ids[0]===h.ids[0]&&v.push(y)}var E=v[0];E?(r=u(E.ids,h.ids),E.parent[2][E.parentIdx]=r.tree,i.push({pos:l.pos,ids:l.ids}),s=s||r.conflicts,a=!0):i.push(d)}else i.push(d)}return a||i.push(t),i.sort(o),{tree:i,conflicts:s||"internal_node"}}function f(e,t){for(var n,r=d.rootToLeaf(e),o=0,i=r.length;i>o;o++){var a=r[o],u=a.ids,f=Math.max(0,u.length-t),l={pos:a.pos+f,ids:s(u,f)};n=n?c(n,l,!0).tree:[l]}return n}var d={};d.merge=function(e,t,n){var r=c(e,t);return{tree:f(r.tree,n),conflicts:r.conflicts}},d.winningRev=function(e){for(var t,n,r,o,i=e.rev_tree.slice();o=i.pop();){var s=o.ids,a=s[2],u=o.pos;if(a.length)for(var c=0,f=a.length;f>c;c++)i.push({pos:u+1,ids:a[c]});else{var d=!!s[1].deleted,l=s[0];(!t||(r!==d?r:n!==u?u>n:l>t))&&(t=l,n=u,r=d)}}return n+"-"+t},d.traverseRevTree=function(e,t){for(var n,r=e.slice();n=r.pop();)for(var o=n.pos,i=n.ids,s=i[2],a=t(0===s.length,o,i[0],n.ctx,i[1]),u=0,c=s.length;c>u;u++)r.push({pos:o+1,ids:s[u],ctx:a})},d.revExists=function(e,t){for(var n,r=e.slice(),o=t.split("-"),i=parseInt(o[0],10),s=o[1];n=r.pop();){if(n.pos===i&&n.ids[0]===s)return!0;for(var a=n.ids[2],u=0,c=a.length;c>u;u++)r.push({pos:n.pos+1,ids:a[u]})}return!1},d.collectLeaves=function(e){var t=[];d.traverseRevTree(e,function(e,n,r,o,i){e&&t.push({rev:n+"-"+r,pos:n,opts:i})}),t.sort(o).reverse();for(var n=0,r=t.length;r>n;n++)delete t[n].pos;return t},d.collectConflicts=function(e){for(var t=d.winningRev(e),n=d.collectLeaves(e.rev_tree),r=[],o=0,i=n.length;i>o;o++){var s=n[o];s.rev===t||s.opts.deleted||r.push(s.rev)}return r},d.rootToLeaf=function(e){for(var t,n=[],r=e.slice();t=r.pop();){var o=t.pos,i=t.ids,s=i[0],a=i[1],u=i[2],c=0===u.length,f=t.history?t.history.slice():[];f.push({id:s,opts:a}),c&&n.push({pos:o+1-f.length,ids:f});for(var d=0,l=u.length;l>d;d++)r.push({pos:o+1,ids:u[d],history:f})}return n.reverse()},t.exports=d},{}],68:[function(e,t,n){"use strict";function r(e,t){e=parseInt(e,10),t=parseInt(t,10),e!==e&&(e=0),t!==t||e>=t?t=(e||1)<<1:t+=1;var n=Math.random(),r=t-e;return~~(r*n+e)}function o(e){var t=0;return e||(t=2e3),r(e,t)}function i(e,t,n,r){return e.retry===!1?(t.emit("error",n),void t.removeAllListeners()):("function"!=typeof e.back_off_function&&(e.back_off_function=o),t.emit("requestError",n),"active"===t.state&&(t.emit("paused",n),t.state="stopped",t.once("active",function(){e.current_back_off=s})),e.current_back_off=e.current_back_off||s,e.current_back_off=e.back_off_function(e.current_back_off),void setTimeout(r,e.current_back_off))}var s=0;t.exports=i},{}],69:[function(e,t,n){"use strict";function r(e,t,n,o,i){return e.get(t)["catch"](function(n){if(404===n.status)return"http"===e.type()&&c("PouchDB is just checking if a remote checkpoint exists."),{session_id:o,_id:t,history:[],replicator:h,version:l};throw n}).then(function(s){return i.cancelled?void 0:(s.history=(s.history||[]).filter(function(e){return e.session_id!==o}),s.history.unshift({last_seq:n,session_id:o}),s.history=s.history.slice(0,p),s.version=l,s.replicator=h,s.session_id=o,s.last_seq=n,e.put(s)["catch"](function(s){if(409===s.status)return r(e,t,n,o,i);throw s}))})}function o(e,t,n,r){this.src=e,this.target=t,this.id=n,this.returnValue=r}function i(e,t){if(e.session_id===t.session_id)return{last_seq:e.last_seq,history:e.history||[]};var n=e.history||[],r=t.history||[];return s(n,r)}function s(e,t){var n=e[0],r=e.slice(1),o=t[0],i=t.slice(1);if(!n||0===t.length)return{last_seq:v,history:[]};var u=n.session_id;if(a(u,t))return{last_seq:n.last_seq,history:e};var c=o.session_id;return a(c,r)?{last_seq:o.last_seq,history:i}:s(r,i)}function a(e,t){var n=t[0],r=t.slice(1);return e&&0!==t.length?e===n.session_id?!0:a(e,r):!1}var u=e(55),c=e(22),f=e(89),d=f.collate,l=1,h="pouchdb",p=5,v=0;o.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then(function(){return n.updateSource(e,t)})},o.prototype.updateTarget=function(e,t){return r(this.target,this.id,e,t,this.returnValue)},o.prototype.updateSource=function(e,t){var n=this;return this.readOnlySource?u.resolve(!0):r(this.src,this.id,e,t,this.returnValue)["catch"](function(e){var t="number"==typeof e.status&&4===Math.floor(e.status/100);if(t)return n.readOnlySource=!0,!0;throw e})};var _={undefined:function(e,t){return 0===d(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return i(t,e).last_seq}};o.prototype.getCheckpoint=function(){var e=this;return e.target.get(e.id).then(function(t){return e.src.get(e.id).then(function(e){if(t.version!==e.version)return v;var n;return n=t.version?t.version.toString():"undefined",n in _?_[n](t,e):v},function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:v}).then(function(){return v},function(n){return 401===n.status?(e.readOnlySource=!0,t.last_seq):v});throw n})})["catch"](function(e){if(404!==e.status)throw e;return v})},t.exports=o},{22:22,55:55,89:89}],70:[function(e,t,n){"use strict";function r(e){return Object.keys(e).sort(s).reduce(function(t,n){return t[n]=e[n],t},{})}function o(e,t,n){var o=n.doc_ids?n.doc_ids.sort(s):"",a=n.filter?n.filter.toString():"",u="",c="";return n.filter&&n.query_params&&(u=JSON.stringify(r(n.query_params))),n.filter&&"_view"===n.filter&&(c=n.view.toString()),e.id().then(function(e){return t.id().then(function(t){var n=e+t+a+c+u+o;return i(n).then(function(e){return e=e.replace(/\//g,".").replace(/\+/g,"_"),"_local/"+e})})})}var i=e(50),s=e(89).collate;t.exports=o},{50:50,89:89}],71:[function(e,t,n){"use strict";function r(e){return/^1-/.test(e)}function o(e,t,n){function o(t,r){var o={revs:!0,open_revs:r,attachments:!0,binary:!0};return e.get(t,o).then(function(e){if(n.cancelled)throw new Error("cancelled");e.forEach(function(e){e.ok&&p.push(e.ok)})})}function i(e){for(var n=t[e].missing,r=[],i=0;i0}function d(o){return e.allDocs({keys:o,include_docs:!0}).then(function(e){if(n.cancelled)throw new Error("cancelled");e.rows.forEach(function(e){!e.deleted&&e.doc&&r(e.value.rev)&&!f(e.doc)&&(p.push(e.doc),delete t[e.id])})})}function l(){var e=Object.keys(t).filter(function(e){var n=t[e].missing;return 1===n.length&&r(n[0])});return e.length>0?d(e):void 0}function h(){return p}t=s(t);var p=[];return a.resolve().then(l).then(c).then(h)}var i=e(78),s=i.clone,a=i.Promise,u=50;t.exports=o},{78:78}],72:[function(e,t,n){"use strict";function r(e,t){var n=t.PouchConstructor;return"string"==typeof e?new n(e,t):e}function o(e,t,n,o){if("function"==typeof n&&(o=n,n={}),"undefined"==typeof n&&(n={}),n.doc_ids&&!Array.isArray(n.doc_ids))throw u.error(u.BAD_REQUEST,"`doc_ids` filter parameter is not a list.");n.complete=o,n=i.clone(n),n.continuous=n.continuous||n.live,n.retry="retry"in n?n.retry:!1,n.PouchConstructor=n.PouchConstructor||this;var c=new a(n),f=r(e,n),d=r(t,n);return s(f,d,n,c),c}var i=e(78),s=e(73),a=e(74),u=e(48);t.exports={replicate:o,toPouch:r}},{48:48,73:73,74:74,78:78}],73:[function(e,t,n){"use strict";function r(e,t,n,c,f){function d(){return k?o.Promise.resolve():a(e,t,n).then(function(n){x=n,k=new i(e,t,x,M)})}function l(){if(0!==O.docs.length){var e=O.docs;return t.bulkDocs({docs:e,new_edits:!1}).then(function(t){if(M.cancelled)throw g(),new Error("cancelled");var n=[],r={};t.forEach(function(e){e.error&&(f.doc_write_failures++,n.push(e),r[e.id]=e)}),P=P.concat(n),f.docs_written+=O.docs.length-n.length;var i=n.filter(function(e){return"unauthorized"!==e.name&&"forbidden"!==e.name});if(U=[],e.forEach(function(e){var t=r[e._id];t?c.emit("denied",o.clone(t)):U.push(e)}),i.length>0){var s=new Error("bulkDocs error");throw s.other_errors=n,m("target.bulkDocs failed to write docs",s),new Error("bulkWrite partial failure")}},function(t){throw f.doc_write_failures+=e.length,t})}}function h(){return q=!0,k.writeCheckpoint(O.seq,J).then(function(){if(q=!1,M.cancelled)throw g(),new Error("cancelled");f.last_seq=D=O.seq;var e=o.clone(f);e.docs=U,c.emit("change",e),O=void 0,S()})["catch"](function(e){throw q=!1,m("writeCheckpoint completed with error",e),e})}function p(){var e={};return O.changes.forEach(function(t){"_user/"!==t.id&&(e[t.id]=t.changes.map(function(e){return e.rev}))}),t.revsDiff(e).then(function(e){if(M.cancelled)throw g(),new Error("cancelled");O.diffs=e})}function v(){return u(e,O.diffs,M).then(function(e){e.forEach(function(e){delete O.diffs[e._id],f.docs_read++,O.docs.push(e)})})}function _(){if(!M.cancelled&&!O){if(0===A.length)return void y(!0);O=A.shift(),p().then(v).then(l).then(h).then(_)["catch"](function(e){m("batch processing terminated with error",e)})}}function y(e){return 0===R.changes.length?void(0!==A.length||O||((N&&H.live||C)&&(c.state="pending",c.emit("paused")),C&&g())):void((e||C||R.changes.length>=L)&&(A.push(R),R={seq:0,changes:[],docs:[]},("pending"===c.state||"stopped"===c.state)&&(c.state="active",c.emit("active")),_()))}function m(e,t){I||(t.message||(t.message=e),f.ok=!1,f.status="aborting",f.errors.push(t),P=P.concat(t),A=[],R={seq:0,changes:[],docs:[]},g())}function g(){if(!(I||M.cancelled&&(f.status="cancelled",q))){f.status=f.status||"complete",f.end_time=new Date,f.last_seq=D,I=M.cancelled=!0;var o=P.filter(function(e){return"unauthorized"!==e.name&&"forbidden"!==e.name});if(o.length>0){var i=P.pop();P.length>0&&(i.other_errors=P),i.result=f,s(n,c,i,function(){r(e,t,n,c)})}else f.errors=P,c.emit("complete",f),c.removeAllListeners()}}function b(e){if(M.cancelled)return g();var t=o.filterChange(n)(e);t&&(R.seq=e.seq,R.changes.push(e),y(0===A.length))}function E(e){return B=!1,M.cancelled?g():(e.results.length>0?(H.since=e.last_seq,S()):N?(H.live=!0,S()):C=!0,void y(!0))}function w(e){return B=!1,M.cancelled?g():void m("changes rejected",e)}function S(){function t(){o.cancel()}function r(){c.removeListener("cancel",t)}if(!B&&!C&&A.lengthe?-1:e>t?1:0},n.compactTree=function(e){var t=[];return r.traverseRevTree(e.rev_tree,function(e,n,r,o,i){"available"!==i.status||e||(t.push(n+"-"+r),i.status="missing")}),t};var c=e(93);n.safeJsonParse=function(e){try{return JSON.parse(e)}catch(t){return c.parse(e)}},n.safeJsonStringify=function(e){try{return JSON.stringify(e)}catch(t){return c.stringify(e)}}},{15:15,22:22,25:25,28:28,31:31,37:37,42:42,49:49,51:51,53:53,54:54,55:55,56:56,58:58,67:67,80:80,83:83,86:86,91:91,93:93}],79:[function(e,t,n){t.exports="4.0.1"},{}],80:[function(e,t,n){"use strict";function r(e){return function(){var t=arguments.length;if(t){for(var n=[],r=-1;++re||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,i,u,c;if(this._events||(this._events={}),"error"===e&&(!this._events.error||s(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(n=this._events[e],a(n))return!1;if(o(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:for(r=arguments.length,i=new Array(r-1),u=1;r>u;u++)i[u-1]=arguments[u];n.apply(this,i)}else if(s(n)){for(r=arguments.length,i=new Array(r-1),u=1;r>u;u++)i[u-1]=arguments[u];for(c=n.slice(),r=c.length,u=0;r>u;u++)c[u].apply(this,i)}return!0},r.prototype.addListener=function(e,t){var n;if(!o(t))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,o(t.listener)?t.listener:t),this._events[e]?s(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,s(this._events[e])&&!this._events[e].warned){var n;n=a(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function n(){this.removeListener(e,n),r||(r=!0,t.apply(this,arguments))}if(!o(t))throw TypeError("listener must be a function");var r=!1;return n.listener=t,this.on(e,n),this},r.prototype.removeListener=function(e,t){var n,r,i,a;if(!o(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],i=n.length,r=-1,n===t||o(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(n)){for(a=i;a-->0;)if(n[a]===t||n[a].listener&&n[a].listener===t){r=a;break}if(0>r)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],o(n))this.removeListener(e,n);else for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?o(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.listenerCount=function(e,t){var n;return n=e._events&&e._events[t]?o(e._events[t])?1:e._events[t].length:0}},{}],82:[function(e,t,n){function r(){f=!1,a.length?c=a.concat(c):d=-1,c.length&&o()}function o(){if(!f){var e=setTimeout(r);f=!0;for(var t=c.length;t;){for(a=c,c=[];++d1)for(var n=1;n=31}function o(){var e=arguments,t=this.useColors;if(e[0]=(t?"%c":"")+this.namespace+(t?" %c":" ")+e[0]+(t?"%c ":" ")+"+"+n.humanize(this.diff),!t)return e;var r="color: "+this.color;e=[e[0],r,"color: inherit"].concat(Array.prototype.slice.call(e,1));var o=0,i=0;return e[0].replace(/%[a-z%]/g,function(e){"%%"!==e&&(o++,"%c"===e&&(i=o))}),e.splice(i,0,r),e}function i(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function s(e){try{null==e?n.storage.removeItem("debug"):n.storage.debug=e}catch(t){}}function a(){var e;try{e=n.storage.debug}catch(t){}return e}function u(){try{return window.localStorage}catch(e){}}n=t.exports=e(84),n.log=i,n.formatArgs=o,n.save=s,n.load=a,n.useColors=r,n.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:u(),n.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],n.formatters.j=function(e){return JSON.stringify(e)},n.enable(a())},{84:84}],84:[function(e,t,n){function r(){return n.colors[f++%n.colors.length]}function o(e){function t(){}function o(){var e=o,t=+new Date,i=t-(c||t);e.diff=i,e.prev=c,e.curr=t,c=t,null==e.useColors&&(e.useColors=n.useColors()),null==e.color&&e.useColors&&(e.color=r());var s=Array.prototype.slice.call(arguments);s[0]=n.coerce(s[0]),"string"!=typeof s[0]&&(s=["%o"].concat(s));var a=0;s[0]=s[0].replace(/%([a-z%])/g,function(t,r){if("%%"===t)return t;a++;var o=n.formatters[r];if("function"==typeof o){var i=s[a];t=o.call(e,i),s.splice(a,1),a--}return t}),"function"==typeof n.formatArgs&&(s=n.formatArgs.apply(e,s));var u=o.log||n.log||console.log.bind(console);u.apply(e,s)}t.enabled=!1,o.enabled=!0;var i=n.enabled(e)?o:t;return i.namespace=e,i}function i(e){n.save(e);for(var t=(e||"").split(/[\s,]+/),r=t.length,o=0;r>o;o++)t[o]&&(e=t[o].replace(/\*/g,".*?"), -"-"===e[0]?n.skips.push(new RegExp("^"+e.substr(1)+"$")):n.names.push(new RegExp("^"+e+"$")))}function s(){n.enable("")}function a(e){var t,r;for(t=0,r=n.skips.length;r>t;t++)if(n.skips[t].test(e))return!1;for(t=0,r=n.names.length;r>t;t++)if(n.names[t].test(e))return!0;return!1}function u(e){return e instanceof Error?e.stack||e.message:e}n=t.exports=o,n.coerce=u,n.disable=s,n.enable=i,n.enabled=a,n.humanize=e(85),n.names=[],n.skips=[],n.formatters={};var c,f=0},{85:85}],85:[function(e,t,n){function r(e){if(e=""+e,!(e.length>1e4)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),r=(t[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*d;case"days":case"day":case"d":return n*f;case"hours":case"hour":case"hrs":case"hr":case"h":return n*c;case"minutes":case"minute":case"mins":case"min":case"m":return n*u;case"seconds":case"second":case"secs":case"sec":case"s":return n*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n}}}}function o(e){return e>=f?Math.round(e/f)+"d":e>=c?Math.round(e/c)+"h":e>=u?Math.round(e/u)+"m":e>=a?Math.round(e/a)+"s":e+"ms"}function i(e){return s(e,f,"day")||s(e,c,"hour")||s(e,u,"minute")||s(e,a,"second")||e+" ms"}function s(e,t,n){return t>e?void 0:1.5*t>e?Math.floor(e/t)+" "+n:Math.ceil(e/t)+" "+n+"s"}var a=1e3,u=60*a,c=60*u,f=24*c,d=365.25*f;t.exports=function(e,t){return t=t||{},"string"==typeof e?r(e):t["long"]?i(e):o(e)}},{}],86:[function(e,t,n){"function"==typeof Object.create?t.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},{}],87:[function(e,t,n){"use strict";function r(){}function o(e){if("function"!=typeof e)throw new TypeError("resolver must be a function");this.state=m,this.queue=[],this.outcome=void 0,e!==r&&u(this,e)}function i(e,t,n){this.promise=e,"function"==typeof t&&(this.onFulfilled=t,this.callFulfilled=this.otherCallFulfilled),"function"==typeof n&&(this.onRejected=n,this.callRejected=this.otherCallRejected)}function s(e,t,n){p(function(){var r;try{r=t(n)}catch(o){return v.reject(e,o)}r===e?v.reject(e,new TypeError("Cannot resolve promise with itself")):v.resolve(e,r)})}function a(e){var t=e&&e.then;return e&&"object"==typeof e&&"function"==typeof t?function(){t.apply(e,arguments)}:void 0}function u(e,t){function n(t){i||(i=!0,v.reject(e,t))}function r(t){i||(i=!0,v.resolve(e,t))}function o(){t(r,n)}var i=!1,s=c(o);"error"===s.status&&n(s.value)}function c(e,t){var n={};try{n.value=e(t),n.status="success"}catch(r){n.status="error",n.value=r}return n}function f(e){return e instanceof this?e:v.resolve(new this(r),e)}function d(e){var t=new this(r);return v.reject(t,e)}function l(e){function t(e,t){function r(e){s[t]=e,++a!==o||i||(i=!0,v.resolve(c,s))}n.resolve(e).then(r,function(e){i||(i=!0,v.reject(c,e))})}var n=this;if("[object Array]"!==Object.prototype.toString.call(e))return this.reject(new TypeError("must be an array"));var o=e.length,i=!1;if(!o)return this.resolve([]);for(var s=new Array(o),a=0,u=-1,c=new this(r);++uo;o++){var i=n.collate(e[o],t[o]);if(0!==i)return i}return e.length===t.length?0:e.length>t.length?1:-1}function a(e,t){return e===t?0:e>t?1:-1}function u(e,t){for(var r=Object.keys(e),o=Object.keys(t),i=Math.min(r.length,o.length),s=0;i>s;s++){var a=n.collate(r[s],o[s]);if(0!==a)return a;if(a=n.collate(e[r[s]],t[o[s]]),0!==a)return a}return r.length===o.length?0:r.length>o.length?1:-1}function c(e){var t=["boolean","number","string","object"],n=t.indexOf(typeof e);return~n?null===e?1:Array.isArray(e)?5:3>n?n+2:n+3:Array.isArray(e)?5:void 0}function f(e){if(0===e)return"1";var t=e.toExponential().split(/e\+?/),n=parseInt(t[1],10),r=0>e,o=r?"0":"2",i=(r?-n:n)-d,s=p.padLeft(i.toString(),"0",l);o+=h+s;var a=Math.abs(parseFloat(t[0]));r&&(a=10-a);var u=a.toFixed(20);return u=u.replace(/\.?0+$/,""),o+=h+u}var d=-324,l=3,h="",p=e(90);n.collate=function(e,t){if(e===t)return 0;e=n.normalizeKey(e),t=n.normalizeKey(t);var r=c(e),o=c(t);if(r-o!==0)return r-o;if(null===e)return 0;switch(typeof e){case"number":return e-t;case"boolean":return e===t?0:t>e?-1:1;case"string":return a(e,t)}return Array.isArray(e)?s(e,t):u(e,t)},n.normalizeKey=function(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-(1/0)||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var r=e.length;e=new Array(r);for(var o=0;r>o;o++)e[o]=n.normalizeKey(t[o])}else{if(e instanceof Date)return e.toJSON();if(null!==e){e={};for(var i in t)if(t.hasOwnProperty(i)){var s=t[i];"undefined"!=typeof s&&(e[i]=n.normalizeKey(s))}}}}return e},n.toIndexableString=function(e){var t="\x00";return e=n.normalizeKey(e),c(e)+h+r(e)+t},n.parseIndexableString=function(e){for(var t=[],n=[],r=0;;){var s=e[r++];if("\x00"!==s)switch(s){case"1":t.push(null);break;case"2":t.push("1"===e[r]),r++;break;case"3":var a=o(e,r);t.push(a.num),r+=a.length;break;case"4":for(var u="";;){var c=e[r];if("\x00"===c)break;u+=c,r++}u=u.replace(/\u0001\u0001/g,"\x00").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(u);break;case"5":var f={element:[],index:t.length};t.push(f.element),n.push(f);break;case"6":var d={element:{},index:t.length};t.push(d.element),n.push(d);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+s)}else{if(1===t.length)return t.pop();i(t,n)}}}},{90:90}],90:[function(e,t,n){"use strict";function r(e,t,n){for(var r="",o=n-e.length;r.lengthn;n++){if(n===o)return 1;var i=e.charAt(n),s=t.charAt(n);if(i!==s)return s>i?-1:1}return o>r?-1:0},n.intToDecimalForm=function(e){var t=0>e,n="";do{var r=t?-Math.ceil(e%10):Math.floor(e%10);n=r+n,e=t?Math.ceil(e/10):Math.floor(e/10)}while(e);return t&&"0"!==n&&(n="-"+n),n}},{}],91:[function(e,t,n){"use strict";function r(){this.store={}}function o(e){if(this.store=new r,e&&Array.isArray(e))for(var t=0,n=e.length;n>t;t++)this.add(e[t])}n.Map=r,n.Set=o,r.prototype.mangle=function(e){if("string"!=typeof e)throw new TypeError("key must be a string but Got "+e);return"$"+e},r.prototype.unmangle=function(e){return e.substring(1)},r.prototype.get=function(e){var t=this.mangle(e);return t in this.store?this.store[t]:void 0},r.prototype.set=function(e,t){var n=this.mangle(e);return this.store[n]=t,!0},r.prototype.has=function(e){var t=this.mangle(e);return t in this.store},r.prototype["delete"]=function(e){var t=this.mangle(e);return t in this.store?(delete this.store[t],!0):!1},r.prototype.forEach=function(e){for(var t=Object.keys(this.store),n=0,r=t.length;r>n;n++){var o=t[n],i=this.store[o];o=this.unmangle(o),e(i,o)}},o.prototype.add=function(e){return this.store.set(e,!0)},o.prototype.has=function(e){return this.store.has(e)},o.prototype["delete"]=function(e){return this.store["delete"](e)}},{}],92:[function(e,t,n){!function(e){if("object"==typeof n)t.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var r;try{r=window}catch(o){r=self}r.SparkMD5=e()}}(function(e){"use strict";var t=function(e,t){return e+t&4294967295},n=function(e,n,r,o,i,s){return n=t(t(n,e),t(o,s)),t(n<>>32-i,r)},r=function(e,t,r,o,i,s,a){return n(t&r|~t&o,e,t,i,s,a)},o=function(e,t,r,o,i,s,a){return n(t&o|r&~o,e,t,i,s,a)},i=function(e,t,r,o,i,s,a){return n(t^r^o,e,t,i,s,a)},s=function(e,t,r,o,i,s,a){return n(r^(t|~o),e,t,i,s,a)},a=function(e,n){var a=e[0],u=e[1],c=e[2],f=e[3];a=r(a,u,c,f,n[0],7,-680876936),f=r(f,a,u,c,n[1],12,-389564586),c=r(c,f,a,u,n[2],17,606105819),u=r(u,c,f,a,n[3],22,-1044525330),a=r(a,u,c,f,n[4],7,-176418897),f=r(f,a,u,c,n[5],12,1200080426),c=r(c,f,a,u,n[6],17,-1473231341),u=r(u,c,f,a,n[7],22,-45705983),a=r(a,u,c,f,n[8],7,1770035416),f=r(f,a,u,c,n[9],12,-1958414417),c=r(c,f,a,u,n[10],17,-42063),u=r(u,c,f,a,n[11],22,-1990404162),a=r(a,u,c,f,n[12],7,1804603682),f=r(f,a,u,c,n[13],12,-40341101),c=r(c,f,a,u,n[14],17,-1502002290),u=r(u,c,f,a,n[15],22,1236535329),a=o(a,u,c,f,n[1],5,-165796510),f=o(f,a,u,c,n[6],9,-1069501632),c=o(c,f,a,u,n[11],14,643717713),u=o(u,c,f,a,n[0],20,-373897302),a=o(a,u,c,f,n[5],5,-701558691),f=o(f,a,u,c,n[10],9,38016083),c=o(c,f,a,u,n[15],14,-660478335),u=o(u,c,f,a,n[4],20,-405537848),a=o(a,u,c,f,n[9],5,568446438),f=o(f,a,u,c,n[14],9,-1019803690),c=o(c,f,a,u,n[3],14,-187363961),u=o(u,c,f,a,n[8],20,1163531501),a=o(a,u,c,f,n[13],5,-1444681467),f=o(f,a,u,c,n[2],9,-51403784),c=o(c,f,a,u,n[7],14,1735328473),u=o(u,c,f,a,n[12],20,-1926607734),a=i(a,u,c,f,n[5],4,-378558),f=i(f,a,u,c,n[8],11,-2022574463),c=i(c,f,a,u,n[11],16,1839030562),u=i(u,c,f,a,n[14],23,-35309556),a=i(a,u,c,f,n[1],4,-1530992060),f=i(f,a,u,c,n[4],11,1272893353),c=i(c,f,a,u,n[7],16,-155497632),u=i(u,c,f,a,n[10],23,-1094730640),a=i(a,u,c,f,n[13],4,681279174),f=i(f,a,u,c,n[0],11,-358537222),c=i(c,f,a,u,n[3],16,-722521979),u=i(u,c,f,a,n[6],23,76029189),a=i(a,u,c,f,n[9],4,-640364487),f=i(f,a,u,c,n[12],11,-421815835),c=i(c,f,a,u,n[15],16,530742520),u=i(u,c,f,a,n[2],23,-995338651),a=s(a,u,c,f,n[0],6,-198630844),f=s(f,a,u,c,n[7],10,1126891415),c=s(c,f,a,u,n[14],15,-1416354905),u=s(u,c,f,a,n[5],21,-57434055),a=s(a,u,c,f,n[12],6,1700485571),f=s(f,a,u,c,n[3],10,-1894986606),c=s(c,f,a,u,n[10],15,-1051523),u=s(u,c,f,a,n[1],21,-2054922799),a=s(a,u,c,f,n[8],6,1873313359),f=s(f,a,u,c,n[15],10,-30611744),c=s(c,f,a,u,n[6],15,-1560198380),u=s(u,c,f,a,n[13],21,1309151649),a=s(a,u,c,f,n[4],6,-145523070),f=s(f,a,u,c,n[11],10,-1120210379),c=s(c,f,a,u,n[2],15,718787259),u=s(u,c,f,a,n[9],21,-343485551),e[0]=t(a,e[0]),e[1]=t(u,e[1]),e[2]=t(c,e[2]),e[3]=t(f,e[3])},u=function(e){var t,n=[];for(t=0;64>t;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n},c=function(e){var t,n=[];for(t=0;64>t;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n},f=function(e){var t,n,r,o,i,s,c=e.length,f=[1732584193,-271733879,-1732584194,271733878];for(t=64;c>=t;t+=64)a(f,u(e.substring(t-64,t)));for(e=e.substring(t-64),n=e.length,r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;n>t;t+=1)r[t>>2]|=e.charCodeAt(t)<<(t%4<<3);if(r[t>>2]|=128<<(t%4<<3),t>55)for(a(f,r),t=0;16>t;t+=1)r[t]=0;return o=8*c,o=o.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(o[2],16),s=parseInt(o[1],16)||0,r[14]=i,r[15]=s,a(f,r),f},d=function(e){var t,n,r,o,i,s,u=e.length,f=[1732584193,-271733879,-1732584194,271733878];for(t=64;u>=t;t+=64)a(f,c(e.subarray(t-64,t)));for(e=u>t-64?e.subarray(t-64):new Uint8Array(0),n=e.length,r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;n>t;t+=1)r[t>>2]|=e[t]<<(t%4<<3);if(r[t>>2]|=128<<(t%4<<3),t>55)for(a(f,r),t=0;16>t;t+=1)r[t]=0;return o=8*u,o=o.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(o[2],16),s=parseInt(o[1],16)||0,r[14]=i,r[15]=s,a(f,r),f},l=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],h=function(e){var t,n="";for(t=0;4>t;t+=1)n+=l[e>>8*t+4&15]+l[e>>8*t&15];return n},p=function(e){var t;for(t=0;t>16)+(t>>16)+(n>>16);return r<<16|65535&n}),_.prototype.append=function(e){return/[\u0080-\uFFFF]/.test(e)&&(e=unescape(encodeURIComponent(e))),this.appendBinary(e),this},_.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,n=this._buff.length;for(t=64;n>=t;t+=64)a(this._state,u(this._buff.substring(t-64,t)));return this._buff=this._buff.substr(t-64),this},_.prototype.end=function(e){var t,n,r=this._buff,o=r.length,i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;o>t;t+=1)i[t>>2]|=r.charCodeAt(t)<<(t%4<<3);return this._finish(i,o),n=e?this._state:p(this._state),this.reset(),n},_.prototype._finish=function(e,t){var n,r,o,i=t;if(e[i>>2]|=128<<(i%4<<3),i>55)for(a(this._state,e),i=0;16>i;i+=1)e[i]=0;n=8*this._length,n=n.toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(n[2],16),o=parseInt(n[1],16)||0,e[14]=r,e[15]=o,a(this._state,e)},_.prototype.reset=function(){return this._buff="",this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},_.prototype.destroy=function(){delete this._state,delete this._buff,delete this._length},_.hash=function(e,t){/[\u0080-\uFFFF]/.test(e)&&(e=unescape(encodeURIComponent(e)));var n=f(e);return t?n:p(n)},_.hashBinary=function(e,t){var n=f(e);return t?n:p(n)},_.ArrayBuffer=function(){this.reset()},_.ArrayBuffer.prototype.append=function(e){var t,n=this._concatArrayBuffer(this._buff,e),r=n.length;for(this._length+=e.byteLength,t=64;r>=t;t+=64)a(this._state,c(n.subarray(t-64,t)));return this._buff=r>t-64?n.subarray(t-64):new Uint8Array(0),this},_.ArrayBuffer.prototype.end=function(e){var t,n,r=this._buff,o=r.length,i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;o>t;t+=1)i[t>>2]|=r[t]<<(t%4<<3);return this._finish(i,o),n=e?this._state:p(this._state),this.reset(),n},_.ArrayBuffer.prototype._finish=_.prototype._finish,_.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},_.ArrayBuffer.prototype.destroy=_.prototype.destroy,_.ArrayBuffer.prototype._concatArrayBuffer=function(e,t){var n=e.length,r=new Uint8Array(n+t.byteLength);return r.set(e),r.set(new Uint8Array(t),n),r},_.ArrayBuffer.hash=function(e,t){var n=d(new Uint8Array(e));return t?n:p(n)},_})},{}],93:[function(e,t,n){"use strict";function r(e,t,n){var r=n[n.length-1];e===r.element&&(n.pop(),r=n[n.length-1]);var o=r.element,i=r.index;if(Array.isArray(o))o.push(e);else if(i===t.length-2){var s=t.pop();o[s]=e}else t.push(e)}n.stringify=function(e){var t=[];t.push({obj:e});for(var n,r,o,i,s,a,u,c,f,d,l,h="";n=t.pop();)if(r=n.obj,o=n.prefix||"",i=n.val||"",h+=o,i)h+=i;else if("object"!=typeof r)h+="undefined"==typeof r?null:JSON.stringify(r);else if(null===r)h+="null";else if(Array.isArray(r)){for(t.push({val:"]"}),s=r.length-1;s>=0;s--)a=0===s?"":",",t.push({obj:r[s],prefix:a});t.push({val:"["})}else{u=[];for(c in r)r.hasOwnProperty(c)&&u.push(c);for(t.push({val:"}"}),s=u.length-1;s>=0;s--)f=u[s],d=r[f],l=s>0?",":"",l+=JSON.stringify(f)+":",t.push({obj:d,prefix:l});t.push({val:"{"})}return h},n.parse=function(e){for(var t,n,o,i,s,a,u,c,f,d=[],l=[],h=0;;)if(t=e[h++],"}"!==t&&"]"!==t&&"undefined"!=typeof t)switch(t){case" ":case" ":case"\n":case":":case",":break;case"n":h+=3,r(null,d,l);break;case"t":h+=3,r(!0,d,l);break;case"f":h+=4,r(!1,d,l);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",h--;;){if(o=e[h++],!/[\d\.\-e\+]/.test(o)){h--;break}n+=o}r(parseFloat(n),d,l);break;case'"':for(i="",s=void 0,a=0;;){if(u=e[h++],'"'===u&&("\\"!==s||a%2!==1))break;i+=u,s=u,"\\"===s?a++:a=0}r(JSON.parse('"'+i+'"'),d,l);break;case"[":c={element:[],index:d.length},d.push(c.element),l.push(c);break;case"{":f={element:{},index:d.length},d.push(f.element),l.push(f);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===d.length)return d.pop();r(d.pop(),d,l)}}},{}],94:[function(e,t,n){"use strict";var r=e(75);t.exports=r,r.ajax=e(25),r.utils=e(78),r.Errors=e(48),r.replicate=e(72).replicate,r.sync=e(76),r.version=e(79);var o=e(3);r.adapter("http",o),r.adapter("https",o),r.plugin(e(63));var i=e(2);Object.keys(i).forEach(function(e){r.adapter(e,i[e],!0)})},{2:2,25:25,3:3,48:48,63:63,72:72,75:75,76:76,78:78,79:79}]},{},[94])(94)}); diff --git a/src/assets/js/pouchdb-5.4.4.min.js b/src/assets/js/pouchdb-5.4.4.min.js new file mode 100644 index 00000000..0e7754c4 --- /dev/null +++ b/src/assets/js/pouchdb-5.4.4.min.js @@ -0,0 +1,11 @@ +// PouchDB 5.4.4 +// +// (c) 2012-2016 Dale Harvey and the PouchDB team +// PouchDB may be freely distributed under the Apache license, version 2.0. +// For all details and documentation: +// http://pouchdb.com +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.PouchDB=e()}}(function(){var e;return function t(e,n,r){function o(a,s){if(!n[a]){if(!e[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[a]={exports:{}};e[a][0].call(f.exports,function(t){var n=e[a][1][t];return o(n?n:t)},f,f.exports,t,e,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;ae||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,n,r,i,u,c;if(this._events||(this._events={}),"error"===e&&(!this._events.error||a(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(n=this._events[e],s(n))return!1;if(o(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:i=Array.prototype.slice.call(arguments,1),n.apply(this,i)}else if(a(n))for(i=Array.prototype.slice.call(arguments,1),c=n.slice(),r=c.length,u=0;r>u;u++)c[u].apply(this,i);return!0},r.prototype.addListener=function(e,t){var n;if(!o(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,o(t.listener)?t.listener:t),this._events[e]?a(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,a(this._events[e])&&!this._events[e].warned&&(n=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,n&&n>0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function n(){this.removeListener(e,n),r||(r=!0,t.apply(this,arguments))}if(!o(t))throw TypeError("listener must be a function");var r=!1;return n.listener=t,this.on(e,n),this},r.prototype.removeListener=function(e,t){var n,r,i,s;if(!o(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],i=n.length,r=-1,n===t||o(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(a(n)){for(s=i;s-- >0;)if(n[s]===t||n[s].listener&&n[s].listener===t){r=s;break}if(0>r)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],o(n))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?o(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(o(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(e,t,n){function r(){d&&f&&(d=!1,f.length?l=f.concat(l):h=-1,l.length&&o())}function o(){if(!d){var e=s(r);d=!0;for(var t=l.length;t;){for(f=l,l=[];++h1)for(var n=1;nn;n++)t[n]=c(e[n]);return t}if(e instanceof Date)return e.toISOString();if(i(e))return s(e);if(!u(e))return e;t={};for(n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var o=c(e[n]);"undefined"!=typeof o&&(t[n]=o)}return t}function f(e){var t=!1;return gr(function(n){if(t)throw new Error("once called more than once");t=!0,e.apply(this,n)})}function l(e){return gr(function(t){t=c(t);var r,o=this,i="function"==typeof t[t.length-1]?t.pop():!1;i&&(r=function(e,t){n.nextTick(function(){i(e,t)})});var a=new qr(function(n,r){var i;try{var a=f(function(e,t){e?r(e):n(t)});t.push(a),i=e.apply(o,t),i&&"function"==typeof i.then&&n(i)}catch(s){r(s)}});return r&&a.then(function(e){r(null,e)},r),a})}function d(e,t){function n(e,t,n){if(Tr.enabled){for(var r=[e._db_name,t],o=0;or;r++){var i=t[r];i in e&&(n[i]=e[i])}return n}function p(e){return e}function v(e){return[{ok:e}]}function y(e,t,n){function r(){var e=[];d.forEach(function(t){t.docs.forEach(function(n){e.push({id:t.id,docs:[n]})})}),n(null,{results:e})}function o(){++l===f&&r()}function i(e,t,n){d[e]={id:t,docs:n},o()}function a(){if(!(_>=y.length)){var e=Math.min(_+Or,y.length),t=y.slice(_,e);s(t,_),_+=t.length}}function s(n,r){n.forEach(function(n,o){var s=r+o,u=c[n],f=h(u[0],["atts_since","attachments"]);f.open_revs=u.map(function(e){return e.rev}),f.open_revs=f.open_revs.filter(p);var l=p;0===f.open_revs.length&&(delete f.open_revs,l=v),["revs","attachments","binary","ajax"].forEach(function(e){e in t&&(f[e]=t[e])}),e.get(n,f,function(e,t){var r;r=e?[{error:e}]:l(t),i(s,n,r),a()})})}var u=t.docs,c={};u.forEach(function(e){e.id in c?c[e.id].push(e):c[e.id]=[e]});var f=Object.keys(c).length,l=0,d=new Array(f),y=Object.keys(c),_=0;a()}function _(){return"undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage&&"undefined"!=typeof chrome.storage.local}function m(){return hr}function g(e){_()?chrome.storage.onChanged.addListener(function(t){null!=t.db_name&&e.emit(t.dbName.newValue)}):m()&&("undefined"!=typeof addEventListener?addEventListener("storage",function(t){e.emit(t.key)}):window.attachEvent("storage",function(t){e.emit(t.key)}))}function b(){br.EventEmitter.call(this),this._listeners={},g(this)}function w(e){if("undefined"!==console&&e in console){var t=Array.prototype.slice.call(arguments,1);console[e].apply(console,t)}}function E(e,t){var n=6e5;e=parseInt(e,10)||0,t=parseInt(t,10),t!==t||e>=t?t=(e||1)<<1:t+=1,t>n&&(e=n>>1,t=n);var r=Math.random(),o=t-e;return~~(o*r+e)}function S(e){var t=0;return e||(t=2e3),E(e,t)}function k(e,t){w("info","The above "+e+" is totally normal. "+t)}function q(e){Error.call(this,e.reason),this.status=e.status,this.name=e.error,this.message=e.reason,this.error=!0}function x(e,t,n){function r(t){for(var r in e)"function"!=typeof e[r]&&(this[r]=e[r]);void 0!==n&&(this.name=n),void 0!==t&&(this.reason=t)}return r.prototype=q.prototype,new r(t)}function A(e){var t,n,r,o,i;return n=e.error===!0&&"string"==typeof e.name?e.name:e.error,i=e.reason,r=no("name",n,i),e.missing||"missing"===i||"deleted"===i||"not_found"===n?r=Ir:"doc_validation"===n?(r=Kr,o=i):"bad_request"===n&&r.message!==i&&(r=Jr),r||(r=no("status",e.status,i)||Fr),t=x(r,i,n),o&&(t.message=o),e.id&&(t.id=e.id),e.status&&(t.status=e.status),e.missing&&(t.missing=e.missing),t}function T(e,t,n){try{return!e(t,n)}catch(r){var o="Filter function threw: "+r.toString();return x(Jr,o)}}function O(e){var t={},n=e.filter&&"function"==typeof e.filter;return t.query=e.query_params,function(r){r.doc||(r.doc={});var o=n&&T(e.filter,r.doc,t);if("object"==typeof o)return o;if(o)return!1;if(e.include_docs){if(!e.attachments)for(var i in r.doc._attachments)r.doc._attachments.hasOwnProperty(i)&&(r.doc._attachments[i].stub=!0)}else delete r.doc;return!0}}function j(e){for(var t=[],n=0,r=e.length;r>n;n++)t=t.concat(e[n]);return t}function C(e){var t;if(e?"string"!=typeof e?t=x(Rr):/^_/.test(e)&&!/^_(design|local)/.test(e)&&(t=x(Br)):t=x(Nr),t)throw t}function L(e,t){return"listenerCount"in e?e.listenerCount(t):br.EventEmitter.listenerCount(e,t)}function I(e){if(!e)return null;var t=e.split("/");return 2===t.length?t:1===t.length?[e,e]:null}function D(e){var t=I(e);return t?t.join("/"):null}function R(e){for(var t=ao.exec(e),n={},r=14;r--;){var o=ro[r],i=t[r]||"",a=-1!==["user","password"].indexOf(o);n[o]=a?decodeURIComponent(i):i}return n[oo]={},n[ro[12]].replace(io,function(e,t,r){t&&(n[oo][t]=r)}),n}function N(e,t,n){return new qr(function(r,o){e.get(t,function(i,a){if(i){if(404!==i.status)return o(i);a={}}var s=a._rev,u=n(a);return u?(u._id=t,u._rev=s,void r(B(e,u,n))):r({updated:!1,rev:s})})})}function B(e,t,n){return e.put(t).then(function(e){return{updated:!0,rev:e.rev}},function(r){if(409!==r.status)throw r;return N(e,t._id,n)})}function M(e){return 0|Math.random()*e}function F(e,t){t=t||so.length;var n="",r=-1;if(e){for(;++rc;c++)i.push({pos:u+1,ids:s[c]});else{var l=!!a[1].deleted,d=a[0];t&&!(r!==l?r:n!==u?u>n:d>t)||(t=d,n=u,r=l)}}return n+"-"+t}function P(e,t){for(var n,r=e.slice();n=r.pop();)for(var o=n.pos,i=n.ids,a=i[2],s=t(0===a.length,o,i[0],n.ctx,i[1]),u=0,c=a.length;c>u;u++)r.push({pos:o+1,ids:a[u],ctx:s})}function H(e,t){return e.pos-t.pos}function K(e){var t=[];P(e,function(e,n,r,o,i){e&&t.push({rev:n+"-"+r,pos:n,opts:i})}),t.sort(H).reverse();for(var n=0,r=t.length;r>n;n++)delete t[n].pos;return t}function J(e){for(var t=U(e),n=K(e.rev_tree),r=[],o=0,i=n.length;i>o;o++){var a=n[o];a.rev===t||a.opts.deleted||r.push(a.rev)}return r}function W(e){var t=[];return P(e.rev_tree,function(e,n,r,o,i){"available"!==i.status||e||(t.push(n+"-"+r),i.status="missing")}),t}function z(e){for(var t,n=[],r=e.slice();t=r.pop();){var o=t.pos,i=t.ids,a=i[0],s=i[1],u=i[2],c=0===u.length,f=t.history?t.history.slice():[];f.push({id:a,opts:s}),c&&n.push({pos:o+1-f.length,ids:f});for(var l=0,d=u.length;d>l;l++)r.push({pos:o+1,ids:u[l],history:f})}return n.reverse()}function X(e,t){return e.pos-t.pos}function G(e,t,n){for(var r,o=0,i=e.length;i>o;)r=o+i>>>1,n(e[r],t)<0?o=r+1:i=r;return o}function V(e,t,n){var r=G(e,t,n);e.splice(r,0,t)}function Q(e,t){for(var n,r,o=t,i=e.length;i>o;o++){var a=e[o],s=[a.id,a.opts,[]];r?(r[2].push(s),r=s):n=r=s}return n}function $(e,t){return e[0]0;){var o=n.pop(),i=o.tree1,a=o.tree2;(i[1].status||a[1].status)&&(i[1].status="available"===i[1].status||"available"===a[1].status?"available":"missing");for(var s=0;ss;s++){var c=e[s];if(c.pos===t.pos&&c.ids[0]===t.ids[0])r=Y(c.ids,t.ids),o.push({pos:c.pos,ids:r.tree}),i=i||r.conflicts,a=!0;else if(n!==!0){var f=c.pos0;){var v=p.pop();if(0!==v.diff)for(var y=v.ids[2],_=0,m=y.length;m>_;_++)p.push({ids:y[_],diff:v.diff-1,parent:v.ids,parentIdx:_});else v.ids[0]===l.ids[0]&&h.push(v)}var g=h[0];g?(r=Y(g.ids,l.ids),g.parent[2][g.parentIdx]=r.tree,o.push({pos:f.pos,ids:f.ids}),i=i||r.conflicts,a=!0):o.push(c)}else o.push(c)}return a||o.push(t),o.sort(X),{tree:o,conflicts:i||"internal_node"}}function ee(e,t){for(var n,r=z(e),o={},i=0,a=r.length;a>i;i++){for(var s=r[i],u=s.ids,c=Math.max(0,u.length-t),f={pos:s.pos+c,ids:Q(u,c)},l=0;c>l;l++){var d=s.pos+l+"-"+u[l].id;o[d]=!0}n=n?Z(n,f,!0).tree:[f]}return P(n,function(e,t,n){delete o[t+"-"+n]}),{tree:n,revs:Object.keys(o)}}function te(e,t,n){var r=Z(e,t),o=ee(r.tree,n);return{tree:o.tree,stemmedRevs:o.revs,conflicts:r.conflicts}}function ne(e,t){for(var n,r=e.slice(),o=t.split("-"),i=parseInt(o[0],10),a=o[1];n=r.pop();){if(n.pos===i&&n.ids[0]===a)return!0;for(var s=n.ids[2],u=0,c=s.length;c>u;u++)r.push({pos:n.pos+1,ids:s[u]})}return!1}function re(e){return e.ids}function oe(e,t){t||(t=U(e));for(var n,r=t.substring(t.indexOf("-")+1),o=e.rev_tree.map(re);n=o.pop();){if(n[0]===r)return!!n[1].deleted;o=o.concat(n[2])}}function ie(e){return/^_local/.test(e)}function ae(e){return wr("return "+e+";",{})}function se(e){return new Function("doc",["var emitted = false;","var emit = function (a, b) {"," emitted = true;","};","var view = "+e+";","view(doc);","if (emitted) {"," return true;","}"].join("\n"))}function ue(e,t){try{e.emit("change",t)}catch(n){w("error",'Error in .on("change", function):',n)}}function ce(e,t,n){function r(){o.cancel()}br.EventEmitter.call(this);var o=this;this.db=e,t=t?c(t):{};var i=t.complete=f(function(t,n){t?L(o,"error")>0&&o.emit("error",t):o.emit("complete",n),o.removeAllListeners(),e.removeListener("destroyed",r)});n&&(o.on("complete",function(e){n(null,e)}),o.on("error",n)),e.once("destroyed",r),t.onChange=function(e){t.isCancelled||(ue(o,e),o.startSeq&&o.startSeq<=e.seq&&(o.startSeq=!1))};var a=new qr(function(e,n){t.complete=function(t,r){t?n(t):e(r)}});o.once("cancel",function(){e.removeListener("destroyed",r),t.complete(null,{status:"cancelled"})}),this.then=a.then.bind(a),this["catch"]=a["catch"].bind(a),this.then(function(e){i(null,e)},i),e.taskqueue.isReady?o.doChanges(t):e.taskqueue.addTask(function(){o.isCancelled?o.emit("cancel"):o.doChanges(t)})}function fe(e,t,n){var r=[{rev:e._rev}];"all_docs"===n.style&&(r=K(t.rev_tree).map(function(e){return{rev:e.rev}}));var o={id:t.id,changes:r,doc:e};return oe(t,e._rev)&&(o.deleted=!0),n.conflicts&&(o.doc._conflicts=J(t),o.doc._conflicts.length||delete o.doc._conflicts),o}function le(e,t){return t>e?-1:e>t?1:0}function de(e,t){for(var n=0;n0?t.keys.slice(t.skip):t.keys;if(t.descending&&r.reverse(),!r.length)return e._allDocs({limit:0},n);var o={offset:t.skip};return qr.all(r.map(function(n){var r=pr.extend({key:n,deleted:"ok"},t);return["limit","skip","keys"].forEach(function(e){delete r[e]}),new qr(function(t,i){e._allDocs(r,function(e,r){return e?i(e):(o.total_rows=r.total_rows,void t(r.rows[0]||{key:n,error:"not_found"}))})})})).then(function(e){return o.rows=e,o})}function me(e){var t=e._compactionQueue[0],r=t.opts,o=t.callback;e.get("_local/compaction")["catch"](function(){return!1}).then(function(t){t&&t.last_seq&&(r.last_seq=t.last_seq),e._compact(r,function(t,r){t?o(t):o(null,r),n.nextTick(function(){e._compactionQueue.shift(),e._compactionQueue.length&&me(e)})})})}function ge(e){return"_"===e.charAt(0)?e+"is not a valid attachment name, attachment names cannot start with '_'":!1}function be(){br.EventEmitter.call(this)}function we(){this.isReady=!1,this.failed=!1,this.queue=[]}function Ee(e){e&&r.debug&&w("error",e)}function Se(e,t){function n(){i.emit("destroyed",o)}function r(){e.removeListener("destroyed",n),e.emit("destroyed",e)}var o=t.originalName,i=e.constructor,a=i._destructionListeners;e.once("destroyed",n),a.has(o)||a.set(o,[]),a.get(o).push(r)}function ke(e,t,n){if(!(this instanceof ke))return new ke(e,t,n);var r=this;if("function"!=typeof t&&"undefined"!=typeof t||(n=t,t={}),e&&"object"==typeof e&&(t=e,e=void 0),"undefined"==typeof n)n=Ee;else{var o=n;n=function(){return w("warn","Using a callback for new PouchDB()is deprecated."),o.apply(null,arguments)}}e=e||t.name,t=c(t),delete t.name,this.__opts=t;var i=n;r.auto_compaction=t.auto_compaction,r.prefix=ke.prefix,be.call(r),r.taskqueue=new we;var a=new qr(function(o,i){n=function(e,t){return e?i(e):(delete t.then,void o(t))},t=c(t);var a,s;return function(){try{if("string"!=typeof e)throw s=new Error("Missing/invalid DB name"),s.code=400,s;var n=(t.prefix||"")+e;if(a=ke.parseAdapter(n,t),t.originalName=e,t.name=a.name,t.adapter=t.adapter||a.adapter,r._adapter=t.adapter,vr("pouchdb:adapter")("Picked adapter: "+t.adapter),r._db_name=e,!ke.adapters[t.adapter])throw s=new Error("Adapter is missing"),s.code=404,s;if(!ke.adapters[t.adapter].valid())throw s=new Error("Invalid Adapter"),s.code=404,s}catch(o){r.taskqueue.fail(o)}}(),s?i(s):(r.adapter=t.adapter,r.replicate={},r.replicate.from=function(e,t,n){return r.constructor.replicate(e,r,t,n)},r.replicate.to=function(e,t,n){return r.constructor.replicate(r,e,t,n)},r.sync=function(e,t,n){return r.constructor.sync(r,e,t,n)},r.replicate.sync=r.sync,void ke.adapters[t.adapter].call(r,t,function(e){return e?(r.taskqueue.fail(e),void n(e)):(Se(r,t),r.emit("created",r),ke.emit("created",t.originalName),r.taskqueue.ready(r),void n(null,r))}))});a.then(function(e){i(null,e)},i),r.then=a.then.bind(a),r["catch"]=a["catch"].bind(a)}function qe(e){Object.keys(br.EventEmitter.prototype).forEach(function(t){"function"==typeof br.EventEmitter.prototype[t]&&(e[t]=uo[t].bind(uo))});var t=e._destructionListeners=new mr.Map;e.on("destroyed",function(e){t.get(e).forEach(function(e){e()}),t["delete"](e)})}function xe(e){return e.reduce(function(e,t){return e[t]=!0,e},{})}function Ae(e){if(!/^\d+\-./.test(e))return x($r);var t=e.indexOf("-"),n=e.substring(0,t),r=e.substring(t+1);return{prefix:parseInt(n,10),id:r}}function Te(e,t){for(var n=e.start-e.ids.length+1,r=e.ids,o=[r[0],t,[]],i=1,a=r.length;a>i;i++)o=[r[i],{status:"missing"},[o]];return[{pos:n,ids:o}]}function Oe(e,t){var n,r,o,i={status:"available"};if(e._deleted&&(i.deleted=!0),t)if(e._id||(e._id=F()),r=F(32,16).toLowerCase(),e._rev){if(o=Ae(e._rev),o.error)return o;e._rev_tree=[{pos:o.prefix,ids:[o.id,{status:"missing"},[[r,i,[]]]]}],n=o.prefix+1}else e._rev_tree=[{pos:1,ids:[r,i,[]]}],n=1;else if(e._revisions&&(e._rev_tree=Te(e._revisions,i),n=e._revisions.start,r=e._revisions.ids[0]),!e._rev_tree){if(o=Ae(e._rev),o.error)return o;n=o.prefix,r=o.id,e._rev_tree=[{pos:n,ids:[r,i,[]]}]}C(e._id),e._rev=n+"-"+r;var a={metadata:{},data:{}};for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s)){var u="_"===s[0];if(u&&!lo[s]){var c=x(Kr,s);throw c.message=Kr.message+": "+s,c}u&&!ho[s]?a.metadata[s.slice(1)]=e[s]:a.data[s]=e[s]}return a}function je(e){for(var t="",n=new Uint8Array(e),r=n.byteLength,o=0;r>o;o++)t+=String.fromCharCode(n[o]);return t}function Ce(e){return vo(je(e))}function Le(e,t){e=e||[],t=t||{};try{return new Blob(e,t)}catch(n){if("TypeError"!==n.name)throw n;for(var r="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,o=new r,i=0;io;o++)r[o]=e.charCodeAt(o);return n}function De(e,t){return Le([Ie(e)],{type:t})}function Re(e,t){return De(po(e),t)}function Ne(e,t){if("undefined"==typeof FileReader)return t(je((new FileReaderSync).readAsArrayBuffer(e)));var n=new FileReader,r="function"==typeof n.readAsBinaryString;n.onloadend=function(e){var n=e.target.result||"";return r?t(n):void t(je(n))},r?n.readAsBinaryString(e):n.readAsArrayBuffer(e)}function Be(e,t){Ne(e,function(e){t(vo(e))})}function Me(e,t){if("undefined"==typeof FileReader)return t((new FileReaderSync).readAsArrayBuffer(e));var n=new FileReader;n.onloadend=function(e){var n=e.target.result||new ArrayBuffer(0);t(n)},n.readAsArrayBuffer(e)}function Fe(e){return vo(e)}function Ue(e,t,n,r){(n>0||r0||rs)c(u,e,r,o),yo(n);else{c(u,e,r,o);var f=u.end(!0),l=Fe(f);t(l),u.destroy()}}var r="string"==typeof e,o=r?e.length:e.byteLength,i=Math.min(_o,o),a=Math.ceil(o/i),s=0,u=r?new Er:new Er.ArrayBuffer,c=r?Pe:Ue;n()}function Ke(e){return Er.hash(e)}function Je(e,t,n){function r(e){try{return po(e)}catch(t){var n=x(Ur,"Attachment is not a valid base64 string");return{error:n}}}function o(e,n){if(e.stub)return n();if("string"==typeof e.data){var o=r(e.data);if(o.error)return n(o.error);e.length=o.length,"blob"===t?e.data=De(o,e.content_type):"base64"===t?e.data=vo(o):e.data=o,He(o,function(t){e.digest="md5-"+t,n()})}else Me(e.data,function(r){"binary"===t?e.data=je(r):"base64"===t&&(e.data=Ce(r)),He(r,function(t){e.digest="md5-"+t,e.length=r.byteLength,n()})})}function i(){s++,e.length===s&&(a?n(a):n())}if(!e.length)return n();var a,s=0;e.forEach(function(e){function t(e){a=e,r++,r===n.length&&i()}var n=e.data&&e.data._attachments?Object.keys(e.data._attachments):[],r=0;if(!n.length)return i();for(var s in e.data._attachments)e.data._attachments.hasOwnProperty(s)&&o(e.data._attachments[s],t)})}function We(e,t,n,r,o,i,a,s){if(ne(t.rev_tree,n.metadata.rev))return r[o]=n,i();var u=t.winningRev||U(t),c="deleted"in t?t.deleted:oe(t,u),f="deleted"in n.metadata?n.metadata.deleted:oe(n.metadata),l=/^1-/.test(n.metadata.rev);if(c&&!f&&s&&l){var d=n.data;d._rev=u,d._id=n.metadata.id,n=Oe(d,s)}var h=te(t.rev_tree,n.metadata.rev_tree[0],e),p=s&&(c&&f||!c&&"new_leaf"!==h.conflicts||c&&!f&&"new_branch"===h.conflicts);if(p){var v=x(Dr);return r[o]=v,i()}var y=n.metadata.rev;n.metadata.rev_tree=h.tree,n.stemmedRevs=h.stemmedRevs||[],t.rev_map&&(n.metadata.rev_map=t.rev_map);var _,m=U(n.metadata),g=oe(n.metadata,m),b=c===g?0:g>c?-1:1;_=y===m?g:oe(n.metadata,y),a(n,m,g,_,!0,b,o,i)}function ze(e){return"missing"===e.metadata.rev_tree[0].ids[1].status}function Xe(e,t,n,r,o,i,a,s,u){function c(e,t,n){var r=U(e.metadata),o=oe(e.metadata,r);if("was_delete"in s&&o)return i[t]=x(Ir,"deleted"),n();var u=l&&ze(e);if(u){var c=x(Dr);return i[t]=c,n()}var f=o?0:1;a(e,r,o,o,!1,f,t,n)}function f(){++h===p&&u&&u()}e=e||1e3;var l=s.new_edits,d=new mr.Map,h=0,p=t.length;t.forEach(function(e,t){if(e._id&&ie(e._id)){var r=e._deleted?"_removeLocal":"_putLocal";return void n[r](e,{ctx:o},function(e,n){i[t]=e||n,f()})}var a=e.metadata.id;d.has(a)?(p--,d.get(a).push([e,t])):d.set(a,[[e,t]])}),d.forEach(function(t,n){function o(){++ur;r++){var i=k[r];if(i._id&&ie(i._id))e();else{var a=g.get(i.metadata.id);a.onsuccess=t}}}function f(){L||(i.notify(r._meta.name),r._meta.docCount+=q,a(null,j))}function l(e,t){var n=w.get(e);n.onsuccess=function(n){if(n.target.result)t();else{var r=x(Zr,"unknown stub attachment with digest "+e);r.status=412,t(r)}}}function d(e){function t(){++o===n.length&&e(r)}var n=[];if(k.forEach(function(e){e.data&&e.data._attachments&&Object.keys(e.data._attachments).forEach(function(t){var r=e.data._attachments[t];r.stub&&n.push(r.digest)})}),!n.length)return e();var r,o=0;n.forEach(function(e){l(e,function(e){e&&!r&&(r=e),t()})})}function h(e,t,n,r,o,i,a,s){q+=i,e.metadata.winningRev=t,e.metadata.deleted=n;var u=e.data;u._id=e.metadata.id,u._rev=e.metadata.rev,r&&(u._deleted=!0);var c=u._attachments&&Object.keys(u._attachments).length;return c?v(e,t,n,o,a,s):void p(e,t,n,o,a,s)}function p(e,t,n,o,i,a){function s(i){var a=e.stemmedRevs||[];o&&r.auto_compaction&&(a=a.concat(W(e.metadata))),a&&a.length&&at(a,e.metadata.id,m),l.seq=i.target.result,delete l.rev;var s=et(l,t,n),u=g.put(s);u.onsuccess=c}function u(e){e.preventDefault(),e.stopPropagation();var t=b.index("_doc_id_rev"),n=t.getKey(f._doc_id_rev);n.onsuccess=function(e){var t=b.put(f,e.target.result);t.onsuccess=s}}function c(){j[i]={ok:!0,id:l.id,rev:t},C.set(e.metadata.id,e.metadata),y(e,l.seq,a)}var f=e.data,l=e.metadata;f._doc_id_rev=l.id+"::"+l.rev,delete f._id,delete f._rev;var d=b.put(f);d.onsuccess=s,d.onerror=u}function v(e,t,n,r,o,i){function a(){c===f.length&&p(e,t,n,r,o,i)}function s(){c++,a()}var u=e.data,c=0,f=Object.keys(u._attachments);f.forEach(function(n){var r=e.data._attachments[n];if(r.stub)c++,a();else{var o=r.data;delete r.data,r.revpos=parseInt(t,10);var i=r.digest;_(i,o,s)}})}function y(e,t,n){function r(){++i===a.length&&n()}function o(n){var o=e.data._attachments[n].digest,i=E.put({seq:t,digestSeq:o+"::"+t});i.onsuccess=r,i.onerror=function(e){e.preventDefault(),e.stopPropagation(),r()}}var i=0,a=Object.keys(e.data._attachments||{});if(!a.length)return n();for(var s=0;sA;A++){var O=k[A];O._id&&ie(O._id)||(O=k[A]=Oe(O,n.new_edits),O.error&&!S&&(S=O))}if(S)return a(S);var j=new Array(k.length),C=new mr.Map,L=!1,I=r._meta.blobSupport?"blob":"base64";Je(k,I,function(e){return e?a(e):void s()})}function ct(e,t,n,r,o){try{if(e&&t)return o?IDBKeyRange.bound(t,e,!n,!1):IDBKeyRange.bound(e,t,!1,!n);if(e)return o?IDBKeyRange.upperBound(e):IDBKeyRange.lowerBound(e);if(t)return o?IDBKeyRange.lowerBound(t,!n):IDBKeyRange.upperBound(t,!n);if(r)return IDBKeyRange.only(r)}catch(i){return{error:i}}return null}function ft(e,t,n,r){ +return"DataError"===n.name&&0===n.code?r(null,{total_rows:e._meta.docCount,offset:t.skip,rows:[]}):void r(x(Xr,n.name,n.message))}function lt(e,t,n,r){function o(e,r){function o(t,n,r){var o=t.id+"::"+r;S.get(o).onsuccess=function(r){n.doc=nt(r.target.result),e.conflicts&&(n.doc._conflicts=J(t)),ot(n.doc,e,g)}}function i(t,n,r){var i={id:r.id,key:r.id,value:{rev:n}},a=r.deleted;if("ok"===e.deleted)k.push(i),a?(i.value.deleted=!0,i.doc=null):e.include_docs&&o(r,i,n);else if(!a&&d--<=0&&(k.push(i),e.include_docs&&o(r,i,n),0===--h))return;t["continue"]()}function a(e){q=t._meta.docCount;var n=e.target.result;if(n){var r=tt(n.value),o=r.winningRev;i(n,o,r)}}function s(){r(null,{total_rows:q,offset:e.skip,rows:k})}function u(){e.attachments?it(k,e.binary).then(s):s()}var c="startkey"in e?e.startkey:!1,f="endkey"in e?e.endkey:!1,l="key"in e?e.key:!1,d=e.skip||0,h="number"==typeof e.limit?e.limit:-1,p=e.inclusive_end!==!1,v="descending"in e&&e.descending?"prev":null,y=ct(c,f,p,l,v);if(y&&y.error)return ft(t,e,y.error,r);var _=[go,bo];e.attachments&&_.push(wo);var m=st(n,_,"readonly");if(m.error)return r(m.error);var g=m.txn,b=g.objectStore(go),w=g.objectStore(bo),E=v?b.openCursor(y,v):b.openCursor(y),S=w.index("_doc_id_rev"),k=[],q=0;g.oncomplete=u,E.onsuccess=a}function i(e,n){return 0===e.limit?n(null,{total_rows:t._meta.docCount,offset:e.skip,rows:[]}):void o(e,n)}i(e,r)}function dt(e){return new qr(function(t){var n=Le([""]);e.objectStore(qo).put(n,"key"),e.onabort=function(e){e.preventDefault(),e.stopPropagation(),t(!1)},e.oncomplete=function(){var e=navigator.userAgent.match(/Chrome\/(\d+)/),n=navigator.userAgent.match(/Edge\//);t(n||!e||parseInt(e[1],10)>=43)}})["catch"](function(){return!1})}function ht(e,t){var n=this;xo.queue.push({action:function(t){pt(n,e,t)},callback:t}),Ye(n.constructor)}function pt(e,t,r){function o(e){var t=e.createObjectStore(go,{keyPath:"id"});e.createObjectStore(bo,{autoIncrement:!0}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0}),e.createObjectStore(wo,{keyPath:"digest"}),e.createObjectStore(So,{keyPath:"id",autoIncrement:!1}),e.createObjectStore(qo),t.createIndex("deletedOrLocal","deletedOrLocal",{unique:!1}),e.createObjectStore(ko,{keyPath:"_id"});var n=e.createObjectStore(Eo,{autoIncrement:!0});n.createIndex("seq","seq"),n.createIndex("digestSeq","digestSeq",{unique:!0})}function i(e,t){var n=e.objectStore(go);n.createIndex("deletedOrLocal","deletedOrLocal",{unique:!1}),n.openCursor().onsuccess=function(e){var r=e.target.result;if(r){var o=r.value,i=oe(o);o.deletedOrLocal=i?"1":"0",n.put(o),r["continue"]()}else t()}}function a(e){e.createObjectStore(ko,{keyPath:"_id"}).createIndex("_doc_id_rev","_doc_id_rev",{unique:!0})}function s(e,t){var n=e.objectStore(ko),r=e.objectStore(go),o=e.objectStore(bo),i=r.openCursor();i.onsuccess=function(e){var i=e.target.result;if(i){var a=i.value,s=a.id,u=ie(s),c=U(a);if(u){var f=s+"::"+c,l=s+"::",d=s+"::~",h=o.index("_doc_id_rev"),p=IDBKeyRange.bound(l,d,!1,!1),v=h.openCursor(p);v.onsuccess=function(e){if(v=e.target.result){var t=v.value;t._doc_id_rev===f&&n.put(t),o["delete"](v.primaryKey),v["continue"]()}else r["delete"](i.primaryKey),i["continue"]()}}else i["continue"]()}else t&&t()}}function u(e){var t=e.createObjectStore(Eo,{autoIncrement:!0});t.createIndex("seq","seq"),t.createIndex("digestSeq","digestSeq",{unique:!0})}function f(e,t){var n=e.objectStore(bo),r=e.objectStore(wo),o=e.objectStore(Eo),i=r.count();i.onsuccess=function(e){var r=e.target.result;return r?void(n.openCursor().onsuccess=function(e){var n=e.target.result;if(!n)return t();for(var r=n.value,i=n.primaryKey,a=Object.keys(r._attachments||{}),s={},u=0;uo&&(o=n),t["continue"]()}}function i(){var e=et(s,s.winningRev,s.deleted),t=r.put(e);t.onsuccess=function(){a["continue"]()}}var a=e.target.result;if(a){var s=t(a.value);return s.winningRev=s.winningRev||U(s),s.seq?i():void o()}}}var h=t.name,p=null;e._meta=null,e.type=function(){return"idb"},e._id=l(function(t){t(null,e._meta.instanceId)}),e._bulkDocs=function(n,r,o){ut(t,n,r,e,p,To,o)},e._get=function(e,t,n){function r(){n(a,{doc:o,metadata:i,ctx:s})}var o,i,a,s=t.ctx;if(!s){var u=st(p,[go,bo,wo],"readonly");if(u.error)return n(u.error);s=u.txn}s.objectStore(go).get(e).onsuccess=function(e){if(i=tt(e.target.result),!i)return a=x(Ir,"missing"),r();if(oe(i)&&!t.rev)return a=x(Ir,"deleted"),r();var n=s.objectStore(bo),u=t.rev||i.winningRev,c=i.id+"::"+u;n.index("_doc_id_rev").get(c).onsuccess=function(e){return o=e.target.result,o&&(o=nt(o)),o?void r():(a=x(Ir,"missing"),r())}}},e._getAttachment=function(e,t,n,r,o){var i;if(r.ctx)i=r.ctx;else{var a=st(p,[go,bo,wo],"readonly");if(a.error)return o(a.error);i=a.txn}var s=n.digest,u=n.content_type;i.objectStore(wo).get(s).onsuccess=function(e){var t=e.target.result.body;rt(t,u,r.binary,function(e){o(null,e)})}},e._info=function(t){if(null===p||!Ao.has(h)){var n=new Error("db isn't open");return n.id="idbNull",t(n)}var r,o,i=st(p,[bo],"readonly");if(i.error)return t(i.error);var a=i.txn,s=a.objectStore(bo).openCursor(null,"prev");s.onsuccess=function(t){var n=t.target.result;r=n?n.key:0,o=e._meta.docCount},a.oncomplete=function(){t(null,{doc_count:o,update_seq:r,idb_attachment_format:e._meta.blobSupport?"binary":"base64"})}},e._allDocs=function(t,n){lt(t,e,p,n)},e._changes=function(t){function n(e){function n(){return c.seq!==a?e["continue"]():(u=a,c.winningRev===i._rev?o(i):void r())}function r(){var e=i._id+"::"+c.winningRev,t=_.get(e);t.onsuccess=function(e){o(nt(e.target.result))}}function o(n){var r=t.processChange(n,c,t);r.seq=c.seq;var o=b(r);return"object"==typeof o?t.complete(o):(o&&(g++,l&&m.push(r),t.attachments&&t.include_docs?ot(n,t,d,function(){it([r],t.binary).then(function(){t.onChange(r)})}):t.onChange(r)),void(g!==f&&e["continue"]()))}var i=nt(e.value),a=e.key;if(s&&!s.has(i._id))return e["continue"]();var c;return(c=w.get(i._id))?n():void(y.get(i._id).onsuccess=function(e){c=tt(e.target.result),w.set(i._id,c),n()})}function r(e){var t=e.target.result;t&&n(t)}function o(){var e=[go,bo];t.attachments&&e.push(wo);var n=st(p,e,"readonly");if(n.error)return t.complete(n.error);d=n.txn,d.onabort=Ze(t.complete),d.oncomplete=i,v=d.objectStore(bo),y=d.objectStore(go),_=v.index("_doc_id_rev");var o;o=t.descending?v.openCursor(null,"prev"):v.openCursor(IDBKeyRange.lowerBound(t.since,!0)),o.onsuccess=r}function i(){function e(){t.complete(null,{results:m,last_seq:u})}!t.continuous&&t.attachments?it(m).then(e):e()}if(t=c(t),t.continuous){var a=h+":"+F();return To.addListener(h,a,e,t),To.notify(h),{cancel:function(){To.removeListener(h,a)}}}var s=t.doc_ids&&new mr.Set(t.doc_ids);t.since=t.since||0;var u=t.since,f="limit"in t?t.limit:-1;0===f&&(f=1);var l;l="return_docs"in t?t.return_docs:"returnDocs"in t?t.returnDocs:!0;var d,v,y,_,m=[],g=0,b=O(t),w=new mr.Map;o()},e._close=function(e){return null===p?e(x(Mr)):(p.close(),Ao["delete"](h),p=null,void e())},e._getRevisionTree=function(e,t){var n=st(p,[go],"readonly");if(n.error)return t(n.error);var r=n.txn,o=r.objectStore(go).get(e);o.onsuccess=function(e){var n=tt(e.target.result);n?t(null,n.rev_tree):t(x(Ir))}},e._doCompaction=function(e,t,n){var r=[go,bo,wo,Eo],o=st(p,r,"readwrite");if(o.error)return n(o.error);var i=o.txn,a=i.objectStore(go);a.get(e).onsuccess=function(n){var r=tt(n.target.result);P(r.rev_tree,function(e,n,r,o,i){var a=n+"-"+r;-1!==t.indexOf(a)&&(i.status="missing")}),at(t,e,i);var o=r.winningRev,a=r.deleted;i.objectStore(go).put(et(r,o,a))},i.onabort=Ze(n),i.oncomplete=function(){n()}},e._getLocal=function(e,t){var n=st(p,[ko],"readonly");if(n.error)return t(n.error);var r=n.txn,o=r.objectStore(ko).get(e);o.onerror=Ze(t),o.onsuccess=function(e){var n=e.target.result;n?(delete n._doc_id_rev,t(null,n)):t(x(Ir))}},e._putLocal=function(e,t,n){"function"==typeof t&&(n=t,t={}),delete e._revisions;var r=e._rev,o=e._id;r?e._rev="0-"+(parseInt(r.split("-")[1],10)+1):e._rev="0-1";var i,a=t.ctx;if(!a){var s=st(p,[ko],"readwrite");if(s.error)return n(s.error);a=s.txn,a.onerror=Ze(n),a.oncomplete=function(){i&&n(null,i)}}var u,c=a.objectStore(ko);r?(u=c.get(o),u.onsuccess=function(o){var a=o.target.result;if(a&&a._rev===r){var s=c.put(e);s.onsuccess=function(){i={ok:!0,id:e._id,rev:e._rev},t.ctx&&n(null,i)}}else n(x(Dr))}):(u=c.add(e),u.onerror=function(e){n(x(Dr)),e.preventDefault(),e.stopPropagation()},u.onsuccess=function(){i={ok:!0,id:e._id,rev:e._rev},t.ctx&&n(null,i)})},e._removeLocal=function(e,t,n){"function"==typeof t&&(n=t,t={});var r=t.ctx;if(!r){var o=st(p,[ko],"readwrite");if(o.error)return n(o.error);r=o.txn,r.oncomplete=function(){i&&n(null,i)}}var i,a=e._id,s=r.objectStore(ko),u=s.get(a);u.onerror=Ze(n),u.onsuccess=function(r){var o=r.target.result;o&&o._rev===e._rev?(s["delete"](a),i={ok:!0,id:a,rev:"0-0"},t.ctx&&n(null,i)):n(x(Ir))}},e._destroy=function(e,t){To.removeAllListeners(h);var n=Oo.get(h);n&&n.result&&(n.result.close(),Ao["delete"](h));var r=indexedDB.deleteDatabase(h);r.onsuccess=function(){Oo["delete"](h),m()&&h in localStorage&&delete localStorage[h],t(null,{ok:!0})},r.onerror=Ze(t)};var v=Ao.get(h);if(v)return p=v.idb,e._meta=v.global,void n.nextTick(function(){r(null,e)});var y;y=t.storage?vt(h,t.storage):indexedDB.open(h,mo),Oo.set(h,y),y.onupgradeneeded=function(e){function t(){var e=c[l-1];l++,e&&e(r,t)}var n=e.target.result;if(e.oldVersion<1)return o(n);var r=e.currentTarget.transaction;e.oldVersion<3&&a(n),e.oldVersion<4&&u(n);var c=[i,s,f,d],l=e.oldVersion;t()},y.onsuccess=function(t){p=t.target.result,p.onversionchange=function(){p.close(),Ao["delete"](h)},p.onabort=function(e){w("error","Database has a global failure",e.target.error),p.close(),Ao["delete"](h)};var n=p.transaction([So,qo,go],"readwrite"),o=n.objectStore(So).get(So),i=null,a=null,s=null;o.onsuccess=function(t){var o=function(){null!==i&&null!==a&&null!==s&&(e._meta={name:h,instanceId:s,blobSupport:i,docCount:a},Ao.set(h,{idb:p,global:e._meta}),r(null,e))},u=t.target.result||{id:So};h+"_id"in u?(s=u[h+"_id"],o()):(s=F(),u[h+"_id"]=s,n.objectStore(So).put(u).onsuccess=function(){o()}),fo||(fo=dt(n)),fo.then(function(e){i=e,o()});var c=n.objectStore(go).index("deletedOrLocal");c.count(IDBKeyRange.only("0")).onsuccess=function(e){a=e.target.result,o()}}},y.onerror=function(){var e="Failed to open indexedDB, are you in private browsing mode?";w("error",e),r(x(Xr,e))}}function vt(e,t){try{return indexedDB.open(e,{version:mo,storage:t})}catch(n){return indexedDB.open(e,mo)}}function yt(e){e.adapter("idb",ht,!0)}function _t(e){return decodeURIComponent(escape(e))}function mt(e){return 65>e?e-48:e-55}function gt(e,t,n){for(var r="";n>t;)r+=String.fromCharCode(mt(e.charCodeAt(t++))<<4|mt(e.charCodeAt(t++)));return r}function bt(e,t,n){for(var r="";n>t;)r+=String.fromCharCode(mt(e.charCodeAt(t+2))<<12|mt(e.charCodeAt(t+3))<<8|mt(e.charCodeAt(t))<<4|mt(e.charCodeAt(t+1))),t+=4;return r}function wt(e,t){return"UTF-8"===t?_t(gt(e,0,e.length)):bt(e,0,e.length)}function Et(e){return"'"+e+"'"}function St(e){return e.replace(/\u0002/g,"").replace(/\u0001/g,"").replace(/\u0000/g,"")}function kt(e){return e.replace(/\u0001\u0001/g,"\x00").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,"")}function qt(e){return delete e._id,delete e._rev,JSON.stringify(e)}function xt(e,t,n){return e=JSON.parse(e),e._id=t,e._rev=n,e}function At(e){for(var t="(";e--;)t+="?",e&&(t+=",");return t+")"}function Tt(e,t,n,r,o){return"SELECT "+e+" FROM "+("string"==typeof t?t:t.join(" JOIN "))+(n?" ON "+n:"")+(r?" WHERE "+("string"==typeof r?r:r.join(" AND ")):"")+(o?" ORDER BY "+o:"")}function Ot(e,t,n){function r(){++i===e.length&&o()}function o(){if(a.length){var e="SELECT DISTINCT digest AS digest FROM "+No+" WHERE seq IN "+At(a.length);n.executeSql(e,a,function(e,t){for(var n=[],r=0;r0;){var e=E.pop();e(null,b)}}function h(e,t){if(0===t){var n="CREATE TABLE IF NOT EXISTS "+Ro+" (dbid, db_version INTEGER)",c="CREATE TABLE IF NOT EXISTS "+Io+" (digest UNIQUE, escaped TINYINT(1), body BLOB)",f="CREATE TABLE IF NOT EXISTS "+No+" (digest, seq INTEGER)",l="CREATE TABLE IF NOT EXISTS "+Co+" (id unique, json, winningseq, max_seq INTEGER UNIQUE)",h="CREATE TABLE IF NOT EXISTS "+Lo+" (seq INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, json, deleted TINYINT(1), doc_id, rev)",p="CREATE TABLE IF NOT EXISTS "+Do+" (id UNIQUE, rev, json)";e.executeSql(c),e.executeSql(p),e.executeSql(f,[],function(){e.executeSql(Ko),e.executeSql(Jo)}),e.executeSql(l,[],function(){e.executeSql(Ho),e.executeSql(h,[],function(){e.executeSql(Uo),e.executeSql(Po),e.executeSql(n,[],function(){var t="INSERT INTO "+Ro+" (db_version, dbid) VALUES (?,?)";b=F();var n=[jo,b];e.executeSql(t,n,function(){d()})})})})}else{var v=function(){var n=jo>t;n&&e.executeSql("UPDATE "+Ro+" SET db_version = "+jo);var r="SELECT dbid FROM "+Ro;e.executeSql(r,[],function(e,t){b=t.rows.item(0).dbid,d()})},y=[r,o,i,a,s,u,v],_=t,m=function(e){y[_-1](e,m),_++};m(e)}}function p(){q.transaction(function(e){f(e,function(){v(e)})},jt(t),n)}function v(e){var t="SELECT sql FROM sqlite_master WHERE tbl_name = "+Ro;e.executeSql(t,[],function(e,t){t.rows.length?/db_version/.test(t.rows.item(0).sql)?e.executeSql("SELECT db_version FROM "+Ro,[],function(e,t){var n=t.rows.item(0).db_version;h(e,n)}):e.executeSql("ALTER TABLE "+Ro+" ADD COLUMN db_version INTEGER",[],function(){h(e,1)}):h(e,0)})}function y(e,t){if(-1!==g._docCount)return t(g._docCount);var n=Tt("COUNT("+Co+".id) AS 'num'",[Co,Lo],Wo,Lo+".deleted=0");e.executeSql(n,[],function(e,n){g._docCount=n.rows.item(0).num,t(g._docCount)})}var _,g=this,b=null,w=Ct(e),E=[];g._docCount=-1,g._name=e.name;var S=pr.extend({},e,{version:Fo,description:e.name,size:w}),k=Rt(S);if(k.error)return jt(t)(k.error);var q=k.db;"function"!=typeof q.readTransaction&&(q.readTransaction=q.transaction),p(),g.type=function(){return"websql"},g._id=l(function(e){e(null,b)}),g._info=function(e){q.readTransaction(function(t){y(t,function(n){var r="SELECT MAX(seq) AS seq FROM "+Lo;t.executeSql(r,[],function(t,r){var o=r.rows.item(0).seq||0;e(null,{doc_count:n,update_seq:o,sqlite_plugin:q._sqlitePlugin,websql_encoding:_})})})},jt(e))},g._bulkDocs=function(t,n,r){Lt(e,t,n,g,q,Mo,r)},g._get=function(e,t,n){function r(){n(a,{doc:o,metadata:i,ctx:s})}var o,i,a,s=t.ctx;if(!s)return q.readTransaction(function(r){g._get(e,pr.extend({ctx:r},t),n)});var u,c;t.rev?(u=Tt(zo,[Co,Lo],Co+".id="+Lo+".doc_id",[Lo+".doc_id=?",Lo+".rev=?"]),c=[e,t.rev]):(u=Tt(zo,[Co,Lo],Wo,Co+".id=?"),c=[e]),s.executeSql(u,c,function(e,n){if(!n.rows.length)return a=x(Ir,"missing"),r();var s=n.rows.item(0);return i=Ve(s.metadata),s.deleted&&!t.rev?(a=x(Ir,"deleted"),r()):(o=xt(s.data,i.id,s.rev),void r())})},g._allDocs=function(e,t){var n,r=[],o="startkey"in e?e.startkey:!1,i="endkey"in e?e.endkey:!1,a="key"in e?e.key:!1,s="descending"in e?e.descending:!1,u="limit"in e?e.limit:-1,c="skip"in e?e.skip:0,f=e.inclusive_end!==!1,l=[],d=[];if(a!==!1)d.push(Co+".id = ?"),l.push(a);else if(o!==!1||i!==!1){if(o!==!1&&(d.push(Co+".id "+(s?"<=":">=")+" ?"),l.push(o)),i!==!1){var h=s?">":"<";f&&(h+="="),d.push(Co+".id "+h+" ?"),l.push(i)}a!==!1&&(d.push(Co+".id = ?"),l.push(a))}"ok"!==e.deleted&&d.push(Lo+".deleted = 0"),q.readTransaction(function(t){y(t,function(o){if(n=o,0!==u){var i=Tt(zo,[Co,Lo],Wo,d,Co+".id "+(s?"DESC":"ASC"));i+=" LIMIT "+u+" OFFSET "+c,t.executeSql(i,l,function(t,n){for(var o=0,i=n.rows.length;i>o;o++){var a=n.rows.item(o),s=Ve(a.metadata),u=s.id,c=xt(a.data,u,a.rev),f=c._rev,l={id:u,key:u,value:{rev:f}};if(e.include_docs&&(l.doc=c,l.doc._rev=f,e.conflicts&&(l.doc._conflicts=J(s)),Nt(l.doc,e,g,t)),a.deleted){if("ok"!==e.deleted)continue;l.value.deleted=!0,l.doc=null}r.push(l)}})}})},jt(t),function(){t(null,{total_rows:n,offset:e.skip,rows:r})})},g._changes=function(e){function t(){var t=Co+".json AS metadata, "+Co+".max_seq AS maxSeq, "+Lo+".json AS winningDoc, "+Lo+".rev AS winningRev ",n=Co+" JOIN "+Lo,u=Co+".id="+Lo+".doc_id AND "+Co+".winningseq="+Lo+".seq",c=["maxSeq > ?"],f=[e.since];e.doc_ids&&(c.push(Co+".id IN "+At(e.doc_ids.length)),f=f.concat(e.doc_ids));var l="maxSeq "+(r?"DESC":"ASC"),d=Tt(t,n,u,c,l),h=O(e);e.view||e.filter||(d+=" LIMIT "+o);var p=e.since||0;q.readTransaction(function(t){t.executeSql(d,f,function(t,n){function r(t){return function(){e.onChange(t)}}for(var u=0,c=n.rows.length;c>u;u++){var f=n.rows.item(u),l=Ve(f.metadata);p=f.maxSeq;var d=xt(f.winningDoc,l.id,f.winningRev),v=e.processChange(d,l,e);v.seq=f.maxSeq;var y=h(v);if("object"==typeof y)return e.complete(y);if(y&&(s++,i&&a.push(v),e.attachments&&e.include_docs?Nt(d,e,g,t,r(v)):r(v)()),s===o)break}})},jt(e.complete),function(){e.continuous||e.complete(null,{results:a,last_seq:p})})}if(e=c(e),e.continuous){var n=g._name+":"+F();return Mo.addListener(g._name,n,g,e),Mo.notify(g._name),{cancel:function(){Mo.removeListener(g._name,n)}}}var r=e.descending;e.since=e.since&&!r?e.since:0;var o="limit"in e?e.limit:-1;0===o&&(o=1);var i;i="return_docs"in e?e.return_docs:"returnDocs"in e?e.returnDocs:!0;var a=[],s=0;t()},g._close=function(e){e()},g._getAttachment=function(e,t,n,r,o){var i,a=r.ctx,s=n.digest,u=n.content_type,c="SELECT escaped, CASE WHEN escaped = 1 THEN body ELSE HEX(body) END AS body FROM "+Io+" WHERE digest=?";a.executeSql(c,[s],function(e,t){var n=t.rows.item(0),a=n.escaped?kt(n.body):wt(n.body,_);i=r.binary?De(a,u):vo(a),o(null,i)})},g._getRevisionTree=function(e,t){q.readTransaction(function(n){var r="SELECT json AS metadata FROM "+Co+" WHERE id = ?";n.executeSql(r,[e],function(e,n){if(n.rows.length){var r=Ve(n.rows.item(0).metadata);t(null,r.rev_tree)}else t(x(Ir))})})},g._doCompaction=function(e,t,n){return t.length?void q.transaction(function(n){var r="SELECT json AS metadata FROM "+Co+" WHERE id = ?";n.executeSql(r,[e],function(n,r){var o=Ve(r.rows.item(0).metadata);P(o.rev_tree,function(e,n,r,o,i){var a=n+"-"+r;-1!==t.indexOf(a)&&(i.status="missing")});var i="UPDATE "+Co+" SET json = ? WHERE id = ?";n.executeSql(i,[Qe(o),e])}),Ot(t,e,n)},jt(n),function(){n()}):n()},g._getLocal=function(e,t){q.readTransaction(function(n){var r="SELECT json, rev FROM "+Do+" WHERE id=?";n.executeSql(r,[e],function(n,r){if(r.rows.length){var o=r.rows.item(0),i=xt(o.json,e,o.rev);t(null,i)}else t(x(Ir))})})},g._putLocal=function(e,t,n){function r(e){var r,c;i?(r="UPDATE "+Do+" SET rev=?, json=? WHERE id=? AND rev=?",c=[o,u,a,i]):(r="INSERT INTO "+Do+" (id, rev, json) VALUES (?,?,?)",c=[a,o,u]),e.executeSql(r,c,function(e,r){r.rowsAffected?(s={ok:!0,id:a,rev:o},t.ctx&&n(null,s)):n(x(Dr))},function(){return n(x(Dr)),!1})}"function"==typeof t&&(n=t,t={}),delete e._revisions;var o,i=e._rev,a=e._id;o=i?e._rev="0-"+(parseInt(i.split("-")[1],10)+1):e._rev="0-1";var s,u=qt(e);t.ctx?r(t.ctx):q.transaction(r,jt(n),function(){s&&n(null,s)})},g._removeLocal=function(e,t,n){function r(r){var i="DELETE FROM "+Do+" WHERE id=? AND rev=?",a=[e._id,e._rev];r.executeSql(i,a,function(r,i){return i.rowsAffected?(o={ok:!0,id:e._id,rev:"0-0"},void(t.ctx&&n(null,o))):n(x(Ir))})}"function"==typeof t&&(n=t,t={});var o;t.ctx?r(t.ctx):q.transaction(r,jt(n),function(){o&&n(null,o)})},g._destroy=function(e,t){Mo.removeAllListeners(g._name),q.transaction(function(e){var t=[Co,Lo,Io,Ro,Do,No];t.forEach(function(t){e.executeSql("DROP TABLE IF EXISTS "+t,[])})},jt(t),function(){m()&&(delete window.localStorage["_pouch__websqldb_"+g._name],delete window.localStorage[g._name]),t(null,{ok:!0})})}}function Mt(){try{return openDatabase("_pouch_validate_websql",1,"",1),!0}catch(e){return!1}}function Ft(){if("undefined"==typeof indexedDB||null===indexedDB||!/iP(hone|od|ad)/.test(navigator.userAgent))return!0;var e=m(),t="_pouch__websqldb_valid_"+navigator.userAgent;if(e&&localStorage[t])return"1"===localStorage[t];var n=Mt();return e&&(localStorage[t]=n?"1":"0"),n}function Ut(){return"undefined"!=typeof SQLitePlugin?!0:"undefined"==typeof openDatabase?!1:Ft()}function Pt(e){return function(t,n,r,o){if("undefined"!=typeof sqlitePlugin){var i=pr.extend({},e,{name:t,version:n,description:r,size:o});return sqlitePlugin.openDatabase(i)}return openDatabase(t,n,r,o)}}function Ht(e,t){var n=Pt(e),r=pr.extend({websql:n},e);Bt.call(this,r,t)}function Kt(e){e.adapter("websql",Ht,!0)}function Jt(){for(var e={},t=new qr(function(t,n){e.resolve=t,e.reject=n}),n=new Array(arguments.length),r=0;r0&&(r=setTimeout(function(){n.reject(new Error("Load timeout for resource: "+e.url))},e.timeout)),n.promise.then(function(t){return o={statusCode:t.status},e.timeout>0&&clearTimeout(r),o.statusCode>=200&&o.statusCode<300?e.binary?t.blob():t.text():t.json()}).then(function(e){o.statusCode>=200&&o.statusCode<300?t(null,o,e):t(e,o)})["catch"](function(e){t(e,o)}),{abort:n.reject}}function zt(e,t){var n,r,o=!1,i=function(){n.abort()},a=function(){o=!0,n.abort()};n=e.xhr?new e.xhr:new XMLHttpRequest;try{n.open(e.method,e.url)}catch(s){t(s,{statusCode:413})}n.withCredentials="withCredentials"in e?e.withCredentials:!0,"GET"===e.method?delete e.headers["Content-Type"]:e.json&&(e.headers.Accept="application/json",e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json",e.body&&e.processData&&"string"!=typeof e.body&&(e.body=JSON.stringify(e.body))),e.binary&&(n.responseType="arraybuffer"),"body"in e||(e.body=null);for(var u in e.headers)e.headers.hasOwnProperty(u)&&n.setRequestHeader(u,e.headers[u]);return e.timeout>0&&(r=setTimeout(a,e.timeout),n.onprogress=function(){clearTimeout(r),4!==n.readyState&&(r=setTimeout(a,e.timeout))},"undefined"!=typeof n.upload&&(n.upload.onprogress=n.onprogress)),n.onreadystatechange=function(){if(4===n.readyState){var r={statusCode:n.status};if(n.status>=200&&n.status<300){var i;i=e.binary?Le([n.response||""],{type:n.getResponseHeader("Content-Type")}):n.responseText,t(null,r,i)}else{var a={};if(o)a=new Error("ETIMEDOUT"),r.statusCode=400;else try{a=JSON.parse(n.response)}catch(s){}t(a,r)}}},e.body&&e.body instanceof Blob?Me(e.body,function(e){n.send(e)}):n.send(e.body),{abort:i}}function Xt(){try{return new XMLHttpRequest,!0}catch(e){return!1}}function Gt(e,t){return Xo||e.xhr?zt(e,t):Wt(e,t)}function Vt(){return""}function Qt(e,t){function n(t,n,r){ +if(!e.binary&&e.json&&"string"==typeof t)try{t=JSON.parse(t)}catch(o){return r(o)}Array.isArray(t)&&(t=t.map(function(e){return e.error||e.missing?A(e):e})),e.binary&&Go(t,n),r(null,t,n)}function r(e,t){var n,r;if(e.code&&e.status){var o=new Error(e.message||e.code);return o.status=e.status,t(o)}if(e.message&&"ETIMEDOUT"===e.message)return t(e);try{n=JSON.parse(e.responseText),r=A(n)}catch(i){r=A(e)}t(r)}e=c(e);var o={method:"GET",headers:{},json:!0,processData:!0,timeout:1e4,cache:!1};return e=pr.extend(o,e),e.json&&(e.binary||(e.headers.Accept="application/json"),e.headers["Content-Type"]=e.headers["Content-Type"]||"application/json"),e.binary&&(e.encoding=null,e.json=!1),e.processData||(e.json=!1),Gt(e,function(o,i,a){if(o)return o.status=i?i.statusCode:400,r(o,t);var s,u=i.headers&&i.headers["content-type"],c=a||Vt();if(!e.binary&&(e.json||!e.processData)&&"object"!=typeof c&&(/json/.test(u)||/^[\s]*\{/.test(c)&&/\}[\s]*$/.test(c)))try{c=JSON.parse(c.toString())}catch(f){}i.statusCode>=200&&i.statusCode<300?n(c,i,t):(s=A(c),s.status=i.statusCode,t(s))})}function $t(e,t){var n=navigator&&navigator.userAgent?navigator.userAgent.toLowerCase():"",r=-1!==n.indexOf("safari")&&-1===n.indexOf("chrome"),o=-1!==n.indexOf("msie"),i=-1!==n.indexOf("edge"),a=r||(o||i)&&"GET"===e.method,s="cache"in e?e.cache:!0,u=/^blob:/.test(e.url);if(!u&&(a||!s)){var c=-1!==e.url.indexOf("?");e.url+=(c?"&":"?")+"_nonce="+Date.now()}return Qt(e,t)}function Yt(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach(function(e){var n=t[e];n.data=Re(n.data,n.content_type)})}function Zt(e){return/^_design/.test(e)?"_design/"+encodeURIComponent(e.slice(8)):/^_local/.test(e)?"_local/"+encodeURIComponent(e.slice(7)):encodeURIComponent(e)}function en(e){return e._attachments&&Object.keys(e._attachments)?qr.all(Object.keys(e._attachments).map(function(t){var n=e._attachments[t];return n.data&&"string"!=typeof n.data?new qr(function(e){Be(n.data,e)}).then(function(e){n.data=e}):void 0})):qr.resolve()}function tn(e){var t=R(e);(t.user||t.password)&&(t.auth={username:t.user,password:t.password});var n=t.path.replace(/(^\/|\/$)/g,"").split("/");return t.db=n.pop(),-1===t.db.indexOf("%")&&(t.db=encodeURIComponent(t.db)),t.path=n.join("/"),t}function nn(e,t){return rn(e,e.db+"/"+t)}function rn(e,t){var n=e.path?"/":"";return e.protocol+"://"+e.host+(e.port?":"+e.port:"")+"/"+e.path+n+t}function on(e){return"?"+Object.keys(e).map(function(t){return t+"="+encodeURIComponent(e[t])}).join("&")}function an(e,t){function n(e,t,n){var r=e.ajax||{},o=pr.extend(c(p),r,t);return Zo(o.method+" "+o.url),s._ajax(o,n)}function r(e,t){return new qr(function(r,o){n(e,t,function(e,t){return e?o(e):void r(t)})})}function o(e,t){return d(e,gr(function(e){i().then(function(){return t.apply(this,e)})["catch"](function(t){var n=e.pop();n(t)})}))}function i(){if(e.skipSetup||e.skip_setup)return qr.resolve();if(g)return g;var t={method:"GET",url:l};return g=r({},t)["catch"](function(e){return e&&e.status&&404===e.status?(k(404,"PouchDB is just detecting if the remote exists."),r({},{method:"PUT",url:l})):qr.reject(e)})["catch"](function(e){return e&&e.status&&412===e.status?!0:qr.reject(e)}),g["catch"](function(){g=null}),g}function a(e){return e.split("/").map(encodeURIComponent).join("/")}var s=this,u=tn;e.getHost&&(u=e.getHost);var f=u(e.name,e),l=nn(f,"");e=c(e);var p=e.ajax||{};if(s.getUrl=function(){return l},s.getHeaders=function(){return p.headers||{}},e.auth||f.auth){var v=e.auth||f.auth,_=v.username+":"+v.password,m=vo(unescape(encodeURIComponent(_)));p.headers=p.headers||{},p.headers.Authorization="Basic "+m}s._ajax=$t;var g;setTimeout(function(){t(null,s)}),s.type=function(){return"http"},s.id=o("id",function(e){n({},{method:"GET",url:rn(f,"")},function(t,n){var r=n&&n.uuid?n.uuid+f.db:nn(f,"");e(null,r)})}),s.request=o("request",function(e,t){e.url=nn(f,e.url),n({},e,t)}),s.compact=o("compact",function(e,t){"function"==typeof e&&(t=e,e={}),e=c(e),n(e,{url:nn(f,"_compact"),method:"POST"},function(){function n(){s.info(function(r,o){o&&!o.compact_running?t(null,{ok:!0}):setTimeout(n,e.interval||200)})}n()})}),s.bulkGet=d("bulkGet",function(e,t){function r(t){var r={};e.revs&&(r.revs=!0),e.attachments&&(r.attachments=!0),n({},{url:nn(f,"_bulk_get"+on(r)),method:"POST",body:{docs:e.docs}},t)}function o(){function n(e){return function(n,r){s[e]=r.results,++a===o&&t(null,{results:j(s)})}}for(var r=Qo,o=Math.ceil(e.docs.length/r),a=0,s=new Array(o),u=0;o>u;u++){var c=h(e,["revs","attachments"]);c.ajax=p,c.docs=e.docs.slice(u*r,Math.min(e.docs.length,(u+1)*r)),y(i,c,n(u))}}var i=this,a=rn(f,""),s=$o[a];"boolean"!=typeof s?r(function(e,n){if(e){var r=Math.floor(e.status/100);4===r||5===r?($o[a]=!1,k(e.status,"PouchDB is just detecting if the remote supports the _bulk_get API."),o()):t(e)}else $o[a]=!0,t(null,n)}):s?r(t):o()}),s._info=function(e){i().then(function(){n({},{method:"GET",url:nn(f,"")},function(t,n){return t?e(t):(n.host=nn(f,""),void e(null,n))})})["catch"](e)},s.get=o("get",function(e,t,n){function o(e){var n=e._attachments,o=n&&Object.keys(n);return n&&o.length?qr.all(o.map(function(o){var i=n[o],s=Zt(e._id)+"/"+a(o)+"?rev="+e._rev;return r(t,{method:"GET",url:nn(f,s),binary:!0}).then(function(e){return t.binary?e:new qr(function(t){Be(e,t)})}).then(function(e){delete i.stub,delete i.length,i.data=e})})):void 0}function i(e){return Array.isArray(e)?qr.all(e.map(function(e){return e.ok?o(e.ok):void 0})):o(e)}"function"==typeof t&&(n=t,t={}),t=c(t);var s={};t.revs&&(s.revs=!0),t.revs_info&&(s.revs_info=!0),t.open_revs&&("all"!==t.open_revs&&(t.open_revs=JSON.stringify(t.open_revs)),s.open_revs=t.open_revs),t.rev&&(s.rev=t.rev),t.conflicts&&(s.conflicts=t.conflicts),e=Zt(e);var u={method:"GET",url:nn(f,e+on(s))};r(t,u).then(function(e){return qr.resolve().then(function(){return t.attachments?i(e):void 0}).then(function(){n(null,e)})})["catch"](n)}),s.remove=o("remove",function(e,t,r,o){var i;"string"==typeof t?(i={_id:e,_rev:t},"function"==typeof r&&(o=r,r={})):(i=e,"function"==typeof t?(o=t,r={}):(o=r,r=t));var a=i._rev||r.rev;n(r,{method:"DELETE",url:nn(f,Zt(i._id))+"?rev="+a},o)}),s.getAttachment=o("getAttachment",function(e,t,r,o){"function"==typeof r&&(o=r,r={});var i=r.rev?"?rev="+r.rev:"",s=nn(f,Zt(e))+"/"+a(t)+i;n(r,{method:"GET",url:s,binary:!0},o)}),s.removeAttachment=o("removeAttachment",function(e,t,r,o){var i=nn(f,Zt(e)+"/"+a(t))+"?rev="+r;n({},{method:"DELETE",url:i},o)}),s.putAttachment=o("putAttachment",function(e,t,r,o,i,s){"function"==typeof i&&(s=i,i=o,o=r,r=null);var u=Zt(e)+"/"+a(t),c=nn(f,u);if(r&&(c+="?rev="+r),"string"==typeof o){var l;try{l=po(o)}catch(d){return s(x(Ur,"Attachment is not a valid base64 string"))}o=l?De(l,i):""}var h={headers:{"Content-Type":i},method:"PUT",url:c,processData:!1,body:o,timeout:p.timeout||6e4};n({},h,s)}),s._bulkDocs=function(e,t,r){e.new_edits=t.new_edits,i().then(function(){return qr.all(e.docs.map(en))}).then(function(){n(t,{method:"POST",url:nn(f,"_bulk_docs"),body:e},function(e,t){return e?r(e):(t.forEach(function(e){e.ok=!0}),void r(null,t))})})["catch"](r)},s.allDocs=o("allDocs",function(e,t){"function"==typeof e&&(t=e,e={}),e=c(e);var n,o={},i="GET";e.conflicts&&(o.conflicts=!0),e.descending&&(o.descending=!0),e.include_docs&&(o.include_docs=!0),e.attachments&&(o.attachments=!0),e.key&&(o.key=JSON.stringify(e.key)),e.start_key&&(e.startkey=e.start_key),e.startkey&&(o.startkey=JSON.stringify(e.startkey)),e.end_key&&(e.endkey=e.end_key),e.endkey&&(o.endkey=JSON.stringify(e.endkey)),"undefined"!=typeof e.inclusive_end&&(o.inclusive_end=!!e.inclusive_end),"undefined"!=typeof e.limit&&(o.limit=e.limit),"undefined"!=typeof e.skip&&(o.skip=e.skip);var a=on(o);if("undefined"!=typeof e.keys){var s="keys="+encodeURIComponent(JSON.stringify(e.keys));s.length+a.length+1<=Yo?a+="&"+s:(i="POST",n={keys:e.keys})}r(e,{method:i,url:nn(f,"_all_docs"+a),body:n}).then(function(n){e.include_docs&&e.attachments&&e.binary&&n.rows.forEach(Yt),t(null,n)})["catch"](t)}),s._changes=function(e){var t="batch_size"in e?e.batch_size:Vo;e=c(e),e.timeout="timeout"in e?e.timeout:"timeout"in p?p.timeout:3e4;var r,o=e.timeout?{timeout:e.timeout-5e3}:{},a="undefined"!=typeof e.limit?e.limit:!1;r="return_docs"in e?e.return_docs:"returnDocs"in e?e.returnDocs:!0;var s=a;if(e.style&&(o.style=e.style),(e.include_docs||e.filter&&"function"==typeof e.filter)&&(o.include_docs=!0),e.attachments&&(o.attachments=!0),e.continuous&&(o.feed="longpoll"),e.conflicts&&(o.conflicts=!0),e.descending&&(o.descending=!0),"heartbeat"in e?e.heartbeat&&(o.heartbeat=e.heartbeat):o.heartbeat=1e4,e.filter&&"string"==typeof e.filter&&(o.filter=e.filter),e.view&&"string"==typeof e.view&&(o.filter="_view",o.view=e.view),e.query_params&&"object"==typeof e.query_params)for(var u in e.query_params)e.query_params.hasOwnProperty(u)&&(o[u]=e.query_params[u]);var l,d="GET";if(e.doc_ids){o.filter="_doc_ids";var h=JSON.stringify(e.doc_ids);h.lengtht?t:s;var c={method:d,url:nn(f,"_changes"+on(o)),timeout:e.timeout,body:l};y=r,e.aborted||i().then(function(){v=n(e,c,u)})["catch"](u)}},m={results:[]},g=function(n,o){if(!e.aborted){var i=0;if(o&&o.results){i=o.results.length,m.last_seq=o.last_seq;var u={};u.query=e.query_params,o.results=o.results.filter(function(t){s--;var n=O(e)(t);return n&&(e.include_docs&&e.attachments&&e.binary&&Yt(t),r&&m.results.push(t),e.onChange(t)),n})}else if(n)return e.aborted=!0,void e.complete(n);o&&o.last_seq&&(y=o.last_seq);var c=a&&0>=s||o&&t>i||e.descending;(!e.continuous||a&&0>=s)&&c?e.complete(null,m):setTimeout(function(){_(y,g)},0)}};return _(e.since||0,g),{cancel:function(){e.aborted=!0,v&&v.abort()}}},s.revsDiff=o("revsDiff",function(e,t,r){"function"==typeof t&&(r=t,t={}),n(t,{method:"POST",url:nn(f,"_revs_diff"),body:e},r)}),s._close=function(e){e()},s._destroy=function(e,t){n(e,{url:nn(f,""),method:"DELETE"},function(e,n){return e&&e.status&&404!==e.status?t(e):void t(null,n)})}}function sn(e){e.adapter("http",an,!1),e.adapter("https",an,!1)}function un(){this.promise=new qr(function(e){e()})}function cn(e){var t=e.db,n=e.viewName,r=e.map,o=e.reduce,i=e.temporary,a=r.toString()+(o&&o.toString())+"undefined";if(!i&&t._cachedViews){var s=t._cachedViews[a];if(s)return qr.resolve(s)}return t.info().then(function(e){function s(e){e.views=e.views||{};var t=n;-1===t.indexOf("/")&&(t=n+"/"+n);var r=e.views[t]=e.views[t]||{};if(!r[u])return r[u]=!0,e}var u=e.db_name+"-mrview-"+(i?"temp":Ke(a));return N(t,"_local/mrviews",s).then(function(){return t.registerDependentDatabase(u).then(function(e){var n=e.db;n.auto_compaction=!0;var s={name:u,db:n,sourceDB:t,adapter:t.adapter,mapFun:r,reduceFun:o};return s.db.get("_local/lastSeq")["catch"](function(e){if(404!==e.status)throw e}).then(function(e){return s.seq=e?e.seq:0,i||(t._cachedViews=t._cachedViews||{},t._cachedViews[a]=s,s.db.once("destroyed",function(){delete t._cachedViews[a]})),s})})})})}function fn(e,t,n,r,o,i){return wr("return ("+e.replace(/;\s*$/,"")+");",{emit:t,sum:n,log:r,isArray:o,toJSON:i})}function ln(e){return-1===e.indexOf("/")?[e,e]:e.split("/")}function dn(e){return 1===e.length&&/^1-/.test(e[0].rev)}function hn(e,t){try{e.emit("error",t)}catch(n){w("error","The user's map/reduce function threw an uncaught error.\nYou can debug this error by doing:\nmyDatabase.on('error', function (err) { debugger; });\nPlease double-check your map/reduce function."),w("error",t)}}function pn(e,t,n){try{return{output:t.apply(null,n)}}catch(r){return hn(e,r),{error:r}}}function vn(e,t){var n=kr.collate(e.key,t.key);return 0!==n?n:kr.collate(e.value,t.value)}function yn(e,t,n){return n=n||0,"number"==typeof t?e.slice(n,t+n):n>0?e.slice(n):e}function _n(e){var t=e.value,n=t&&"object"==typeof t&&t._id||e.id;return n}function mn(e){e.rows.forEach(function(e){var t=e.doc&&e.doc._attachments;t&&Object.keys(t).forEach(function(e){var n=t[e];t[e].data=Re(n.data,n.content_type)})})}function gn(e){return function(t){return e.include_docs&&e.attachments&&e.binary&&mn(t),t}}function bn(e){var t="builtin "+e+" function requires map values to be numbers or number arrays";return new Jn(t)}function wn(e){for(var t=0,n=0,r=e.length;r>n;n++){var o=e[n];if("number"!=typeof o){if(!Array.isArray(o))throw bn("_sum");t="number"==typeof t?[t]:t;for(var i=0,a=o.length;a>i;i++){var s=o[i];if("number"!=typeof s)throw bn("_sum");"undefined"==typeof t[i]?t.push(s):t[i]+=s}}else"number"==typeof t?t+=o:t[0]+=o}return t}function En(e,t,n,r){var o=t[e];"undefined"!=typeof o&&(r&&(o=encodeURIComponent(JSON.stringify(o))),n.push(e+"="+o))}function Sn(e){if("undefined"!=typeof e){var t=Number(e);return isNaN(t)||t!==parseInt(e,10)?e:t}}function kn(e){return e.group_level=Sn(e.group_level),e.limit=Sn(e.limit),e.skip=Sn(e.skip),e}function qn(e){if(e){if("number"!=typeof e)return new Hn('Invalid value for integer: "'+e+'"');if(0>e)return new Hn('Invalid value for positive integer: "'+e+'"')}}function xn(e,t){var n=e.descending?"endkey":"startkey",r=e.descending?"startkey":"endkey";if("undefined"!=typeof e[n]&&"undefined"!=typeof e[r]&&kr.collate(e[n],e[r])>0)throw new Hn("No rows can match your key range, reverse your start_key and end_key or set {descending : true}");if(t.reduce&&e.reduce!==!1){if(e.include_docs)throw new Hn("{include_docs:true} is invalid for reduce");if(e.keys&&e.keys.length>1&&!e.group&&!e.group_level)throw new Hn("Multi-key fetches for reduce views must use {group: true}")}["group_level","limit","skip"].forEach(function(t){var n=qn(e[t]);if(n)throw n})}function An(e,t,n){var r,o=[],i="GET";if(En("reduce",n,o),En("include_docs",n,o),En("attachments",n,o),En("limit",n,o),En("descending",n,o),En("group",n,o),En("group_level",n,o),En("skip",n,o),En("stale",n,o),En("conflicts",n,o),En("startkey",n,o,!0),En("start_key",n,o,!0),En("endkey",n,o,!0),En("end_key",n,o,!0),En("inclusive_end",n,o),En("key",n,o,!0),o=o.join("&"),o=""===o?"":"?"+o,"undefined"!=typeof n.keys){var a=2e3,s="keys="+encodeURIComponent(JSON.stringify(n.keys));s.length+o.length+1<=a?o+=("?"===o[0]?"&":"?")+s:(i="POST","string"==typeof t?r={keys:n.keys}:t.keys=n.keys)}if("string"==typeof t){var u=ln(t);return e.request({method:i,url:"_design/"+u[0]+"/_view/"+u[1]+o,body:r}).then(gn(n))}return r=r||{},Object.keys(t).forEach(function(e){Array.isArray(t[e])?r[e]=t[e]:r[e]=t[e].toString()}),e.request({method:"POST",url:"_temp_view"+o,body:r}).then(gn(n))}function Tn(e,t,n){return new qr(function(r,o){e._query(t,n,function(e,t){return e?o(e):void r(t)})})}function On(e){return new qr(function(t,n){e._viewCleanup(function(e,r){return e?n(e):void t(r)})})}function jn(e){return function(t){if(404===t.status)return e;throw t}}function Cn(e,t,n){function r(){return dn(f)?qr.resolve(s):t.db.get(a)["catch"](jn(s))}function o(e){return e.keys.length?t.db.allDocs({keys:e.keys,include_docs:!0}):qr.resolve({rows:[]})}function i(e,t){for(var n=[],r={},o=0,i=t.rows.length;i>o;o++){var a=t.rows[o],s=a.doc;if(s&&(n.push(s),r[s._id]=!0,s._deleted=!c[s._id],!s._deleted)){var u=c[s._id];"value"in u&&(s.value=u.value)}}var f=Object.keys(c);return f.forEach(function(e){if(!r[e]){var t={_id:e},o=c[e];"value"in o&&(t.value=o.value),n.push(t)}}),e.keys=oi(f.concat(e.keys)),n.push(e),n}var a="_local/doc_"+e,s={_id:a,keys:[]},u=n[e],c=u.indexableKeysToKeyValues,f=u.changes;return r().then(function(e){return o(e).then(function(t){return i(e,t)})})}function Ln(e,t,n){var r="_local/lastSeq";return e.db.get(r)["catch"](jn({_id:r,seq:0})).then(function(r){var o=Object.keys(t);return qr.all(o.map(function(n){return Cn(n,e,t)})).then(function(t){var o=j(t);return r.seq=n,o.push(r),e.db.bulkDocs({docs:o})})})}function In(e){var t="string"==typeof e?e:e.name,n=ii[t];return n||(n=ii[t]=new un),n}function Dn(e){return ri(In(e),function(){return Rn(e)})()}function Rn(e){function t(e,t){var n={id:o._id,key:kr.normalizeKey(e)};"undefined"!=typeof t&&null!==t&&(n.value=kr.normalizeKey(t)),r.push(n)}function n(t,n){return function(){return Ln(e,t,n)}}var r,o,i;if("function"==typeof e.mapFun&&2===e.mapFun.length){var a=e.mapFun;i=function(e){return a(e,t)}}else i=fn(e.mapFun.toString(),t,wn,ui,Array.isArray,JSON.parse);var s=e.seq||0,u=new un;return new qr(function(t,a){function c(){u.finish().then(function(){e.seq=s,t()})}function f(){function t(e){a(e)}e.sourceDB.changes({conflicts:!0,include_docs:!0,style:"all_docs",since:s,limit:si}).on("complete",function(t){var a=t.results;if(!a.length)return c();for(var l={},d=0,h=a.length;h>d;d++){var p=a[d];if("_"!==p.doc._id[0]){r=[],o=p.doc,o._deleted||pn(e.sourceDB,i,[o]),r.sort(vn);for(var v,y={},_=0,m=r.length;m>_;_++){var g=r[_],b=[g.key,g.id];0===kr.collate(g.key,v)&&b.push(_);var w=kr.toIndexableString(b);y[w]=g,v=g.key}l[p.doc._id]={indexableKeysToKeyValues:y,changes:p.changes}}s=p.seq}return u.add(n(l,s)),a.lengths;s++){var c=i[s],f=pn(e.sourceDB,r,[c.keys,c.values,!1]);if(f.error&&f.error instanceof Jn)throw f.error;t.push({value:f.error?null:f.output,key:c.groupKey})}return{rows:yn(t,n.limit,n.skip)}}function Bn(e,t){return ri(In(e),function(){return Mn(e,t)})()}function Mn(e,t){function n(t){return t.include_docs=!0,e.db.allDocs(t).then(function(e){return o=e.total_rows,e.rows.map(function(e){if("value"in e.doc&&"object"==typeof e.doc.value&&null!==e.doc.value){var t=Object.keys(e.doc.value).sort(),n=["id","key","value"];if(!(n>t||t>n))return e.doc.value}var r=kr.parseIndexableString(e.doc._id);return{key:r[0],id:r[1],value:"value"in e.doc?e.doc.value:null}})})}function r(n){var r;if(r=i?Nn(e,n,t):{total_rows:o,offset:a,rows:n},t.include_docs){var s=oi(n.map(_n));return e.sourceDB.allDocs({keys:s,include_docs:!0,conflicts:t.conflicts,attachments:t.attachments,binary:t.binary}).then(function(e){var t={};return e.rows.forEach(function(e){e.doc&&(t["$"+e.id]=e.doc)}),n.forEach(function(e){var n=_n(e),r=t["$"+n];r&&(e.doc=r)}),r})}return r}var o,i=e.reduceFun&&t.reduce!==!1,a=t.skip||0;if("undefined"==typeof t.keys||t.keys.length||(t.limit=0,delete t.keys),"undefined"!=typeof t.keys){var s=t.keys,u=s.map(function(e){var t={startkey:kr.toIndexableString([e]),endkey:kr.toIndexableString([e,{}])};return n(t)});return qr.all(u).then(j).then(r)}var c={descending:t.descending};if(t.start_key&&(t.startkey=t.start_key),t.end_key&&(t.endkey=t.end_key),"undefined"!=typeof t.startkey&&(c.startkey=t.descending?kr.toIndexableString([t.startkey,{}]):kr.toIndexableString([t.startkey])),"undefined"!=typeof t.endkey){var f=t.inclusive_end!==!1;t.descending&&(f=!f),c.endkey=kr.toIndexableString(f?[t.endkey,{}]:[t.endkey])}if("undefined"!=typeof t.key){var l=kr.toIndexableString([t.key]),d=kr.toIndexableString([t.key,{}]);c.descending?(c.endkey=l,c.startkey=d):(c.startkey=l,c.endkey=d)}return i||("number"==typeof t.limit&&(c.limit=t.limit),c.skip=a),n(c).then(r)}function Fn(e){return e.request({method:"POST",url:"_view_cleanup"})}function Un(e){return e.get("_local/mrviews").then(function(t){var n={};Object.keys(t.views).forEach(function(e){var t=ln(e),r="_design/"+t[0],o=t[1];n[r]=n[r]||{},n[r][o]=!0});var r={keys:Object.keys(n),include_docs:!0};return e.allDocs(r).then(function(r){var o={};r.rows.forEach(function(e){var r=e.key.substring(8);Object.keys(n[e.key]).forEach(function(n){var i=r+"/"+n;t.views[i]||(i=n);var a=Object.keys(t.views[i]),s=e.doc&&e.doc.views&&e.doc.views[n];a.forEach(function(e){o[e]=o[e]||s})})});var i=Object.keys(o).filter(function(e){return!o[e]}),a=i.map(function(t){return ri(In(t),function(){return new e.constructor(t,e.__opts).destroy()})()});return qr.all(a).then(function(){return{ok:!0}})})},jn({ok:!0}))}function Pn(e,t,r){if("http"===e.type())return An(e,t,r);if("function"==typeof e._query)return Tn(e,t,r);if("string"!=typeof t){xn(r,t);var o={db:e,viewName:"temp_view/temp_view",map:t.map,reduce:t.reduce,temporary:!0};return ai.add(function(){return cn(o).then(function(e){function t(){return e.db.destroy()}return ni(Dn(e).then(function(){return Bn(e,r)}),t)})}),ai.finish()}var i=t,a=ln(i),s=a[0],u=a[1];return e.get("_design/"+s).then(function(t){var o=t.views&&t.views[u];if(!o||"string"!=typeof o.map)throw new Kn("ddoc "+s+" has no view named "+u);xn(r,o);var a={db:e,viewName:i,map:o.map,reduce:o.reduce};return cn(a).then(function(e){return"ok"===r.stale||"update_after"===r.stale?("update_after"===r.stale&&n.nextTick(function(){Dn(e)}),Bn(e,r)):Dn(e).then(function(){return Bn(e,r)})})})}function Hn(e){this.status=400,this.name="query_parse_error",this.message=e,this.error=!0;try{Error.captureStackTrace(this,Hn)}catch(t){}}function Kn(e){this.status=404,this.name="not_found",this.message=e,this.error=!0;try{Error.captureStackTrace(this,Kn)}catch(t){}}function Jn(e){this.status=500,this.name="invalid_value",this.message=e,this.error=!0;try{Error.captureStackTrace(this,Jn)}catch(t){}}function Wn(e){return/^1-/.test(e)}function zn(e,t,n){return!e._attachments||!e._attachments[n]||e._attachments[n].digest!==t._attachments[n].digest}function Xn(e,t){var n=Object.keys(t._attachments);return qr.all(n.map(function(n){return e.getAttachment(t._id,n,{rev:t._rev})}))}function Gn(e,t,n){var r="http"===t.type()&&"http"!==e.type(),o=Object.keys(n._attachments);return r?e.get(n._id).then(function(r){return qr.all(o.map(function(o){return zn(r,n,o)?t.getAttachment(n._id,o):e.getAttachment(r._id,o)}))})["catch"](function(e){if(404!==e.status)throw e;return Xn(t,n)}):Xn(t,n)}function Vn(e){var t=[];return Object.keys(e).forEach(function(n){var r=e[n].missing;r.forEach(function(e){t.push({id:n,rev:e})})}),{docs:t,revs:!0}}function Qn(e,t,n,r){function o(){var o=Vn(n);if(o.docs.length)return e.bulkGet(o).then(function(n){if(r.cancelled)throw new Error("cancelled");return qr.all(n.results.map(function(n){return qr.all(n.docs.map(function(n){var r=n.ok;return n.error&&(l=!1),r&&r._attachments?Gn(t,e,r).then(function(e){var t=Object.keys(r._attachments);return e.forEach(function(e,n){var o=r._attachments[t[n]];delete o.stub,delete o.length,o.data=e}),r}):r}))})).then(function(e){f=f.concat(j(e).filter(Boolean))})})}function i(e){return e._attachments&&Object.keys(e._attachments).length>0}function a(t){return e.allDocs({keys:t,include_docs:!0}).then(function(e){if(r.cancelled)throw new Error("cancelled");e.rows.forEach(function(e){!e.deleted&&e.doc&&Wn(e.value.rev)&&!i(e.doc)&&(f.push(e.doc),delete n[e.id])})})}function s(){var e=Object.keys(n).filter(function(e){var t=n[e].missing;return 1===t.length&&Wn(t[0])});return e.length>0?a(e):void 0}function u(){return{ok:l,docs:f}}n=c(n);var f=[],l=!0;return qr.resolve().then(s).then(o).then(u)}function $n(e,t,n,r,o){return e.get(t)["catch"](function(n){if(404===n.status)return"http"===e.type()&&k(404,"PouchDB is just checking if a remote checkpoint exists."),{session_id:r,_id:t,history:[],replicator:pi,version:hi};throw n}).then(function(i){return o.cancelled?void 0:(i.history=(i.history||[]).filter(function(e){return e.session_id!==r}),i.history.unshift({last_seq:n,session_id:r}),i.history=i.history.slice(0,vi),i.version=hi,i.replicator=pi,i.session_id=r,i.last_seq=n,e.put(i)["catch"](function(i){if(409===i.status)return $n(e,t,n,r,o);throw i}))})}function Yn(e,t,n,r){this.src=e,this.target=t,this.id=n,this.returnValue=r}function Zn(e,t){return e.session_id===t.session_id?{last_seq:e.last_seq,history:e.history}:er(e.history,t.history)}function er(e,t){var n=e[0],r=e.slice(1),o=t[0],i=t.slice(1);if(!n||0===t.length)return{last_seq:yi,history:[]};var a=n.session_id;if(tr(a,t))return{last_seq:n.last_seq,history:e};var s=o.session_id;return tr(s,r)?{last_seq:o.last_seq,history:i}:er(r,i)}function tr(e,t){var n=t[0],r=t.slice(1);return e&&0!==t.length?e===n.session_id?!0:tr(e,r):!1}function nr(e){return"number"==typeof e.status&&4===Math.floor(e.status/100)}function rr(e,t,n,r){return e.retry===!1?(t.emit("error",n),void t.removeAllListeners()):("function"!=typeof e.back_off_function&&(e.back_off_function=S),t.emit("requestError",n),"active"!==t.state&&"pending"!==t.state||(t.emit("paused",n),t.state="stopped",t.once("active",function(){e.current_back_off=mi})),e.current_back_off=e.current_back_off||mi,e.current_back_off=e.back_off_function(e.current_back_off),void setTimeout(r,e.current_back_off))}function or(e){return Object.keys(e).sort(kr.collate).reduce(function(t,n){return t[n]=e[n],t},{})}function ir(e,t,n){var r=n.doc_ids?n.doc_ids.sort(kr.collate):"",o=n.filter?n.filter.toString():"",i="",a="";return n.filter&&n.query_params&&(i=JSON.stringify(or(n.query_params))),n.filter&&"_view"===n.filter&&(a=n.view.toString()),qr.all([e.id(),t.id()]).then(function(e){var t=e[0]+e[1]+o+a+i+r;return new qr(function(e){He(t,e)})}).then(function(e){return e=e.replace(/\//g,".").replace(/\+/g,"_"),"_local/"+e})}function ar(e,t,n,r,o){function i(){return S?qr.resolve():ir(e,t,n).then(function(n){E=n,S=new Yn(e,t,E,r)})}function a(){if(B=[],0!==w.docs.length){var e=w.docs;return t.bulkDocs({docs:e,new_edits:!1}).then(function(t){if(r.cancelled)throw p(),new Error("cancelled");var n=[],i={};t.forEach(function(e){e.error&&(o.doc_write_failures++,n.push(e),i[e.id]=e)}),N=N.concat(n),o.docs_written+=w.docs.length-n.length;var a=n.filter(function(e){return"unauthorized"!==e.name&&"forbidden"!==e.name});if(e.forEach(function(e){var t=i[e._id];t?r.emit("denied",c(t)):B.push(e)}),a.length>0){var s=new Error("bulkDocs error");throw s.other_errors=n,h("target.bulkDocs failed to write docs",s),new Error("bulkWrite partial failure")}},function(t){throw o.doc_write_failures+=e.length,t})}}function s(){if(w.error)throw new Error("There was a problem getting docs.");o.last_seq=j=w.seq;var e=c(o);return B.length&&(e.docs=B,r.emit("change",e)),x=!0,S.writeCheckpoint(w.seq,M).then(function(){if(x=!1,r.cancelled)throw p(),new Error("cancelled");w=void 0,m()})["catch"](b)}function u(){var e={};return w.changes.forEach(function(t){"_user/"!==t.id&&(e[t.id]=t.changes.map(function(e){return e.rev}))}),t.revsDiff(e).then(function(e){if(r.cancelled)throw p(),new Error("cancelled");w.diffs=e})}function f(){return Qn(e,t,w.diffs,r).then(function(e){w.error=!e.ok,e.docs.forEach(function(e){delete w.diffs[e._id],o.docs_read++,w.docs.push(e)})})}function l(){if(!r.cancelled&&!w){if(0===k.length)return void d(!0);w=k.shift(),u().then(f).then(a).then(s).then(l)["catch"](function(e){h("batch processing terminated with error",e)})}}function d(e){return 0===q.changes.length?void(0!==k.length||w||((C&&U.live||A)&&(r.state="pending",r.emit("paused")),A&&p())):void((e||A||q.changes.length>=L)&&(k.push(q),q={seq:0,changes:[],docs:[]},"pending"!==r.state&&"stopped"!==r.state||(r.state="active",r.emit("active")),l()))}function h(e,t){T||(t.message||(t.message=e),o.ok=!1,o.status="aborting",o.errors.push(t),N=N.concat(t),k=[],q={seq:0,changes:[],docs:[]},p())}function p(){if(!(T||r.cancelled&&(o.status="cancelled",x))){o.status=o.status||"complete",o.end_time=new Date,o.last_seq=j,T=!0;var i=N.filter(function(e){return"unauthorized"!==e.name&&"forbidden"!==e.name});if(i.length>0){var a=N.pop();N.length>0&&(a.other_errors=N),a.result=o,rr(n,r,a,function(){ar(e,t,n,r)})}else o.errors=N,r.emit("complete",o),r.removeAllListeners()}}function v(e){if(r.cancelled)return p();var t=O(n)(e);t&&(q.seq=e.seq,q.changes.push(e),d(0===k.length&&U.live))}function y(e){if(D=!1,r.cancelled)return p();if(e.results.length>0)U.since=e.last_seq,m(),d(!0);else{var t=function(){C?(U.live=!0,m()):A=!0,d(!0)};w||0!==e.results.length?t():(x=!0,S.writeCheckpoint(e.last_seq,M).then(function(){x=!1,o.last_seq=j=e.last_seq,t()})["catch"](b))}}function _(e){return D=!1,r.cancelled?p():void h("changes rejected",e)}function m(){function t(){i.cancel()}function o(){r.removeListener("cancel",t)}if(!D&&!A&&k.lengthr.since&&!r.cancelled&&(r.since=e.seq,r.onChange(e))}).on("complete",function(){"waiting"===a&&setTimeout(function(){o()},0),a=!1}).on("error",e)}}if(!this._listeners[t]){var i=this,a=!1;this._listeners[t]=o,this.on(e,o)}},b.prototype.removeListener=function(e,t){t in this._listeners&&br.EventEmitter.prototype.removeListener.call(this,e,this._listeners[t])},b.prototype.notifyLocalWindows=function(e){_()?chrome.storage.local.set({dbName:e}):m()&&(localStorage[e]="a"===localStorage[e]?"b":"a")},b.prototype.notify=function(e){this.emit(e),this.notifyLocalWindows(e)},yr(q,Error),q.prototype.toString=function(){return JSON.stringify({status:this.status,name:this.name,message:this.message,reason:this.reason})};var Cr=new q({status:401,error:"unauthorized",reason:"Name or password is incorrect."}),Lr=new q({status:400,error:"bad_request",reason:"Missing JSON list of 'docs'"}),Ir=new q({status:404,error:"not_found",reason:"missing"}),Dr=new q({status:409,error:"conflict",reason:"Document update conflict"}),Rr=new q({status:400,error:"invalid_id",reason:"_id field must contain a string"}),Nr=new q({status:412,error:"missing_id",reason:"_id is required for puts"}),Br=new q({status:400,error:"bad_request",reason:"Only reserved document ids may start with underscore."}),Mr=new q({status:412,error:"precondition_failed",reason:"Database not open"}),Fr=new q({status:500,error:"unknown_error",reason:"Database encountered an unknown error"}),Ur=new q({status:500,error:"badarg",reason:"Some query argument is invalid"}),Pr=new q({status:400,error:"invalid_request",reason:"Request was invalid"}),Hr=new q({status:400,error:"query_parse_error",reason:"Some query parameter is invalid"}),Kr=new q({status:500,error:"doc_validation",reason:"Bad special document member"}),Jr=new q({status:400,error:"bad_request",reason:"Something wrong with the request"}),Wr=new q({status:400,error:"bad_request",reason:"Document must be a JSON object"}),zr=new q({status:404,error:"not_found",reason:"Database not found"}),Xr=new q({status:500,error:"indexed_db_went_bad",reason:"unknown"}),Gr=new q({status:500,error:"web_sql_went_bad",reason:"unknown"}),Vr=new q({status:500,error:"levelDB_went_went_bad",reason:"unknown"}),Qr=new q({status:403,error:"forbidden",reason:"Forbidden by design doc validate_doc_update function"}),$r=new q({status:400,error:"bad_request",reason:"Invalid rev format"}),Yr=new q({status:412,error:"file_exists",reason:"The database could not be created, the file already exists."}),Zr=new q({status:412,error:"missing_stub"}),eo=new q({status:413,error:"invalid_url",reason:"Provided URL is invalid"}),to=[Cr,Lr,Ir,Dr,Rr,Nr,Br,Mr,Fr,Ur,Pr,Hr,Kr,Jr,Wr,zr,Gr,Vr,Qr,$r,Yr,Zr,Xr,eo],no=function(e,t,n){var r=to.filter(function(n){return n[e]===t});return n&&r.filter(function(e){return e.message===n})[0]||r[0]},ro=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],oo="queryKey",io=/(?:^|&)([^&=]*)=?([^&]*)/g,ao=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,so="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");yr(ce,br.EventEmitter),ce.prototype.cancel=function(){this.isCancelled=!0,this.db.taskqueue.isReady&&this.emit("cancel")},ce.prototype.doChanges=function(e){var t=this,n=e.complete;if(e=c(e),"live"in e&&!("continuous"in e)&&(e.continuous=e.live),e.processChange=fe,"latest"===e.since&&(e.since="now"),e.since||(e.since=0),"now"===e.since)return void this.db.info().then(function(r){return t.isCancelled?void n(null,{status:"cancelled"}):(e.since=r.update_seq,void t.doChanges(e))},n);if(e.continuous&&"now"!==e.since&&this.db.info().then(function(e){t.startSeq=e.update_seq},function(e){if("idbNull"!==e.id)throw e}),e.view&&!e.filter&&(e.filter="_view"),e.filter&&"string"==typeof e.filter&&("_view"===e.filter?e.view=D(e.view):e.filter=D(e.filter),"http"!==this.db.type()&&!e.doc_ids))return this.filterChanges(e);"descending"in e||(e.descending=!1),e.limit=0===e.limit?1:e.limit,e.complete=n;var r=this.db._changes(e);if(r&&"function"==typeof r.cancel){var o=t.cancel;t.cancel=gr(function(e){r.cancel(),o.apply(this,e)})}},ce.prototype.filterChanges=function(e){var t=this,n=e.complete;if("_view"===e.filter){if(!e.view||"string"!=typeof e.view){var r=x(Jr,"`view` filter parameter not found or invalid.");return n(r)}var o=I(e.view);this.db.get("_design/"+o[0],function(r,i){if(t.isCancelled)return n(null,{status:"cancelled"});if(r)return n(A(r));var a=i&&i.views&&i.views[o[1]]&&i.views[o[1]].map;return a?(e.filter=se(a),void t.doChanges(e)):n(x(Ir,i.views?"missing json key: "+o[1]:"missing json key: views"))})}else{var i=I(e.filter);if(!i)return t.doChanges(e);this.db.get("_design/"+i[0],function(r,o){if(t.isCancelled)return n(null,{status:"cancelled"});if(r)return n(A(r));var a=o&&o.filters&&o.filters[i[1]];return a?(e.filter=ae(a),void t.doChanges(e)):n(x(Ir,o&&o.filters?"missing json key: "+i[1]:"missing json key: filters"))})}},yr(be,br.EventEmitter),be.prototype.post=d("post",function(e,t,n){return"function"==typeof t&&(n=t,t={}),"object"!=typeof e||Array.isArray(e)?n(x(Wr)):void this.bulkDocs({docs:[e]},t,he(n))}),be.prototype.put=d("put",gr(function(e){function t(){a||(w("warn","db.put(doc, id, rev) has been deprecated and will be removed in a future release, please use db.put({_id: id, _rev: rev}) instead"),a=!0)}var n,r,o,i,a=!1,s=e.shift(),u="_id"in s;if("object"!=typeof s||Array.isArray(s))return(i=e.pop())(x(Wr));for(;;)if(n=e.shift(),r=typeof n,"string"!==r||u?"string"!==r||!u||"_rev"in s?"object"===r?o=n:"function"===r&&(i=n):(t(),s._rev=n):(t(),s._id=n,u=!0),!e.length)break;return o=o||{},C(s._id),ie(s._id)&&"function"==typeof this._putLocal?s._deleted?this._removeLocal(s,i):this._putLocal(s,i):void this.bulkDocs({docs:[s]},o,he(i))})),be.prototype.putAttachment=d("putAttachment",function(e,t,n,r,o){function i(e){var n="_rev"in e?parseInt(e._rev,10):0;return e._attachments=e._attachments||{},e._attachments[t]={content_type:o,data:r,revpos:++n},a.put(e)}var a=this;return"function"==typeof o&&(o=r,r=n,n=null),"undefined"==typeof o&&(o=r,r=n,n=null),a.get(e).then(function(e){if(e._rev!==n)throw x(Dr);return i(e)},function(t){if(t.reason===Ir.message)return i({_id:e});throw t})}),be.prototype.removeAttachment=d("removeAttachment",function(e,t,n,r){var o=this;o.get(e,function(e,i){return e?void r(e):i._rev!==n?void r(x(Dr)):i._attachments?(delete i._attachments[t],0===Object.keys(i._attachments).length&&delete i._attachments,void o.put(i,r)):r()})}),be.prototype.remove=d("remove",function(e,t,n,r){var o;"string"==typeof t?(o={_id:e,_rev:t},"function"==typeof n&&(r=n,n={})):(o=e,"function"==typeof t?(r=t,n={}):(r=n,n=t)),n=n||{},n.was_delete=!0;var i={_id:o._id,_rev:o._rev||n.rev};return i._deleted=!0,ie(i._id)&&"function"==typeof this._removeLocal?this._removeLocal(o,r):void this.bulkDocs({docs:[i]},n,he(r))}),be.prototype.revsDiff=d("revsDiff",function(e,t,n){function r(e,t){s.has(e)||s.set(e,{missing:[]}),s.get(e).missing.push(t)}function o(t,n){var o=e[t].slice(0);P(n,function(e,n,i,a,s){var u=n+"-"+i,c=o.indexOf(u);-1!==c&&(o.splice(c,1),"available"!==s.status&&r(t,u))}),o.forEach(function(e){r(t,e)})}"function"==typeof t&&(n=t,t={});var i=Object.keys(e);if(!i.length)return n(null,{});var a=0,s=new mr.Map;i.map(function(t){this._getRevisionTree(t,function(r,u){if(r&&404===r.status&&"missing"===r.message)s.set(t,{missing:e[t]});else{if(r)return n(r);o(t,u)}if(++a===i.length){var c={};return s.forEach(function(e,t){c[t]=e}),n(null,c)}})},this)}),be.prototype.bulkGet=d("bulkGet",function(e,t){y(this,e,t)}),be.prototype.compactDocument=d("compactDocument",function(e,t,n){var r=this;this._getRevisionTree(e,function(o,i){if(o)return n(o);var a=ye(i),s=[],u=[];Object.keys(a).forEach(function(e){a[e]>t&&s.push(e)}),P(i,function(e,t,n,r,o){var i=t+"-"+n;"available"===o.status&&-1!==s.indexOf(i)&&u.push(i)}),r._doCompaction(e,u,n)})}),be.prototype.compact=d("compact",function(e,t){"function"==typeof e&&(t=e,e={});var n=this;e=e||{},n._compactionQueue=n._compactionQueue||[],n._compactionQueue.push({opts:e,callback:t}),1===n._compactionQueue.length&&me(n)}),be.prototype._compact=function(e,t){function n(e){a.push(o.compactDocument(e.id,0))}function r(e){var n=e.last_seq;qr.all(a).then(function(){return N(o,"_local/compaction",function(e){return!e.last_seq||e.last_seqn;n++)t["$"+e[n]]=!0;var o=Object.keys(t),i=new Array(o.length);for(n=0,r=o.length;r>n;n++)i[n]=o[n].substring(1);return i},ii={},ai=new un,si=50,ui=w.bind(null,"log"),ci={_sum:function(e,t){return wn(t)},_count:function(e,t){return t.length},_stats:function(e,t){function n(e){for(var t=0,n=0,r=e.length;r>n;n++){var o=e[n];t+=o*o}return t}return{sum:wn(t),min:Math.min.apply(null,t),max:Math.max.apply(null,t),count:t.length,sumsqr:n(t)}}},fi=ti(function(){var e=this;return"http"===e.type()?Fn(e):"function"==typeof e._viewCleanup?On(e):Un(e)}),li=function(e,t,n){"function"==typeof t&&(n=t,t={}),t=t?kn(t):{},"function"==typeof e&&(e={map:e});var r=this,o=qr.resolve().then(function(){return Pn(r,e,t)});return ei(o,n),o};yr(Hn,Error),yr(Kn,Error),yr(Jn,Error);var di={query:li,viewCleanup:fi},hi=1,pi="pouchdb",vi=5,yi=0;Yn.prototype.writeCheckpoint=function(e,t){var n=this;return this.updateTarget(e,t).then(function(){return n.updateSource(e,t)})},Yn.prototype.updateTarget=function(e,t){return $n(this.target,this.id,e,t,this.returnValue)},Yn.prototype.updateSource=function(e,t){var n=this;return this.readOnlySource?qr.resolve(!0):$n(this.src,this.id,e,t,this.returnValue)["catch"](function(e){if(nr(e))return n.readOnlySource=!0,!0;throw e})};var _i={undefined:function(e,t){return 0===kr.collate(e.last_seq,t.last_seq)?t.last_seq:0},1:function(e,t){return Zn(t,e).last_seq}};Yn.prototype.getCheckpoint=function(){var e=this;return e.target.get(e.id).then(function(t){return e.readOnlySource?qr.resolve(t.last_seq):e.src.get(e.id).then(function(e){if(t.version!==e.version)return yi;var n;return n=t.version?t.version.toString():"undefined",n in _i?_i[n](t,e):yi},function(n){if(404===n.status&&t.last_seq)return e.src.put({_id:e.id,last_seq:yi}).then(function(){return yi},function(n){return nr(n)?(e.readOnlySource=!0,t.last_seq):yi});throw n})})["catch"](function(e){if(404!==e.status)throw e;return yi})};var mi=0;yr(sr,br.EventEmitter),sr.prototype.cancel=function(){this.cancelled=!0,this.state="cancelled",this.emit("cancel")},sr.prototype.ready=function(e,t){function n(){o.cancel()}function r(){e.removeListener("destroyed",n),t.removeListener("destroyed",n)}var o=this;o._readyCalled||(o._readyCalled=!0,e.once("destroyed",n),t.once("destroyed",n),o.once("complete",r))},yr(lr,br.EventEmitter),lr.prototype.cancel=function(){this.canceled||(this.canceled=!0,this.push.cancel(),this.pull.cancel())},ke.plugin(yt).plugin(Kt).plugin(sn).plugin(di).plugin(dr),t.exports=ke}).call(this,e(2),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{1:1,10:10,12:12,14:14,15:15,16:16,17:17,2:2,4:4,5:5,8:8,9:9}],4:[function(e,t,n){"use strict";function r(e){return function(){var t=arguments.length;if(t){for(var n=[],r=-1;++r=31}function o(){var e=arguments,t=this.useColors;if(e[0]=(t?"%c":"")+this.namespace+(t?" %c":" ")+e[0]+(t?"%c ":" ")+"+"+n.humanize(this.diff),!t)return e;var r="color: "+this.color;e=[e[0],r,"color: inherit"].concat(Array.prototype.slice.call(e,1));var o=0,i=0;return e[0].replace(/%[a-z%]/g,function(e){"%%"!==e&&(o++,"%c"===e&&(i=o))}),e.splice(i,0,r),e}function i(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(e){try{null==e?n.storage.removeItem("debug"):n.storage.debug=e}catch(t){}}function s(){var e;try{e=n.storage.debug}catch(t){}return e}function u(){try{return window.localStorage}catch(e){}}n=t.exports=e(6),n.log=i,n.formatArgs=o,n.save=a,n.load=s,n.useColors=r,n.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:u(),n.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],n.formatters.j=function(e){return JSON.stringify(e)},n.enable(s())},{6:6}],6:[function(e,t,n){function r(){return n.colors[f++%n.colors.length]}function o(e){function t(){}function o(){var e=o,t=+new Date,i=t-(c||t);e.diff=i,e.prev=c,e.curr=t,c=t,null==e.useColors&&(e.useColors=n.useColors()),null==e.color&&e.useColors&&(e.color=r());var a=Array.prototype.slice.call(arguments);a[0]=n.coerce(a[0]),"string"!=typeof a[0]&&(a=["%o"].concat(a));var s=0;a[0]=a[0].replace(/%([a-z%])/g,function(t,r){if("%%"===t)return t;s++;var o=n.formatters[r];if("function"==typeof o){var i=a[s];t=o.call(e,i),a.splice(s,1),s--}return t}),"function"==typeof n.formatArgs&&(a=n.formatArgs.apply(e,a));var u=o.log||n.log||console.log.bind(console);u.apply(e,a)}t.enabled=!1,o.enabled=!0;var i=n.enabled(e)?o:t;return i.namespace=e,i}function i(e){n.save(e);for(var t=(e||"").split(/[\s,]+/),r=t.length,o=0;r>o;o++)t[o]&&(e=t[o].replace(/\*/g,".*?"),"-"===e[0]?n.skips.push(new RegExp("^"+e.substr(1)+"$")):n.names.push(new RegExp("^"+e+"$")))}function a(){n.enable("")}function s(e){var t,r;for(t=0,r=n.skips.length;r>t;t++)if(n.skips[t].test(e))return!1;for(t=0,r=n.names.length;r>t;t++)if(n.names[t].test(e))return!0;return!1}function u(e){return e instanceof Error?e.stack||e.message:e}n=t.exports=o,n.coerce=u,n.disable=a,n.enable=i,n.enabled=s,n.humanize=e(11),n.names=[],n.skips=[],n.formatters={};var c,f=0},{11:11}],7:[function(e,t,n){(function(e){"use strict";function n(){f=!0;for(var e,t,n=l.length;n;){for(t=l,l=[],e=-1;++e1e4)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),r=(t[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*l;case"days":case"day":case"d":return n*f;case"hours":case"hour":case"hrs":case"hr":case"h":return n*c;case"minutes":case"minute":case"mins":case"min":case"m":return n*u;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n}}}}function o(e){return e>=f?Math.round(e/f)+"d":e>=c?Math.round(e/c)+"h":e>=u?Math.round(e/u)+"m":e>=s?Math.round(e/s)+"s":e+"ms"}function i(e){return a(e,f,"day")||a(e,c,"hour")||a(e,u,"minute")||a(e,s,"second")||e+" ms"}function a(e,t,n){return t>e?void 0:1.5*t>e?Math.floor(e/t)+" "+n:Math.ceil(e/t)+" "+n+"s"}var s=1e3,u=60*s,c=60*u,f=24*c,l=365.25*f;t.exports=function(e,t){return t=t||{},"string"==typeof e?r(e):t["long"]?i(e):o(e)}},{}],12:[function(e,t,n){"use strict";function r(e){if(null!==e)switch(typeof e){case"boolean":return e?1:0;case"number":return f(e);case"string":return e.replace(/\u0002/g,"").replace(/\u0001/g,"").replace(/\u0000/g,"");case"object":var t=Array.isArray(e),r=t?e:Object.keys(e),o=-1,i=r.length,a="";if(t)for(;++oo;o++){var i=n.collate(e[o],t[o]);if(0!==i)return i}return e.length===t.length?0:e.length>t.length?1:-1}function s(e,t){return e===t?0:e>t?1:-1}function u(e,t){for(var r=Object.keys(e),o=Object.keys(t),i=Math.min(r.length,o.length),a=0;i>a;a++){var s=n.collate(r[a],o[a]);if(0!==s)return s;if(s=n.collate(e[r[a]],t[o[a]]),0!==s)return s}return r.length===o.length?0:r.length>o.length?1:-1}function c(e){var t=["boolean","number","string","object"],n=t.indexOf(typeof e);return~n?null===e?1:Array.isArray(e)?5:3>n?n+2:n+3:Array.isArray(e)?5:void 0}function f(e){if(0===e)return"1";var t=e.toExponential().split(/e\+?/),n=parseInt(t[1],10),r=0>e,o=r?"0":"2",i=(r?-n:n)-l,a=p.padLeft(i.toString(),"0",d); +o+=h+a;var s=Math.abs(parseFloat(t[0]));r&&(s=10-s);var u=s.toFixed(20);return u=u.replace(/\.?0+$/,""),o+=h+u}var l=-324,d=3,h="",p=e(13);n.collate=function(e,t){if(e===t)return 0;e=n.normalizeKey(e),t=n.normalizeKey(t);var r=c(e),o=c(t);if(r-o!==0)return r-o;if(null===e)return 0;switch(typeof e){case"number":return e-t;case"boolean":return e===t?0:t>e?-1:1;case"string":return s(e,t)}return Array.isArray(e)?a(e,t):u(e,t)},n.normalizeKey=function(e){switch(typeof e){case"undefined":return null;case"number":return e===1/0||e===-(1/0)||isNaN(e)?null:e;case"object":var t=e;if(Array.isArray(e)){var r=e.length;e=new Array(r);for(var o=0;r>o;o++)e[o]=n.normalizeKey(t[o])}else{if(e instanceof Date)return e.toJSON();if(null!==e){e={};for(var i in t)if(t.hasOwnProperty(i)){var a=t[i];"undefined"!=typeof a&&(e[i]=n.normalizeKey(a))}}}}return e},n.toIndexableString=function(e){var t="\x00";return e=n.normalizeKey(e),c(e)+h+r(e)+t},n.parseIndexableString=function(e){for(var t=[],n=[],r=0;;){var a=e[r++];if("\x00"!==a)switch(a){case"1":t.push(null);break;case"2":t.push("1"===e[r]),r++;break;case"3":var s=o(e,r);t.push(s.num),r+=s.length;break;case"4":for(var u="";;){var c=e[r];if("\x00"===c)break;u+=c,r++}u=u.replace(/\u0001\u0001/g,"\x00").replace(/\u0001\u0002/g,"").replace(/\u0002\u0002/g,""),t.push(u);break;case"5":var f={element:[],index:t.length};t.push(f.element),n.push(f);break;case"6":var l={element:{},index:t.length};t.push(l.element),n.push(l);break;default:throw new Error("bad collationIndex or unexpectedly reached end of input: "+a)}else{if(1===t.length)return t.pop();i(t,n)}}}},{13:13}],13:[function(e,t,n){"use strict";function r(e,t,n){for(var r="",o=n-e.length;r.lengthn;n++){if(n===o)return 1;var i=e.charAt(n),a=t.charAt(n);if(i!==a)return a>i?-1:1}return o>r?-1:0},n.intToDecimalForm=function(e){var t=0>e,n="";do{var r=t?-Math.ceil(e%10):Math.floor(e%10);n=r+n,e=t?Math.ceil(e/10):Math.floor(e/10)}while(e);return t&&"0"!==n&&(n="-"+n),n}},{}],14:[function(e,t,n){"use strict";function r(){this.store={}}function o(e){if(this.store=new r,e&&Array.isArray(e))for(var t=0,n=e.length;n>t;t++)this.add(e[t])}n.Map=r,n.Set=o,r.prototype.mangle=function(e){if("string"!=typeof e)throw new TypeError("key must be a string but Got "+e);return"$"+e},r.prototype.unmangle=function(e){return e.substring(1)},r.prototype.get=function(e){var t=this.mangle(e);return t in this.store?this.store[t]:void 0},r.prototype.set=function(e,t){var n=this.mangle(e);return this.store[n]=t,!0},r.prototype.has=function(e){var t=this.mangle(e);return t in this.store},r.prototype["delete"]=function(e){var t=this.mangle(e);return t in this.store?(delete this.store[t],!0):!1},r.prototype.forEach=function(e){for(var t=Object.keys(this.store),n=0,r=t.length;r>n;n++){var o=t[n],i=this.store[o];o=this.unmangle(o),e(i,o)}},o.prototype.add=function(e){return this.store.set(e,!0)},o.prototype.has=function(e){return this.store.has(e)},o.prototype["delete"]=function(e){return this.store["delete"](e)}},{}],15:[function(e,t,n){(function(){var e={}.hasOwnProperty,n=[].slice;t.exports=function(t,r){var o,i,a,s;i=[],s=[];for(o in r)e.call(r,o)&&(a=r[o],"this"!==o&&(i.push(o),s.push(a)));return Function.apply(null,n.call(i).concat([t])).apply(r["this"],s)}}).call(this)},{}],16:[function(t,n,r){!function(t){if("object"==typeof r)n.exports=t();else if("function"==typeof e&&e.amd)e(t);else{var o;try{o=window}catch(i){o=self}o.SparkMD5=t()}}(function(e){"use strict";function t(e,t,n,r,o,i){return t=g(g(t,e),g(r,i)),g(t<>>32-o,n)}function n(e,n,r,o,i,a,s){return t(n&r|~n&o,e,n,i,a,s)}function r(e,n,r,o,i,a,s){return t(n&o|r&~o,e,n,i,a,s)}function o(e,n,r,o,i,a,s){return t(n^r^o,e,n,i,a,s)}function i(e,n,r,o,i,a,s){return t(r^(n|~o),e,n,i,a,s)}function a(e,t){var a=e[0],s=e[1],u=e[2],c=e[3];a=n(a,s,u,c,t[0],7,-680876936),c=n(c,a,s,u,t[1],12,-389564586),u=n(u,c,a,s,t[2],17,606105819),s=n(s,u,c,a,t[3],22,-1044525330),a=n(a,s,u,c,t[4],7,-176418897),c=n(c,a,s,u,t[5],12,1200080426),u=n(u,c,a,s,t[6],17,-1473231341),s=n(s,u,c,a,t[7],22,-45705983),a=n(a,s,u,c,t[8],7,1770035416),c=n(c,a,s,u,t[9],12,-1958414417),u=n(u,c,a,s,t[10],17,-42063),s=n(s,u,c,a,t[11],22,-1990404162),a=n(a,s,u,c,t[12],7,1804603682),c=n(c,a,s,u,t[13],12,-40341101),u=n(u,c,a,s,t[14],17,-1502002290),s=n(s,u,c,a,t[15],22,1236535329),a=r(a,s,u,c,t[1],5,-165796510),c=r(c,a,s,u,t[6],9,-1069501632),u=r(u,c,a,s,t[11],14,643717713),s=r(s,u,c,a,t[0],20,-373897302),a=r(a,s,u,c,t[5],5,-701558691),c=r(c,a,s,u,t[10],9,38016083),u=r(u,c,a,s,t[15],14,-660478335),s=r(s,u,c,a,t[4],20,-405537848),a=r(a,s,u,c,t[9],5,568446438),c=r(c,a,s,u,t[14],9,-1019803690),u=r(u,c,a,s,t[3],14,-187363961),s=r(s,u,c,a,t[8],20,1163531501),a=r(a,s,u,c,t[13],5,-1444681467),c=r(c,a,s,u,t[2],9,-51403784),u=r(u,c,a,s,t[7],14,1735328473),s=r(s,u,c,a,t[12],20,-1926607734),a=o(a,s,u,c,t[5],4,-378558),c=o(c,a,s,u,t[8],11,-2022574463),u=o(u,c,a,s,t[11],16,1839030562),s=o(s,u,c,a,t[14],23,-35309556),a=o(a,s,u,c,t[1],4,-1530992060),c=o(c,a,s,u,t[4],11,1272893353),u=o(u,c,a,s,t[7],16,-155497632),s=o(s,u,c,a,t[10],23,-1094730640),a=o(a,s,u,c,t[13],4,681279174),c=o(c,a,s,u,t[0],11,-358537222),u=o(u,c,a,s,t[3],16,-722521979),s=o(s,u,c,a,t[6],23,76029189),a=o(a,s,u,c,t[9],4,-640364487),c=o(c,a,s,u,t[12],11,-421815835),u=o(u,c,a,s,t[15],16,530742520),s=o(s,u,c,a,t[2],23,-995338651),a=i(a,s,u,c,t[0],6,-198630844),c=i(c,a,s,u,t[7],10,1126891415),u=i(u,c,a,s,t[14],15,-1416354905),s=i(s,u,c,a,t[5],21,-57434055),a=i(a,s,u,c,t[12],6,1700485571),c=i(c,a,s,u,t[3],10,-1894986606),u=i(u,c,a,s,t[10],15,-1051523),s=i(s,u,c,a,t[1],21,-2054922799),a=i(a,s,u,c,t[8],6,1873313359),c=i(c,a,s,u,t[15],10,-30611744),u=i(u,c,a,s,t[6],15,-1560198380),s=i(s,u,c,a,t[13],21,1309151649),a=i(a,s,u,c,t[4],6,-145523070),c=i(c,a,s,u,t[11],10,-1120210379),u=i(u,c,a,s,t[2],15,718787259),s=i(s,u,c,a,t[9],21,-343485551),e[0]=g(a,e[0]),e[1]=g(s,e[1]),e[2]=g(u,e[2]),e[3]=g(c,e[3])}function s(e){var t,n=[];for(t=0;64>t;t+=4)n[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return n}function u(e){var t,n=[];for(t=0;64>t;t+=4)n[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return n}function c(e){var t,n,r,o,i,u,c=e.length,f=[1732584193,-271733879,-1732584194,271733878];for(t=64;c>=t;t+=64)a(f,s(e.substring(t-64,t)));for(e=e.substring(t-64),n=e.length,r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;n>t;t+=1)r[t>>2]|=e.charCodeAt(t)<<(t%4<<3);if(r[t>>2]|=128<<(t%4<<3),t>55)for(a(f,r),t=0;16>t;t+=1)r[t]=0;return o=8*c,o=o.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(o[2],16),u=parseInt(o[1],16)||0,r[14]=i,r[15]=u,a(f,r),f}function f(e){var t,n,r,o,i,s,c=e.length,f=[1732584193,-271733879,-1732584194,271733878];for(t=64;c>=t;t+=64)a(f,u(e.subarray(t-64,t)));for(e=c>t-64?e.subarray(t-64):new Uint8Array(0),n=e.length,r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;n>t;t+=1)r[t>>2]|=e[t]<<(t%4<<3);if(r[t>>2]|=128<<(t%4<<3),t>55)for(a(f,r),t=0;16>t;t+=1)r[t]=0;return o=8*c,o=o.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(o[2],16),s=parseInt(o[1],16)||0,r[14]=i,r[15]=s,a(f,r),f}function l(e){var t,n="";for(t=0;4>t;t+=1)n+=b[e>>8*t+4&15]+b[e>>8*t&15];return n}function d(e){var t;for(t=0;tn;n+=1)i[n]=e.charCodeAt(n);return t?i:o}function v(e){return String.fromCharCode.apply(null,new Uint8Array(e))}function y(e,t,n){var r=new Uint8Array(e.byteLength+t.byteLength);return r.set(new Uint8Array(e)),r.set(new Uint8Array(t),e.byteLength),n?r:r.buffer}function _(e){var t,n=[],r=e.length;for(t=0;r-1>t;t+=2)n.push(parseInt(e.substr(t,2),16));return String.fromCharCode.apply(String,n)}function m(){this.reset()}var g=function(e,t){return e+t&4294967295},b=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];return"5d41402abc4b2a76b9719d911017c592"!==d(c("hello"))&&(g=function(e,t){var n=(65535&e)+(65535&t),r=(e>>16)+(t>>16)+(n>>16);return r<<16|65535&n}),"undefined"==typeof ArrayBuffer||ArrayBuffer.prototype.slice||!function(){function t(e,t){return e=0|e||0,0>e?Math.max(e+t,0):Math.min(e,t)}ArrayBuffer.prototype.slice=function(n,r){var o,i,a,s,u=this.byteLength,c=t(n,u),f=u;return r!==e&&(f=t(r,u)),c>f?new ArrayBuffer(0):(o=f-c,i=new ArrayBuffer(o),a=new Uint8Array(i),s=new Uint8Array(this,c,o),a.set(s),i)}}(),m.prototype.append=function(e){return this.appendBinary(h(e)),this},m.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,n=this._buff.length;for(t=64;n>=t;t+=64)a(this._hash,s(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},m.prototype.end=function(e){var t,n,r=this._buff,o=r.length,i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;o>t;t+=1)i[t>>2]|=r.charCodeAt(t)<<(t%4<<3);return this._finish(i,o),n=d(this._hash),e&&(n=_(n)),this.reset(),n},m.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},m.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash}},m.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},m.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},m.prototype._finish=function(e,t){var n,r,o,i=t;if(e[i>>2]|=128<<(i%4<<3),i>55)for(a(this._hash,e),i=0;16>i;i+=1)e[i]=0;n=8*this._length,n=n.toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(n[2],16),o=parseInt(n[1],16)||0,e[14]=r,e[15]=o,a(this._hash,e)},m.hash=function(e,t){return m.hashBinary(h(e),t)},m.hashBinary=function(e,t){var n=c(e),r=d(n);return t?_(r):r},m.ArrayBuffer=function(){this.reset()},m.ArrayBuffer.prototype.append=function(e){var t,n=y(this._buff.buffer,e,!0),r=n.length;for(this._length+=e.byteLength,t=64;r>=t;t+=64)a(this._hash,u(n.subarray(t-64,t)));return this._buff=r>t-64?new Uint8Array(n.buffer.slice(t-64)):new Uint8Array(0),this},m.ArrayBuffer.prototype.end=function(e){var t,n,r=this._buff,o=r.length,i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;o>t;t+=1)i[t>>2]|=r[t]<<(t%4<<3);return this._finish(i,o),n=d(this._hash),e&&(n=_(n)),this.reset(),n},m.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},m.ArrayBuffer.prototype.getState=function(){var e=m.prototype.getState.call(this);return e.buff=v(e.buff),e},m.ArrayBuffer.prototype.setState=function(e){return e.buff=p(e.buff,!0),m.prototype.setState.call(this,e)},m.ArrayBuffer.prototype.destroy=m.prototype.destroy,m.ArrayBuffer.prototype._finish=m.prototype._finish,m.ArrayBuffer.hash=function(e,t){var n=f(new Uint8Array(e)),r=d(n);return t?_(r):r},m})},{}],17:[function(e,t,n){"use strict";function r(e,t,n){var r=n[n.length-1];e===r.element&&(n.pop(),r=n[n.length-1]);var o=r.element,i=r.index;if(Array.isArray(o))o.push(e);else if(i===t.length-2){var a=t.pop();o[a]=e}else t.push(e)}n.stringify=function(e){var t=[];t.push({obj:e});for(var n,r,o,i,a,s,u,c,f,l,d,h="";n=t.pop();)if(r=n.obj,o=n.prefix||"",i=n.val||"",h+=o,i)h+=i;else if("object"!=typeof r)h+="undefined"==typeof r?null:JSON.stringify(r);else if(null===r)h+="null";else if(Array.isArray(r)){for(t.push({val:"]"}),a=r.length-1;a>=0;a--)s=0===a?"":",",t.push({obj:r[a],prefix:s});t.push({val:"["})}else{u=[];for(c in r)r.hasOwnProperty(c)&&u.push(c);for(t.push({val:"}"}),a=u.length-1;a>=0;a--)f=u[a],l=r[f],d=a>0?",":"",d+=JSON.stringify(f)+":",t.push({obj:l,prefix:d});t.push({val:"{"})}return h},n.parse=function(e){for(var t,n,o,i,a,s,u,c,f,l=[],d=[],h=0;;)if(t=e[h++],"}"!==t&&"]"!==t&&"undefined"!=typeof t)switch(t){case" ":case" ":case"\n":case":":case",":break;case"n":h+=3,r(null,l,d);break;case"t":h+=3,r(!0,l,d);break;case"f":h+=4,r(!1,l,d);break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"-":for(n="",h--;;){if(o=e[h++],!/[\d\.\-e\+]/.test(o)){h--;break}n+=o}r(parseFloat(n),l,d);break;case'"':for(i="",a=void 0,s=0;;){if(u=e[h++],'"'===u&&("\\"!==a||s%2!==1))break;i+=u,a=u,"\\"===a?s++:s=0}r(JSON.parse('"'+i+'"'),l,d);break;case"[":c={element:[],index:l.length},l.push(c.element),d.push(c);break;case"{":f={element:{},index:l.length},l.push(f.element),d.push(f);break;default:throw new Error("unexpectedly reached end of input: "+t)}else{if(1===l.length)return l.pop();r(l.pop(),l,d)}}},{}]},{},[3])(3)}); diff --git a/src/automint_modules/am-mailer.js b/src/automint_modules/am-mailer.js index 3d5a609b..afdb1bd3 100644 --- a/src/automint_modules/am-mailer.js +++ b/src/automint_modules/am-mailer.js @@ -45,7 +45,7 @@ html: emailTemplate }, function(err, email) { if (err) { - console.log(err); + console.warn(err); return; } diff --git a/src/automint_modules/am-preferences.js b/src/automint_modules/am-preferences.js new file mode 100644 index 00000000..6546af46 --- /dev/null +++ b/src/automint_modules/am-preferences.js @@ -0,0 +1,91 @@ +/** + * Module for storing local usage preferences + * @author ndkcha + * @since 0.6.4 + * @version 0.6.4 + */ + +/// + +(function() { + // imported modules + var fs = require('fs'); + var Promise = require('promise'); + + // named assignments + var PREF_DIR = __dirname + "/../../app.asar.unpacked/"; + var PREF_FILE = PREF_DIR + 'automint-preferences.json'; + var e404 = { + success: false, + status: 404, + message: 'Preference not found!' + } + + // export as module + module.exports = { + storePreference: storePreference, + getPreference: getPreference, + getAllPreferences: getAllPreferences + } + + // function definitions + + function storePreference(key, value) { + fs.readFile(PREF_FILE, changePreferences); + + function changePreferences(err, content) { + var prefJson = (content == undefined) ? {} : JSON.parse(content); + prefJson[key] = value; + try { + fs.mkdirSync(PREF_DIR); + } catch(err) { + if (err.code != 'EEXIST') + throw err; + } + fs.writeFile(PREF_FILE, JSON.stringify(prefJson)); + } + } + + function getPreference(key) { + return (new Promise(readPromise)); + + function readPromise(fulfill, reject) { + fs.readFile(PREF_FILE, readPreferences); + + function readPreferences(err, content) { + var prefJson = (content == undefined) ? {} : JSON.parse(content); + if (prefJson[key]) + fulfill(prefJson[key]); + else + reject(e404); + } + } + } + + function getAllPreferences(key) { + return (new Promise(readPromise)); + + function readPromise(fulfill, reject) { + fs.readFile(PREF_FILE, readPreferences); + + function readPreferences(err, content) { + var prefJson = (content == undefined) ? {} : JSON.parse(content); + var z = Object.keys(prefJson).filter(filterFunc).reduce(reduceFunc, {}); + + if (Object.keys(z).length === 0) + reject(e404); + else + fulfill(z); + + function filterFunc(k) { + return (k.indexOf(key) == 0); + } + + function reduceFunc(newData, k) { + newData[k] = prefJson[k]; + return newData; + } + } + } + } +})(); \ No newline at end of file diff --git a/src/automint_modules/googleoauth/google-auth.js b/src/automint_modules/googleoauth/google-auth.js index 27b669d5..aea04e1c 100644 --- a/src/automint_modules/googleoauth/google-auth.js +++ b/src/automint_modules/googleoauth/google-auth.js @@ -2,7 +2,7 @@ * Module to authenticate user to Google Server * @author ndkcha * @since 0.4.1 - * @version 0.6.0 + * @version 0.6.4 */ /// @@ -42,7 +42,7 @@ // process file containing client secrets and extract its contents for authorization function processClientSecrets(err, content) { if (err) { - console.log('Error loading content: ' + err); + console.warn('Error loading content: ' + err); return; } authorize(JSON.parse(content), cbFn); @@ -108,7 +108,7 @@ function handleToken(err, token) { if (err) { - console.log('Error while trying to retrieve access token', err); + console.warn('Error while trying to retrieve access token', err); return; } oAuth2Client.credentials = token; @@ -121,7 +121,6 @@ // store token in local storage function storeToken(token) { try { - console.log(TOKEN_DIR); fs.mkdirSync(TOKEN_DIR); } catch(err) { if (err.code != 'EEXIST') diff --git a/src/bower.json b/src/bower.json index 567eba5a..dc9a43ac 100644 --- a/src/bower.json +++ b/src/bower.json @@ -22,14 +22,14 @@ "tests" ], "dependencies": { - "angular": "^1.5.3", - "angular-ui-router": "^0.2.18", - "angular-sanitize": "^1.5.3", - "angular-material": "^1.0.7", + "angular": "^1.5.7", + "angular-ui-router": "^0.3.1", + "angular-sanitize": "^1.5.7", + "angular-material": "^1.0.9", "oclazyload": "^1.0.9", - "angular-material-data-table": "^0.10.4", - "jquery": "^2.2.3", - "moment": "^2.12.0", + "angular-material-data-table": "^0.10.9", + "jquery": "^3.0.0", + "moment": "^2.14.1", "angular-google-chart": "^0.1.0" } } diff --git a/src/index.html b/src/index.html index eaf03de5..fc8f395a 100644 --- a/src/index.html +++ b/src/index.html @@ -24,7 +24,7 @@ - + @@ -36,7 +36,7 @@ - + diff --git a/src/main.js b/src/main.js index 42555f46..e130ff03 100644 --- a/src/main.js +++ b/src/main.js @@ -2,7 +2,7 @@ * Entrance file for Atom Electron App * @author ndkcha * @since 0.1.0 - * @version 0.1.0 + * @version 0.6.4 by @vrlkacha */ 'use strict'; @@ -19,7 +19,8 @@ // Module to Auto Update app var autoUpdater = electron.autoUpdater; var os = require('os'); - var feedURL = 'http://updates.automint.in/releases/' + (os.platform()) + '/' + (os.arch()); + // var feedURL = 'http://updates.automint.in/releases/' + (os.platform()) + '/' + (os.arch()); + var feedURL = 'http://updates.automint.in/releases/win32/ia32'; autoUpdater.addListener("error", function(error) {}); autoUpdater.setFeedURL(feedURL); if (process.argv[1] == '--squirrel-firstrun') { @@ -34,23 +35,11 @@ // be closed automatically when the JavaScript object is garbage collected. let mainWindow; - function createWindow() { - // Create the browser window. - mainWindow = new BrowserWindow({ - width: 800, - height: 600 - }); - mainWindow.maximize(); - // and load the index.html of the app. - mainWindow.loadURL('file://' + __dirname + '/index.html'); + var shouldQuit = app.makeSingleInstance(msiCallback); - // Emitted when the window is closed. - mainWindow.on('closed', function() { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null; - }); + if (shouldQuit) { + app.quit(); + return; } // This method will be called when Electron has finished @@ -73,4 +62,31 @@ createWindow(); } }); + + function createWindow() { + // Create the browser window. + mainWindow = new BrowserWindow({ + width: 800, + height: 600 + }); + mainWindow.maximize(); + // and load the index.html of the app. + mainWindow.loadURL('file://' + __dirname + '/index.html'); + + // Emitted when the window is closed. + mainWindow.on('closed', function() { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); + } + + // Someone tried to run a second instance, we should focus our window. + function msiCallback(commandLine, workingDirectory) { + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore(); + mainWindow.focus(); + } + } })(); \ No newline at end of file diff --git a/src/package.json b/src/package.json index acd820f0..372955c4 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "Automint", - "version": "0.6.3", + "version": "0.6.4", "description": "CRM by Automint", "main": "main.js", "scripts": { @@ -16,8 +16,9 @@ }, "dependencies": { "base64url": "^1.0.6", - "google-auth-library": "^0.9.7", + "google-auth-library": "^0.9.8", "googleapis": "^5.2.1", - "premailer-api": "^1.0.4" + "premailer-api": "^1.0.4", + "promise": "^7.1.1" } }