{"version":3,"sources":["helpers.js","api-intercepter.js","authentication.js","cache.js","file.js","filters.js","format.js","functions.js","http-pending-requests.js","local-database.js","ng-react-bridge.js","permissions.js","portal-permissions.js","resource.js","validation.js"],"names":["angular","module","factory","$q","$rootScope","Authentication","HttpPendingRequests","$window","localStorageService","regexDateFormat1","regexDateFormat2","regexDateFormat3","regexDateFormat4","convertDateStringsToDates","input","indexOf","key","hasOwnProperty","match","value","Date","charAt","length","loadingCount","request","config","d","defer","headers","$state","current","Angularstate","name","url","startsWith","apiLocation","$broadcast","undefined","data","loginRequired","params","get","isPortal","then","authData","Authorization","access_token","go","messages","resolve","promise","response","authHeader","authorization","storageKey","split","set","responseError","error_uri","error_description","keepMessages","transitionTo","reload","inherit","notify","substring","lastIndexOf","token","location","href","reject","$injector","authenticationData","gettingAuthentication","authenticate","$http","post","Content-Type","login","args","grant_type","enterpriseID","password","pass","setRootScope","userID","user_id","enterprise_id","internalURL","portalURL","portalCSS","portalTopMenu","is_portal","$on","error","allowAnonymous","LocalDatabase","Format","setState","table","state","putWithIndex","getState","save","index","evaluateJSON","getAll","remove","fileId","refTable","refID","getAjaxURL","service","method","internalUrlRoot","generateUUID","getTime","uuid","replace","c","r","Math","random","floor","toString","dataURItoBlob","dataURI","byteString","mimestring","atob","decodeURI","content","i","charCodeAt","Blob","Uint8Array","type","getFileContent","file_id","$","Deferred","ajax","dataType","cache","success","e","getFileContentOffline","Database","getFileUrlByID","fileID","offline","fail","setReference","id","imgData","setFileID","ID","internal","saveFile","param","addArray","fd","FormData","append","description","document_type_id","file_name","file_size","file_content","file_type","ref_id","ref_table","ref_field","contentType","processData","original","push","deletePhoto","deleteArray","found","forEach","photo","splice","filter","$filter","items","classification","field","resetItems","item","filtered","resetItem","county","toLowerCase","month","getMonth","year","getFullYear","days","out","now","isValidDate","dayDiff","round","label","string","result","txt","toUpperCase","substr","date","day","getDate","hour","getHours","minute","getMinutes","second","getSeconds","convertDateToUTC","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","cyberSourceDate","record","revertTimeZone","partial","getDescendantProp","obj","desc","forceString","arr","shift","fileSize","bytes","val","isNaN","pow","underscore","newString","buildCSS","jsonString","isPublic","jsonObject","fromJson","active_link","isHexColor","background","button","menu","header_background","nativeJSDateFormat","formatName","Object","prototype","call","updateArray","array","object","copy","sortObjectArray","property","sortOrder","a","b","guid","s4","nullGuid","isValidGuid","test","regex","exec","isValidGuidList","list","validateEmail","email","re","isEmpty","color","getNameFromListArray","nameVal","isArray","opt","generateStringFromArrays","valueArray","optionArray","showValue","isString","chunkArray","myArray","chunk_size","results","String","str","this","slice","isUndefined","removeByAttr","attr","arguments","getByAttr","showDate","setTime","getTimezoneOffset","applyTimeZone","newTimeout","cancelPromise","cancelPromises","cancelAll","isGloballyCancelled","filesystem","licensuredb","keyPaths","license","query","visit","inspection","account","enterprise","portal_permission","inspection_status","merge_sort","middle","left","right","merge","il","ir","concat","getFileURL","file","deferredFileURL","CONTENT","window","URL","createObjectURL","root","getFile","FILE_NAME","fileEntry","toURL","console","log","writeFileToStorage","deferredFile","create","createWriter","fileWriter","onwriteend","onerror","event","write","deleteFileFromStorage","fileName","openDB","offlineDBOn","Dexie","version","stores","open","openTheDB","collection","put","blob","removeWithIndex","clear","toArray","getOneWithIndex","getWithIndexOnly","only","appraisaldb","all","beginsWith","lower","limit","counter","temp","NAME","getAllWithIndex","getWithSortOrder","sort","dbresult","filePointer","FILE_ID","deleteFile","deferredFileGet","fileURL","fileObject","isCssLoaded","existingLinkElements","document","getElementsByTagName","existingStyleElements","getAttribute","loadCssAsync","Promise","linkElement","createElement","rel","head","appendChild","isScriptLoaded","existingScriptElements","src","loadScriptAsync","scriptElement","loadScriptPromise","async","onload","body","timeoutPromise","setTimeout","race","openCacheAsync","cacheNameBase","caches","cacheGetOrAddAsync","text","add","originalLoadScriptAsync","loadScriptTextAsync","script","fromUrl","setAttribute","scriptText","Error","err","originalLoadCssAsync","loadCssText","css","styleElement","textContent","cssText","initializeAsync","resource","basename","hashIndex","cssUrl","loadCssPromise","scriptUrl","createRenderOptions","portal","pathBase","pathname","paths","appPath","app","loginUrl","absolute","homeUrl","renderPageOptions","rootElementId","apiUrl","routerBasename","angularJsCompatibilityMode","createNgReactDirective","renderFunc","cleanupFunc","renderOptions","restrict","link","scope","elem","attrs","rootElement","onScopeDestroy","$eval","unmountComponent","cleaner","bind","SecurityTemplatePermissions","permissions","gettingPermissions","getPermissions","p","permission","view","userAccount","edit","delete","CMSSites","Cache","portalPermissions","permissionObject","getByEnterprise","s","portal_pages","visible","required_login","PRODUCTNAME","getByAddress","address","encodeURIComponent","viewByAddress","page","access","requiredLogin","activeOptions","options","environmentOptions","yesNoOptions","dateOptions","months","abbrv","weekdays","years","offset","span","currentYear","birthdate_duration","duration","alpha","getActiveOptions","getEnvironmentOptions","getDateOptions","browser","tem","ua","navigator","userAgent","M","join","appName","appVersion","isNumeric","n","parseFloat","isFinite","isDate","parseDate","getDifferenceInDays","today","setHours","trunc","functions","validateNumeric","validatePastDate","validateToday","validateFutureDate","validatePastDateToday","validateFutureDateToday","validateNotToday","validateDollar","validateDobEighteen","setFullYear","parseInt","validateDobSixteen","validateGpsLatitude","validateGpsLongitude","validateWithin30Days","dateToCheck","diff","validateWithin60Days","validateWithin90Days","validateMin","settings","min_length","validateMax","max_length","validateType","validation_type_method","validateExpression","tempString","map","regexString","expression","RegExp","validateQuestion","validation","minResult","$setValidity","$setDirty","maxResult","validation_type_id","typeResult","expResult","funcResult"],"mappings":"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","file":"helpers-24.12.2.2.min.js","sourcesContent":["'use strict';\r\n\r\nangular.module('licensure.helpers', [\r\n\r\n])","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('ApiIntercepter', ['$q', '$rootScope', 'Authentication', 'HttpPendingRequests', '$window', 'localStorageService', function ($q, $rootScope, Authentication, HttpPendingRequests, $window, localStorageService) {\r\n var regexDateFormat1 = /^\\d{4}-\\d{2}-\\d{2}\\s?T?\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?$/g;\r\n var regexDateFormat2 = /^\\d{2}\\/\\d{2}\\/\\d{4}\\s\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z?$/g;\r\n var regexDateFormat3 = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}\\s(AM|PM)?$/g;\r\n var regexDateFormat4 = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/g;\r\n\r\n var convertDateStringsToDates = function (input) {\r\n // Ignore things that aren't objects.\r\n if (typeof input !== \"object\") {\r\n return;\r\n }\r\n\r\n //Ignore certain custom form answers (they could have custom options that look like dates) - multi select, drop down, checkbox, slush box, radio button, search\r\n if (input && input[\"data_point_id\"] == null && input[\"section_id\"] != null && (input[\"service\"] == null || input[\"service\"] == \"\") && input[\"question_type_id\"] != null && ['1ae5aa55-c71a-4e13-961c-511597b4d78c', '3b114d4f-39f9-4ee3-8692-046d6277e326', '67948a8a-55e8-45cf-aa27-8928872a7430', '79af640c-4420-4466-9b8b-63b9ea805b50', 'c335ef14-5e37-4350-b760-dea16764fcfb', '2cd698ad-dcc7-4990-acd0-c0db28e69a32'].indexOf(input[\"question_type_id\"]) >= 0) {\r\n return;\r\n }\r\n\r\n for (var key in input) {\r\n if (!input.hasOwnProperty(key)) continue;\r\n\r\n var value = input[key];\r\n var match;\r\n // Check for string properties which look like dates.\r\n if (typeof value === \"string\" && ((match = value.match(regexDateFormat2)) || (match = value.match(regexDateFormat3)) || (match = value.match(regexDateFormat4)))) {\r\n input[key] = new Date(value);\r\n }\r\n else if (typeof value === \"string\" && (match = value.match(regexDateFormat1))) {\r\n // the regexDateFormat1 has the trailing uppercase 'Z' as optional so adding a check for that here\r\n if (value.charAt(value.length - 1) !== 'Z') {\r\n input[key] = new Date(value + 'Z');\r\n }\r\n else {\r\n input[key] = new Date(value);\r\n }\r\n }\r\n else if (typeof value === \"object\") {\r\n // Recurse into object\r\n convertDateStringsToDates(value);\r\n }\r\n else {\r\n //console.log(value);\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n var loadingCount = 0;\r\n\r\n return {\r\n request: function (config) {\r\n var d = $q.defer();\r\n config = config || {};\r\n config.headers = config.headers || {};\r\n\r\n if ($rootScope.$state != null && $rootScope.$state.current != null) {\r\n config.headers.Angularstate = $rootScope.$state.current.name;\r\n }\r\n\r\n if (config.url.startsWith(apiLocation + '/api/')) {\r\n if (++loadingCount > 0) $rootScope.$broadcast('loading:progress');\r\n if (($rootScope.$state.current.data != undefined && $rootScope.$state.current.data.loginRequired) || ($rootScope.$state.current.params != undefined && $rootScope.$state.current.params.loginRequired)) {\r\n // Make sure they have a token (for internal, it creates a new one if they don't), and if not make them log in again\r\n Authentication.get($rootScope.$state.current.data.isPortal).then(function (authData) {\r\n if (authData) {\r\n // they have token\r\n config.headers.Authorization = 'Bearer ' + authData.access_token;\r\n }\r\n else {\r\n // they don't\r\n if ($rootScope.$state.current.data.isPortal) {\r\n $rootScope.$state.go(\"portal.menus.login\", { messages: [\"Your session has expired. Please log in again to continue.\"] });\r\n }\r\n else {\r\n // redirect to internal login\r\n }\r\n\r\n }\r\n d.resolve(config);\r\n });\r\n }\r\n // there are cases where login isn't required, but we want to get the account data anyway (redirecting from a CF page to a .NET page)\r\n else if ($rootScope.$state.current.data != undefined || $rootScope.$state.current.params != undefined) {\r\n Authentication.get($rootScope.$state.current.data.isPortal).then(function (authData) {\r\n if (authData) {\r\n // they have token\r\n config.headers.Authorization = 'Bearer ' + authData.access_token;\r\n }\r\n d.resolve(config);\r\n });\r\n }\r\n else {\r\n d.resolve(config);\r\n }\r\n }\r\n else {\r\n d.resolve(config);\r\n }\r\n\r\n return d.promise;\r\n },\r\n\r\n response: function (response) {\r\n var d = $q.defer();\r\n\r\n var authHeader = response.headers().authorization;\r\n if (authHeader !== undefined && authHeader != null && authHeader.length > 0) {\r\n var storageKey = $rootScope.$state.current.data.isPortal ? 'portalAuthorizationData' : 'internalAuthorizationData';\r\n var authData = localStorageService.get(storageKey);\r\n if (authData !== undefined && authData != null) {\r\n authData.access_token = authHeader.split(\" \")[1];\r\n localStorageService.set(storageKey, authData);\r\n }\r\n }\r\n\r\n if (response.config.url.startsWith(apiLocation + '/api/')) {\r\n convertDateStringsToDates(response.data);\r\n if (--loadingCount == 0) $rootScope.$broadcast('loading:finish');\r\n }\r\n\r\n d.resolve(response);\r\n return d.promise;\r\n },\r\n\r\n responseError: function(response){\r\n\r\n if (response.config.url.startsWith(apiLocation + '/api/')) {\r\n if (--loadingCount == 0) $rootScope.$broadcast('loading:finish');\r\n }\r\n if (response.data != null && response.data.error_uri != null) {\r\n if (response.data.error_uri.indexOf('http') != 0) { // check whether angular state, or full url\r\n if ($rootScope.$state.current.name == response.data.error_uri) {\r\n // we're staying on the same page, but we need to \"reload\" to get any error messages loaded in\r\n var params = $rootScope.$state.current.params;\r\n params.messages = [response.data.error_description];\r\n $rootScope.$state.transitionTo($rootScope.$state.current, params, {\r\n reload: true,\r\n inherit: false,\r\n notify: true\r\n });\r\n }\r\n else {\r\n $rootScope.$state.go(response.data.error_uri, {messages: [response.data.error_description], keepMessages: true});\r\n return $q.resolve(response);\r\n }\r\n }\r\n else {\r\n // if full url, could be coldfusion page, or could be reset password page. If reset password, we want error message passed through, which we can't do through a $window.location call\r\n if (response.data.error_uri.indexOf('/reset/') > -1) {\r\n var url = response.data.error_uri.substring(0, response.data.error_uri.lastIndexOf('/'));\r\n var token = url.substring(url.lastIndexOf('/') + 1, url.length + 1);\r\n $rootScope.$state.go('portal.menus.resetpassword', { token: token, messages: [response.data.error_description], keepMessages: true });\r\n }\r\n else {\r\n $window.location.href = response.data.error_uri;\r\n }\r\n }\r\n }\r\n else {\r\n\r\n }\r\n\r\n return $q.reject(response.data);\r\n }\r\n }\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('Authentication', ['$injector', '$q', 'localStorageService', '$rootScope', function ($injector, $q, localStorageService, $rootScope) {\r\n var authenticationData = null;\r\n var gettingAuthentication = false;\r\n\r\n var authenticate = function (isPortal) {\r\n var d = $q.defer();\r\n var $http = $injector.get('$http');\r\n\r\n $http.post(apiLocation + '/token', \"grant_type=environment&isPortal=\" + isPortal, {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n }).\r\n then(function (response) {\r\n // set when the token expires\r\n //var t = new Date();\r\n //t.setSeconds(t.getSeconds() + data.expires_in);\r\n //data.expires = t;\r\n\r\n if (isPortal) {\r\n localStorageService.set('portalAuthorizationData', response.data);\r\n }\r\n else {\r\n localStorageService.set('internalAuthorizationData', response.data);\r\n }\r\n d.resolve(response.data);\r\n })\r\n .catch(function (response) {\r\n d.reject(response.data);\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n var login = function (args) {\r\n var d = $q.defer();\r\n var $http = $injector.get('$http');\r\n\r\n args.grant_type = \"password\";\r\n args.enterpriseID = $rootScope.enterpriseID;\r\n args.password = args.pass;\r\n\r\n $http.post(apiLocation + '/api/Core/Auth/Login', args).\r\n then(function (response) {\r\n // set when the token expires\r\n //var t = new Date();\r\n //t.setSeconds(t.getSeconds() + data.expires_in);\r\n //data.expires = t;\r\n\r\n if (args.isPortal) {\r\n localStorageService.set('portalAuthorizationData', response.data);\r\n }\r\n else {\r\n localStorageService.set('internalAuthorizationData', response.data);\r\n }\r\n d.resolve(response.data);\r\n })\r\n .catch(function (response) {\r\n d.reject(response.data);\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n var setRootScope = function (authData) {\r\n $rootScope.userID = authData.user_id;\r\n $rootScope.enterpriseID = authData.enterprise_id;\r\n $rootScope.internalURL = authData.internalURL;\r\n $rootScope.portalURL = authData.portalURL;\r\n $rootScope.portalCSS = authData.portalCSS;\r\n $rootScope.portalTopMenu = authData.portalTopMenu;\r\n $rootScope.isPortal = authData.is_portal;\r\n authenticationData = authData;\r\n }\r\n\r\n return {\r\n get: function (isPortal) {\r\n var d = $q.defer();\r\n var authData;\r\n\r\n if (isPortal) {\r\n authData = localStorageService.get('portalAuthorizationData');\r\n if (!authData && $rootScope.$state.current.params && $rootScope.$state.current.params.loginRequired) {\r\n //Try to get authentication (but only for tabs where login is required)\r\n if (!gettingAuthentication) {\r\n gettingAuthentication = true;\r\n authenticate(isPortal).then(function (data) {\r\n setRootScope(data);\r\n gettingAuthentication = false;\r\n $rootScope.$broadcast('Authentication:finish');\r\n d.resolve(data);\r\n }).catch(function (error) {\r\n // handle the error \r\n });\r\n }\r\n else {\r\n $rootScope.$on('Authentication:finish', function () {\r\n d.resolve(authenticationData);\r\n });\r\n }\r\n }\r\n else if (!authData) {\r\n d.resolve(null);\r\n }\r\n else {\r\n setRootScope(authData);\r\n d.resolve(authData);\r\n }\r\n }\r\n else {\r\n authData = localStorageService.get('internalAuthorizationData');\r\n\r\n if (!authData && $rootScope.$state.current.params && $rootScope.$state.current.params.allowAnonymous) {\r\n d.resolve(null);\r\n }\r\n else if (!authData) {\r\n if (!gettingAuthentication) {\r\n gettingAuthentication = true;\r\n authenticate(isPortal).then(function (data) {\r\n setRootScope(data);\r\n gettingAuthentication = false;\r\n $rootScope.$broadcast('Authentication:finish');\r\n d.resolve(data);\r\n }).catch(function (error) {\r\n // handle the error \r\n });\r\n }\r\n else {\r\n $rootScope.$on('Authentication:finish', function () {\r\n d.resolve(authenticationData);\r\n });\r\n }\r\n }\r\n else {\r\n setRootScope(authData);\r\n d.resolve(authData);\r\n }\r\n }\r\n\r\n return d.promise;\r\n },\r\n\r\n login: login,\r\n\r\n authenticate: authenticate\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('Cache', ['LocalDatabase', '$state', 'Format', function (LocalDatabase, $state, Format) {\r\n return {\r\n setState: function (table, data) {\r\n data.state = $state.current.name;\r\n return LocalDatabase.putWithIndex(table, 'state', $state.current.name, data);\r\n },\r\n\r\n getState: function (table) {\r\n return LocalDatabase.get(table, $state.current.name);\r\n },\r\n\r\n save: function (table, data, index) {\r\n if (index == null) {\r\n index = 'id';\r\n }\r\n\r\n return LocalDatabase.putWithIndex(table, index, Format.evaluateJSON(data, index), data);\r\n },\r\n\r\n get: function (table, index) {\r\n return LocalDatabase.get(table, index);\r\n },\r\n\r\n getAll: function (table) {\r\n return LocalDatabase.getAll(table);\r\n },\r\n\r\n remove: function (table, index) {\r\n return LocalDatabase.remove(table, index);\r\n }\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.helpers').factory('File', ['$rootScope', 'LocalDatabase', function ($rootScope, LocalDatabase) {\r\n\r\n var\r\n fileId = '00000000-0000-0000-000000000000',\r\n\r\n refTable = '',\r\n\r\n refID = '00000000-0000-0000-000000000000',\r\n\r\n getAjaxURL = function (service, method) {\r\n return $rootScope.internalUrlRoot +\r\n 'Appraisal/controller.cfm?method=' +\r\n service + '.' +\r\n method;\r\n },\r\n getAjaxURLJSON = function (service, method) {\r\n return getAjaxURL(service, method) +\r\n '&returnformat=json';\r\n },\r\n // TODO: helper service\r\n generateUUID = function () {\r\n var d = new Date().getTime();\r\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16);\r\n });\r\n return uuid;\r\n },\r\n dataURItoBlob = function (dataURI) {\r\n\r\n var byteString,\r\n mimestring;\r\n\r\n if (dataURI.split(',')[0].indexOf('base64') !== -1) {\r\n byteString = atob(dataURI.split(',')[1]);\r\n } else {\r\n byteString = decodeURI(dataURI.split(',')[1]);\r\n }\r\n\r\n mimestring = dataURI.split(',')[0].split(':')[1].split(';')[0];\r\n\r\n var content = [];\r\n\r\n for (var i = 0; i < byteString.length; i++) {\r\n content[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return new Blob([new Uint8Array(content)], { type: mimestring });\r\n },\r\n getFileContent = function (file_id) {\r\n\r\n var d = $.Deferred();\r\n\r\n $.ajax({\r\n type: 'GET',\r\n url: 'inspections/file/getFileContent',\r\n data: {\r\n 'file_id': file_id\r\n },\r\n dataType: 'JSON',\r\n cache: false,\r\n success: function (data) {\r\n d.resolve(data);\r\n },\r\n error: function (e) {\r\n d.reject(e);\r\n }\r\n });\r\n\r\n return d.promise();\r\n\r\n },\r\n getFileContentOffline = function (file_id) {\r\n var d = $.Deferred();\r\n\r\n Database.get('file', file_id).then(function (data) {\r\n d.resolve(data);\r\n })\r\n\r\n return d.promise();\r\n },\r\n getFileUrlByID = function (fileID, offline) {\r\n\r\n var d = $.Deferred();\r\n\r\n if (offline) {\r\n Database.getFileUrlByID(fileID).then(function (url) {\r\n d.resolve(url);\r\n }).fail(function (e) {\r\n d.reject(e);\r\n });\r\n } else {\r\n d.resolve(getAjaxURL('fileController', 'downloadFile') + '&fileID=' + fileID);\r\n }\r\n\r\n return d.promise();\r\n\r\n },\r\n saveImageData = function (param) {\r\n //refId, fileId, refTable\r\n var d = $.Deferred();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n data: param,\r\n dataType: 'JSON',\r\n url: param.url,\r\n cache: false,\r\n error: function (e) {\r\n d.reject(e);\r\n },\r\n success: function (result) {\r\n d.resolve(result);\r\n }\r\n });\r\n\r\n return d.promise();\r\n },\r\n bulkUploadPhoto = function (file, appraisalID, itemID) {\r\n var fd = new FormData(),\r\n d = $.Deferred();\r\n\r\n fd.append('upload', file, file.name);\r\n fd.append('name', file.name);\r\n fd.append('appraisalID', appraisalID);\r\n fd.append('field_name', 'upload');\r\n if (itemID != '') {\r\n fd.append('itemID', itemID);\r\n }\r\n\r\n $.ajax({\r\n url: $rootScope.internalUrlRoot + 'Appraisal/controller.cfm?method=AppraisalService.saveBulkPhoto&returnformat=json',\r\n type: 'POST',\r\n data: fd,\r\n contentType: false,\r\n cache: false,\r\n processData: false,\r\n error: function (e) {\r\n d.reject(e, file);\r\n },\r\n success: function (data) {\r\n d.resolve(data, file);\r\n }\r\n });\r\n\r\n return d.promise();\r\n },\r\n indexImages = function (appraisalKey, itemID, itemMediaIds, inspectionPointID, recommendedPhotoID, existingPhotoCount) {\r\n var args = { appraisalKey: appraisalKey, itemID: itemID, itemMediaIds: itemMediaIds, inspectionPointID: inspectionPointID, recommendedPhotoID: recommendedPhotoID, existingPhotoCount: existingPhotoCount };\r\n\r\n var d = $.Deferred();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n data: args,\r\n url: $rootScope.internalUrlRoot + 'Appraisal/controller.cfm?method=AppraisalService.indexPhotos&returnformat=json',\r\n async: false,\r\n cache: false,\r\n error: function (e) {\r\n d.reject(e);\r\n },\r\n success: function (result) {\r\n d.resolve(result);\r\n }\r\n });\r\n\r\n return d.promise();\r\n\r\n };\r\n\r\n return {\r\n setReference: function (id, table, imgData, fileID) {\r\n refTable = table;\r\n refID = id;\r\n $rootScope.$broadcast(\"referenceUpdated\", refID, refTable, imgData, fileID);\r\n },\r\n setFileID: function (ID, internal) {\r\n fileId = ID;\r\n $rootScope.$broadcast(\"file_updated_\" + refID, fileId, internal);\r\n },\r\n saveFile: function (param, internal, addArray) {\r\n var d = $.Deferred();\r\n\r\n if (internal !== 'false') {\r\n var fd = new FormData();\r\n\r\n if (param.file_id !== undefined && param.file_id !== null) {\r\n fd.append('file_id', param.file_id);\r\n }\r\n if (param.description !== undefined && param.description !== null) {\r\n fd.append('description', param.description);\r\n }\r\n if (param.document_type_id !== undefined && param.document_type_id !== null) {\r\n fd.append('document_type_id', param.document_type_id);\r\n }\r\n fd.append('name', param.name);\r\n fd.append('file_name', param.file_name);\r\n fd.append('file_size', param.file_size);\r\n fd.append('file_content', param.file_content);\r\n fd.append('file_type', param.file_type);\r\n fd.append('ref_id', param.ref_id);\r\n fd.append('ref_table', param.ref_table);\r\n\r\n if (param.ref_field === \"Value\") {\r\n fd.append('ref_field', param.ref_field);\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n data: fd,\r\n url: 'inspections/file/saveFile',\r\n contentType: false,\r\n processData: false,\r\n cache: false,\r\n error: function (e) {\r\n d.reject(e);\r\n },\r\n success: function (data) {\r\n d.resolve(data);\r\n }\r\n });\r\n }\r\n else {\r\n if (param.file_id === undefined || param.file_id === null || param.file_id === '') {\r\n param.file_id = generateUUID();\r\n }\r\n\r\n param.original = false;\r\n addArray.push(param);\r\n d.resolve({ 'success': true, 'file_id': param.file_id });\r\n }\r\n\r\n return d.promise();\r\n },\r\n deletePhoto: function (data, internal, deleteArray, addArray) {\r\n var d = $.Deferred();\r\n\r\n if (internal !== 'false') {\r\n $.ajax({\r\n type: 'POST',\r\n url: 'inspections/file/deletePhoto',\r\n data: {\r\n file_id: data.file_id,\r\n ref_id: data.ref_id,\r\n ref_table: data.ref_table\r\n },\r\n dataType: 'JSON',\r\n success: function (data) {\r\n d.resolve(data);\r\n },\r\n error: function (e) {\r\n d.reject(e);\r\n }\r\n });\r\n }\r\n else {\r\n var found = false;\r\n var index;\r\n\r\n addArray.forEach(function (photo, i) {\r\n if (photo.file_id == data.file_id) {\r\n found = true;\r\n index = i;\r\n }\r\n })\r\n\r\n if (found) {\r\n addArray.splice(index, 1);\r\n }\r\n else {\r\n deleteArray.push(data.file_id);\r\n }\r\n\r\n d.resolve({ 'success': true });\r\n }\r\n\r\n return d.promise();\r\n },\r\n\r\n getFileUrlByID: getFileUrlByID,\r\n\r\n getFileContent: getFileContent,\r\n\r\n getFileContentOffline: getFileContentOffline,\r\n\r\n dataURItoBlob: dataURItoBlob\r\n\r\n };\r\n\r\n}]);","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .filter('classification', ['$filter', function ($filter) {\r\n return function (items, classification, field) {\r\n\r\n var resetItems = items.filter(function (item) {\r\n if (item['activeservice'] == true) {\r\n if (item['filtered'] == \"Classification\") {\r\n item['disable'] = false;\r\n item['filtered'] = null;\r\n }\r\n }\r\n return item;\r\n });\r\n\r\n var filtered = resetItems.filter(function (resetItem) {\r\n if (resetItem['activeservice'] == true) {\r\n if (field !== null && classification !== null) {\r\n if (resetItem[field] !== classification) {\r\n resetItem['disable'] = true;\r\n resetItem['filtered'] = \"Classification\";\r\n }\r\n }\r\n }\r\n return resetItem['disable'] !== true ;\r\n });\r\n\r\n return filtered;\r\n }\r\n }])\r\n .filter('county', ['$filter', function ($filter) {\r\n return function (items, county, field) {\r\n var resetItems = items.filter(function (item) {\r\n if (item['activeservice'] == true) {\r\n if (item['filtered'] == \"County\") {\r\n item['disable'] = false;\r\n item['filtered'] = null;\r\n }\r\n }\r\n return item;\r\n });\r\n\r\n var filtered = resetItems.filter(function (resetItem) {\r\n if (resetItem['activeservice'] == true) {\r\n if (field !== null && county !== null) {\r\n // if county (the filter) is null, don't disable anything, otherwise check for equality\r\n if (county !== null && resetItem[field] !== null && resetItem[field].toLowerCase() !== county.toLowerCase()) {\r\n resetItem['disable'] = true;\r\n resetItem['filtered'] = \"County\";\r\n } else if (county !== null && resetItem[field] === null) {\r\n resetItem['disable'] = true;\r\n resetItem['filtered'] = \"County\";\r\n }\r\n }\r\n }\r\n return resetItem;\r\n });\r\n\r\n return filtered;\r\n }\r\n }])\r\n .filter('month', ['$filter', function ($filter) {\r\n return function (items, month, field) {\r\n if (month == null || field == null) {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n for (var i = 0; i < items.length; i++) {\r\n var d = new Date($filter('date')(items[i][field], 'medium'));\r\n if (d.getMonth() == month) {\r\n filtered.push(items[i]);\r\n }\r\n }\r\n return filtered;\r\n }\r\n }])\r\n .filter('year', ['$filter', function ($filter) {\r\n return function (items, year, field) {\r\n if (year == null || field == null) {\r\n return items;\r\n }\r\n\r\n var filtered = [];\r\n for (var i = 0; i < items.length; i++) {\r\n var d = new Date($filter('date')(items[i][field], 'medium'));\r\n if (d.getFullYear() == year) {\r\n filtered.push(items[i]);\r\n }\r\n }\r\n return filtered;\r\n }\r\n }])\r\n .filter('days', ['Format', function (Format) {\r\n return function (input, days, field) {\r\n input = input || [];\r\n\r\n if (field == null || days == null)\r\n return input;\r\n\r\n var out = [];\r\n var now = new Date();\r\n input.forEach(function (item) {\r\n if (item != null) {\r\n var value = item[field];\r\n if (value != null && isValidDate(value)) {\r\n var dayDiff = Math.round((now.getTime() - value.getTime()) / (24 * 60 * 60 * 1000));\r\n if (dayDiff < 0) {\r\n if (dayDiff >= days) {\r\n out.push(item);\r\n }\r\n }\r\n else {\r\n if (days == 1 && dayDiff == 1) {\r\n // special case for yesterday, to not include today \r\n out.push(item);\r\n }\r\n else if (days != 1 && dayDiff <= days) {\r\n out.push(item);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n return out;\r\n }\r\n }])\r\n ;","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('Format', [function () {\r\n return {\r\n label: function (string) {\r\n var result;\r\n\r\n result = string.replace(/_/g, \" \");\r\n result = result.replace(/\\w\\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });\r\n\r\n return result;\r\n },\r\n\r\n date: function (date) {\r\n var day = date.getDate(); // yields day\r\n var month = date.getMonth()+1; // yields month\r\n var year = date.getFullYear(); // yields year\r\n var hour = date.getHours(); // yields hours \r\n var minute = date.getMinutes(); // yields minutes\r\n var second = date.getSeconds(); // yields seconds\r\n // After this construct a string with the above results as below\r\n return month + \"/\" + day + \"/\" + year + \" \" + hour + ':' + minute + ':' + second;\r\n },\r\n\r\n convertDateToUTC: function(date) {\r\n return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());\r\n },\r\n\r\n cyberSourceDate: function (date) {\r\n var day = date.getUTCDate(); // yields day\r\n var month = date.getUTCMonth() + 1; // yields month\r\n var year = date.getUTCFullYear(); // yields year\r\n var hour = date.getUTCHours(); // yields hours \r\n var minute = date.getUTCMinutes(); // yields minutes\r\n var second = date.getUTCSeconds(); // yields seconds\r\n // After this construct a string with the above results as below\r\n return year + \"-\" + (month < 10 ? \"0\" + month : month) + \"-\" + (day < 10 ? \"0\" + day : day) + \"T\" + (hour < 10 ? \"0\" + hour : hour) + ':' + (minute < 10 ? \"0\" + minute : minute) + ':' + (second < 10 ? \"0\" + second : second) + \"Z\";\r\n },\r\n\r\n evaluateJSON: function (record, field, revertTimeZone) {\r\n var value = record;\r\n\r\n if (field != '') {\r\n field.split('.').forEach(function (partial) {\r\n if (value != null) {\r\n value = value[partial];\r\n }\r\n })\r\n }\r\n \r\n if (value instanceof Date) {\r\n if (revertTimeZone) {\r\n value = value.revertTimeZone();\r\n }\r\n //value = value.toLocaleDateString(\"en-US\");\r\n }\r\n\r\n return value;\r\n },\r\n\r\n getDescendantProp: function (obj, desc, forceString) {\r\n if (obj != null && desc != null) {\r\n var arr = desc.split(\".\");\r\n while (arr.length && (obj = obj[arr.shift()]));\r\n }\r\n\r\n if (forceString) {\r\n obj += '';\r\n }\r\n\r\n return obj;\r\n },\r\n\r\n fileSize: function (bytes) {\r\n var val = '';\r\n\r\n if (!isNaN(bytes)) {\r\n bytes = +bytes;\r\n if (bytes < 1024) {\r\n val = bytes + ' b';\r\n }\r\n else if (bytes < Math.pow(1024,2)) {\r\n val = Math.round(bytes / 1024, -2) + ' KB';\r\n }\r\n else if (bytes < Math.pow(1024, 3)) {\r\n val = Math.round(bytes / Math.pow(1024, 2), -2) + ' MB';\r\n }\r\n else {\r\n val = Math.round(bytes / Math.pow(1024, 3), -2) + ' GB';\r\n }\r\n }\r\n else {\r\n val = bytes;\r\n }\r\n\r\n return val;\r\n },\r\n\r\n underscore: function(original) {\r\n var newString = original.toLowerCase();\r\n var newString = newString.replace(\" \", \"_\");\r\n return newString;\r\n },\r\n\r\n buildCSS: function (jsonString, isPublic) {\r\n if (jsonString == null) {\r\n return \"\";\r\n }\r\n if (jsonString.indexOf(\"\";\r\n return val;\r\n },\r\n\r\n url: function (value) {\r\n if (value && value !== '' && value.substring(0, 4) !== 'http') {\r\n return 'http://' + value;\r\n }\r\n else {\r\n return value;\r\n }\r\n },\r\n\r\n nativeJSDateFormat: function (formatName) {\r\n switch (formatName) {\r\n case \"MM/DD/YY\":\r\n return { month: '2-digit', day: '2-digit', year: '2-digit' };\r\n case \"MM/DD/YYYY hh:mm\":\r\n // MM/DD/YYYY, hh:mm AM/PM\r\n return { month: '2-digit', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' };\r\n default:\r\n // MM/DD/YYYY\r\n return { month: '2-digit', day: '2-digit', year: 'numeric' };\r\n }\r\n }\r\n }\r\n }])\r\n;","if (typeof (String.prototype.startsWith) === 'undefined') {\r\n String.prototype.startsWith = function (str) {\r\n return this.slice(0, str.length) === str;\r\n };\r\n}\r\n\r\nvar isUndefined = function (str) {\r\n if (str == null || str == undefined || str == '') {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n}\r\n\r\nvar removeByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i]\r\n && arr[i].hasOwnProperty(attr)\r\n && (arguments.length > 2 && arr[i][attr] === value)) {\r\n\r\n arr.splice(i, 1);\r\n }\r\n }\r\n return arr;\r\n}\r\n\r\nvar getByAttr = function (arr, attr, value) {\r\n var i = arr.length;\r\n while (i--) {\r\n if (arr[i] && arr[i].hasOwnProperty(attr) && (arguments.length > 2 && arr[i][attr] === value)) {\r\n return arr[i];\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction isValidDate(d) {\r\n if (Object.prototype.toString.call(d) !== \"[object Date]\")\r\n return false;\r\n return !isNaN(d.getTime());\r\n}\r\n\r\nfunction updateArray(array, object, remove) {\r\n var found = false;\r\n\r\n for (var i in array) {\r\n if (array[i].id == object.id) {\r\n found = true;\r\n if (remove) {\r\n array.splice(i, 1);\r\n }\r\n else {\r\n array[i] = angular.copy(object);\r\n }\r\n }\r\n }\r\n\r\n if (!found && !remove) {\r\n array.push(object);\r\n }\r\n}\r\n\r\nfunction sortObjectArray(property) {\r\n var sortOrder = 1;\r\n if (property[0] === \"-\") {\r\n sortOrder = -1;\r\n property = property.substr(1);\r\n }\r\n return function (a, b) {\r\n var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;\r\n return result * sortOrder;\r\n }\r\n}\r\n\r\nfunction guid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' +\r\n s4() + '-' + s4() + s4() + s4();\r\n}\r\n\r\nfunction nullGuid() {\r\n return '00000000-0000-0000-0000-000000000000';\r\n}\r\n\r\nfunction isValidGuid(test) {\r\n var regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;\r\n var match = regex.exec(test);\r\n return match != null;\r\n}\r\n\r\nfunction isValidGuidList(list) {\r\n var pass = true;\r\n\r\n list.split(',').forEach(function (test) {\r\n if (!isValidGuid(test)) {\r\n pass = false;\r\n }\r\n })\r\n\r\n return pass;\r\n}\r\n\r\nDate.prototype.revertTimeZone = function () {\r\n var showDate = new Date(this.getTime());\r\n showDate.setTime(showDate.getTime() + (showDate.getTimezoneOffset() * 60 * 1000));\r\n return showDate;\r\n}\r\n\r\nDate.prototype.applyTimeZone = function () {\r\n var showDate = new Date(this.getTime());\r\n showDate.setTime(showDate.getTime() - (showDate.getTimezoneOffset() * 60 * 1000));\r\n return showDate;\r\n}\r\n\r\nfunction validateEmail(email) {\r\n var re = /[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}$/;\r\n return re.test(email);\r\n}\r\n\r\nfunction isEmpty(obj) {\r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key))\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isHexColor(color) {\r\n // used to see if input string is valid hex for color representation in CSS\r\n var re = /(^[0-9A-Fa-f]{6}$)|(^[0-9A-Fa-f]{3}$)/;\r\n return re.test(color);\r\n}\r\n\r\nfunction getNameFromListArray(array, id) {\r\n // returns the id if there is no matching id in the array\r\n var nameVal = null;\r\n if (angular.isArray(array)) {\r\n array.forEach(function (opt) {\r\n if (opt.id == id) {\r\n nameVal = opt.name;\r\n }\r\n })\r\n }\r\n return nameVal;\r\n}\r\n\r\n\r\nfunction generateStringFromArrays(valueArray, optionArray) {\r\n var showValue = null;\r\n\r\n if (angular.isArray(valueArray)) {\r\n valueArray.forEach(function (val) {\r\n if (val != null) {\r\n var value = null;\r\n if (angular.isString(val)) {\r\n value = val;\r\n }\r\n else {\r\n value = val.id;\r\n }\r\n\r\n optionArray.forEach(function (opt) {\r\n if (opt.id == value) {\r\n if (showValue == null) {\r\n showValue = opt.name;\r\n }\r\n else {\r\n showValue += ', ' + opt.name;\r\n }\r\n }\r\n })\r\n }\r\n })\r\n\r\n if (valueArray.length > 0 && showValue == null) {\r\n showValue = \"\";\r\n }\r\n }\r\n else if (angular.isString(valueArray)) {\r\n valueArray.split(',').forEach(function (val) {\r\n optionArray.forEach(function (opt) {\r\n if (opt.id == val) {\r\n if (showValue == null) {\r\n showValue = opt.name;\r\n }\r\n else {\r\n showValue += ', ' + opt.name;\r\n }\r\n }\r\n })\r\n })\r\n\r\n if (valueArray != null && valueArray != \"\" && showValue == null) {\r\n showValue = \"\";\r\n }\r\n }\r\n\r\n return showValue;\r\n}\r\n\r\nfunction chunkArray(myArray, chunk_size) {\r\n var results = [];\r\n\r\n while (myArray.length) {\r\n results.push(myArray.splice(0, chunk_size));\r\n }\r\n\r\n return results;\r\n}","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('HttpPendingRequests', ['$q', '$rootScope', function ($q, $rootScope) {\r\n var cancelPromises = [];\r\n\r\n function newTimeout() {\r\n var cancelPromise = $q.defer();\r\n cancelPromise.promise.state = $rootScope.$state.current;\r\n cancelPromises.push(cancelPromise);\r\n return cancelPromise.promise;\r\n }\r\n\r\n function cancelAll(state) {\r\n angular.forEach(cancelPromises, function (cancelPromise) {\r\n cancelPromise.promise.isGloballyCancelled = true;\r\n cancelPromise.resolve();\r\n });\r\n cancelPromises.length = 0;\r\n }\r\n\r\n return {\r\n newTimeout: newTimeout,\r\n cancelAll: cancelAll\r\n };\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('LocalDatabase', ['$rootScope', '$q', function ($rootScope, $q) {\r\n var DB_NAME = 'licensuredb',\r\n DB_VERSION = 1,\r\n dbDeferred = $q.defer(),\r\n database,\r\n filesystem,\r\n licensuredb = null,\r\n keyPaths = {\r\n list: 'state',\r\n license: 'id',\r\n query: 'state',\r\n visit: 'id',\r\n inspection: 'id',\r\n account: 'PRODUCTNAME',\r\n enterprise: 'PRODUCTNAME',\r\n portal_permission: 'PRODUCTNAME',\r\n inspection_status: 'id',\r\n year: 'MODULENAME'\r\n },\r\n merge_sort = function (items, index) {\r\n\r\n if (!items || items === null || typeof items === 'undefined' || items.length == 0) {\r\n return [];\r\n }\r\n\r\n if (items.length < 2) {\r\n return items;\r\n }\r\n\r\n var middle = Math.floor(items.length / 2),\r\n left = items.slice(0, middle),\r\n right = items.slice(middle);\r\n\r\n return merge(merge_sort(left, index), merge_sort(right, index), index);\r\n },\r\n merge = function (left, right, index) {\r\n var result = [],\r\n il = 0,\r\n ir = 0;\r\n while (il < left.length && ir < right.length) {\r\n if (left[il][index] < right[ir][index]) {\r\n result.push(left[il++]);\r\n } else {\r\n result.push(right[ir++]);\r\n }\r\n }\r\n\r\n return result.concat(left.slice(il)).concat(right.slice(ir));\r\n },\r\n onInitFs = function (fs) {\r\n console.log('The file system has been initialized.');\r\n filesystem = fs;\r\n },\r\n errorHandler = function (e) {\r\n var msg = '',\r\n FileError = window.FileError;\r\n switch (e.code) {\r\n case FileError.QUOTA_EXCEEDED_ERR:\r\n msg = 'QUOTA_EXCEEDED_ERR';\r\n break;\r\n case FileError.NOT_FOUND_ERR:\r\n msg = 'NOT_FOUND_ERR';\r\n break;\r\n case FileError.SECURITY_ERR:\r\n msg = 'SECURITY_ERR';\r\n break;\r\n case FileError.INVALID_MODIFICATION_ERR:\r\n msg = 'INVALID_MODIFICATION_ERR';\r\n break;\r\n case FileError.INVALID_STATE_ERR:\r\n msg = 'INVALID_STATE_ERR';\r\n break;\r\n default:\r\n msg = 'Unknown Error';\r\n break;\r\n }\r\n console.log('There was an error requesting access to the file system: ' + msg);\r\n },\r\n getFileURL = function (file) {\r\n var deferredFileURL = $q.defer();\r\n if (file.CONTENT !== null) {\r\n deferredFileURL.resolve(window.URL.createObjectURL(file.CONTENT));\r\n } else {\r\n filesystem.root.getFile(file.FILE_NAME, {}, function (fileEntry) {\r\n deferredFileURL.resolve(fileEntry.toURL());\r\n }, function (e) {\r\n deferredFileURL.reject(e); console.log('error --> ', e);\r\n });\r\n }\r\n return deferredFileURL.promise;\r\n },\r\n writeFileToStorage = function (file) {\r\n var deferredFile = $q.defer();\r\n if (filesystem) {\r\n filesystem.root.getFile(file.FILE_NAME, {\r\n create: true\r\n }, function (fileEntry) {\r\n fileEntry.createWriter(function (fileWriter) {\r\n fileWriter.onwriteend = function () {\r\n file.CONTENT = null;\r\n deferredFile.resolve(file);\r\n };\r\n fileWriter.onerror = function (event) {\r\n console.log('There was an error writing the file to the file system.');\r\n deferredFile.reject(event);\r\n };\r\n fileWriter.write(file.CONTENT);\r\n });\r\n }, function (e) {\r\n deferredFile.reject(e); console.log('error --> ', e);\r\n });\r\n } else {\r\n deferredFile.resolve(file);\r\n }\r\n return deferredFile.promise;\r\n },\r\n deleteFileFromStorage = function (fileName) {\r\n var d = $q.defer();\r\n if (filesystem) {\r\n filesystem.root.getFile(fileName, {\r\n create: false\r\n }, function (fileEntry) {\r\n fileEntry.remove(function () {\r\n d.resolve();\r\n }, function (e) {\r\n console.log(e);\r\n d.resolve(e);\r\n });\r\n }, function (e) {\r\n console.log(e);\r\n d.resolve();\r\n });\r\n } else {\r\n d.resolve();\r\n }\r\n return d.promise;\r\n },\r\n openDB = function () {\r\n $rootScope.offlineDBOn = true;\r\n \r\n var emptydb = {};\r\n if (licensuredb == null) {\r\n licensuredb = {};\r\n try {\r\n licensuredb.list = new Dexie('list');\r\n licensuredb.list.version(1).stores({ record: \"\" });\r\n licensuredb.list.open();\r\n\r\n licensuredb.license = new Dexie('license');\r\n licensuredb.license.version(1).stores({ record: \"\" });\r\n licensuredb.license.open();\r\n\r\n licensuredb.query = new Dexie('query');\r\n licensuredb.query.version(1).stores({ record: \"\" });\r\n licensuredb.query.open();\r\n\r\n licensuredb.visit = new Dexie('visit');\r\n licensuredb.visit.version(1).stores({ record: \"\" });\r\n licensuredb.visit.open();\r\n\r\n licensuredb.inspection = new Dexie('inspection');\r\n licensuredb.inspection.version(1).stores({ record: \"\" });\r\n licensuredb.inspection.open();\r\n\r\n licensuredb.account = new Dexie('account');\r\n licensuredb.account.version(1).stores({ record: \"\" });\r\n licensuredb.account.open();\r\n\r\n licensuredb.enterprise = new Dexie('enterprise');\r\n licensuredb.enterprise.version(1).stores({ record: \"\" });\r\n licensuredb.enterprise.open();\r\n\r\n licensuredb.portal_permission = new Dexie('portal_permission');\r\n licensuredb.portal_permission.version(1).stores({ record: \"\" });\r\n licensuredb.portal_permission.open();\r\n\r\n licensuredb.inspection_status = new Dexie('inspection_status');\r\n licensuredb.inspection_status.version(1).stores({ record: \"\" });\r\n licensuredb.inspection_status.open();\r\n\r\n licensuredb.year = new Dexie('year');\r\n licensuredb.year.version(1).stores({ record: \"\" });\r\n licensuredb.year.open();\r\n }\r\n catch (e) {\r\n console.log('Caching not available');\r\n $rootScope.offlineDBOn = false;\r\n return;\r\n }\r\n }\r\n },\r\n getDB = function () {\r\n return licensuredb;\r\n };\r\n openDB();\r\n return {\r\n openTheDB: function () {\r\n openDB();\r\n },\r\n get: function (collection, key) {\r\n var d = $q.defer();\r\n\r\n try {\r\n licensuredb[collection].record.get(key, function (item) {\r\n d.resolve(item);\r\n }).catch(function (error)\r\n {\r\n console.log(\"lawnchair cache\", error);\r\n licensuredb[collection].delete();\r\n window.location.reload();\r\n d.reject(error);\r\n });\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n put: function (collection, blob) {\r\n var d = $q.defer();\r\n\r\n try {\r\n blob.key = blob[keyPaths[collection]];\r\n licensuredb[collection].record.put(blob, blob.key);\r\n d.resolve();\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n return d.promise;\r\n },\r\n putWithIndex: function (collection, i, key, blob) {\r\n var d = $q.defer();\r\n\r\n try {\r\n if (licensuredb[collection])\r\n licensuredb[collection].record.put(blob, key);\r\n d.resolve();\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n remove: function (collection, key) {\r\n var d = $q.defer();\r\n\r\n try {\r\n licensuredb[collection].record.delete(key);\r\n d.resolve();\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n removeWithIndex: function (collection, i, key) {\r\n var d = $q.defer();\r\n\r\n try {\r\n licensuredb[collection].record.delete(key);\r\n d.resolve();\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n clear: function (collection) {\r\n var d = $q.defer();\r\n\r\n try {\r\n licensuredb[collection].record.clear();\r\n d.resolve();\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n getAll: function (collection) {\r\n var d = $q.defer();;\r\n\r\n try {\r\n var result = licensuredb[collection].record.toArray();\r\n d.resolve(result);\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n getOneWithIndex: function (collection, i, key) {\r\n var d = $q.defer();\r\n\r\n try {\r\n var result;\r\n licensuredb[collection].record.get(key, function (item) {\r\n result = item;\r\n d.resolve(result);\r\n });\r\n\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n getWithIndexOnly: function (collection, i, only) {\r\n var d = $q.defer();\r\n\r\n try {\r\n var result = [];\r\n i = i.toUpperCase();\r\n appraisaldb[collection].all(function (items) {\r\n console.log(items);\r\n for (var a = 0; a < items.length; a++) {\r\n if (items[a][i] == only) {\r\n result.push(items[a]);\r\n }\r\n }\r\n d.resolve(result);\r\n });\r\n\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n beginsWith: function (collection, i, lower, limit, filter) {\r\n //right now its not begins with. it is if it contain the string\r\n var d = $q.defer();\r\n lower = lower.toUpperCase();\r\n try {\r\n var result = [];\r\n var counter = 0;\r\n appraisaldb[collection].all(function (all) {\r\n for (var i = 0; i < all.length; i++) {\r\n var temp = all[i].NAME;\r\n temp = temp.toUpperCase();\r\n if (temp.indexOf(lower) > -1) {\r\n result.push(all[i]);\r\n counter++;\r\n }\r\n if (counter == limit) {\r\n break;\r\n }\r\n }\r\n d.resolve(result);\r\n });\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n\r\n return d.promise;\r\n },\r\n getAllWithIndex: function (collection, index) {\r\n var d = $q.defer();\r\n index = index.toUpperCase();\r\n var result;\r\n try {\r\n var a;\r\n appraisaldb[collection].all(function (all) {\r\n a = all;\r\n result = merge_sort(a, index);\r\n console.log('allwindex', index, result);\r\n d.resolve(result);\r\n });\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n return d.promise;\r\n },\r\n getWithSortOrder: function (collection, i, id, sort) {\r\n var d = $q.defer();\r\n sort = sort.toUpperCase();\r\n var test = i.toUpperCase() + '_ID';\r\n try {\r\n var a = [];\r\n appraisaldb[collection].all(function (dbresult) {\r\n\r\n for (var r = 0; r < dbresult.length; r++) {\r\n\r\n if (dbresult[r][test] == id) {\r\n a.push(dbresult[r]);\r\n }\r\n\r\n }\r\n if (a === null || a.length == 0) {\r\n d.resolve([]);\r\n } else {\r\n var result = merge_sort(a, sort);\r\n console.log('wsortorder', result);\r\n d.resolve(result);\r\n }\r\n });\r\n\r\n } catch (e) {\r\n console.log('error --> ', e);\r\n d.reject(e);\r\n }\r\n return d.promise;\r\n },\r\n saveFile: function (file) {\r\n var deferredFile = $q.defer();\r\n writeFileToStorage(file).then(function (filePointer) {\r\n filePointer.ID = filePointer.FILE_ID;\r\n try {\r\n licensuredb['file'].save(filePointer);\r\n deferredFile.resolve(filePointer);\r\n } catch (e) {\r\n console.log('error saving file', e);\r\n deferredFile.reject(e); console.log('error --> ', e);\r\n }\r\n });\r\n return deferredFile.promise;\r\n },\r\n deleteFile: function (file) {\r\n var d = $q.defer();\r\n deleteFileFromStorage(file.FILE_NAME).then(function () {\r\n var query = 'FILE_NAME === ' + file.FILE_NAME;\r\n try {\r\n licensuredb['file'].get(query, function (item) {\r\n licensuredb['file'].remove(item, function () {\r\n console.log('file was deleted');\r\n d.resolve();\r\n });\r\n });\r\n } catch (e) {\r\n d.reject(event);\r\n }\r\n });\r\n return d.promise;\r\n },\r\n getFileUrlByID: function (fileID) {\r\n var deferredFileGet = $q.defer();\r\n try {\r\n licensuredb['file'].get(fileID, function (file) {\r\n getFileURL(file).then(function (fileURL) {\r\n deferredFileGet.resolve(fileURL);\r\n });\r\n });\r\n } catch (e) {\r\n deferredFileGet.reject(e); console.log('error --> ', e);\r\n }\r\n return deferredFileGet.promise;\r\n },\r\n getFileContent: function (fileID) {\r\n var d = $q.defer();\r\n licensuredb['file'].get(fileID, function (file) {\r\n if (file.CONTENT !== null) {\r\n if (!('name' in file.CONTENT)) {\r\n file.CONTENT.name = file.FILE_NAME;\r\n }\r\n d.resolve(file.CONTENT);\r\n } else {\r\n filesystem.root.getFile(file.FILE_NAME, {}, function (fileEntry) {\r\n fileEntry.file(function (fileObject) {\r\n d.resolve(fileObject);\r\n });\r\n }, function (e) {\r\n d.reject(e); console.log('error --> ', e);\r\n });\r\n }\r\n });\r\n return d.promise;\r\n }\r\n };\r\n }])\r\n;","/*\r\n * Helper methods for rendering React components inside an AngularJS page.\r\n */\r\n\r\nangular.module('licensure.helpers')\r\n .factory('ngReactBridge', ['$window', '$state',\r\n /**\r\n * @param {Window=} $window\r\n * @param {any=} $state\r\n */\r\n function ($window, $state) {\r\n if (!$window) {\r\n $window = window;\r\n }\r\n\r\n /**\r\n * Returns true if the css file is already loaded.\r\n *\r\n * @param {string} url\r\n */\r\n var isCssLoaded = function (url) {\r\n if (!url || url.indexOf(\"data:\") === 0) {\r\n return false;\r\n }\r\n\r\n var existingLinkElements = $window.document.getElementsByTagName('link');\r\n for (var i = 0; i < existingLinkElements.length; i++) {\r\n if (existingLinkElements[i].href === url) {\r\n return true;\r\n }\r\n }\r\n\r\n var existingStyleElements = $window.document.getElementsByTagName('style');\r\n for (var i = 0; i < existingStyleElements.length; i++) {\r\n if (existingStyleElements[i].getAttribute(\"data-href\") === url) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Loads a css file into the current HTML document.\r\n * \r\n * @param {string} url\r\n * @return {Promise}\r\n */\r\n var loadCssAsync = function (url) {\r\n if (isCssLoaded(url)) {\r\n return Promise.resolve();\r\n }\r\n\r\n var linkElement = $window.document.createElement('link');\r\n linkElement.rel = 'stylesheet';\r\n linkElement.href = url;\r\n $window.document.head.appendChild(linkElement);\r\n return Promise.resolve(linkElement);\r\n };\r\n\r\n /**\r\n * Returns true if the css file is already loaded.\r\n *\r\n * @param {string} url\r\n */\r\n var isScriptLoaded = function (url) {\r\n if (!url || url.indexOf(\"data:\") === 0) {\r\n return false;\r\n }\r\n\r\n var existingScriptElements = $window.document.getElementsByTagName('script');\r\n for (var i = 0; i < existingScriptElements.length; i++) {\r\n if (existingScriptElements[i].src === url || existingScriptElements[i].getAttribute(\"data-src\") === url) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Loads a javascript file into the current HTML document and returns a promise that resolves when it is loaded.\r\n * \r\n * @param {string} url\r\n * @return {Promise}\r\n */\r\n var loadScriptAsync = function (url) {\r\n if (isScriptLoaded(url)) {\r\n return Promise.resolve();\r\n }\r\n\r\n var scriptElement = $window.document.createElement('script');\r\n var loadScriptPromise = new Promise(function (resolve, reject) {\r\n scriptElement.async = true;\r\n scriptElement.onload = resolve;\r\n scriptElement.onerror = reject;\r\n scriptElement.src = url;\r\n $window.document.body.appendChild(scriptElement);\r\n });\r\n var timeoutPromise = new Promise(function (resolve) {\r\n setTimeout(resolve, 10000);\r\n });\r\n return Promise.race([loadScriptPromise, timeoutPromise]).then(function () { return scriptElement });\r\n };\r\n\r\n // Offline Cache support for loading scripts/css.\r\n // We want this stuff to be available offline, but the main application uses cache manifest.\r\n // Instead of trying to fit our dynamic scripts into that, we'll do our own thing using the newer Cache API.\r\n // If the main application switches from cache manifest to service workers, then we can probably do all of the cache work there and get rid of all of this garbage.\r\n var openCacheAsync = function () {\r\n var cacheNameBase = \"lms-licensure-cache-24.12.2.2\";\r\n\r\n return $window.caches.open(cacheNameBase);\r\n }\r\n\r\n /**\r\n * @param {Cache} cache\r\n * @param {string} url\r\n */\r\n var cacheGetOrAddAsync = function (cache, url) {\r\n // Try the cache first, fall back to network\r\n return cache.match(url)\r\n .then(function (response) {\r\n if (response) {\r\n return response.text();\r\n }\r\n return cache.add(url)\r\n .then(function () {\r\n return cache.match(url)\r\n })\r\n .then(function (response) {\r\n return response.text();\r\n });\r\n });\r\n\r\n // Try the network first, fall back to cache.\r\n return cache.add(url)\r\n .catch(function () {\r\n // It's fine if the fetch for adding to the cache failed, that's when we fall back to just reading from the cache.\r\n return undefined;\r\n })\r\n .then(function () {\r\n return cache.match(url)\r\n })\r\n .then(function (cacheResponse) {\r\n if (!cacheResponse) {\r\n return undefined;\r\n }\r\n return cacheResponse.text();\r\n });\r\n };\r\n\r\n var originalLoadScriptAsync = loadScriptAsync;\r\n\r\n /**\r\n * @param {string} script\r\n * @param {string} fromSrc\r\n */\r\n var loadScriptTextAsync = function (script, fromUrl) {\r\n if (fromUrl && isScriptLoaded(fromUrl)) {\r\n return Promise.resolve();\r\n }\r\n\r\n var scriptElement = $window.document.createElement('script');\r\n if (fromUrl) {\r\n scriptElement.setAttribute(\"data-src\", fromUrl);\r\n }\r\n scriptElement.text = script;\r\n $window.document.body.appendChild(scriptElement);\r\n return Promise.resolve(scriptElement);\r\n };\r\n\r\n loadScriptAsync = function (url) {\r\n return openCacheAsync()\r\n .then(function (cache) {\r\n return cacheGetOrAddAsync(cache, url);\r\n })\r\n .then(function (scriptText) {\r\n if (!scriptText) {\r\n throw new Error(\"Failed to cache load script from: \" + url);\r\n }\r\n return loadScriptTextAsync(scriptText, url);\r\n })\r\n .catch(function (err) {\r\n console.error(\"Fallback because of script cache load error\", err);\r\n return originalLoadScriptAsync(url);\r\n });\r\n };\r\n\r\n var originalLoadCssAsync = loadCssAsync;\r\n\r\n /**\r\n * @param {string} css\r\n * @param {string} fromHref\r\n */\r\n var loadCssText = function (css, fromUrl) {\r\n if (fromUrl && isCssLoaded(fromUrl)) {\r\n return;\r\n }\r\n\r\n var styleElement = $window.document.createElement('style');\r\n styleElement.type = \"text/css\";\r\n styleElement.textContent = css;\r\n if (fromUrl) {\r\n styleElement.setAttribute(\"data-href\", fromUrl);\r\n }\r\n $window.document.head.appendChild(styleElement);\r\n return styleElement;\r\n };\r\n\r\n loadCssAsync = function (url) {\r\n return openCacheAsync()\r\n .then(function (cache) {\r\n return cacheGetOrAddAsync(cache, url);\r\n })\r\n .then(function (cssText) {\r\n if (!cssText) {\r\n throw new Error(\"Failed to cache load css from: \" + url);\r\n }\r\n return loadCssText(cssText, url);\r\n })\r\n .catch(function (err) {\r\n console.error(\"Fallback because of css cache load error\", err);\r\n return originalLoadCssAsync(url);\r\n });\r\n };\r\n\r\n /**\r\n * Initializes the current HTML page in preparation for rendering a react component,\r\n * and returns a promise that resolves when it is ready.\r\n * \r\n * @param {string} resource\r\n * @param {string} basename\r\n * @returns {Promise}\r\n */\r\n var initializeAsync = function (resource, basename) {\r\n // Ensure we have a hash in our url (or things get weird with react router)\r\n var href = $window.location.href;\r\n var hashIndex = href.indexOf(\"#\");\r\n if (hashIndex === -1) {\r\n window.location.replace(href + \"#/\" + basename);\r\n }\r\n\r\n /** @type {string} */\r\n var apiLocation = $window.apiLocation || \"\";\r\n // update this version on release\r\n var version = '24.12.2.2';\r\n var cssUrl = apiLocation + '/api/ClientAppBundles/css/' + resource + '?v=' + version;\r\n var loadCssPromise = loadCssAsync(cssUrl, $window);\r\n\r\n var scriptUrl = apiLocation + '/api/ClientAppBundles/js/' + resource + '?v=' + version;\r\n var loadScriptPromise = loadScriptAsync(scriptUrl, $window);\r\n\r\n return Promise.all([loadScriptPromise, loadCssPromise]);\r\n };\r\n\r\n /**\r\n * Creates and returns render options for an LMS react bundle.\r\n * \r\n * @param {string} basename\r\n * @returns options for rendering a page (as defined in the React app)\r\n */\r\n var createRenderOptions = function (basename, portal) {\r\n /** @type {string} */\r\n var apiLocation = $window.apiLocation || \"\";\r\n\r\n var pathBase = $window.location.pathname;\r\n if (typeof pathBase !== \"string\") {\r\n /** @type { { app?: string } } */\r\n var paths = $window.paths || {};\r\n var appPath = paths.app || \"\";\r\n var pathBase = appPath.replace(/\\/app(\\/)?$/i, '$1');\r\n if (!pathBase || pathBase.length === 0) {\r\n pathBase = appPath;\r\n }\r\n }\r\n\r\n var loginUrl = $state && portal\r\n ? pathBase + $state.href('portal.menus.login', {}, { absolute: false })\r\n : pathBase + \"#/login\";\r\n var homeUrl = pathBase + \"#/\";\r\n\r\n var renderPageOptions = {\r\n rootElementId: \"react-root\",\r\n pathBase: pathBase,\r\n apiUrl: apiLocation + '/',\r\n loginUrl: loginUrl,\r\n homeUrl: homeUrl,\r\n routerBasename: basename,\r\n angularJsCompatibilityMode: true\r\n };\r\n return renderPageOptions;\r\n };\r\n\r\n /* eslint-disable valid-jsdoc */\r\n /**\r\n * Creates and returns an AngularJS directive for rendering a react element.\r\n * \r\n * @param {string} basename\r\n * @param {function(ReturnType): void} renderFunc\r\n * @param {function(ReturnType): void} cleanupFunc\r\n * @returns an AngularJS directive for rendering a React element\r\n */\r\n /* eslint-enable valid-jsdoc */\r\n var createNgReactDirective = function (basename, portal, renderFunc, cleanupFunc) {\r\n var renderOptions = createRenderOptions(basename, portal);\r\n return {\r\n restrict: 'E',\r\n replace: true,\r\n\r\n /**\r\n * @param {any} scope\r\n * @param {Element[]=} elem\r\n * @param {any=} attrs\r\n */\r\n link: function (scope, elem, attrs) {\r\n try {\r\n if (elem && elem.length > 0) {\r\n renderOptions.rootElement = elem[0];\r\n }\r\n renderFunc(renderOptions);\r\n } catch (err) {\r\n console.error(\"React render failed\", err);\r\n throw err;\r\n }\r\n\r\n if (cleanupFunc) {\r\n // Based on the cleanup in the directive from https://github.com/ngReact/ngReact\r\n scope.$on('$destroy', function () {\r\n try {\r\n if (!attrs.onScopeDestroy) {\r\n cleanupFunc(renderOptions);\r\n } else {\r\n scope.$eval(attrs.onScopeDestroy, {\r\n unmountComponent: cleaner.bind(this, renderOptions)\r\n });\r\n }\r\n } catch (err) {\r\n console.error(\"React cleanup error\", err);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n };\r\n\r\n return {\r\n initializeAsync: initializeAsync,\r\n createNgReactDirective: createNgReactDirective\r\n };\r\n }]);\r\n","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('Permissions', ['$q', '$state', 'SecurityTemplatePermissions', '$rootScope', function ($q, $state, SecurityTemplatePermissions, $rootScope) {\r\n var permissions = null;\r\n var gettingPermissions = false;\r\n\r\n var getPermissions = function () {\r\n var d = $q.defer();\r\n\r\n if (permissions == null) {\r\n if (!gettingPermissions) {\r\n gettingPermissions = true;\r\n var arr = [];\r\n SecurityTemplatePermissions.get(true).then(function (p) {\r\n p.forEach(function (permission) {\r\n if (permission.object != null && (arr[permission.object.state] == null || arr[permission.object.state] < permission.permission)) {\r\n arr[permission.object.state] = permission.permission;\r\n }\r\n });\r\n\r\n permissions = arr;\r\n gettingPermissions = false;\r\n $rootScope.$broadcast('SecurityTemplatePermissions:finish');\r\n\r\n d.resolve(permissions);\r\n });\r\n }\r\n else {\r\n $rootScope.$on('SecurityTemplatePermissions:finish', function () {\r\n d.resolve(permissions);\r\n });\r\n }\r\n }\r\n else {\r\n d.resolve(permissions);\r\n }\r\n\r\n return d.promise;\r\n }\r\n\r\n return {\r\n view: function (state) {\r\n var d = $q.defer();\r\n \r\n if (state == null) {\r\n state = $state.current.name;\r\n }\r\n \r\n getPermissions().then(function (permissions) {\r\n d.resolve(($rootScope.userAccount != null && $rootScope.userAccount.super) || permissions[state] > 0)\r\n })\r\n\r\n return d.promise;\r\n },\r\n\r\n add: function (state) {\r\n var d = $q.defer();\r\n\r\n if (state == null) {\r\n state = $state.current.name;\r\n }\r\n\r\n getPermissions().then(function (permissions) {\r\n d.resolve(($rootScope.userAccount != null && $rootScope.userAccount.super) || permissions[state] > 2)\r\n })\r\n\r\n return d.promise;\r\n },\r\n\r\n edit: function (state) {\r\n var d = $q.defer();\r\n\r\n if (state == null) {\r\n state = $state.current.name;\r\n }\r\n\r\n getPermissions().then(function (permissions) {\r\n d.resolve(($rootScope.userAccount != null && $rootScope.userAccount.super) || permissions[state] > 1)\r\n })\r\n\r\n return d.promise;\r\n },\r\n\r\n delete: function (state) {\r\n var d = $q.defer();\r\n\r\n if (state == null) {\r\n state = $state.current.name;\r\n }\r\n\r\n getPermissions().then(function (permissions) {\r\n d.resolve(($rootScope.userAccount != null && $rootScope.userAccount.super) || permissions[state] > 3)\r\n })\r\n\r\n return d.promise;\r\n }\r\n }\r\n }])\r\n;","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('PortalPermissions', ['$q', '$state', 'CMSSites', '$rootScope', 'Cache', '$http', function ($q, $state, CMSSites, $rootScope, Cache, $http) {\r\n var portalPermissions = null;\r\n var gettingPermissions = false;\r\n\r\n var getPermissions = function () {\r\n var d = $q.defer();\r\n if (portalPermissions == null) {\r\n if ($rootScope.offline) {\r\n Cache.get('portal_permission', 'LICENSURE').then(function (permissionObject) {\r\n portalPermissions = permissionObject.permissions;\r\n d.resolve(portalPermissions);\r\n }).catch(function (response) {\r\n d.reject(response.data);\r\n });\r\n }\r\n else {\r\n if (!gettingPermissions) {\r\n gettingPermissions = true;\r\n var arr = [];\r\n var promise = null;\r\n\r\n if ($rootScope.state && $rootScope.state.current && $rootScope.state.current.params) {\r\n promise = CMSSites.get();\r\n }\r\n else {\r\n promise = CMSSites.getByEnterprise($rootScope.enterpriseID);\r\n }\r\n promise.then(function (s) {\r\n if (s != null) {\r\n s.portal_pages.forEach(function (p) {\r\n if (arr[p.state] == null || arr[p.state].visible < p.visible) {\r\n arr[p.state] = { visible: p.visible, required_login: p.required_login, name: p.name };\r\n }\r\n })\r\n }\r\n portalPermissions = arr;\r\n gettingPermissions = false;\r\n $rootScope.$broadcast('PortalPermissions:finish');\r\n\r\n var permissionObject = {};\r\n permissionObject.PRODUCTNAME = 'LICENSURE';\r\n permissionObject.permissions = portalPermissions;\r\n\r\n Cache.save('portal_permission', permissionObject, 'PRODUCTNAME').then(function () {\r\n d.resolve(portalPermissions);\r\n });\r\n });\r\n }\r\n else {\r\n $rootScope.$on('PortalPermissions:finish', function () {\r\n d.resolve(portalPermissions);\r\n });\r\n }\r\n }\r\n }\r\n else {\r\n d.resolve(portalPermissions);\r\n }\r\n\r\n return d.promise;\r\n }\r\n\r\n var getByAddress = function (address) {\r\n var d = $q.defer();\r\n\r\n $http\r\n .get(apiLocation + '/api/Core/PortalPage/?actionKeyword=&address=' + encodeURIComponent(address), {\r\n params: {}\r\n })\r\n .then(function (response) {\r\n d.resolve(response.data);\r\n })\r\n .catch(function (response) {\r\n d.reject(response.data);\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n var view = function (state) {\r\n var d = $q.defer();\r\n\r\n if (state == null) {\r\n state = $state.current.name;\r\n }\r\n getPermissions().then(function (permissions) {\r\n if (permissions[state] !== undefined) {\r\n d.resolve(($rootScope.userAccount != null && $rootScope.userAccount.super) || permissions[state].visible);\r\n } else {\r\n d.resolve(false);\r\n }\r\n });\r\n\r\n return d.promise;\r\n }\r\n\r\n return {\r\n view: view,\r\n\r\n viewByAddress: function (address) {\r\n var d = $q.defer();\r\n getByAddress(address).then(function (page) {\r\n if (page && page.state) {\r\n view(page.state).then(function (access) {\r\n d.resolve({ access: access, requiredLogin: page.requiredLogin });\r\n });\r\n }\r\n else {\r\n d.resolve(null);\r\n }\r\n }).catch(function (response) {\r\n d.reject(response.data);\r\n });\r\n\r\n return d.promise;\r\n },\r\n\r\n getPermissions: getPermissions\r\n }\r\n }])\r\n;","\"use strict\";\r\n\r\nangular.module(\"licensure.helpers\").factory(\"Resource\", [\r\n \"$q\",\r\n \"$window\",\r\n function($q, $window) {\r\n var activeOptions = function() {\r\n var options = [];\r\n\r\n options.push({ id: true, name: \"Active\" });\r\n options.push({ id: false, name: \"Inactive\" });\r\n\r\n return options;\r\n };\r\n\r\n var environmentOptions = function() {\r\n var options = [];\r\n\r\n options.push({ id: true, name: \"Public\" });\r\n options.push({ id: false, name: \"Internal\" });\r\n\r\n return options;\r\n };\r\n\r\n var yesNoOptions = function() {\r\n var options = [];\r\n\r\n options.push({ id: true, name: \"Yes\" });\r\n options.push({ id: false, name: \"No\" });\r\n\r\n return options;\r\n };\r\n\r\n var dateOptions = function() {\r\n var options = [];\r\n\r\n options.push({ id: 0, name: \"Today\" });\r\n options.push({ id: 1, name: \"Yesterday\" });\r\n options.push({ id: 7, name: \"Last 7 Days\" });\r\n options.push({ id: 30, name: \"Last 30 Days\" });\r\n options.push({ id: 90, name: \"Last 90 Days\" });\r\n options.push({ id: 365, name: \"Last Year\" });\r\n options.push({ id: 1095, name: \"Last Three Years\" });\r\n options.push({ id: -1, name: \"Tomorrow\" });\r\n options.push({ id: -7, name: \"Next 7 Days\" });\r\n options.push({ id: -30, name: \"Next 30 Days\" });\r\n options.push({ id: -90, name: \"Next 90 Days\" });\r\n options.push({ id: -365, name: \"Next Year\" });\r\n\r\n return options;\r\n };\r\n\r\n return {\r\n months: function() {\r\n var months = [];\r\n\r\n months.push({ id: 0, name: \"January\", abbrv: \"Jan\" });\r\n months.push({ id: 1, name: \"February\", abbrv: \"Feb\" });\r\n months.push({ id: 2, name: \"March\", abbrv: \"Mar\" });\r\n months.push({ id: 3, name: \"April\", abbrv: \"Apr\" });\r\n months.push({ id: 4, name: \"May\", abbrv: \"May\" });\r\n months.push({ id: 5, name: \"June\", abbrv: \"Jun\" });\r\n months.push({ id: 6, name: \"July\", abbrv: \"Jul\" });\r\n months.push({ id: 7, name: \"August\", abbrv: \"Aug\" });\r\n months.push({ id: 8, name: \"September\", abbrv: \"Sep\" });\r\n months.push({ id: 9, name: \"October\", abbrv: \"Oct\" });\r\n months.push({ id: 10, name: \"November\", abbrv: \"Nov\" });\r\n months.push({ id: 11, name: \"December\", abbrv: \"Dec\" });\r\n\r\n return months;\r\n },\r\n\r\n weekdays: function () {\r\n var weekdays = [];\r\n\r\n weekdays.push({ id: 0, name: 'Sunday', abbrv: 'Sun' });\r\n weekdays.push({ id: 1, name: 'Monday', abbrv: 'Mon' });\r\n weekdays.push({ id: 2, name: 'Tuesday', abbrv: 'Tues' });\r\n weekdays.push({ id: 3, name: 'Wednesday', abbrv: 'Wed' });\r\n weekdays.push({ id: 4, name: 'Thursday', abbrv: 'Thurs' });\r\n weekdays.push({ id: 5, name: 'Friday', abbrv: 'Fri' });\r\n weekdays.push({ id: 6, name: 'Saturday', abbrv: 'Sat' });\r\n\r\n return weekdays;\r\n },\r\n\r\n years: function (offset, span) {\r\n if (offset == undefined) { offset = 10; }\r\n if (span == undefined) { span = 20; }\r\n\r\n var years = [];\r\n\r\n var currentYear = new Date().getFullYear();\r\n\r\n for (\r\n var i = currentYear - offset;\r\n i < currentYear - offset + span + 1;\r\n i++\r\n ) {\r\n years.push({ id: i, name: i });\r\n }\r\n\r\n return years;\r\n },\r\n\r\n birthdate_duration: function () {\r\n var duration = [{ id: 1, name: 1 }, { id: 2, name: 2 }];\r\n return duration;\r\n },\r\n\r\n alpha: function() {\r\n var alpha = [];\r\n\r\n alpha.push({ id: \"a\", name: \"A\" });\r\n alpha.push({ id: \"b\", name: \"B\" });\r\n alpha.push({ id: \"c\", name: \"C\" });\r\n alpha.push({ id: \"d\", name: \"D\" });\r\n alpha.push({ id: \"e\", name: \"E\" });\r\n alpha.push({ id: \"f\", name: \"F\" });\r\n alpha.push({ id: \"g\", name: \"G\" });\r\n alpha.push({ id: \"h\", name: \"H\" });\r\n alpha.push({ id: \"i\", name: \"I\" });\r\n alpha.push({ id: \"j\", name: \"J\" });\r\n alpha.push({ id: \"k\", name: \"K\" });\r\n alpha.push({ id: \"l\", name: \"L\" });\r\n alpha.push({ id: \"m\", name: \"M\" });\r\n alpha.push({ id: \"n\", name: \"N\" });\r\n alpha.push({ id: \"o\", name: \"O\" });\r\n alpha.push({ id: \"p\", name: \"P\" });\r\n alpha.push({ id: \"q\", name: \"Q\" });\r\n alpha.push({ id: \"r\", name: \"R\" });\r\n alpha.push({ id: \"s\", name: \"S\" });\r\n alpha.push({ id: \"t\", name: \"T\" });\r\n alpha.push({ id: \"u\", name: \"U\" });\r\n alpha.push({ id: \"v\", name: \"V\" });\r\n alpha.push({ id: \"w\", name: \"W\" });\r\n alpha.push({ id: \"x\", name: \"X\" });\r\n alpha.push({ id: \"y\", name: \"Y\" });\r\n alpha.push({ id: \"z\", name: \"Z\" });\r\n\r\n return alpha;\r\n },\r\n\r\n activeOptions: activeOptions,\r\n yesNoOptions: yesNoOptions,\r\n\r\n getActiveOptions: function() {\r\n var d = $q.defer();\r\n\r\n d.resolve(activeOptions());\r\n\r\n return d.promise;\r\n },\r\n\r\n getEnvironmentOptions: function() {\r\n var d = $q.defer();\r\n\r\n d.resolve(environmentOptions());\r\n\r\n return d.promise;\r\n },\r\n\r\n getDateOptions: function() {\r\n var d = $q.defer();\r\n\r\n d.resolve(dateOptions());\r\n\r\n return d.promise;\r\n },\r\n\r\n browser: function() {\r\n var ua = navigator.userAgent,\r\n tem,\r\n M =\r\n ua.match(\r\n /(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i\r\n ) || [];\r\n if (/trident/i.test(M[1])) {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n return \"IE \" + (tem[1] || \"\");\r\n }\r\n if (M[1] === \"Chrome\") {\r\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\r\n if (tem != null)\r\n return tem\r\n .slice(1)\r\n .join(\" \")\r\n .replace(\"OPR\", \"Opera\");\r\n }\r\n M = M[2]\r\n ? [M[1], M[2]]\r\n : [navigator.appName, navigator.appVersion, \"-?\"];\r\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null)\r\n M.splice(1, 1, tem[1]);\r\n return M.join(\" \");\r\n }\r\n };\r\n }\r\n]);\r\n","'use strict';\r\n\r\nangular.module('licensure.helpers')\r\n .factory('Validation', ['$injector', '$q', function ($injector, $q) {\r\n // Helper Functions\r\n var isNumeric = function (n) {\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n }\r\n var isDate = function (date) {\r\n return !/Invalid|NaN/.test(new Date(date));\r\n }\r\n var parseDate = function (value) {\r\n if (isDate(value)) {\r\n return new Date(value.getFullYear(), value.getMonth(), value.getDate());\r\n }\r\n else { return null; }\r\n }\r\n var getDifferenceInDays = function (value) {\r\n var today = new Date();\r\n value.setHours(0, 0, 0, 0);\r\n today.setHours(0, 0, 0, 0);\r\n\r\n return Math.trunc((value.getTime() - today.getTime()) / 86400000);\r\n }\r\n\r\n\r\n // Functions for Validation Types\r\n var functions = {};\r\n functions.validateNumeric = function (n) {\r\n return isNumeric(n);\r\n }\r\n functions.validatePastDate = function (value) {\r\n var date = parseDate(value);\r\n var today = new Date();\r\n\r\n if (date != null) {\r\n return today > date;\r\n } else { return false; }\r\n }\r\n functions.validateToday = function (value) {\r\n var date = parseDate(value);\r\n var today = new Date();\r\n\r\n if (date != null) {\r\n today.setHours(0, 0, 0, 0);\r\n date.setHours(0, 0, 0, 0);\r\n return today.getTime() == date.getTime();\r\n } else { return false; }\r\n }\r\n functions.validateFutureDate = function (value) {\r\n var date = parseDate(value);\r\n var today = new Date();\r\n\r\n if (date != null) {\r\n return today < date;\r\n } else { return false; }\r\n }\r\n functions.validatePastDateToday = function (value) {\r\n return functions.validatePastDate(value) || functions.validateToday(value);\r\n }\r\n functions.validateFutureDateToday = function (value) {\r\n return functions.validateFutureDate(value) || functions.validateToday(value);\r\n }\r\n functions.validateNotToday = function (value) {\r\n return !functions.validateToday(value);\r\n }\r\n functions.validateDollar = function (value) {\r\n var re = /^((\\d*)|(\\$\\d*)|(\\d*\\.\\d{2})|(\\$\\d*\\.\\d{2})|(\\-((\\d*)|(\\$\\d*)|(\\d*\\.\\d{2})|(\\$\\d*\\.\\d{2}))))$/;\r\n return re.test(value);\r\n }\r\n functions.validateDobEighteen = function (value) {\r\n var date = parseDate(value);\r\n var today = new Date();\r\n\r\n if (date != null) {\r\n today.setFullYear(parseInt(today.getFullYear()) - 18);\r\n return today.getTime() >= date.getTime();\r\n } else { return false; }\r\n }\r\n functions.validateDobSixteen = function (value) {\r\n var date = parseDate(value);\r\n var today = new Date();\r\n\r\n if (date != null) {\r\n today.setFullYear(parseInt(today.getFullYear()) - 16);\r\n return today.getTime() >= date.getTime();\r\n } else { return false; }\r\n }\r\n functions.validateGpsLatitude = function (value) {\r\n return /^(\\+|-)?([9][0]|([1-8][0-9]|[0-9]|90)(\\.[0-9]{1,6})?)*$/i.test(value);\r\n }\r\n functions.validateGpsLongitude = function (value) {\r\n return /^(\\+|-)?([1][8][0]|([1][0-7][0-9]|[1-9][0-9]|[0-9]|90)(\\.[0-9]{1,6})?)*$/i.test(value);\r\n }\r\n functions.validateWithin30Days = function (value) {\r\n var dateToCheck = parseDate(value);\r\n\r\n if (dateToCheck != null) {\r\n var diff = getDifferenceInDays(dateToCheck)\r\n \r\n if (diff <= 30 && diff >= 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n functions.validateWithin60Days = function (value) {\r\n var dateToCheck = parseDate(value);\r\n\r\n if (dateToCheck != null) {\r\n var diff = getDifferenceInDays(dateToCheck)\r\n \r\n if (diff <= 60 && diff >= 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n functions.validateWithin90Days = function (value) {\r\n var dateToCheck = parseDate(value);\r\n\r\n if (dateToCheck != null) {\r\n var diff = getDifferenceInDays(dateToCheck)\r\n \r\n if (diff <= 90 && diff >= 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n\r\n // Functions for each kind of validation\r\n var validateMin = function (settings, value) {\r\n return (isNumeric(settings.min_length) && value.length >= settings.min_length);\r\n }\r\n\r\n var validateMax = function (settings, value) {\r\n return (isNumeric(settings.max_length) && value.length <= settings.max_length);\r\n }\r\n\r\n var validateType = function (settings, value) {\r\n var result = functions[settings.validation_type_method](value);\r\n return result;\r\n }\r\n\r\n var validateExpression = function (settings, value) {\r\n if (typeof (value) == \"string\") {\r\n if (isValidGuid(value)) {\r\n value = value.toUpperCase();\r\n }\r\n }\r\n if (typeof (value) == \"object\" && value.length > 0) {\r\n var tempString = \"\";\r\n value = value.map(function (a) { tempString += (a.id.toString().toUpperCase()+\",\") });\r\n value = tempString;\r\n }\r\n var regexString = settings.expression;\r\n var regex = new RegExp(regexString);\r\n return !value || regex.test(value);\r\n }\r\n\r\n return {\r\n // Main validation function\r\n validateQuestion: function (input, validation, value) {\r\n var d = $q.defer();\r\n if (validation) {\r\n var result = true;\r\n if (value) {\r\n if (validation.min_length) {\r\n var minResult = validateMin(validation, value);\r\n if (input != null) {\r\n input.$setValidity(\"min\", minResult);\r\n input.$setDirty(); //validation is run on page load, so have to set to dirty to get it to display\r\n }\r\n result = result && minResult;\r\n }\r\n if (validation.max_length) {\r\n var maxResult = validateMax(validation, value);\r\n if (input != null) {\r\n input.$setValidity(\"max\", maxResult);\r\n input.$setDirty();\r\n }\r\n result = result && maxResult;\r\n }\r\n if (validation.validation_type_id) {\r\n var typeResult = validateType(validation, value);\r\n if (input != null) {\r\n input.$setValidity(\"type\", typeResult);\r\n input.$setDirty();\r\n }\r\n result = result && typeResult;\r\n }\r\n if (validation.expression) {\r\n var expResult = validateExpression(validation, value);\r\n if (input != null) {\r\n input.$setValidity(\"expression\", expResult);\r\n input.$setDirty();\r\n }\r\n result = result && expResult;\r\n }\r\n }\r\n if (validation.function && typeof validation.function == \"function\") {\r\n validation.function(value).then(function (funcResult) {\r\n if (input != null) {\r\n input.$setValidity(\"customFunction\", funcResult);\r\n input.$setDirty();\r\n }\r\n result = result && funcResult;\r\n d.resolve(result);\r\n });\r\n } else {\r\n d.resolve(result);\r\n }\r\n } else {\r\n // If there's no validation, it's valid\r\n d.resolve(true);\r\n }\r\n return d.promise;\r\n }\r\n\r\n }\r\n }])\r\n;"]}